pax_global_header00006660000000000000000000000064147466740570014536gustar00rootroot0000000000000052 comment=48dd287af8b4502daa227b0e9d612ad8a88fd630 vedo-2025.5.3/000077500000000000000000000000001474667405700127315ustar00rootroot00000000000000vedo-2025.5.3/.circleci/000077500000000000000000000000001474667405700145645ustar00rootroot00000000000000vedo-2025.5.3/.circleci/config.yml000066400000000000000000000021021474667405700165470ustar00rootroot00000000000000# Python CircleCI 2.0 configuration file # # Check https://circleci.com/docs/2.0/language-python/ for more details version: 2 jobs: ############################################################## test-vedo: machine: image: ubuntu-2004:current resource_class: medium environment: MPLBACKEND: "agg" DEBIAN_FRONTEND: "noninteractive" steps: - checkout - run: name: installing vedo command: | sudo apt-get update sudo apt install libgl1-mesa-dev xvfb -y pip3 install typing-extensions pip3 install vedo pip3 install matplotlib pip3 install scipy pip3 install --no-deps . - run: name: Run tests command: | cd cd project/tests/common source run_all.sh - store_artifacts: path: test-reports destination: test-reports ###################################################### workflows: version: 2 build-stuff: jobs: - test-vedo vedo-2025.5.3/.gitignore000066400000000000000000000003651474667405700147250ustar00rootroot00000000000000*pyc .DS_Store docs/pdoc/html develop/ dist/ vtk_data vedo.egg-info build .jupyter .ipynb *.ipynb .ipynb_checkpoints examples/notebooks/.ipynb_checkpoints *png *jpg *tiff *tif # *npz untitled*.py bug_*.py data www dev_*.py z?.py x?.py v?.pyvedo-2025.5.3/CHANGELOG.md000066400000000000000000000432611474667405700145500ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. # Development Version ## Changes and Fixes ## Soft-breaking Changes Changes that may break existing code whose fixing is trivial: ## Hard-breaking Changes Changes that will break existing code and need active thinking and some work to adapt - None ## New/Revised Examples ``` ``` ## To Do - fix trasform in image.tomesh() is not transmitted to mesh ### Broken Examples Examples that are not fully functional and need some fixing: ``` markpoint.py (misplaced leader indicator) cut_and_cap.py (incomplete capping) tests/issues/discussion_800.py (incomplete capping of tube) advanced/warp4b.py (probs with picker?) ``` #### (Internal) Known issues umap_viewer3d should be revised trackviewer (some problems with removing a track, and z spacing) pyplot.plot cannot plot constant line or single point numpy2volume0.py (volume alphas look bad) ##### (Internal) Broken exports to .npz: Fails to export correctly to npz format ``` boolean.py cartoony.py mesh_lut.py mesh_map2cell.py texturecubes.py meshquality.py streamlines1.py ``` # Version 2024.5.3 ## Changes and Fixes - add `settings.force_single_precision_points = False` in #1137 by @JeffreyWardman and @sean-d-zydex - fix Volume masking in #1146 by @ivishalanand - fix `LegendBox` in #1153 by @GerritFischer - add `mesh.laplacian_diffusion()` - fix `DistanceTool` in #1158 - fix `shapes.Plane.normal` in #1159 by @smoothumut - add `Arrow.top_point()` and `Arrow.base_point()` to extract current arrow position #1163 @smoothumut - fix `Arrow.top_index` to produce the correct index value - add `assembly.Group.objects` by @smoothumut - add `addons.DrawingWidget` class for tracing on planar props - add `Video(..., scale=1)` keyword in #1168 by @YongcaiHuang - modify `legosurface(boundary=True)` default in #1166 - make load functions compatible with pathlib #1176 by @Louis-Pujol - fixed broken link to example #1175 by @jo-mueller - add documentation to `Mesh.boolean()` #1173 by @jkunimune - raise an error when calling cell_normals before compute_normals() #1172 by @jkunimune - add documentation warning as computing normals can affect appearence of the mesh #1174 by @jkunimune - add documentation about `Cube` and `Box` having duplicated vertices to allow defining normals #1171 - add documentation do address the behaviour of `mesh.volume()` and `mesh.is_closed()` wrt duplicated vertices. - add `plotter.reset_clipping_range()` to reset the camera clipping range based on the bounds of the visible actors #1170 - fix issue with find_cell() in #1095 - improvements to `volume.isosurface_discrete()` in #1180 by @snownontrace - fix bug on video frame by resetting camera clipping range in #1180 by @snownontrace - changes in the scalarbar2d object. - fix purging of nan in pyplot.plot() - fix line trace to skip first point - adjust volume transfer function for transparency @Poisoned - fixing axes type 10 by @Poisoned - improvements to input/output functionality for Assembly @ttsesm - added `mesh.remove_all_lines()` method - added keyword `Plane(edge_direction=...)` by @smoothumut - added `isolines(..., n=list())` option to pass specific values. - in `file_io.screenshot()` add fourth channel representing trasparency @miek0tube - remove obsolete class `CellCenters` which is now function `object.cell_centers()` ## Soft-breaking Changes Changes that may break existing code whose fixing is trivial: - change `object.points()` to `object.points` everywhere. - change `object.cell_centers` to `object.cell_centers().points` everywhere. - change `Picture()` to `Image()` everywhere. ## Hard-breaking Changes Changes that will break existing code and need active thinking and some work to adapt - None ## New/Revised Examples ``` examples/advanced/spline_draw2.py examples/volumetric/isosurfaces2.py examples/pyplot/fit_curve2.py tests/issues/issue_1146.py tests/issues/discussion_1190.py tests/issues/test_sph_harm2.py tests/issues/issue_1218.py tests/snippets/test_interactive_plotxy1.py tests/snippets/test_interactive_plotxy2.py tests/snippets/test_elastic_pendulum.py ``` # Version 2024.5.2 ## Changes and Fixes - add `magic-class` example - fix bug in `IsosurfaceBrowser` in #1064 - add `mesh.adjacency_list()` and `graph_ball()` methods by @sergei9838 - add `utils.circle_from_3points()` function. - add example `examples/other/iminuit2.py` - add `rotation=..` to `Arrow2D()` class - improvements to `applications.MorphPlotter` class - add `FlyOverSurface` class and `examples/basic/interaction_modes3.py` - add `mesh.extrude_and_trim_with()` method out of #1077 - fix reset clipping range in thumbnail generation in #1085 - add `mesh.euler_characteristic()`, `mesh.genus()` and `mesh.to_reeb_graph()` in #1084 - fix `reset_camera()` by @sergei9838 and Eric - fix handle empty axis for rotation #1113 by @JeffreyWardman - fix minor bug in RoundedLine #1104 by @PinkMushroom - fix avoid overwriting screenshots with "S" key #1100 by @j042 - add support for `meshlib` in https://doc.meshinspector.com/index.html - add relevant keyword options to `core.probe()` method - increase precision in writing obj files in #1119 by @ManuGraiph - add `plotter.freeze()` to freeze interaction of current renderer in #1122 by @sergei9838 - add class `addons.ButtonWidget` to address issue #1138 - add typing annotations in submodules * allow for dictionary input in Group and Assembly by @JeffreyWardman in https://github.com/marcomusy/vedo/pull/1057 * allow assembly to correctly index objects by @JeffreyWardman in https://github.com/marcomusy/vedo/pull/1062 * backwards compatibility in typing with python < 3.11 by @JeffreyWardman in https://github.com/marcomusy/vedo/pull/1093 * avoid overwriting screenshots with `"S"` key by @j042 in https://github.com/marcomusy/vedo/pull/1100 * minor bug in RoundedLine by @PinkMushroom in https://github.com/marcomusy/vedo/pull/1104 * bugfix: add tolerance to contains by @JeffreyWardman in https://github.com/marcomusy/vedo/pull/1105 * Mitigate issue #769: don't set backend to '2d' in IPython REPLs by @paulbrodersen in https://github.com/marcomusy/vedo/pull/1108 * handle empty axis for rotation by @JeffreyWardman in https://github.com/marcomusy/vedo/pull/1113 * Print position parameter as 'pos' by @adamltyson in https://github.com/marcomusy/vedo/pull/1134 ## Soft-breaking Changes Changes that will break existing code whose fixing is trivial: - remove `concatenate=True` keyword from `apply_transform()` discussed in #1111 ## Hard-breaking Changes Changes that will break existing code and need active thinking and work to adapt - None ## New/Revised Examples ``` examples/basic/interaction_modes3.py examples/basic/interaction_modes4.py examples/basic/buttons3.py examples/advanced/warp4b.py examples/other/magic-class1.py examples/other/iminuit2.py examples/other/meshlib1.py tests/issues/issue_1077.py ``` # Version 2024.5.1 ## Changes and Fixes - fixes to `extrude()` method thanks to @JeffreyWardman - add `utils.madcad2vedo` conversion as per #976 by @JeffreyWardman - add `utils.camera_to_dict()` - add `Axes(title_backface_color=...)` keyword - fix `labels()` and `labels2d()` - add `shapes.plot_scalar()` plot a scalar along a line. - add support for `tetgenpy` - add `transformations.compute_main_axes()` - add `transformations.__call__()` to apply a transformation - fix small bug in `pointcloud.distance_to()` - add `applications.MorphPlotter()` to morph a polygonal mesh to a target mesh - add `smooth_data()` to smooth/diffuse data attributes - add `shapes.Tubes()` - add `utils.Minimizer()` class - add `CellCenters(Points)` class - add `core.apply_transform_from_actor()` - add `add volume.slab()` - add `mesh.generate_random_points()` to generate random points onto a surface - add `tetmesh.generate_random_points()` to generate random points in a tet mesh - rename `integrate_arrays_over_domain()` to `integrate_data` - extend `volume.operation()` to support logic operations as per #1002 - add `pointcloud.relax_point_positions()` method - add `pointcloud.auto_distance()` method calculates the distance to the closest point in the same cloud of points. - fixed `mesh.collapse_edges()` after #992 - add `mesh.cut_closed_surface()` - fix `image.clone()` in #1011 - add `transformations.TransformInterpolator` class - add `Line.find_index_at_position()` finds the index of the line vertex that is closest to a point - add `visual.LightKit` class which provides "natural" lighting from 4 sources. - add `fast-simplification` example by @Louis-Pujol in #992 - add metadata "shape" to `volume.slice_plane()` in #1018 - fix `core.mark_boundaries()` method - add callbacks for cutters in #1020 and `examples/volumetric/slice_plane3.py` - add `utils.andrews_curves()` function. - add `transformations.LinearTransform.transpose()` method. - add `pointcloud.generate_segments()` to generate a continous line from un-ordered points in 3d - fix `assembly.__add__()` by @j042 in #1036 - small fix to `Ruler3D` class. - add `plotter.render_hidden_lines()` method - add slot for triangle strips in constructor `Mesh([verts, faces, lines, strips])` in #1019 - internally use "import vedo.vtkclasses as vtki" instead of "vtk" to avoid confusion - add `join_with_strips()` in #1043 - improvements to `shapes.Ellipsoid()` and bug fixes in #978 by @daniel-a-diaz - improvements to `pointcloud.pca_ellipsoid()` and bug fixes - improvements to `pointcloud.pca_ellipse()` and bug fixes - fix Plotter `a` toggle keypress - fix viz on jupyter notebook as per #994 - fix `mesh.imprint()` - small fix to `applications.Slicer2DPlotter` - automatically apply the actor transform to an object actor that was moved manually (via eg "InteractorStyleTrackballActor") in #1045 and #1046 by @sergei9838 - add support to `RectilinearGrid` and `StructuredGrid` data (experimental). - improvements to `RayCastPlotter` - add `visual.scalar_range()` to control mesh coloring. - fix `shapes.Text3D.text()` by @gioda - add `volume.isosurface_discrete()` method ## Soft Breaking Changes Changes that can break existing code whose fixing is trivial: - change `clone2d(scale=...)` to `clone2d(size=...)` - remove `shapes.StreamLines(object)` becomes `object.compute_streamlines()` - split `mesh.decimate()` into `mesh.decimate()`, `mesh.decimate_pro()` and `mesh.decimate_binned()` as per #992 - modified `core.clean()` after #992 - remove `import_window()` for obj files and create `load_obj()` by @zhouzq-thu in #891 - add `smooth_mls_12d(..., n=0)` to fix the number of neighbors in the smoothing - modified API for `mesh.binarize()` - `plotter.add_hover_legend()` now returns the id of the callback. - removed `settings.render_lines_as_tubes` and `settings.hidden_line_removal`, add `plotter.render_hidden_lines()` method - fix `close()`, `close_window()` is now obsolete and removed. ## Hard Breaking Changes Changes that will break existing code and need active thinking and work to adapt - None ## New/Revised Examples ``` examples/basic/sliders_hsv.py examples/basic/buttons1.py examples/basic/buttons2.py examples/basic/input_box.py examples/advanced/warp4b.py examples/advanced/diffuse_data.py examples/advanced/moving_least_squares1D.py examples/volumetric/slab_vol.py examples/volumetric/streamlines1.py examples/volumetric/streamlines2.py examples/volumetric/streamlines3.py examples/volumetric/streamlines4.py examples/volumetric/office.py examples/volumetric/slice_plane1.py examples/volumetric/slice_plane3.py examples/volumetric/mesh2volume.py examples/volumetric/read_volume3.py examples/volumetric/rectl_grid1.py examples/volumetric/struc_grid1.py examples/volumetric/app_raycaster.py examples/volumetric/isosurfaces1.py examples/volumetric/isosurfaces2.py examples/simulations/mag_field1.py examples/pyplot/andrews_cluster.py examples/other/madcad1.py examples/other/tetgen1.py examples/other/nelder-mead.py examples/other/fast_simpl.py tests/issues/issue_968.py tests/issues/issue_1025.py tests/issues/test_force_anim.py tests/snippets/test_discourse_1956.py tests/snippets/test_ellipsoid_main_axes.py tests/snippets/test_compare_fit1.py ``` # Version 2023.5.0 ## Main changes Major internal refactoring. ## Breaking changes - rename internal list `plt.actors` which now become `plt.objects` - rename `.points()` to property `.vertices`. Hence: `mesh.points() -> mesh.vertices` `mesh.points(newpoints) -> mesh.vertices = newpoints` - rename `.cell_centers()` to property `.cell_centers` - rename `.faces()` to property `.cells` - rename `.lines()` to property `.lines` - rename `.edges()` to property `.edges` - rename `.normals()` and split it into property `.vertex_normals` and property `.cell_normals` - rename `picture.Picture2D(...)` which becomes `Image(...).clone2d()` (see `examples/pyplot/embed_matplotlib.py`). - rename `Volume.probe_points()` which becomes `points.probe(volume)` - rename `Volume.probe_line()` which becomes `line.probe(volume)` - rename `Volume.probe_plane()` which becomes `plane.probe(volume)` - rename `file_io.load_transform()`. `LinearTransform("file.mat")` substitutes it. - rename `transform_with_landmarks()` to `align_with_landmarks()` - rename `find_cells_in()` to `find_cells_in_bounds()` - rename `mesh.is_inside(pt)` moved to `mesh.contains(pt)` - rename `Slicer2DPlotter` moved to `application module.Slicer2DPlotter` - rename and moved method `voronoi()` to `points.generate_voronoi()` - rename class `Ruler` to `Ruler3D` ## Other changes - improvements in how vtk classes are imported (allow lazy import) - improvements to method `mesh.clone2d()` - improvements in `Slicer3DPlotter` thanks to @daniel-a-diaz in #925 - improvements in `applications.Browser` - add new `vedo.transformations.py` module. - add `plotter.pick_area()` thanks to @ZiguoAtGitHub and @RubendeBruin feedback. - add texture to npz files thanks to @zhouzq-thu in #918 - add background radial gradients - add `utils.line_line_distance()` function - add `utils.segment_segment_distance()` function - add `plotter.initialize_interactor()` method - add object hinting by hovering mouse (see `flag_labels1.py`) - add `colors.lut_color_at(value)` the color of the lookup table at value. - add `.show(..., screenshot="myfile.png")` keyword - add `object.coordinates` same as `object.vertices` - add `move()` to move single points or objects - add `copy()` as alias to `clone()` - add "Roll" to camera dictionary (thanks @baba-yaga ) - add `applications.Slicer3DTwinPlotter` thanks to @daniel-a-diaz - add radii feature to `smooth_mls_2d()` by @jo-mueller (now store results in arrays `mesh.pointdata['MLSVariance']` and `mesh.pointdata['MLSValidPoint']`) - passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is therefore not muted by any subsequent interaction (thanks @baba-yaga ) ## Bug Fixes - bug fix in `closest_point()` thanks to @goncalo-pt - bug fix in tformat thanks to @JohnsWor in #913 - bug fix in windows OS in timers callbacks thanks to @jonaslindemann - bug fix to non linear tranforms mode. Now it can be instantiated with a dictionary - bug fix in meshlab interface thanks to @JeffreyWardman in #924 - bug fix changed `mp = matplotlib.colormaps[name]` in colors.py ## New/Revised Examples ``` examples/basic/buttons.py examples/basic/input_box.py examples/basic/sliders2.py examples/basic/spline_tool.py examples/basic/interaction_modes2.py examples/advanced/timer_callback1.py examples/advanced/timer_callback2.py examples/advanced/warp4a.py examples/advanced/warp4b.py examples/pyplot/embed_matplotlib.py examples/pyplot/plot_fxy2.py examples/simulations/springs_fem.py examples/simulations/lorenz.py examples/volumetric/numpy2volume0.py examples/volumetric/slicer1.py examples/volumetric/tet_astyle.py examples/volumetric/tet_cut1.py examples/volumetric/tet_cut2.py examples/other/flag_labels1.py ``` # Version 2023.4.5 ## Main changes - Rename module `io.py` to `file_io.py` to avoid overriding stlib `io`. - Complete revision of cutter widgets functionality - Integration in napari thanks to @jo-mueller ### Breaking changes - method `plotter.add()` no more accepts keyword `render=True/False`. Please use `plotter.add().render()` explicitly. Same thing for `plotter.remove()`. ### Other fixes and improvements - added gpu acceleration for CLI volumetric visualization in #832 by @zhang-qiang-github - fixes for `k3d` jupyter backend - added `plotter.fov(value)` (field of view, the so called "fish-eye" effect) - fix `ploter.get_meshes()` - fix for `plotter.remove(unpack_assemblies=False)` method - fix for `io.import_window()` method - added `cut_with_cookiecutter()` to cut 2D contours. - fix `shapes.NormalLines()` class - added `vedo.interactor_modes` module - added `vedo.interactor_modes.BlenderStyle` class - added `base.pointdata.clear()` to remove all associated data - added `volume.hide_voxels()` for visualization - added `Event.timerid` attribute - fix to `Volume.operation` by @DanKrsi - fix links in `pyplot` examples by @androbaza - fix `screenshot_scale` and remove it from settings. - allow initializing `ScalarBar` with a tuple range `(min, max)` - Update API Documentation for Changing Backend by @bhacha - Add `application.Browser().play()` to autoplay a slider - Add `pad()` to padding a Volume with zeros voxels (useful to `dilate()`) - Add `ProgressBarWidget()` to show a progress bar in the rendering window - Fix Scalarbar3D logscale and change separator symbol by @XushanLu - Fix `vedo/interactor_modes.mouse_left_move()` by @MiticoDan - Added `applications.AnimationPlayer` class by @mikaeltulldahl - fix convex hull in 2D by @ManuGraiph ------------------------- ## New/Revised Examples ``` examples/basic/sliders_range.py examples/basic/interaction_modes.py examples/advanced/timer_callback3.py examples/advanced/warp6.py examples/pyplot/histo_1d_e.py examples/other/tensor_grid2.py examples/simulations/airplane1.py examples/simulations/lorenz.py examples/simulations/gas.py examples/simulations/aspring2_player.py ``` vedo-2025.5.3/CODE_OF_CONDUCT.md000066400000000000000000000057501474667405700155370ustar00rootroot00000000000000## Code of Conduct ### Our Pledge We, as contributors and maintainers of the vedo project, pledge to make participation in our project a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. We are committed to creating a welcoming and inclusive environment for all. ### Our Standards Examples of behavior that contributes to creating a positive environment include: - Using welcoming and inclusive language - Being respectful of differing viewpoints and experiences - Gracefully accepting constructive criticism - Focusing on what is best for the community - Showing empathy towards other community members Examples of unacceptable behavior by participants include: - The use of sexualized language or imagery and unwelcome sexual attention or advances - Trolling, insulting/derogatory comments, and personal or political attacks - Public or private harassment - Publishing others' private information, such as a physical or electronic address, without explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting ### Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ### Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing the project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ### Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [this email](marco.musy@embl.es). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ### Attribution This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.vedo-2025.5.3/CONTRIBUTING.md000066400000000000000000000034161474667405700151660ustar00rootroot00000000000000## Contributing to vedo Thank you for considering contributing to vedo! vedo is an open-source 3D visualization library for scientific data in Python. It aims to provide an easy-to-use and flexible toolset for creating publication-quality visualizations of complex 3D data. We welcome all contributions, including bug reports, feature requests, and code contributions. This file outlines the guidelines for contributing to the vedo project. ### Reporting bugs and requesting features If you encounter a bug in vedo, or would like to request a new feature, please open an issue on the vedo GitHub repository. When opening an issue, please provide as much detail as possible about the problem or feature request, including code snippets, screenshots, or other relevant information. ### Contributing code If you would like to contribute code to vedo, please follow these guidelines: Fork the vedo repository and create a new branch for your changes. Make your changes, including adding tests and updating documentation as necessary. Submit a pull request to the vedo repository. When submitting a pull request, please provide a clear and detailed description of your changes, including the motivation for the changes and any relevant background information. All contributions will be reviewed by the vedo development team, and we may request changes or ask for additional information before merging your changes. ### Code style When contributing code to vedo, please follow the PEP 8 style guide. ###Licensing All contributions to vedo are subject to the MIT license. By contributing to vedo, you agree to license your contributions under the terms of this license. ### Thank you! We appreciate your interest in contributing to vedo, and we look forward to working with you to make it even better! vedo-2025.5.3/FONT.LICENSE000066400000000000000000000167011474667405700145100ustar00rootroot00000000000000Files: vedo/fonts/Bongas.* Source: https://www.1001freefonts.com/boogaloo.font Copyright: 2011 John Vargas Beltrán, with Reserved Font Name Boogaloo 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Bongas License: OFL Files: vedo/fonts/Calco.* Source: https://www.1001freefonts.com/calling-code.font Copyright: 2017 Ryoichi Tsunekawa, with Reserved Font Name Calling Code 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Calco License: OFL Files: vedo/fonts/Comae.* Source: https://www.1001freefonts.com/comfortaa.font Copyright: 2011 Johan Aakerlund, with Reserved Font Name Comfortaa 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Comae License: OFL Files: vedo/fonts/Glasgo.* Source: https://www.1001freefonts.com/class-coder.font Copyright: 2017 Walter E Stewart, with Reserved Font Name Class Coder 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Glasgo License: OFL Files: vedo/fonts/Kanopus.* Source: https://www.1001freefonts.com/kelvinch.font Copyright: 2016 Paul Miller, with Reserved Font Names "Kelvinch" and "SIL" 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Kanopus License: OFL Files: vedo/fonts/Normografo.* Source: https://www.1001freefonts.com/tecnico-font-19886.font Copyright: 2017 Cristhian Gomez, with Reserved Font Name Tecnico 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Normografo License: OFL Files: vedo/fonts/SmartCouric.* Source: https://www.fontsquirrel.com/fonts/courier-prime Copyright: 2013 Quote-Unquote Apps, with Reserved Font Name Courier Prime 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name SmartCouric License: OFL Files: vedo/fonts/Theemim.* Source: https://www.1001freefonts.com/theano-didot.font Copyright: Alexey Kryukov, with Reserved Font Name Theano Didot 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Theemim License: OFL Files: vedo/fonts/VictorMono.ttf Source: https://www.fontsquirrel.com/fonts/victor-mono Copyright: 2019 Rune Bjørnerås, (https://rubjo.github.io/victor-mono) License: MIT Files: vedo/fonts/Quikhand.ttf Source: https://www.1001freefonts.com/quikhand.font Copyright: 2020 Qwerks (http://graphicriver.net/user/joiaco) License: public-domain License: MIT Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License: public-domain Files in the public domain have no restrictions on use and may be used, modified and redistributed freely. Licence: OFL SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 . PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. . The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. . DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. . "Reserved Font Name" refers to any names specified as such after the copyright statement(s). . "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). . "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. . "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. . PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: . 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. . 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. . 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. . 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. . 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. . TERMINATION This license becomes null and void if any of the above conditions are not met. . DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. vedo-2025.5.3/LICENSE000066400000000000000000000020531474667405700137360ustar00rootroot00000000000000MIT License Copyright (c) 2017 Marco Musy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. vedo-2025.5.3/README.md000066400000000000000000000263401474667405700142150ustar00rootroot00000000000000 ![vlogo](https://user-images.githubusercontent.com/32848391/110344277-9bc20700-802d-11eb-8c0d-2e97226a9a32.png) [![lics](https://img.shields.io/badge/license-MIT-blue.svg)](https://en.wikipedia.org/wiki/MIT_License) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/vedo/badges/version.svg)](https://anaconda.org/conda-forge/vedo) [![Ubuntu 24.10 package](https://repology.org/badge/version-for-repo/ubuntu_24_10/vedo.svg)](https://repology.org/project/vedo/versions) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4587871.svg)](https://doi.org/10.5281/zenodo.4587871) [![Downloads](https://static.pepy.tech/badge/vedo)](https://pepy.tech/project/vedo) [![CircleCI](https://circleci.com/gh/marcomusy/vedo.svg?style=svg)](https://circleci.com/gh/marcomusy/vedo) Your friendly python module for scientific analysis and **v**isualization of **3d** **o**bjects.
## 💾 Installation ```bash pip install vedo ```
additional installation details [click to expand] - To install the latest _dev_ version of `vedo`: ```bash pip install -U git+https://github.com/marcomusy/vedo.git ``` - To install from the conda-forge channel: ```bash conda install -c conda-forge vedo ```
## 📙 Documentation The webpage of the library with documentation is available [**here**](https://vedo.embl.es). 📌 **Need help? Have a question, or wish to ask for a missing feature?** Do not hesitate to ask any questions on the [**image.sc** forum](https://forum.image.sc/) or by opening a [**github issue**](https://github.com/marcomusy/vedo/issues). ## 🎨 Features The library includes a [large set of working examples](https://github.com/marcomusy/vedo/tree/master/examples) for a wide range of functionalities
working with polygonal meshes and point clouds [click to expand] - Import meshes from VTK format, STL, Wavefront OBJ, 3DS, Dolfin-XML, Neutral, GMSH, OFF, PCD (PointCloud), - Export meshes as ASCII or binary to VTK, STL, OBJ, PLY ... formats. - Analysis tools like Moving Least Squares, mesh morphing and more.. - Tools to visualize and edit meshes (cutting a mesh with another mesh, slicing, normalizing, moving vertex positions, etc..). - Split mesh based on surface connectivity. Extract the largest connected area. - Calculate areas, volumes, center of mass, average sizes etc. - Calculate vertex and face normals, curvatures, feature edges. Fill mesh holes. - Subdivide faces of a mesh, increasing the number of vertex points. Mesh simplification. - Coloring and thresholding of meshes based on associated scalar or vectorial data. - Point-surface operations: find nearest points, determine if a point lies inside or outside of a mesh. - Create primitive shapes: spheres, arrows, cubes, torus, ellipsoids... - Generate glyphs (associate a mesh to every vertex of a source mesh). - Create animations easily by just setting the position of the displayed objects in the 3D scene. Add trailing lines and shadows to moving objects is supported. - Straightforward support for multiple sync-ed or independent renderers in the same window. - Registration (alignment) of meshes with different techniques. - Mesh smoothing. - Delaunay triangulation in 2D and 3D. - Generate meshes by joining nearby lines in space. - Find the closest path from one point to another, traveling along the edges of a mesh. - Find the intersection of a mesh with lines, planes or other meshes. - Interpolate scalar and vectorial fields with Radial Basis Functions and Thin Plate Splines. - Add sliders and buttons to interact with the scene and the individual objects. - Visualization of tensors. - Analysis of Point Clouds - Moving Least Squares smoothing of 2D, 3D and 4D clouds - Fit lines, planes, spheres and ellipsoids in space - Identify outliers in a distribution of points - Decimate a cloud to a uniform distribution.
working with volumetric data and tetrahedral meshes - Import data from VTK format volumetric TIFF stacks, DICOM, SLC, MHD and more - Import 2D images as PNG, JPEG, BMP - Isosurfacing of volumes - Composite and maximum projection volumetric rendering - Generate volumetric signed-distance data from an input surface mesh - Probe volumes with lines and planes - Generate stream-lines and stream-tubes from vectorial fields - Slice and crop volumes - Support for other volumetric structures (structured and grid data)
plotting and histogramming in 2D and 3D - Polygonal 3D text rendering with Latex-like syntax and unicode characters, with 30 different fonts. - Fully customizable axis styles - donut plots and pie charts - Scatter plots in 2D and 3D - Surface function plotting - 1D customizable histograms - 2D hexagonal histograms - Polar plots, spherical plots and histogramming - Draw latex-formatted formulas in the rendering window. - Quiver, violin, whisker and stream-line plots - Graphical markers analogous to matplotlib
integration with other libraries - Integration with the [Qt5](https://www.qt.io/) framework. - Support for [FEniCS/Dolfin](https://fenicsproject.org/) platform for visualization of PDE/FEM solutions. - Interoperability with the [trimesh](https://trimsh.org/), [pyvista](https://github.com/pyvista/pyvista) and [pymeshlab](https://github.com/cnr-isti-vclab/PyMeshLab) libraries. - Export 3D scenes and embed them into a [web page](https://vedo.embl.es/examples/fenics_elasticity.html). - Embed 3D scenes in *jupyter* notebooks with [K3D](https://github.com/K3D-tools/K3D-jupyter) (can export an interactive 3D-snapshot page [here](https://vedo.embl.es/examples/geo_scene.html)).
### ⌨ Command Line Interface Visualize a polygonal mesh or a volume from a terminal window simply with: ```bash vedo https://vedo.embl.es/examples/data/embryo.tif ```
volumetric files (slc, tiff, DICOM...) can be visualized in different modes [click to expand] |Volume 3D slicing
`vedo --slicer embryo.slc`| Ray-casting
`vedo -g`| 2D slicing
`vedo --slicer2d`| |:--------|:-----|:--------| | ![slicer](https://user-images.githubusercontent.com/32848391/80292484-50757180-8757-11ea-841f-2c0c5fe2c3b4.jpg) | ![isohead](https://user-images.githubusercontent.com/32848391/58336107-5a09a180-7e43-11e9-8c4e-b50e4e95ae71.gif) | ![viz_slicer](https://user-images.githubusercontent.com/32848391/90966778-fc955200-e4d6-11ea-8e29-215f7aea3860.png) |
Type `vedo -h` for the complete list of options.
## 🐾 Gallery `vedo` currently includes 300+ working [examples](https://github.com/marcomusy/vedo/tree/master/examples) and [notebooks](https://github.com/marcomusy/vedo/tree/master/examples/notebooks).
Run any of the built-in examples. In a terminal type: `vedo -r warp2` Check out the example galleries organized by subject here: ![](https://user-images.githubusercontent.com/32848391/104370203-d1aba900-551e-11eb-876c-41e0961fcdb5.jpg) ## ✏ Contributing Any contributions are **greatly appreciated**! If you have a suggestion that would make this better, please fork the repo and create a pull request. This is how: ```bash # 1. Fork the repository on GitHub then clone your fork locally: git clone https://github.com/your-username/vedo.git # 2. Create a new branch for your feature or bugfix: git checkout -b feature/my-feature # 3. Make your changes and commit them: git commit -m "Description of my feature" # 4. Push your changes to your fork: git push origin feature/my-feature # 5. Open a Pull Request on the main repository. ``` You can also simply open an issue with the tag "enhancement". ## 📜 References **Scientific publications leveraging `vedo`:** - X. Diego *et al.*: *"Key features of Turing systems are determined purely by network topology"*, Phys. Rev. X 8, 021071, [DOI](https://journals.aps.org/prx/abstract/10.1103/PhysRevX.8.021071). - M. Musy, K. Flaherty *et al.*: *"A Quantitative Method for Staging Mouse Limb Embryos based on Limb Morphometry"*, Development (2018) 145 (7): dev154856, [DOI](http://dev.biologists.org/content/145/7/dev154856). - F. Claudi, A. L. Tyson, T. Branco, *"Brainrender. A python based software for visualisation of neuroanatomical and morphological data."*, eLife 2021;10:e65751, [DOI](https://doi.org/10.7554/eLife.65751). - J. S. Bennett, D. Sijacki, *"Resolving shocks and filaments in galaxy formation simulations: effects on gas properties and star formation in the circumgalactic medium"*, Monthly Notices of the Royal Astronomical Society, Volume 499, Issue 1, [DOI](https://doi.org/10.1093/mnras/staa2835). - J.D.P. Deshapriya *et al.*, *"Spectral analysis of craters on (101955) Bennu"*. Icarus 2020, [DOI](https://doi.org/10.1016/j.icarus.2020.114252). - A. Pollack *et al.*, *"Stochastic inversion of gravity, magnetic, tracer, lithology, and fault data for geologically realistic structural models: Patua Geothermal Field case study"*, Geothermics, Volume 95, September 2021, [DOI](https://doi.org/10.1016/j.geothermics.2021.102129). - X. Lu *et al.*, *"3D electromagnetic modeling of graphitic faults in the Athabasca Basin using a finite-volume time-domain approach with unstructured grids"*, Geophysics, [DOI](https://doi.org/10.1190/geo2020-0657.1). - M. Deepa Maheshvare *et al.*, *"A Graph-Based Framework for Multiscale Modeling of Physiological Transport"*, Front. Netw. Physiol. 1:802881, [DOI](https://www.frontiersin.org/articles/10.3389/fnetp.2021.802881/full). - F. Claudi, T. Branco, *"Differential geometry methods for constructing manifold-targeted recurrent neural networks"*, bioRxiv 2021.10.07.463479, [DOI](https://doi.org/10.1101/2021.10.07.463479). - J. Klatzow, G. Dalmasso, N. Martínez-Abadías, J. Sharpe, V. Uhlmann, *"µMatch: 3D shape correspondence for microscopy data"*, Front. Comput. Sci., 15 February 2022. [DOI](https://doi.org/10.3389/fcomp.2022.777615) - G. Dalmasso *et al.*, *"4D reconstruction of murine developmental trajectories using spherical harmonics"*, Developmental Cell 57, 1–11 September 2022, [DOI](https://doi.org/10.1016/j.devcel.2022.08.005). - D.J.E Waibel *et al.*, *"Capturing Shape Information with Multi-scale Topological Loss Terms for 3D Reconstruction"*, Lecture Notes in Computer Science, vol 13434. Springer, Cham. [DOI](https://doi.org/10.1007/978-3-031-16440-8_15). - N. Lamb *et al.*, *"DeepJoin: Learning a Joint Occupancy, Signed Distance, and Normal Field Function for Shape Repair"*, ACM Transactions on Graphics (TOG), vol 41, 6, 2022. [DOI](https://dl.acm.org/doi/abs/10.1145/3550454.3555470) - J. Cotterell *et al.*, *"Cell 3D Positioning by Optical encoding (C3PO) and its application to spatial transcriptomics"*, bioRxiv 2024.03.12.584578; [DOI](https://doi.org/10.1101/2024.03.12.584578) **Have you found this software useful for your research? Star ✨ the project and cite it as:** M. Musy et al., "vedo, a python module for scientific analysis and visualization of 3D objects and point clouds", Zenodo, 2021, doi: 10.5281/zenodo.7019968. [![embl_logo](https://user-images.githubusercontent.com/32848391/58046204-e9157180-7b44-11e9-81c9-e916cdf9ba84.gif)](https://www.embl.es) vedo-2025.5.3/docs/000077500000000000000000000000001474667405700136615ustar00rootroot00000000000000vedo-2025.5.3/docs/colormaps.jpg000066400000000000000000005202521474667405700163700ustar00rootroot00000000000000JFIF''C     C     q  1q!A"2FG BEQr#%&'367DV$45CRTUWabHScd8Xesvfgt Y  1QRSABCT2D!abq34EUcd"#$5r%e&s ?$H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H뉔dꔾu Z_VM*ɑM0 ^$!. r7ڹ{NMT5L(/t"P:g2E8{ML[kī'͹ڌ؉!mML}֧\fDs"T39{N̉"drYlZ RSGԧ\fď2=kR%h%H\K8MqZZlm.N'M'JKyeؿVڒħA3x>?\WZZ[źR_Vڒg!1v:?\CMio*Z*@gp:WtQ=/M Z[T]K +GugCfTWKf˔aq?׾ӯ*kYٮ/T^KyMș>gPMI3z]N7L\)?5 ]=O;2w2.~XYIrr|λRMf ~ǔZ>ir*juLl\JO9ZW f֕}l= h R_19Z|\skʜNCJUS)qQfcQxދTmRKX~*q? ˎ6\zDGz_X޻@yY9mSlǯEײrj.:BR_Vڒ;,c{n?/ !e`jRVݖ]ou.B-A*CPS)Hkm!:B/A*Cvl3%p.:FlX0#R2HٲcEj&D32z.͛! ޛ8_C[NJLfĠh' e){=U>[uhb&G-jf!m K:kڠ|vyfcGjgD+n NWO;qre2Eu͉DɒYpJw5M;qLio3bQ ][q7˝9֖6%$ 2n*_TYs0f,WZ[Ȓ2 lx_NvF2$d)qX;SihØ^Zd!Y|<%+EcJ5Nj&Иv^^;K-WdU; p ዗G*ۦ + HNdDJ`Dݲ"\RRkz9BfnTt~5AX(224LY֢4 |ݡ>IنLMEr@@@6YMUD]z9*@c"u"Tp)J`C7B]#Qu~3 #/Ia 0HªbP9 _9ZdW-=r(p}j8ˬ#:nJ4zL ),ՊDŏ*rK.졧ܷ^F%y}tuLss`c2Y9bXQulZX-d{B\0utt.IVHdP;KBRf TDiҧe w|; h+1=*+m%iR +ZDnQ,Ig_[dtZ^?(D_Z^Zm!-dgNz01eZ^Zm#.JIwuE6]sKmr/1s X^.bS-dϭ"뛐?4Q|(nݣ qtE'J1rGkraMܱ$6CFGk*#mE<:+L޶p˒4;^<^.jƙ71%#Cw`kKVN:*x޶dAqe6a=55$ FG<ߘֲwKIJXx ZvI(5U&ԟ"?Յ*yc2U7MrEpܲDF?Մe(YHpշn Y#Vî)6Gsn\M!p[mg;,[ WV|| mA?јmm x>no?C"_[Y_[zD~F-E'yMݒ k-CI}ǶP?C#2Z⣼QN-혎LeжDQ~3CN#? [-1Gtͭ.E"֧l݇{Aea-w*KOYR(ɋԗ+Q-lR. %ɍKOY?02"*>lN % K$돥V"r;3҈d&wFh%,*J(=da5(CCQ~K.F>rݞ}^>se7YvN`;#R^D8Md;HUu @KӅyoNHTtg?$'TIdq.'?CYY:fZB~HNr`rg.}O1 ?ENJm+q5 @ $HYjOLuW2(zGA@.)3 p(v.йהIRm{,6qu٢N(Z81@6` Dq6fR+k̕StIݷ@Q3 ]f.b )BbDÜ;+X塭$g1LU"QW@AU($P `K`ԶWi RoO5=;\4Qj)𙊐H90x4oNsMDɚ^&E5Pq80!01}>'Կb_y_8Ga4IJF(Іgѧ ɹYSI>hԆoroCBkԆoOC>kӆn~#I2@R6kFk.k3lD ؀c 3hsELeu6gs{1أ!eB\z(8QUF-QYE4UqA\FchG:Ab31tY4Tq9MݿX}!k#9K.*/)DF\C^ށ#q$T5308g=ܙ&ͣr^c)hHҧ~5!CAz(h3&ɡN;k&_AcoKi$xQg^ xQg^xQjt<#sZj9EM'/=#TKW֌7M9O $H]{i,ڐv[2eX@J<$J6SӉ RESME%8MDS&1NC@Z+hZn$Ճ*|Lx`̈́8RLhA1JLp 3JP&4)\Odl2jqED .`р:6JMgTuvǼ&ճ"HcCps`KBؼ鹵=uufRiLC*DS IڙQDQ !mhkY-2 l??9L0ǟhDJUb+q֙OB\*DkwXJu,MvǓeQ\mKy11- }@Ɣ:byr5 lDui~Z70.pŕ#31@@ۇl[iqA.:Bz6UgqA+wdtYff7j1P+9l܉+Iی힣6NZO0xjL`ip4ɉ^N数c&n3BJ+p(xաwr5cQ}"̪fѫ2N-|\R|̫hk=[VI9p>Qȱ=|Akch:GHEqRA Jkdw%C :B*A J #_XmF: r\z)xoֳk^1ۋGw}o׎_@TĜJyكnwďOCl?jzR̽9~a {W:^LIdw1\dE3r\iæ> 4Ɯ:{S#`U; Qq .ٌ[dӇXL/T]ĵÃqr]g~E/o "llL). J}xꌈljxhjlr֙8!(vjS -{m }<яT;̈K :y%G\Wv`dPJS \joD<稃U .VU xxzlȴu1}kW+f~aKfyUB}Tu-k?ey8)x|U>5$E(w z+η )vd*,V 1Ll=C؍*A&~vrOVlqJzk1[*:"l?j%\[fi8z(EC3d_UtjF.]V ziQXTt\h\ڔS(ҵn7a&&uI#\L5ׂ̮q*+ImƔ<1!IM(9&V녪Fa)\2_xbPSL*L1n9q;YgwM()&VԷ6..Qq.ً¸ˑRJ enk+= 8,Xر*[q"V덾U lO\讏<ޤq[v@U|WE'ѩ*j66Vdcqifz(2& =kM~}\pڐx!e=~ *|uiVyspҡB7ێy(V!g!_T<"uhckLN{Mg!hw涡< ֡xw͉T纴4vaDY? | 8nJ=զy9ʗhz$H @ Q7֮w2骴ّ7U) ,8 +;^W3^fySv*׋H ls-I; csL:Epylc՛̉͟=BUM8 }DUQD\5*1K% 62LeI0`ig122 yF0O[_[3Hߥ ?N'#~gyBяCsiGx)P<(Z1 !'cIǟIǞ)ǟp)(-8A Ohˁ)OANxڂo@S7`獨&Eyv  0l65jB76kӄ2ohԄ5V4cRAF|PsŒx02b S/(9-rAVaJc>JĀ $HQ~5Ug*d@T1!`( 8b rIVMW*[Y=hN7E9_2Jfa3in*[{f`pe }IsO.ZB貕œVF:9H%9)Ny@0[ŕ ^O)|˪|3U r VQ6B%S g@lg׻rG[* 4ĵLAc%P19 c9e(ѧjFx=jYX=3xb`\1j.,2FEV$\{Jǹŋsrn.<&x}imp{X R{!X!yD8˭D3 Cy4~RbR82VܿBco"y~'}*Rr?k[} Ȥ#5C7-feU5Sao Rm9H>~S[PN)?idr{{f, czm_gd/`[ mw"Bq*6a:j6п-k+[B"y>ۑS6 8XK;F0nFw3d -kX}&͉KrCnɐex6^64HQ䆕7d [ 5!IEIqTۉꏃ{wMĩ.(>J }m_څ@I*cĽZ W1*B {J7"uƌHN(1~V8r9ե:Wew`mWmA Ms`__%2K]m+,G/lBMrlm{]بkU~f K;c[M2p- Tbeʘևr\~6KSa5!eE$aIqR. Ad!<W65H{hX _K<]5DmcţXkNj'9b`(TIZ= ifْn- K)ɠhR{q!7`m0Mγ$KjTh?K$ܒ;$0cRiׅ$4RtquJdIF$ċOR-\[uMPS4uKT7R_K2~XZT/5?KְT?K]I'n/.2va^iGS*GMzI]VZ^](n/.Ye;_)skK Z~rQݗhCc: JLB 79$%/xч,_Y].,(kxRFdEߒ+UsJ,?y0ܒRwO׀#Z8[DQ49w5) OXkZo(TimEa qhOXo\smm{_.]fίDx-6KqoBDx "[(=ͷx"0}z(v]GOXo@so "0}z8u;hb[(>Ro(: DMIw՚6рU0I]?9'Bf+CvxIZWh/BfV t"ǩ|btҴ7OɦXʹqjv!KVRA22o+5jo#9؄hZiZ)52öC/-OW;EJۅNQHnhijo#9،jS.b)vxBv_#9،x#Ғ axBv*O#،h޹j<-th6#,eũO9j]rDmiyzv 4UGRerCuKq"\J jkʋ6#,+qx'k+`F>Iqh]q#B5jP}hhD=Z%\kBjT BUᦓ؊n.î5*&U JUVيNiNî5!DberVM1:-Aҫ,:Vx)Z@U5يoiuH5˦X/ JrnWf*鎧uƬ9TO+m%+U8MT]c0~Lq{7\3Jki/o bt:lPTeaY]km%Z!JTmL,:k;+m^)9/Ci,:|2WZIxƳp'"(E=Z%\-g%׵P\lEt] ea YmckKڊCT^F&X녬ܾ঴/MIwNV⻦`kZ^PkG]TGsPf,'Y[A {RhÔLRUthZiZܿ87F9h镋R]VP{;_?8?\F81S+V*:#3A:Ȯv#F7TRًdAU"#iCELG), $H @  pLيmEjdCr6.V@ VuhSv"*d= h T+V P̓FLXLZEFQrmj p&",dOA\e{TaK8Q1.WjBjnH ی~ygڍzU<̤qڒO$ mFǔPxySNSjscuHMa'5*C|bBJq0#71f~XqN% 0v7l%>͚.'X5 y[=&vld]OE1kz3`]PךYR5&9<亦+ Jx: RKTӓk?D 25*$ĩ ]ZG:[GћLfDԨ%\gNf&Aˈ ]PMOt鵸8xΈ&E2*E7?/qbDR#R͟rqSu$iֵ/CU\XI1Mqf$WZ[h̳G~TqLiך0ʈXYkTqFkQУ $H @^[RRRJ̐>WuƥNS)Z:|hiv1E:Ig 3A+wa5,$%:pbm[A_I!gN9jITUv52#D"ɘ2 sGy A-uʯSV"Fv{Lra19.PAp&*2!@@ǔ {Ǐ/g8aˬ#3&z.{xő1 3!W_SfO+;pٴpΞzTP|P&i[ܷ fu/~M@G9CVܺh~1wL|mdNJȊjA*}'f%@:b6oô&\G=CuFeeɶ#.ɓWbԥوu861f5f|x?}H)}0ͳP,hv ܨxX1 Oq+-xڎnTP-T1 fXܨiYP1 b2JиmʋW΃KaQً\2_M+K:zVCóp4Ҵ+iȵx $i~>=QM+BE+5(i˃[ꃄAJЮȥ g9D;), nd VѮ̢wT c8cl%h=TQCP|sg2N_Uٶ"g`/yisVC6_܃qe٦5xd>_S/TŖP?u19ĵN;<:)>~ cu^#v>pӉv}Stv;!IUygM%ɶ"Q{ZLwS`p;1ME^jԣtiE@~GF+b︩"ZZYoGq(T︲ Kf2F\LvG6mʅTz.& ;#ZʊfZiMqp.zbGl= Q?YG 2@ $iיe2pGOE Hn0`%0(@軙?Qm#S,ѥZosӝ≷+S6 ,9flӁ u;*yJ]ںB^񀲧r[2).cSpW5L)I<eI2YtSI 9xD P ];~yS)~:3T,h 6'Tb &QU4fW ~EO7RYܡ*"eK3ᚡJ|LP)"8XצVId$45G6YfʝQ "D@ i};_=}+0݈H&!1uLRzuLSՋ2bɉ.x[ŠJqEB/w1MĐ%-1Q JP 8l' 2YMT$kI5uQ#99{ЕR_ cy |NDgJiQuQ% /#ҼvtN_D 5+G%Now$tNw)r9GxL~/M+L. dVrs ښ/<=_)h5Nw0-6(3Zߚʥ8^i(-hN_EyO?AXU-N_D/$5-_D8;ʦi(_G7,LN41$s~gӟ[1%=›oQ4=BpTͿD"&nGb!Pyf𣊑.!l_̩S5˔sYyIN„:SU>oyiIOvOUt*;=JC3/qUt%ʫqa4{ f?⣨uʮ o#{H4 çW*w\Egco}Q/s"_(J̝%|s2# YؙƺsbM9_!g_Yi.sGyM?d r"̒i'7)djq$Ct+3Gqs|M?dnxE9Dz*3yir)d6'Til=NNG7FE\JLuDzK3"#!I I<71S7yK&F^DwuqELbO :͜L1@̽םF;BN^wC9 ɛY9l>D_o9'ȋѓ7y3 9= NMy?5X~NI%>N>-b??H F⧵ݢUU1# &?K1jt($H GY+xwOUM՞5T]NʩiZ#R,rȬڠW/L@`2Af  -\IyAۆujje%FFyenpY7* e( %Z޽fgdSzbR&0خ& U~ 1L$2g)! ׾ m;2}jYJ%4`ǘ>p$]azT) I”L إ>swmk{4Tu yrK3Ma#cǕ1œL+ 6_}Vsr!W_y7"F?+R/~ Q*ԨۂEa QӮNcj65ULͰ}}Tu Wu~_Y ;"GD>& }6[cS, w7laNȹ{6UVZM y62% "\b7o9#F»q(m线s s'F7n͉$rc}}~>4G L( wMч*r?8_}h2A3Qr!r{߸-M]Ȇag7"Nbn ~Op&i: o}!}}CIk/2Q-~a%:_o}"}/Ik/#3%񚏤t,SK`~^Đ1ȢCoH,gFk+J/a BM^>36De19ίm$!6%%ږ"s^&Jn3bS1mKyEX[7JSka!qOclL'nHPE.ND-%sn) &ӡev2; wfSswattuWLtۊ)!Y].%ә_ͷ݆l.uZ[1%6VvO'eIy_q.L~@QYpy=Z .WZK]mEuh\my.?F>a.ùz w`麴nj4!D埐6_n!Y]W M {tڍxQ2!Ű_gѲsj/)tP. F{Qr2LYzNnCW]Ѳf*5{(1i(m^"MZ Os^?2$Sm>6K*%=4܆ۋ zRK,R]'??qn٧/5*R{1!lȂgRwvb* V|]ߧņ1*IDȒ$H @ I_W3ZVKv髜 qy-xx QLJ`3QU6;.;j pݚ BR,gL֨ܮE[%\ & cߨ[\k`JWljYJ>Ie싃LɢgG7`%zLΜu.333P1V|ۂid$)ALē>` Ρ7$ILx sqFW3 s@p c:v-DUqPǓيj2ef,7TeǓي/c")BZ)[y=mQ]1e3- S{s'2)1\BT}NMR|}Zԧܱ2- S}MQ|έ-ǢLi/3R;71SMcS:JEe`4%M R i%y_JnocZdũLx+m%A}M>O[f5*&U1⽫Ph fscZXiYa?~g>N[f5!ǂ+C%~H^Sf1ѳ˒9ߢ/qE]plreEN4܊uEGQ4V}\hELӠ'{N_Va&UNʧTU} IİqU Mҗ?TSu JHqӜA)ٰzVꊎn}Ƅ9)ZO@cs*^ NOǞ?TYAɖR/f}ckKF=9V J&YXp6i-﹏E2D֗96~e1V>ea 05Z96}cF::u2}\-f h`4)f,'Y[x:iZ 58~d1ReKV&g<2NhDhZIZyT-(I+(5+;1"QibJ!b3I+='<e56b!DNj!^P#>~a̽ƦZkD+|JlŦs ULѕp1i!OYC$H @ꎢ4{8vF[U^v9p QOR8,*8WwTJj+~dkTl\T̓L&p R@EZ\\6:BySTeYBIh$ *=OhuO˜BG)PeH ƦO$) A8f|Q9 1 GK&SU9*j:}%|iL3E AuR>(N(b -VTΞRRiʢFgOgĀLbUNp9H|ܥ)1 r":۩& SZټW7?0gal1ќ>ǐ`o[ո\Y31n= |cY=A٨j SWpu߾wظlm%S)ܯ=K@^bT1IA ~ヌظIuOեH=#>Tw1ob$,6ԃ4E>U4^C[dM#ܼYT޳-᯽ҏ6{#6^j[e.+4D G):nx>o`K.j9M^1v{Զ\Vtm% G){:nt>ٞ`R)q]fj9I)m鹍51.麵d{Jj[e.+,αk G(۴:nl>o`I MKlwN K(:nh>؞o Kֺ G(k!s1yHJj[e.+:ֺ K(+:ned> KΤg5έCDtܪ|~yԶ\WZJw\KxbW玛W KΤ!~.hp:A%5-Jio Jܡq*SR)qYԵ!io F܁peyܰRI&'L͐|zn7aܰRIXi2n} HehTo3xp/=Vꆣ 'NШ|ڀk2>Z,6} xN;+ByU)Y}jJCnV:di/)3j7K5_ա+R^1"'L4xe^Z!nV:jGN'T%m*U2ׂǖ^/3b'+8>ڕZ94ek%mixJ~gP_ tuU*G3/^R^gEN_ |uU*Cv+ /N!/3&h:*VGЕzvZ@z^#m}++ zvZ KͤU2<3)dX#RYEiUJ;%BE5F_ vuT~^{v3+ K еSx^{v- rFe~Id!QmU 4V{v.\YZB|%!P)yEihR"<۴-pZirEekpRY%mTMs*'OB$FV!iMPS7yDhJtvBȲ/ x:n#y}>"2l@NꝩyDk;۴/jG!?GTMApʈwhkp"Ns+vɾI󴃶(N0 !zNnRien7Ɇlކ蜟u\-naI'+kv -oDtN QkwhIgo0oa]VWDwpz1zN4h[#Ydִ`ꛎ!%ݢ`"lZ3ߕ :!ya/H'"{[#6SWRi" NI/?/7>l[ۼ219^wz^5;[e7WjIx@޴ȣZnP"@ \JŢ ||[2fP!A52(,(8qkU^ݚiCG+IBk2Dpc2‡a8%0>ԹBWVijaCL7eDLp7S43W 2N zVi$ZKg' PY'Rz2)PUQL3;PD@9PYGN;*ito3VPiɫbi?IaE^&qET9R8Q3nVгՖ[zwK;WNALjl yˉ``S%s[6u5#QV5ƛ!3IPhv>("Ccj]GR\dִJSy.,aQ9 j&9*Ls̒nuMLjZlUfPb9:~S2B640GhB.BF5+jך*8}1Qu!Fd+(6J)F(EuB)C,8\]MK u HM7,,Sq.R'5B B ##" RB҈)ahԲд YhZ0,4-ZZ4@0!a&aG `]01xAbN riyM- z"E8r,4BŖxg (q H %C? +QS:aUH8+'t^TO`~<]DT$)) Pİdi,T8IԞTO9:⥛,E\.h""D 4`y&UUT7t)Q:@8gI2E~ EN;!l $:1R2gN *i@-^eUAY0Mizn^^)(lF1Jr(sDÈM•x`ʦv~*E_@2is3 cCI4K)Sgs)cgvEHL㐠\P>% 1/zNg_.hEs$|iCS9AȁsUD3 rl)k)tN=AUHU\5]A`(s~i!gm]s%23g2 q7@}Ds4z{,梳d\bOgD+^$1I0}B3_5Q{%r$WRu!*ܨг)WI>wS_K7+_x ;j'؎p uܰ}/(kmY} Ҥb)]΃Q~Qmȕ7hbɟл'G8w: o(ەjf{{;oyv><ݧ΃[*; FdZ̺]^6"Z:oa@FA)ZˡVk_1fZr]֝ WCFXqqzO/ل::{AZ&~; BӐVi ^ rң ZvF/ JY4<:Tcu3.Z-ݑ"am W=*2wRwuQ.ȑ}yh[wZZSEזZ[oZ96Z3ӥV{+_Yl*97d-,z&UJ7P3?ټ9dW7SDήY+*Do,6vEpb$[w3ZvBfhP= Oһm%i /4Of(8 pHAVxŠ^HP#0-̪amu'(9(F&G/)6O8ﭷq4ג'5(G~j=mv"I]g5(N_@v .jvbIŋF%QAhV4ى$:5uģ95SlPZuD^^XĐzr(:8d:I$1$'*~~s[}$P3%G/+$TNsV (ÇYmDוZ2rx2>ѥ-F[PĢ$f:rx Υ-+ԛjP<pă0=c{,vhۆ %fia4{һvq~@k^1ۉ'Ħxb7+ܷYCLwuws)1o[Z(%e J2U2+ gUvUIZuRNWw\CNFOϺpԑin?njINU#f37fn*./ IhY׸ ;VD;@} HӕEl6j4 ŬxnВCwj X3 2@.6&AK ( uM+CD $H 76L2Ĩ'l:u?em7KYϟMVDQEbDA02"C D& k&饬׫u c+;;hQhY5@ r5`7)]%Ճ( n]bjޥMԞ8Q6֟$JV8aJc1NSٰЯyE>W:M&A͌*u)r$ [w%YtUgԜihdИ.!U"S Kڊ YTտn}p*sZ?FQ:o7ᓖ^,p!TL͒X0^jll!oS9nx[O;hۚ-4Ê5mZbFZaaZbFZbF$eM\xٱJ^H\ԸfE)zzcM QHR!X!HChCzbЇ 4u5YՄ8gSZWS^!MhCz" Bׄ8iSZS d= & ZutYa4;1a/}Ya$pLd9D*r `mjm1ƷP_81S?Yca>DDG`5ɥ˸i5hf\tIO`RpJ8MTrx暥)0q,!f2)$5NЄ!*P C(P901FHCї ivdN>G.'1oqԞT!J!JlTnSJZ~Kw#rPNՇ}Yí?hōgXhKP}eݴ`G֨b9`?OOjCU0m_fu o%2̐{5L;[WjU4}]e9J֢[uo&8x=e:.[jIR=)y}%aF~xQ [j)6,OJ;)(6del\%~beE}6PJCۊ.ꈣk_?X{KHM$.ͷRrm}19)?XI9ݲd:;|k8umܿ#;`7U0rEyd:#pjYjϹ Tb`JL6rҨ R74j9y$M%amQpoTM10N^j;$$; 5*?Z5IT(毳OI&IvYKP&䢨Bꓫ+_gdLeǒT]10&\ZI%$@rêJ05JDe-L$HM]Rw4:yS6 "CLPr9^c&lG"djTWUi!SyA/1jf$5* LD͂i32VUiqSEШN'n.T:Ԓl\\a0M&/OOS`2b`$4#Rb":?uMî\}dĠ(y!%MbGe4SZr#&-'$&ԗ H;>>9ԕ":fFTX0!(1"?Ik'ɩsTm:#̐db9KY|T:\LJQBeZϒGJ$uCn2bxy òC嬟$fg:䁵1prH0kֳܵLs:EڌuHCmHktNC@MjQ ²tYjSt?>\ Jea.Bu!ǒPyA+.#.!7r[(Y‡ed7ZMdâdԊphkX G e$;-cXiaCaT벱.-cKE/OT0mTD7 ;#.%YO;ږ;Σ39I}k@jaԷ0AvS./lYJFvVKy_*0f_Z]dGeDd1|LC0r! : R " ]8H qHk[:e J&Zԑdѻrظb*"!EK μ>T&ajfo]u2f:Rrna HP4v y~f*[=LYTC$RRR$ fRBDR* nL s &3*Rn%. 7/8TN_4<lL Km Ra`2)v*ASnS պU[4tfs22IܹYcL,L|ҀжM.uyT+qUvC/Vm6#&NfR2?C.q^2ebԧ'av=|Cq DըSMx9E~NP3&amX[!=Ɣ?)))cx9~{ӆ|jyˏVK`n /{7q,4S.Gh|[*iC^fȠc=F9t皘dEOT#l+@0r8EܯK$5w r)ap-]>wn_XW0rV*rۚ<@wl䶵;fFܐ[wV]흕ֶ^srY+SrZ0m1ְٔL_b0#ɮHʹkޯT1}$F֗Fb[;՞y1}B\JsQK njVyնcr.9H YP'9kfhá4+î#3I+7'%oF:"OVaS3P5S4ate}\Cv0oN͋V5?Thãg,u7m0BE3 2灭F8`E\$ZrSI7M0BV4p7ThCLRCtKX51^2ebԤ1q- PP>cJRƃP3hc*) c !5Ƅ4T@,$HR'yj*&Ar"J!標rbi֭)S2śEf3?xH (Q66 slӒpz)z/ZT\[Tl!sDLD iOYY]%KVu+H*)򓵖;tHL@Vb)8( BF(}DQQw5AhEbCLXLU0PJ"8LD@9QL)+dƦ%C EaH aaRљPS5]@VO?U*6O&dla-L*RP(LLEJ(ሀG+r()ҵdR}4bmEܙ V1 BU UT DL&]եCHI8 7sxnva3 tb>}䄤 P[[ǻNj.,x璪2F6"nw[cō avl-%MuSyeVu EðۈyBu]6K w˝OVa \z.͛%ĻRaUuGuhvp7^ frwnO,9ۊvXmn fqnuյIqU\We-p~P6l#߭GwqUl[p7~ fq.qեGwqUt/2nvl-NϝEgqUzKC8]..%ԭʡ򳍸MKlց:.͗VߍAgqYR6\/ e {\ WT)qq*9j'늮in}NWT)qij'G?\Uu=KȽ9mSlĨ&t*)ؽ,%ğL'?\TvS]v/hk)/mIqqg!ߺt^?h_ն˛*; )ν~еJ늮jw_/@եHZY,n'v6x: R6|?fNt-$늮!OW %Htx4 @ 4۽M_!*ufYEX' {&"TG0pwޛ8RD.'ٜZfZJIFiT1Hq*,~! @@:kh&󩌑JB F׊c`eLDC9S6x/=$<"]nIH1jS$L 'W53`.qSaܚQӦSRbdT08~VE) I#-%U8w'Z[?{H*2#,QN !Yc*&Pso-;~q7)jSG;773ǿL+g78ny~1niKᛙH[ꙻ_bǏωsg-d_ ַ9wqWʞ/+vE9.alC2]˻^s>u9.љ,[0kGUNC`m/vcY\>w&^zd<*o]Yb7q]QlQT`E-07q]P%m\'.oId[f>Cw_(<_s}Z[*m:*@u zNm'-%jwE{ٶ-p'ɮ-%jж㪣 W\7WJٴ-p'ɮ-%jb WvP%m 'ٮ.%jmCw݆42iD }Y]UlEwau;m7hZO]ZK@oGlEuºzvnп8}Z&"lB (nеæ{/xxFT6"-M Ate7"#|]EE/2o@=ZKPgKjpAlBNQk,qe (a< f_ZmZyBc kPq; Bb;mZӯq-z:A֓Wm8Fc-%@;T6"r+m_?v~%H??4X꜆WY=}nhkMGKImQ(,WY=}rhkMGKm7 {FZiJ?gZ[rۥ!pي"AkLKInlK{D˺~Ĵ ƒSPي% ZaN7gZ[|ۅ(: M}zhwTOlu__ڠ6wTcİ ae.:+jZYV5Љ}twHʯ ~.Ʈ걬xL;馇Tuj ZQz[%M:_ݪ\/EZJ(5::+_2ݪ\Ai5lx'%=01]hXedZK-%P@: |d^%d#\{d+X-%"PD:|9 yQωii"OIS߃v _r/Qωi)@O$hkSE"Y.%,Ԝu;Y&){/ZZdә@/BZ%;t_KUEu+'wOZJoMechdp_ Sއ+3OĴ =2 o Y庯HpŀBq|+nc $H/mIyUI#ͦ,Fr.2 19>n '8C >e;ByODx%?S(JpJaj)B(NT!>hZPj)r Q*s Q*)DB\ s”R'ĨBP)(/& N)B %BS/KD)D!8ZPJ%B煨 OT8RPJ!B QJ)E(Bz!j!B(OT!>xRPJ%Kj)BS(NT8ZPhZPJ%B(NT%-BĨRp ”J QJ)DJpQI$Hnmcr'$r)t"9ITS))J$(y`Ea+ Hѧj&}5vo/g``UcTN $&*br)ALL *Pԥ7 *J}JZrw'4rϚEb EB(A+I1sq0=*ŞUulZi*|LnUD6a@1@J ɤ,xw1jE$+vrdP.0@ImTΝ@ESpP.0L3PG-ɦ.Ja74#P2X$+*nTpR h=CJQ@9V][5Cوq!_Nno*'Ss&.\_"=>g5#=Uqn1iW/I/ɫeq椮Mv_Ue~1ae7s 2N6CT,;Sd7_eq5$Z\s,;.4 2ZN6NV_Te~1q%;s d-pRGIզJ_Te~1q%< dApRCIG ꬰ.$'a#, QO6N2_Ue~1q%?s lApR}ip&_Ue~1q%noHa~jQO'? >.bKrF[\t[vN }}Y]ėXna]#. QO'>ՙeߌ\r7#eJ/J%m>'ՙeߊ\Iu2Zy_Ve~)y%; n/<ԢtVێ|;O˿!7eJ#J%m>eߊ\IuǐnH. PQ+nχ vYw]eyt_>Z۲sy}]]َaEApRҋ[vCyzYw[f^05(]( 2˿;5H. КQke>痠e~!q%փke \˃yzYw[hQZ J-l9:, -[(Z\sjuzY_/N[j9qZJ5lyYeW5g WVˎ|)ίB+ĖaEApWVˎ|(NBʗla5i SV˃6qz&Իe.aEApWt S6.$ [-ak9wG^.q%jk\(ø>'mK^ImZQqτ R햒[oyp[DpgJ=pNy8j]Km0߅-pS4mz6Իe\ƩzEApW4+q=ףmK\Ie 5H ྔp9mv-Qtx iLWd<^cj]K(a:E_+1\;y6ԻEќ>" )1\+y6ԻE=(B=)\sͯ1.q%1}"-pWkq9&ڗhSӞF +:S5¸3KmKyq%1"-pWtkq>^kj[ˉ,6jp;^kj[ˉ+95k3\+q[yy%0E8iMW Yo}Ėyc)p7JjWo}ĖI90D03Jj7+ˉ,$-pWppoyq%a{$ Retpn9&WGܣiI$HnS5Vzژ++r E&b@@@p*r~Үp}-r@MXh~R L9@ttr%%]ZU<9% ."sCqNjomnzM*MFdq& `HsC6[I~{YT֓Jph_;DȉE31$0)ih 25$2 񁃹x8vKb& * l %3;p'[-ĢrK5.Zbջ$VKɊPK̠qT f5u޼3WQBd6\ZF8 %8B"P Bi-,[>_%'ҋ*|( KH‰A4 ,b% Q)IBp \P!(R@J1(KP8R@Bj Rh(/N5(/N!8Z@BcBS Q-IB\Ђs”b%!=0R@j1( N>xR@j1 Q-Izp)腩4/NP %8Z@”j' Q<)F4!8RBj5 ”b Q)F B|Qnq0 $ 42K]KL:LȮEU%!r @-MK?%2ƛa$f)턔Ӵl$b1]LXQ s%l0=Ǡ2+\އu2JY|e9nͼɪuPEE "R0#>3Eڈf2vI&ldlRE4L0p@ nBMY 䵓"d,LT+"hy77k4m@nRTQvh)bKH+Knʩw"Oid*I 9xد;HG:d6z1A0 ]JrwcZ*),=ҡ}.+;m8Fkmt~޷ ǺǍLXrB] & -`jϿ/N%l!螭ωq2ߝ[pJ14V͂u4;>%vv> +΄Nsf=^e;tR54[6q.&[tSWɽ 8.&ZӱilU>}%|йl'WgĴjO~— ^9"ó^L'tH4sOWeo-&YsnTR>wCΘ2x>j} \;!\z++ZL?[vgBW|g²E"x>jP_gdtq2ŞxCTM%pNN*nHA ˶6RRK-!I'C ˶ˉ{ϣTM!p^%F0lWO45J—h[eHeeʮ|=QLS{ \ӡmC*²eS>)-S{ \5 ۈ|&RژV]\LÏέ%71:mu. +..&T^)F@-1eeʊ~=ҡ^a_*tt0lPO~ oa+BQۈ*I²e=?S7ެ ½6+/.&Ssz Jrz; 9eXLjdUաm>T*^~8§z-Gðۈ/SB\L* MBV; !OT-&RUK b)-GXVCSHT<=2 ꐻ6dT-.Q"GM!ҒBGP|~$H @1JV&S1r&PZMYt|EL0 7ՍdҋQSE/5щ*f#:ri1T[<1a6*#2'!4rkR9]{"^s,DqǗKfОwΪr涪MO,+fi3MRDi͇帉3O4`۫,XOJW/npTkQeT%n\HجL1NpLmҎni\sp'ƦIW( TT!&HJ%G8G8²jRSʣvWZ?ge6nva sG a[-ۚxxJcLxcCw(>ɓ% 6u {՛F"ZIE 6u \*{Vm dwEqi(?AY-e&4dwCMqmO@=6,ƭj.&Mp<V.j Y-dukQy2qaஶu h>fХխJ\Lx-fо5Z:]ukqGBu]6,֩)zy;]֞^n+T/]3hZMjR'l+?{7q]CCu]6,ީ)y2zƳw(n e֏:.O'˨ /{p~ e▎Ժ.O'ۦl{q]i#Bxu.Kɓ{JӴO[6\[;uZq]m▌Ժ\?[jp讵odVX[ !i/C-?u懃.phεoS[b.`%i7öŭHbCW(<՞Bu޲mR4W}2䇃ʯnpmZW};r~_nҴXe)hG\#>wZRC2o=%e'dn0x?|bx..NxO\Euu촗ZϲӲ +K-sm%օ:Y{Fs֐6^)hJSD닓7;ĩbK- JuXqrvnBFstkAҽV%\K;_x/lEuֶRTUaWh'lBr[XRTUa'h+ƈ!I.=N/fӵi'K_b+Fg5ԢogL_fnqKRپ[ J{Ŷa -pnQ{7^@>M[f龥}䶵xwOWfߢ({F߲^Ǹل,(+R\n%ķF71]b-OݓOkǰ? $H @qTM>:3QrH,%AUDˀiL8b8yg$r*YG4g0*&,e%UQ쁈g/j? x@v<S54tT*[Y" D1bĸ +Krjng2bmfMj9(c444 AfU\򞸶s1x32'j"Exnx@ q3Տ@wqȪk 9.3s7ʹn=%T\X&KeEEקn,ٴr8QiPHRnr%!e7x%czJZ<gW'^zpcE\ɥ%=x\M9[bM̜c㆜e`hqFzU_Q大b6Va5r!-r;ἎՒf箐 i%P?yP%$5~,3gDr9ZvPg#]&wrLXwb$ܦ>OJZvy5 Or"J}jzjlIʂ= 9<51gHTUTS()蒐 1'ַD<:%;]TÆ!#Pd$̬7jjɐ#,Ӛ\_J(*2ޯO;l1YM|}`Bc&LʘӼ{uū*U3aFboc23/ܺ+3c[ϷF(XK+,j߹|KY@]>1MmpܾL>}r/ƻE?G'ś7Qz?I1#OX q?&NLeخDVE3;ea ^,g2gtQܦs0:xv.ELst@chP5 ""?bAq}J*[JW%N91X*BG@dTS)mG0v/ xȮn4c{\ rDbG]VѢ$"/'RWvK\[l* DoRW?b-EA!ƅ+ ŕZ1Mە~Pk3ߚ.P{uw`&7c?,ToЪ%M>%z)2OKNwofo;;QL}\qbLDDwҪy>)5F"h7|(;L Y=̬emJ iP#BPTJGYH{qϋZ>?E߹^7Q[nU$o˧&$P?z` EL`Hѥaʬj/.,gYIΌWҧ\;ݮO8;E*g*\)?D^OKO50Ȋ)s!楪䂤N:bW>kCMEĈOU/)d% 2k["+u:!iڣ<{Y\`!?wy?ŕjj~@Zv<$ʖQ5.xt;5Rr#eڌOϘ 3Sh) $Oo܈oюXj=qiz#7T#wIXѤ q?3,F+>E[ G[ŌSU,GhNY6}.wc:Jc@c7&!i]$G}Gbo}j*[ァwĊU |te%OEo܈vF#މUS+͆ @ $HPR3Sc&G#*"3#"sYˤH0Nc%zK@ߒi-Yc,d}0 MS 8 #L%f*zn)2eFcvwm* TTS.W

ngmgՏ%Op[aJB$#- V4gDT7bTŏŗ%6uԶ!m% ȦHG 4 ?0}!7 q=sOIDW,:̥.p¶LsnI叨ax)Bib 1yxoFbIbw"}dzs?pj(Kt,TsjSʖQlI7^&/O=[5>Pk=2Yj68za@ b2qZ֯ƻۓ$ibRgl'?5Wd9gז9TM%*#n<,'@Rkd%n?U'I(Yn6ɸtʨ=unf3 >LRtDʪ$Ί'۰G `C\O9Кa9= n#W|<̅O0l#s:R#Zp.<{\z$Yv#_r@ [&-/`'H#8G')GLqzI kE_4lجv=c5qDʛwa``7j0Q.=oއ'z&&dEOW>d3D$^QG*v 9D:V~73 8Xqf1 B;p߻̧j} сa4\s3fQ_6Ո qD|&ˍ>C|JZFAJb: #RMElE^F3-8&c#\Z{%ɥ feA/ lGڡ9?<]$Entak8_Ga\dudLòtrmlfu9H<L127IҰ1LIO>G+E*ǃ'\޿sO>QeprWn% % %?Rjt'(9:Cf~N*"|"H2]k`JqzXe18}2G$LH@T"Tw=+ڎLKn[4< )n aTdo?hy79&Ac*&~TԴă3 ={=+͓t됣 &0xcGRԴæY!8nO}3pfY&.F&5=ݢYikųx^N]R@rԏMEcqeEv%P'1DÔ&Lw5v>Ȧܞa]RsO4$xᆐ@Ruzf"|CWBR$Nw<ۓZTZ5jtG}ׁ>^mL_b|J1nFbθCYϚ۬&]F0؈PknXIJJ)튫qo?)X=˸_/>Zn)J 7j9|(X[{ p]jF./O<RPpaɍ<1G.pu)ET%>P*&V>3"e#Zy?pݶJ+:C3h!rt3!9Vr1Dj#?7JR*"fb'ѫ B;RTW*Yv9=SARTmۧ;_/Ec]b.&tbiZy;l ?(0$`łe-thvE{yyQ\ >"7}E8=en5tNR?>=L>$gIņӆ>slT@VSm ~q ʅ5z 씓hٕ3"ekJajC>Vjbr}7+j_!WQn MOp)X0C%_/;4Ҧ/D˱rXSG'އW nl&W64Dj{ (l#s&"nثS\pn;S&騵*L)Z^=ͩ9 ΨHM)# "^gk"/]05 l Ɖb{rãܢ\^VոgLT?x`Wt̬f'VLi9N]Oׯaa4E%F#WМv;UF"5V9\g2yɭS>c1 R=:(~R0rvZ::k/ڽ~A\kE9-䷃!kjQ%nC&#`И1) "7.'NipbtXoOg-t^,Ưmb`EHXkwp 'OxZNߵ\"G.)x1,BZ8:JR=z'"DX6VLYlQ ꭻYşRBtj(}Ni ʼ LX+P\G0ؕL^ԕ5O&udҦ,̱ÕHW\MUMLJT$(g9ouG¯F7B?2iPG*ko{X1A~I֩c(]K'&}_֡PJ$}MZêUIz +lo5'D4~HhŸcAy-U{3 kq}RG/?FsM1+8y5Z'p_D}GA/[~֧9Ke?ky ~4߬KOg>?pXmx'#wK߰!댘>ߢ?nW7Ü=r̨}gE>t ;cW IĨ>?oG/O\éY6~?}AG\ X 2,?cSjOT{?xyâɿGPG,y==7w.z*O fTSzd ~8^QMw-P!i:_Y__ԊK% Q>差aM/Fh=7Vڂ? _Xm跃Z?3Bzm?>lNyЇof@waޞMZêU(z~?h¿A>O}~E?_+_鏤`҇ )IQ?N!J~7_ѯ&~NӓOaoQQkkSn玲??d7?E~пI'PL?o8xs=-pK#tg/AǤZz@ $H'y.L+z3yEIȪir6 ȪSC&8P9A%09O`R3J܀5FEQB5f4S@PDr$&FS@liIpJc5a#`ÈVqq5U-TǢmQsr}97gZ_ ?7r*t6|B9c*e?miavW7tT8 cʰ pR6[|Y"vQtKqgF!G(2tCM-Q<$S bo4w1AEO2.읿)\\ OD CƎ:J`Rߤ3iu][=_Mw]cYbMA+zdtه3%6?F'8cJ\py[ ~`*#hci_w0fE4PK&(⋻~),#TL"cB}JGЮGBzkWzrxn5ʭL@CKp~vqgFreOd%'uBZRdη\ 1p##JmUѢO0IynV4Ly"jfTI:"HI1+!Č͔>GIR1|"pzɚ_zL ~,s'JG&O(NE_q d~LPR"?-? `@FSh?- EŤtD6aiɀ?3Hx1}'sM); 0+,-1G$9VS;>yAQxq,ͤ666g'Pwrģe%菘GL)`5(>CrFC|v^9O-VX@qt,M>'H`"a>!K~SyL_C/ZZ[B1HPnjm0GMcqjCm ( *čOsZ e p Qp$4}oP8 3iǐ߱5YGc[,gήG0&K y|œ(:]H/lȢ@ sڎ!>N]~:ǚ浈>!傝aA!hKeA 5M4JIo?TRҪd4Ǚ\AGT('ITXi6')lm8w} j&Ⱦy~m]<] #pCp6BM65ҥ UV UŏfrGJTQQ3/(tt\Z[ fd9xeH8e( &3#2CSOÌ+9l_D]SH2͓U&b632:i޼OR4u3Kߖcͻ(p&֦EDE(#N!U4]؏K_0}_hrk>o\݀9G+I 5,V.>訝dz@-NWԱWj}\J|q%0Ggn*OqrR0(o˗=JX {^ A踳,|xX1釰|rU4U`=?NcZ읫_ŒQ>̢J:LHoTܪwn~n.MZ$(T0!G~_)Hp]'ofTtЗw;erat]n珏˜ƫW'f$ TLv#ښS IҸ a!.k<<-?Ia>j:@U% 1+䖀F~s* Rmؿ[OBGݎ$H 2m1ocTbbP(@<ɑ9͊(lWFW3ZqܡWmܴRh 53CJM.c.`?34wTM)岉Ću/@fr lNVF@r!*9;RZN];2mJUeKY2"h(6L+3u`>apON!EYly$cRJf5BmJ``mDM`Dˉ`l 06@smZW[IYtEgI1+veBwnSɡg+H? "Цɦ.s@p(CU6>lIzCğ@G==O@Є,!JPǹޗ>HrG|Ґ7eK"a+|h*GNOz<:]=cL*o[F3>h=4 J\y z9yȖkcnh]ď\SH˙vq'Izebw97Xr΋"ň9t;l9=mPpArFݑ ?r\͂`j.I1)z1>$|D5Q㿍^Odn=;ԂtId5ay4ߖrcn8)$]iז/7g YAjWFf{F \"Xiט\(=G/'=2Ov*Z^Yg$̔jlZV'+?HͮVU[cU设O%ْ`}3!\+0F{ْ݀=A!2l) blE TiwYIAM0ޅ-9EͲv?YI?K9)2aDnYxKxQhrf T?Ir )t(DSliE4َ3nORÆ4n_[N~);؞L%?xl5WM@qE4=m/xlWMTqbJ-.ѵ+PD]̋Кi.(?rQҽ퍚U2wg[1$DL8y"׀Y 6M<\bDky|?(3NGKXWۺ |D\dEUMxu0Pl L[z|BbF J! #e%2J|@bE.(i8&ʓP@eDt䗇a a3ߖNg&ΖTHj%Q&7$+ yy_Ng:cсFeĤXܒlxH~Y(^JkT(ʉL}Rg^dyW咃٠Bmij Rt.&rI@!ȿ,mOQ4j'qp#/{Hя#hBmǨ>H @ $Hѯdnݘe rTi Η$u&xe5@9Yȱ0-@qF֪}.i nY-(].V+LA\D2`<o6ַ/K>U|Kkq|%pE6nva sG JiGG{X0v,H|&K7<מ^0i-2C.O%{/wQ,;mR‰%{OwQT; e M/^PI]{{8MA&Y]6+Qry0^@K\y8U閐ڳhR)ara`?Zj^YCx(ɦMw|֦ tW~` q%&#,.@3mjǛ~+{Vmq$f$7TY>]BUk9KAAYeD$TVxk{밻Fmq(V+rIu\3߄2.ћFTJ"\ﲷYYKPj%s裡]/2P}\(촗q0^\7P"xgSRbygc)ݓG g%vcŏ r=+B,,n%3e56c+ڹׅeٿd:Nz}ƦcELy hT0do/%+;I>S1"zjk¡)T)} <ܪuF,YxˑRzI2İӦgCrW$'Y[xTU eaMҗ?TcE\]en5QɖٰzVHd}\lBL]en/N}~ŋDRKKօ)2a9 =-ysF,j\,:^dũKӑ̃?TbE)u'}Ƽ(Q+V v\Q{7𚩕\DQi!~ɭ șTy47Tf ݓMxЛX܂hlpH,3iݓOAn]2mh%yL é<,n&)T#FzlpLGSE:<,^p 4+*0rH&1}9M'EqLi]U9› `2uƔ:VL ĮXlpC\_@RR%\iæ(3o;X_eJİ8tfmWv68Q/BR,:N;D&Y]/;ѳj1(qԒe}\i 2$wgkgaBêLb/â).+qD= fЕݕ RG;*}:[HxMA&Y=6om86U"utle+qy005Y?]Dگ j2Fi\(U>)=6duG-b> wM:1"%'av\N`qVCwMպ1#a '!mock7qe0SR䚇mWɪ8ZuS7qi񓘵)U-6{S @ 8*V5<ګcMHԎd^Ѡ$GQQ@*pa |$Z2|ʯS"K͑P2+:UqgB XH*'ԣY6vCXFĝP f}nPD깦z[$2 w,d :R]aL $*3(7@HJQRn!Em:Je,n\Ҡ$ūRjVĖ8!@\Ps k.Ԣ޾075jvL6M7 :9((9"yQ0G0@8_Wpj)qOqqĿU ss3v}U#H$ țXxcEŏc?}}b;,9o68ܚ};GWhT(]6MҒj@/p럻EeBٲaƁ 21*@/1h;Ew`ԡvl01ҽpc[Ȫp6\aULޛ:k|xyAQ=RfˌHb&G-a^[!^;Ȫ6\bEj5N:Nv⳨Z/ðیXӳI+-CG.v⫨j3ðیXdKxZ7n1AÍ6-)>&mׅv+>j?+ۊDZbť$3ۯ JߝD>6qEQ]qS$Kn%+[aePqY\WeeD9uB>qIld-3"fUZz:k{4[e.:1"UY1[j3#*!6\M)cE2o^R\m|'R\1)_E1BGME6oڊ/T[Nr/h(V,h:ޫs-=~:g1MPӚm9J FrΦ#6ņT[m׆%T΄ygRqEȅ4Zmׅ%RL(qIZm1IuxJu}5}G[e-HĶ PqMJRayi'A]&֥RsuşL{qQj^e#;}^fYEߺ]1MkR9֖ LwsgMLkZ&W,WZ[ɖ..~鹝c[sS :ErgZKy8- Wɐjxe=}^_e$,cΡ pCSve=}^^e#e+s\ԥ n){:(=}]pz p!bw(O١m§7(T5Lډ#;}^^CQV'ss+]> SEIHiך0J)rCۅNj\pj6qJFw^NЇAQ Nf˄ήt\p07qJBs\Kye% fȡ߯L.vIHNkio4a dvl:_U!vyIs-<,ɛ"ww.Vğ:hrA_9D~s\Ky})떏C>Gُ @ <7ɢ}hM.k+AI[8O\2;ėNBBdr  EBTUK7K%ZpIt8TT:fA00@LIg'E~.%R˥pQ8+ 0kJdv-Q@Tt̂K臲٣H$'t#s(3q&' ҹ5VR3YAWH[NΫ&S"̞$id7$ pf G5G|';ҪZ㺩_*IiIh+g1q7kss)*#F+/d2d@+ ' \ # y@9mZ\꿢h~' >3q-M0'byp(ߠĉ~[\jQ4;|ߑŋ.Ly3CC' gT.>eNZ:},n٣$7ÒYz(ˉZg*}-gi'sdY]%T(߫dUQ))HD//-_ 8 (D4_ Ҵ/JH8|V$+~_? =biՅNoFM'1cK5=(OÆy;o][b?\EQ)k0K˦YId|rKogEaC,~0埀P9&|WN?x]R?gd[Kzn![P88* YhhɉGI9^. &Li+ur[)f~JRWKĹVPxۨ.LYMv])YN. G'魨+w0ŽLr}MJRSMlcފ.&Q)9SLNSCQK,|ʋzQ>3hb`?ZV4g>f;hf;%#*ĭtwf* (dem]Kt-*!9&]"-hw7.z4cNjʔ7); EvٴXLOYmvÒMfX)>ћC֠]hcRӦ01MOA=2셥Ea+.Ю; e|XmvBSM<쓰F[fkZ]QJLISيϦ(=m`$XvdZґvbڲ0>{+vih?%~j_0;V^_&?|蜺fҠO-+C.JFjM9?<Cs( nd)i !rR0;V^f Rivɀɀ30{0:K9E.JBj0bN&"ng@:k\զ0vNjvQ ?iSu\ )bxt=tȡݒzh*L_uJB9*O]7L 9KXT-+)'!_];H ;$~*OQٺEfcq"qF<0]NIsh@P"q$+~:>Oݳ1nu>Qb45Ef;(J]lsn]>xJZ5~դ[\ P6PANp'Wkr/^.]xM՝f&ĥ#C&/V.mI3n6 y~tKw2ޘ(l$nYwY1_*߉eXMsrUàO{knX+eazk R|:ǂhcNL?.M?`:OU٦**OcY7>#U.ZqPdV=+Pʶ7U<ͥ*'Yo-en ֎1̪hۈ<Ѥ./kd*;2GWq̩(1qjϦUoYo egN;}GG6'Sσ=~!>~-$H S7JWAV"C-vY˦;H̒^RR`*f@T 5%1E) h f+:.Nu*eUHJe Gi^J*}FbKf1}XaRg@ ^,r!D{Yُ$%oj-3f96)$ 8#Ӊx> L0@OHw~ff4ܹ~ƽv&(U>@B qD11@5;ט1RVCbZއ#]glil(QA|RPbq,Lt=V=lTWoD]<;O02Tɡр18yy^=l)E?ؖj,_ANEHCL[;N3k˓<8 ?ڭ-DJ693rb&=fN_7%1#G&ӕ)31qF,2R^Y~b_:Uqa?G%UWL:~1pת>c2'!, D_OJaCVʇ87 ̋GQ-ɋLm7kh/+AٌT4\l3Ly嘋i rAيnA5~!QEycFVPA+}o{' 5~!QIvXCV㜵Ov1& LzPh&7,HV6ٌQf*yU b{ Q̚VQjƩ3Wn`̶GLW U)\LqRTMxgLnKd׳<&8>OPYC>/$OFǪmtd>npAg섿 puaǪJ5%GYZuxD~Ȩq)̘omQ:J׮p! "CF۲w($mPs]bW ofHqꇶРIܡRj\w,7f $(C %סCCzט ~5pKL򱃰Be٢Cz46~5{ye!?f7'~"q&"C2?.,"g⟃rqDڋn-~a ӇvICl7J(\'PC4tb3-2$K aK%zU8ҶĊ} ~ F;$K Q3lW}F?[iM(2ﲟkS+hDžF2H_4fV~ o.ʱ gp/+1 zTf}&#s{YKpYo\jrL%#v, Ƽ1 u~θӇ=rL6ۿׅFN,aګ&2'w~䲮҇=OI[wпHI}hv£,E7v W3 s/$+S^l8SǶW8'?Jf&HC.`Vw{9Vz'r_bO,tdżB %ɉM }UTJLLm'u2fSB7o9V-h|3NYZ\Tvҳ9Ym6"lSJx&%YZ%Hy0=Ãmsץ-ی9o-\[SɽF/.ĶÃgqGף/FD\WO\MF8׶=iL;F5"y!| l@r,pUV>oH37`M=5dr`nE#[ڤK47E7Udjy;5`=-nWVwїif|:ݲA|X6^ٷs'Umd:E[D/j}4O3O>}Zl>WMnӈəlݫT ML\V)ACsĂ% ѢwG -]7>Iji;ɜ'SMWQ DDD78 i;srw~ʴc-s+%/+|Eڹ@KupTO8405[v*ޞe9"f#OUhI8INf0B4U,fVt鑤JH֮7wM$fR R|ru]!4'k"xKƄ08 ĸ橁3Bsj6t7d2Gt2&nV 0]!He1Dx!/r&(0E_hl2Μ1x2[HO-By@\i`HHS;cA& EDdT\3U,E+pq;Yw0VT5͝,` D ;^@ 37Ls>~Lr6Y1JͮWL+hclF4S9J)d1W#/)%|эmrhƊyㅻܧ狌<(<\ajcN.03u1q独<(<]a9@Ҁa?*\ ǥ)Ǧ ǥ ǥ)ǥ ǥ)ǥ돥 zHMfgѵڀjs>xڂo59i܉esZ9 Q +̵qo:Iѯ)@5aϚ!.6d -r$k¬&)us6! #yM$RRe M˘;`iS% Iff1f!Hd("h8vÈܡYY[&[$Gh!U: $*(%.8yqfVZ%me:e.ƷfNDQiCrH TLـ%Z̢m1OeTzN&lv놯LbAQh;?gyeKɛ&R<`&(Bpg  )q@ٸr)9uvۄk9#j&."`Pä CN <p덳5 GRugU2;8һrgq/VY4v<~cɋ'}Mi<24 =ߥ.3}v?h$y/WdXP^vXqmy/1@Bְ(FcEOr혱YچdI\!<=h>0ŘoLJ zP2Q*._ L;edx;2ޑk[׸NT8zj5b=5+4_k?1dELc٦5~X: d;qi^)|$oFɏ8:[f_r`ɶq \^wd^rۋL¨kWi6l.رx\~t#k- !nm9u`|ܛMHPxD)P&yd%퐷C風OÍ4'吗2壥{%3-)hw咁%ga-)Ťj7pxJۿv>y.CE%갓Z뿅v>y.jCU !(zRI>y.RC]$A(itMOK/ }\dGSVQ `p2}XkH"}+ڍ8/ gdZyAr.)=K۾vQԗ'+q WdЅLa_̣hOVTmkB %bZMVB~Z&SMܨ&̢OVR}kB5ɲjXhN/~ M `JF, _Zm6MXTR^k p-\A*NoMb Zb%;ݖI _'Л`݁EI;bj%Y}2Yk~: JwFRl㻱v`}䥧;t߃2me5.WMqw`d9ۮɹq;#F.͆@Ȫu7 `-sɾPx(~*YvMOht+nͽ T7U9?zMvqɭ*sv ~%ڀKn33 Ivqɍ5v9@&8YT˼Xd2R3=\o*92NLv0[Ea`7^u)[E2OL`9L+X8~7h|J&JBgMʔ6zfIؽ,IMv`9X. aƦifdmז[%)7{'c'{1oC?ⳝP|ЖhwM.Uߕ~m O'mV#lH @ $HmeY2RPSD+6m,T[ɕ)P8`) \7 E;0C-f|{(L*Dds9n"$dEq#(a9Q2%P4l)ʫ{T܉4S6P2HɄg&3$@82l/j  Ozirm?b;fsq6R<^Ǝ+n"cZ ޱnžcźTNjcœNY.|-< :}>+~jͣjgP1uɜ#-HIw[GB.I]6YjktΣ*딸Fî9sc97Lًe=N/f9)HYp'C\\f,:LPñ⒋ٿdqVNh)V唉aqrH߲ZyדُC/ER--î+. SF/fVN|zIz>u2}\)pb7'ojqvcKLXN\n!)@w71LZR?#vONɷUُI.ܨ%pW?쟲 R{_q+^#*\''CaJlǥ^vmPTq$lBh3o7`0dXuƫ1wl6;$k§(7o7Ptea\sfڤnq ,.ї(zE2˾ˮ5Yfzڤq D; fѽLen5YO\ٶ´6u6 5g7HMXNMaMxS\m5V|tѽRaXɞÍ5p 7ejԣF6ukn⣰!f܍6k._Zy) (fLA\nt*5qMMAu=6K/;,b%h5k.mW S~PzhͣKRMk sJ r7["z.ї^,-6krKAHb)hn e磗(5o67h5ɜE'SG\6 ܳFVSyfF(5o6-gv+=8U?lG2m&.ћ@7qb<%"i/'ћ@DZTyy󲫏Vփ (f9mU>Esr<ljXM=C#SkQɅT=6b._/ s"ԣ[X?Bj͠e,--Y7[30#97Tn=61 @ $H NCޫ&**EJVefJ1YS@1C * L7 NVGYd9LtB'IdےXѓv,HS8) 9PWtYVPRj108h?nS3c&ALA<\U_WdN3gf.vnq3 #Q4u(d]vֻ=-.,x,ȟ{جܪ_|.Sw|,>cCW%fE".W-jZ\oX}={bOP3drjXL//^{ 2Hٲ^bc-.R׃\{y9BI(]./V|7$.͗ Z\./V{Ϡhn.5)+jVoc=n/Z HRyhhvqyJ  u'}G'2n.JYz4 }_|O7*OWe MSjBevi3FH@)qyt-2쏅 gNR:2ErmEݎ_g3#*jB(e.-.QW_}g3',TQr,uV^#>$ĨW,,6u~՗{ωdjДZ啇a(kM};Fs19 ̠Xvqar2gb&B:\6t"a dvmA]!Xy}3'*֥` eŅr}/:F{DLZԽ5# eŤD|$^unjVd`l,-E][|tio/3O L-%=[[Ƞɤ֖0S-fio6Vu*,޹֖LD=6KI}`ƫ|yZFs\JfD2HA왲\Kr-[[ZSZ[̈7B&I=6B7'Vyu֖&.PɒJf͒7Ai9s-DZ E!vl X5_o!|g=uɋBiV^븢\ ˎ'1h52KCۋWtOo!kJOio2br ][pA/=~dŕLRoU7\z-LX#.NWK;pKy"!y.yIp).NȊNWcߵIwp).NɊ&E.NWC߭Gwpi.Nɉ"dr֥݊{n4Y}^dD"-jխMgPY-iOۯ2bLH'u+a*ʮ6kMҝf%^dELio/%ҭGʫQ-&%%<#ӯ/NVc|ʋzKnȋJ)f%^^KY}O+)^ۯ2Sdmׄ's+ۅ;JyS$^rx>3[j-[uLJ~L{G'r똭 Zvq-*&iv/h1 H @ $H5Oen^I<` 8rE傃1@@DT؜"&(jO TniS-pǎy*әPJq`B8.d#kSR+t`giWrDe3I:d+5sAp ߚU`_ڶ(K;tX'ϟ0.cK_w|omGb,nn,{.6uU ~M$f{4-646{k./Pwm^)]FcMf+Ҵ.'QiGUJMs.RhBr+ByU0uT݆$~6M;kjUFM_ rIhnQ\;jkkUBMS }N=x Nwz^ZO3湶uT ~݄_TcĴ%o/z^\O3*؎߫'S辫ljmUG/{o.'Ys\{f:~McX4qR|>lA'G~!a|J…蹥rN-LBy;n?WOב;-3Z9m7'S.3&C?̞gM~QRqRvN/+k]<`t1 ]>2qW\mkpyi&$?̾g~\~z)^ 73/5~!a|Ϛj#n?W LZQZ F-.@tTG^51ekqES(vɐ5rM5]EW LkYZP*1 Fݲ[MWDQkSV2-!Zкj'ʋn!k1[/Gm!j#ʫn" -4@e6 -Z]5}Uvo%2[T9k "kôI@g̹Tʇ򲻘_-D~H,$ kJnak;KqA >ʙ$4/<ԏ!Z[~Ha\Pbi-ѳV24&u\.A%"e&y4״xۨXivJU :˶LixwQ3z+KP~ S]f>up++0.AM$#3MƷ5aZ]=O$ iMɷ<ʛ.AN0 ϴO=G̙  ]tO2 W/O=b!4XivJO'១n% WR11'!Z]=Gp Q Bwvmuԩ<\;d"^R~+L']fR:VR2wBbH"~$H_l9gR+(njpLLa(⩸wvsT֮Gm,l\ UpEG:LLQ,PD٠^Pe'\J&sI\C8P˲~) @'@psZ6*P0do:1UH(t(CN~Rb0`mꮷ$&dD5@`gPGM<8LG06Qھzi=JoZKHLO&GzFnUr Dx9"Kf6bu9e"dĶ;w KL v`UJS7 g昹,( 4^Dr4"2҃Q/&f5#lcVcfcDdLDմ@ [腩m~hRѿ4)@bL!ĐbD!Nz$4Eg @"@"j1Y1Vp N*8sK9S9犏hOa,tUqm-4HDWqmEu--4HB<%K,S@Դ}(ܠ+Z.[@ _8XAcs 玏A[xr z-q!   <熴{M~c܌Zae6YESF=Q @qmѓ*^EUoLc"g!ʢJD Er9@|&tg2e\Zo;>Na&9dJID#骡UPAR= >xIU&N읖`zp`p `@L337 M%NM&ɼq=TSZK`8"T OM2; a4WQ*u{gD)sMnDNyqgp2D9H9JTTDuPʼ4QP5tdt`\X2FIC(W%78DI&J4U5dYBJ_YۗD R&\EgXa=y s|:PF1wo!G^dò+{SHY Ƅ:>qr+=T8';=@Gw4s=ZX#PPڄ*|(JQڸZɠ9KFPYO_fRЫ}n%sZu%]'mr> o8.\:i X??/3d|l_Vs}jL!0;$ leh:_\o!KM?dgd/\][,x˫ԋ)f(엙XR%닰.W*k \ԃ /QKI q|Q%Tv,XNo#"]gakyS) m,7B2w~?+ ϖ."J#ierz#d8XtqvA7'iis:o"H7$0z PAdp_2J7o9VM8Hp|(oW@KcNS Nbv@A{؁xQ%=pֺM2noNHixWzlށ| (뇤Y\0vs`}٘@ $q4ST&Rs͐xLtsDA!("` R]EFR.)|..3]>X^h҄-KKp)ayRԄ@a#J,.Xd 4,.8BԴcRBGF$*b0 CqsF$an2qF!ʴa)1# CpsFa7OHe|щj@Fan2mqj'2_ )=j ?QYX#\m57 EgMaL~pi<%Y;S]El].Ct,=0v#S]ʑE&G"t,9.efotk%&;j]*MbYg{pE%nf@ %N|G-#5*މI1 ZQIyGjgİ촄jj)Y1 Z!Iyggs|J-!5ڦ ZL~v|pi"qT>#IgTW(iy1դ Teo&2?5ڷF\M66"<{:&Y[Ƨ9޿3ڷϮ @ $H2fնJu܎G$wRM1!&(fhRQ3{R֕UBϩv mR}'VZtb^ R:`HWi?F }rR{X{FFAjQ\.CVᮛ{oz}~khAjQlikn{VmH1tVHcl O<7a% נ$bhJ6kaqtz5qMEB]6$+R[X۔\qUhk7a av$hCfJ9mVnqM!v%DZ堪$uOh e䷨+Pյ\Su7Eu}o$ߢ ZZ1j@'qL}jI!Ej6uGC\Su1Fvy$55qƐZIYmHọVޮ.RzGҔXewp6mojcLN\mJG^Mنh:cM\mFK^M1نhOC[vbʹF;0խ!?.5Sf)vWZIyk Ӳ,`)7-m5s Zsr> m5/mhOrͤS2,kn~+JЖ%5k(~\1b5nдҴ$feVVIFZ.](1InsV H`QM(C/]0 -QKsS\EPuaj\dF'986X~=Pj.244%h.^TDpfu$nRً9Z Rꅫɘ %h.ZC4׃sB)mr6\97p>M XoZNrqO0Mꅬ(+Qq҉6^.Z8I&C0&\e!&3-%ڀqC4Lم1tV.Nxz&)b-`EZNA=axj)mZ)umZD fr:l^6ԥRjz;m\G)iꖭ Yx RLQPrְ)9}RGխJ\e5EC[ @p'!k+VꔸrpF^-^VâGT-ef5nK]//i *R 1uKqu!v-h ؅έ-a fе{;_8P8/en.D=6Y"8P5HNلz՛BpXSZY[j =~kh\& yVnK#5u(нk sMգ'[M]en-7 y2{Vmgcgh @ $pLUvNʨ}F'sշTLso)H`ia9*Χ:; oG &%NY…7PuLjЗh)s'Y` %ArJwJ %\>p%1y=~`Ro9=)IHK=ޠb512LUApH`sVNI[X3復D E ~%0Bfy@9DǞk̬-XRud5=,χyl1 H/-acoGbD\JMխ#!q)fQ:YKM&ta{ W;9u\We2o%6Z~u.,6|.鹵^o"~\eFhvpѥ[Xbi-e_ðۇL6V%cEZRgUa޻aT:玷QoVa;m5N:Nv+1MkR4wVaݺc[ԃpn1ZZ*ۇll` k*u͜m¸T}c[-GvXmæw2?uWO\} :d[pī uS;s%*cXѲ:YmæUPn꥜Ppc[Σ,ۇljcPMG[v<*cX$-Z,d:)Ic[ϑNRjt8c9juņ^kR哢mjޣLr~sf#ijSt%F陴̞ MkRjҤ6?6GZ뇶4]%JnA*A37뇤XKYQahHЏ+ %PRpl=vr2qU\w5p*{UJD,:Ga:X~0QRca)Us+0t`Rԙ uSuQ)^n8>r7\1fdLDj\pfTWX4kj\p= NO l(z)Q]Ѣ-j,^8M߆JuÛTuMkQ[x'sMs`BJkZUq}4 OUڇ6 5XHJG7 Oڋ-!]f5o;5Qq§Pն:Z[ĎM^P*j[)/mIq]gf иXTjXlRMiociQrIJe.zZ[ŋ1·CT1$uMIs-~]tn2K$޹֖jRn4Զ\u'^ˌpjʱӅAq JA1?m˄ olJZ"YM9*T^`*I9<br8Þ|@ yV1K{p)TMcp,8 ~?7aM8b*5SpjO&;/xl$djjq•̴-i acҶ aK :n&G$mj!BV ={- ZqFcx}ٽlwP_Еԣ~#v>7~lĬt1lwqCWZ]N7g6ieOj,޶p#8!+,5J'ߍ"o[5Xm ]cX5OX޶g";.J*[#Vjlڦ?: ögRJLjɽ$O 5!OXm Τz|F(QS߃F@OXi ]LK>#g2C['CWN*O0Bzk,Nd9.;-!UK}^#Pd9"Ki WuA)ʀ>d:.3- !)h~h:/e+9ը%6HrLk[i+yPJM3C莣7,+kB^E33LC~49rւ}=LJ$ 4+??$-$IKP֠C["XkM8gҨC3E,/88!aꆤd̢JQhkp;0Ԏ+P^C[ن$'5j/Z86?6dRiꄬ_{d?7d!C[6u^"IuZԺ>?[s)sdH=t8siFDkP8ϕI5:'KצkR'g.ɷPҬN|Dt;^n|l~h ;0~51,Jvdq!>6&u1,Jv-k .DK>$~j.;0:w14ۨgPC._%gCN׆C0ĦgĒQC-qsYES}^-^3-x d!^-iL~Lj/ֲ׀Gnђ]V;R*Lj߬e~8Ѧ͆wzK#FDN dLT&,\@yMXQW$KѯE_>nz@ $Hd 9’̧;*}ONGbfi735Dg$☉L#|bEVq:}+y5ys$"Ś7EBDtqL s G0@@6&ArRy[YaNLIVɜ'1 Nn\@9~eR壤*j5kJJ0Q3#)H#9 b @rn9 vi#ZSJӖ4Ȝ)9Y۴M@L&sU  r;PLɸUi,(܆fq7$p& 9gj)@;|p@|x(OimFS϶ E'AHH7iM4EEuGLBJYBB(TBY)]vВG-aJQpݦ^9i RʹD~h3m BmhQxͿ4M nPaWPb\=u FҫD[WRXew5!P~xԅXEwېjF-qB!]!ENWQ;xsEz<9H@PsZ`ށigzDSF~H @ 2f dZ3eL)kYG$y]58<9@s0 O^zYs)AL8co^#JUTFOJx[&&7Bf|@ܘjZ\q[Y[VLLJP+S8LI28)ot]Ehŧ:+Ϻ1 ]o-isj}Vcw["P˭ V=ϏqHG]oVu5Kxѩmiu! Φ)^V6Bjo^XYԽ'~6(j/IJ!ybwRԏ+Y^0EF{CRJ^X^F{WΕ#9a!Er,Of3^:sКkCR'p^F0AЌ˧F!g&WᩱrNd9(;;,f&VNd=(G?ٸR̝ . 6Kn~Nh9Ҝwu–4O!1h8n!%W#p3,]29 XRw,ˤ.r*\!bI1 %qYlWXPy1ĮzeѹJƇo+ {WqeVΤ@!cw ֟H]\M"?;j s]q='!fe9QjZP19@#Hs'y]R\dj sq4r,sVPrUܕ\M&#fN 9GxcoC䪟+]L̝e'xmlj+MbML'#{p74OfC+Nډf-gh=Nn.9W_rV;PĜp/4OfSf9sЯj'fӑ^h!q~Oo}x}'xðܹWAeQ.2NFaE*qp~BYJRu9^aE+qptsmDNk;$'xz&9+I^wgƶ7d^q0㜝,y߾-7͔yg#>oQ\ih\֕?cUpsJ6:"Ji]ViTfLZh6MFE(=mT!8J^\`.N-R)Lb p""LW)+8 NxYyՉ!Q‡<PCxQw4*d.b@ $Hܚ*e;;(ľb؎Pp14@ս+MI" j/OJHljz<2k.& r8R\[arT/LVةD"Y.dJflhR)@@Iݨ2ጎ@5IR/җ;RG)H]̖fD)S)qP ,(U19G1'kSrg,UL1H*EZhZ.fq_OR,5"jN  X*?HZG ?"q$A*Ba\B̹ys: XU1Qa%cbnd)35Bj"ܳE**33Br*fdJvzZu#&n+!%@+?n\~dK[`JGLVCm@ M[?1%uNDR9l\~w䃭uu&;m?j^p o}═uM+BMK@<%pu9ߴ/qR(+qU.8tеyo~ K,fȠ?94th_3mV2 W, o]%(YH'#}j5 ^\~t!thZu"bC< ێyIfoGWen.| -ѵӥۉ&R9mò1[QMn&[Hos \]iqk L,~oCuð4-X륋R kh7);(/ZˋrPbaD7;CNz^L~6ueCS 'W*7hK, q H{L ^Fu&Z ,-Sl˽;47 MS,]*4m6=^_ԦfW*'}sHlD $H @fstom1*FY9Cvȡ9K(El\DA psgkarrILfVlVȕLG8%Cag6ǚGN^j8p/p7 %c,TDeie̔K۬R䦒Iv=t'rb7UN0dGq3p `yV欯lU'Dg|la4+KVMʬcƨ,MjhZIYwYe0B]"鶕{^whZIXoYm[k]6ڰ tK~oYmػ]6 r{F4gZmYS6 r'[ M+ALxjmٛL3*Cp I+B7ö́ uR\)bJТZ_Yel m]lL3ڄ5\lB,=$RArL2o66Ұ&ԔkB#4)iڬ iyk- ݳ:]HIi/b^svUtZ*(rP]ʮֶ^7kHOG2 lكvWMk[i/E'uGV|Ժ/fT5?TsvUJ= Z5?TCtVbVf!;ihid5n^4%cBJ= sj}Qh%bJbߓ4_+ƂU΅ɴ\?SF8!\ɶX~Trg-" gQUC1AL>o+3uy~VB Tfr1]Zq)H_1]~e#Ja +QE "eRc"V \.:7TTt RV0i;ԉ֥vaz9ㄹQQҳT ?E/OMG%oGScEWIenߢ \3cjTVY)S+P'<68If#0Ժ/z ѵ pS%va+!9u( RE;6Lل9}R(T)- Z:wP.AjQ[uV8Rӱ-[f!Ӻu7 RJIOT}bQu7 RZqŽT1(K^6Ԣ60]D:6"IGj]en!h-J*shhQ'sI K8ǔł+qȸBGbD\!}`p럻Gt޵֖6FST)p rD9n%X:箷Yi s-!)m9æcx"s-G[e.#zn;uΤﴷm%e`\i*q:s֔׾9(,_e3ow\ԣrn+-+HuuGP-fFZcnn++Huu䒍2n7-ePJԏY}^I(C,kY~:zKne [\cVOG\}RR?b[uVYmV 'Cb9#b[u2n*c-I8siZC>ۯ|[pݥkQ j |Ym)?m׈Z>OR)p]>6uSj,6,Rjtb&ҝqay]2K(Tsq5|:ܟ/2^M?quk:Ut%\qu+ҺSt ZTfτy^/2jazGV/A*@N ]?}7\]dm5J E*@.V\]dhZԬPz)PJo\ 8E嬬ٙRtYA{J M£ibWC3Z%@vc݌5|1¡S1%NkM kS1fσncbP&R#"1[1f58?\5!2TtV⥜g )Q8 5;S l(z)Q$g{3 OTچ6 =]Vq¡CR - WAq¥Q4 A*@9iDpgad1 AJήeb\ph1%%HtL֥ ʡ Sgq4!H%yvmRÍsejҤ&A p mwSӝzJ[jK#S0븤6UAxyl%Ú<,j5O"dMl6fAt mʬCU@ylR̈́L(;s@Q@ ²Idsp@"BxcmjfS5Z,ҪO33~l◷(P0 "|;hV2E0_9 IĆaOV<-!ur&,y~\_!h9b|Cёu9mcӤe~WMcWjrl=0b:mN{k+>cJS٬R,Mm~eCSEK*s A)LǢ:"`r]_(Br񉎡ln.RC kz|B YQ"!CT~l4sc0ַ쉤V@jS~hKZ&^1~jK[I&pܨz8Ġ514br(bCݑpӑ?YB熟 o M'a"~.qm>?}tC$`^ŖP?>Xk&xcC)2^Nl@OD?GJVeP'&T/.R^I%wZl1CRNGTHgy/?EkZ_]S~s]R^5#RYL~ 9)T溤bL9N$eh ehjMNEbu6>h [Ew3mԼ=0.&A.hBQ1]rp!J愩]G$U<ªXUp4D=*h$Nt`ޙx{/H:Gwl',\0oKd=ʷe=Q]g%׏I<'L/ R6i"kUYhSh=sB˪!è=V Z-Y{Vt,<>ټ4x>իf0Do+7˼cV-a5OqXY{޽t(@jN/RTRrD/+9.NO JRNHW2Izt14o*. d;PĦ(o*h`w=MQ͉Us'9w&õ O m7G5ed.-%\2nGVL|\ù]9y]a;’v;_6nSC9N!ͦ !i%0qs]R^+{P5]0=,T("Xsћ\!NkKbUyX<̈.'1&5V8 M(TDw@k+!s%|uIE^tpQ:$RmX@rvk'h*GOA&br( #w./z6piȿ^D טhNEZKtls4IE:^ū˭5_-"i2uIx'5{/)fZt >bSuIxӚ-=q,iNK5%֝NkKni68^ȱ%3yZs]R^)sM!9K#/ꉥ-yxID:H㞭uDғx‰4:sչrioTM)KȽ׊\+NcnЩ㜵Jbi= yk)}MFd8-vz *ى5_q0EyB茙A;1KݡbKÎrҍ fe$Y$ݡr%ccO ̤ hTdt 9i6wne&Q$Th$H_R<I1O^i4Qnej q؛L"ʙnU3D10CH5 Dެծ՝Mf%] ت(Z%:\ B( {BՖUKyN4BiqH8W]""#]iWf0}-0Xc]&N.7;}8= sLhuZAlHג+9v̲Rdg2[,3p`:jQ6I0A4qudij%z'$ϛN&9j5$kHJHa”bq9& mGT&޷< De<`ݤRx4/$vInDT\TtD!D4)D(鞈Bp%D(r+nךR()J.R-9jQxٶ3oBmDoBMHQx ƕXiYEYiYņ\ZsR p|[=s3m8Ԏ&VQ?1GsǏu\x|_JDo*?Y;6,iJ&9=zcF! I|tVt8z Q4u5e3W6tm5mjGEjCӣmA5oFOk UsD!0B$> -jy]вu!}o6ܺߌbt,Cu!|> j2*uCs#5H2+:Dxv|HzcF^5I>2*)X=~FMwxHz6x@b3ouˣ0<-ioX*:7i1msФe_#BUu ֣[|-P?cĪŷ1Bp5KG?cĪ+ŷq50Q$?cĪ3Dc52Q7]׀z5&wRĸhVjR 1nn3(NgT+q iF8" %dNƀd:0:AA/uoɌ)df.PECEFꁲ3zY[9V?9-Ni:'Y[jZI1p-RcV⫘h8-x>?T[l}ZԥgBNM%OꋌũJEjQz@pتuEAթJAjQz@pGS56b!DNjTtu֥-GT ]?2])1uKpz&p棩1e\7enBTÎ}Zj#7uVF bt:ljDp K—60uKٍ8Q\Y[.mdlpgVjC2+C!9uPVÎmB:.6#N8VKK]8Q58؍(s+m%xsR+p[A^rP(YҚKpf,Y[T/%OW;ŝֶ^kBLR<8uG\G8lbdũA tP5On6WZIy +V6N%-V" :$np$?ֶ^lBEL@ $HGCR[sHJ)zucRfɯ ux$9F9[Z:w!O2ҵߑl(48q0rrp)n[5dtE5-Y DK&NΙ@gRWG6u 1prlj(MO_J%UffZ vt' sPJDյ UVG 2' ϚE G+B <%e"'eLՒy5dNI<0IN\vX*TD#l7W:JZ.Bmƻ 3]33;7oXw+a*jPwk}9ORsƹc_JnA(=p{ݻ8*7R녬GQjgQzwߍ XZĬG-bs ԹK&%bZTPf=~ZƉIkQr,1l=~RƋMkQ[v\pLCS:[]5D,m5D+*>G7kZYkZ]U)sQ6֥uukx<5LVڈpkZtƱխGW&.8U3_n9#ij!fu] Т8VjLFZ_ ֺ%yu뒀ZannijCMk]io;q¹TM#ZԂk]io_U!vyHt9f]^P.XčIkQ|:kZKx{rˎ S{bEI٭k-8\5T4IkZZ[Kt.mfbD~1:VW.h7ؚ=KX:;:3nl:*Gؖزc93?-j}썓 $H ̟^lSTJӪLTJhฮDHbJpsi F N1^q)HLHHٱR!r)80O5ܠ89ЋN‰-='%QxԶʉm N#.xj<qM"T <Uvԥ>,`-)f ?Q U 8b`-)K":=}6Q%"Rc C<@9'{fGbĠ.vO>}#6~ghψŶNrĴߋ(:B?i=$rduVD8O z#FNJ::nkN^$TlHS{؅;'^)/y-7Ҏ=ZӒz_uV 䖉aFJm0uUOK\,(Ž#L'֎-iwRF\l:zzOMKf!rZ}xqm$%"nf&h:tu%x\q{7\1A @nݷU2=QtҴ˒J7f(-GM׷cF!R:ĭ/;Ĕ䑍پ3*0}-х̎+K6$#vO`{E'CCĎ+KNJ>7dU4A4uT(uֶ֗t>+Znm::m#m<ڧGpEPuʹ\pbWx! ZZC^MZ;#vO1+CHuNڅ/Gi\:nqpXuNڈ-1GuZmi}ܺ ;GT _QexgEq*0`8>5Cjam}#_RYSDvkLQj)p~,:S5}>>3Kmnî0>8U]p( o*gU2}p( m▀::IUjy( m▁sXsRH-1D=o %u\ y[51ͨcꄭ/Du=o #u\ zi%1ͨ$cꅭ1C=o !Zp1+lF8~ )i՗ZխN kh~w#f+(o;V^!h \/^L2u"a"sBڲ @Oh-lsg2_Uq:?KJob7T*:^)(UHYxNT+lz$)o9<߲-_$Zlsgt/m1's'~ȵF59_ۈzOQvhmO|"6{J_ql܂䛅4߲,q=[%䘒\P6o~ȹ3>:_Zҋf!v싕8.j?hzD\i Χ+{@4n?j2|1د8G)kYǚ9UQ~#["@!-6,T^amy uPh HZq7$-Y .2jGs $-aK1oHIak\d+Ȍ]9Fž!%녬)c!W24twqq"B$#bu .2yy& ste>wqu$n!td󻸸O "A$$nb^uwwJ?#`})MK7ra(,ʯ-¤Ȓixb3 Mܥy{Xtrrs "KW\w=q][F'+-L-ȗ%w$#*9hʱ=p ۑE51-TWW K ¼1nFUh9fM&BwE.L/4L[Z!&p5 c+A2^dQ(I2x']#,ΘyR/-p ̕6ɼ'T#-ꊮT \"sej1oOqT#.ꊮT Zw -T[M!کq:F_]5<;-[vX{+a]5-#n[(SVwЩ]8*f!ӸUʒkxz'ET)bL}WNa?*K)UOY>1EGNa'*@KЧ=_-: $9<А[BzZD8& Y"T$6;"۪#$EGMӜBEBzT}"ߪ V,p*:jH^ M?:I.噮GMRܩBIIzNE 5¸O!C$ǡ4ߤR. `zkqQ4.!& }"TGL^tp)f{q(?uB9yU*:bosV!ڙH|pJ11{K)s/T\$"L d兕A~E` &GW d2wX=^f `d|pHoN˙qK&GǮ /fV /K~L[.#; ɨh2:2:/q 'fV_%2:'qu?4!єjdX7o ʂAr2)_Gt¤s"9ITȮ!qaH^lcB)W53(hmjd e8H @ ^U;eWT!x4 HCX~G p>UU$k*V`fҟ-TA;څj7"*6\ʙ2xR$QKQ.hvM@.⬰K °3 &m46mR 1sC80K$ΒQA72*.ܸ&!AQ\*gr@YuJP9@EaPJv]/bĥY*G ˁ\pcE\jt%SJ@yC D.EuUl NTU,*3 mm>OJ;ӱ *r ܫjS9LB@Nl+l :OIԶBJ]`B|/0!8R)y)ԺJ^`Bp/0!8RX)K OHԼNob9k^I-9 ᦘCz:"ɠ妈H8i_I-yɠRy/&8gAM1En+pѶb3m BƍCm֔4m iAF)fz) HCpIbRC;fT̖T_I' N&OQ9jH Ha9nw!INcp q'֢X^WqNݲ08J"9UlXЎC1 JMG<Tqq W qKd+\ғdeu+I/w7&z*,U)D!G`^j~vSWR.qN#;m8F"9?1es*턹I`U XlReaWkBeMKI^, j>!LXlw # Beue˸p 4P7kYir?/')QaO׾i28袾>"SA*,Ab%eҠa Qa|Ni2Sg7mEѱ:KE˕Ac` 5m2"[eˑ_tQoնhn-[ G ۫mE1W#[/O.g<.ʆ@wSj"k~YHaYd{h7Ʒ^L)fU&m-bB2mzyw̃E6 eU}v?i^^3`g-jϿuxvP{piWףsh- j;=0_G< 4ZKNjVE/&_SjmPjez+=$/O/ڈ4ZZ7> n}~cK@*nkclU>%vh= }~cBR@*%aBI(= &,i!TpwmCT_""Cd@垘Sd`.ʨ!D]ѤFfWh2M REwL0{4#,hm'5IHK&I \l [T5JJ@L0;4[& jswDR讴$^G `b, XzrHH|u۰0C+A\D}G۰Vu8*+FgV_'wXm]T4jbR0;?Ŵ݀ԲZp53W{ \,rz+t[M G*JޔSUw<"cv~U G'KvPbPp\55W{WvkVv,KMK(e^o"0*v"Znz7>t57SyW`)Zl74Ea EhV=⫰^M:G֛!9ʚYKR'ۋ̧b/±UvJ'=z7Vl}-%n/2z@'=ե\ՈjHQuסeYt:=Õ@ԙ)/D>%GQPS*׊*-Qj/2uWm^%WQʵ!P8SJhz&y6'*~fj9HNʼQU,*i QyE$HLY{Gk*ҳO;gEz!kff041z{-4G4Ҫ UÂEZp ,Rz* kt⊚ M.%NSU07p=>D1k K޳EZbr%KNn-64]NG\Iyq2eAu"EҒKSɚA`EZ-h{-%xGS[y,mZ &UVn6ԥrz-6dwVn6ԥ4oYeZL.x+}84}K-o.&Mp<V^n>ԥӔWZm&V֞|>jRi+Cˉ?{q 1ZzpdvC}gy!&5kROnZN`<V^cVꔰ!;m%Dq5{_wNez7T8l_Bxŵ%[iX{ R7\2[sJ<ޯ r{>qz'T<.ћC62wVTu;u<.ћCFJ9mVnqQ\VC]6l. rW;MTVBxѽ˦\TuHw[q!v4uC\T}I/>ˮ#?\2 4]D.6"ZO>î8]/FVu@*_b+ JuXqU!v= aYB|kEwPtUa]NQ=nhÑ-'=/ւKnP-Z]4gchM yVSRۄԊRf!uZ}nV♎*R*TO mI.ECFɩzҩ[F-\`1p82`BL`f"9AIqqMe38g ٹp6F>nm6pKCD@eQzMcԒ5ʊMSCtѨSt}D˜b53#nz>_ob Mie1x>h}n5V ynv>ob;g$n`IJæWC!vqf@rW#!~u&٢e+|w JM!E* G(:nl>b;{=)5cy,G-dz)PZ9AQ[Z'؆IkaAhtMͬ G}H0R N>uay4&!h%H!EZԒ@ RWqAcEZԞA*@į7;D7kZIx: R#|nH鸕h ijM%%H7 DxDm5I$ wt ˎMkQ-V bWH#ijM%jR#y.-yT#">֤V_Vڐ-_9ۅ}b֤V_Vڒz=ԾYs1Z1ԗv[ԃqXi)-mIpR7bj1񻍸 :IjR\խMgQm8TƱխN[T)pRWJ k|ln"sVI9]Sli\C~>5_n!uo&RKҹ髧E2gZKy46\ɫMY=q3ubHje. JUڅɭk-FSR)pRW'c%<6kZKy4Զ\D9jioGk]io'$-#^㦥ڈ,ֵ֖i!'m-:ov:o\Ky4Բn FMC6g+zZ[ɶԲn ND?v|>o\Kxģ ۂSjY}Gkio%XP- |q2bQ9uZZYmճ;{M8|֖kGYe..%W<N>Sj9uZI[e./%S;~l=֧\>s\KxԶ\\JuJu5δYMKlĩwS9uRJe./%I7M{pps-JWT)qru}5}8|֖K'-m 4~j=A\Kx-mIq#I$Hȑ*$g&rL ̬S8}MFLy,le$Ƀ(Q%K\@C`Rvw s/+6i9˥Ӆ&&EQELIHDPÄ OZ>'DH{-4eeU!p7YA"g %U^kfeo_HQuGEE{(*bQf7 ~Fvjɑ[KMXʞ\Mө*Vg T939əC5dP vogowAv%TUYSM2fL68\Kˎ IW,[G}7O+>~gh&!NYH1cIJ_7M>>&'MYW~4I„' /} \,d$VaKɝ"i`n.U2ulD,(By8 LqXn Ԋe:hٮ—R鼖XnS+{ሓ}V- %f]7{.+2ܸ&7"RCivYwq]lV{k&{5/NKZ}EwIb g:nBIe_n N'%;7,/X:Z$3%+A,(w-p˱õKS٨JVV˱lõOu7vjlUL]3Cu"Mu8ݚk`][j:BD8:;~,znBRrS.CCI#̧);o+ uTE؈H}fI12Pܬ<&Pb!V $zno JUUvbZm.%㧩9`S8$. \wq5%*XhA=.Ae V:2zno N}phq<.C@p{DR#v~!)QSV\%Rzzn-:B^ѣr]Z=\I)W'F$;T1 -`q6wUc!:I5iIvb<WkK/UcĽ:E5aJl7NAkJVcļnjS0وR}zj֕-9pi2 $AKJOLjA(i01̂~PRҩY/N @:OOE*|B=#O2E-*LK>%ꎉ̘ڝGwF')~٢f|B B8 u9ŢvưӢ}GϞ$H ]W1]Ϛ:ϐUfL 6&FQEtCG@%JeGxkzҞJ(|c?.1$FMb*C-*p`SbGU5 w)Ks:;2*( 5|,83T3 sHKkO4E)L&2'e݂t#/1S5L4Ćs4\.5\$YM1ٻniUEL@DŽ0 Q.Ѯ% W\L%lНc.fez MR*&PPW{P ֻyLM&2*\ք{GSSԤ9S+g*>bWM'͜`%&PɞnGl?#tLDkKٴzIrmǤ,bDz9qzP9݀5Q#P1- b'PƠRZ"F Bqa!qyCPе5 \=abǡh~c1 ?Dy冟f9K-$yiROx<Ǒ,crdy)h(%a*qB SIi)tBZ:a+!a ACEC)C]Er]”bVp!\%F-g Qx+ɴUy]FVpݬQyQVMGY'ݐp(8γ$H %C? +QS:aUH8+'t^TO`~<]DT$)) PİdՒ3Zz_V21Yɸ\]R8Q)DS р i4DʂRcќ僔Hs)pBd%YRf(C# '~X鲩' +KVU39;QMD8!)TǃCOn 3JP$ruJגIR3*Ѻ ~< HQL(8Xa0y@ 'z&WUbeg9A.l[OHH$Y<E:LɝTrTxDR s3 $շփmTҙcyLƛ bc$\2j2*\#(!:F5@b|fh|jCr&'s}a#KM܁iO2+&]!$던/OEM)(%:"-,6!EFwxȕxUf]%Ƽ)a=㨩ȕx'Xdl%){Ïb"UkhNtM}9W9Idq k y/8'5*/%{hJtOp0r$shJK_̕$j4a%ȒjwΘJKprE ^ēF0irCJhJFНYG\Wu e>pur1.q*ܕMeqQ.*0\eKXZ%sh-YO\T}NZ\ZfKE}&/Ŕ;+qu*-,%%1§e|qvKl)^y~ LgDl&~X+\e)MF-!aSA\_'BJ$lHSˑ}e2ɮObz7e}(~iH?ixBr{2ʒwn,6sy^!r=&uF o%n62fr$-'#+]nJc!Kb7,Tg Wj6'w+.6bnr] r'.nI1IO!,Npj.WPm6W3݈ܯZш(^I.؊nTV$UP_B3R_I6E%+9c\N%Q)G+Z\)])+9d ң [ϭ XH JYgUJ6"~L)cj>-+9g9W*1؊ntʱ+m–cIYAQSuB&U[.XCg/3ߥF[Mmw`RZVs::Tg#ɗ~=xZVUIlE'JeJSw%imw.j؊o&>JSy{wj-w.j؊nLL1BV~ ۼ5YoCqTtR{E2^!i c4/nm}ˊbreIJh~J ;I'ZelWZBڼ5sFrl'O`:el!i K4?jm&^yIيN0cy]ԅ!PTw+ML> gI+F{W[вVt=܃@lϢU¸FsxŽ(g&&nAbLW dFgxŽ//r6!F4{P F7*'}b@ 8 zZaSMijRpn%eL^6^2 Y¢R3 (yMj[s(e[VT16MbV0fgtD @a.U5QR fO*?lIXA፞T@22=7Jk)Dҟ1I.gJ艈s "|@@È*]#/%Rq4Rd VSA)E0s4 mwy3rͮDwnM]S %% M. T `#QШbr`DDͯ}Q$C*mP?hbɔ#%T`\^5zO,Pda"=}li{ rp2L*@!y>wAnP>X'Eq4 nAJ\nAJ^mč"R'py#rAj\H܂)KpE(ReKPQkB F ! k F bQ8Մ4!MhA{!>h]9iQ1K3ܥZ\`鞈\``.4`c#"!YDRPWJ GGldE+89ȊVpb1c")UFDRg!JF2"dE+89#")YFDB-Ǣ9 oќGhBƍfB# $HS(l TQUL) DyF8e˚QyHS%pO2JT'!ND CC˛Q2QJFK4-۹`rt|!@ pn\Ȉ0u3KtRe_GzzETX 9ݶ8(T RS } g0gK=RTpVL$Ј mږt;,үez(B]8@cӣe^!Ie2|YpF{B#vF6-,4bnDҙږ𤲏d>lj \#O_Dng3j[“%᪑.*0=z/ihno),Y TwUy;HESs.+a/]D.2^zd>-8j  zN&yZbo5RBۉ_IίLKxZ7ZKy \?56q6tﴷ{YMkU0]Cϼ \.''W"[PocA].h7=ieuq}f% J65SSm;hȓQmZ7KinU>ba5(Vmڳkq{E F>mjZye7#v( R?m)4[#g:nC%h`$pF~W}nB68Hj8׹Tš둻E N{ǢTņkXS]r7hi]}EQQ%SC2څ%sHn))p䢥]qY4څ%r n0*Q4$]qUOZmBҸD0IRYisJqQѦb[PZd5K~lkTݒiBҮn).QZ%rm=8;-IVd/P:zfQԌtδW&nd!„ЫYUu+<3-IU$H$a.P}UVZ^{ZKxZU"fLجz; k[’oI!Cٲ-ibַ9L})*ٲC4ֵ)f\جޡfqֵ-9CR!L:wzMR1АI) 17%l5'[AQ0 HibM\R EMAjj\M#=rZ&% AY =}1t @#ʲFo,TNWi<њ]BETT C sJk:[:򚷕c(7,B&H*'pLH"\p6ºz3VvHfSn+4eE:QJC 1)ĢC66⧽yLNyLC"]اS #wD.V2#`W s1ulTtbdTHE-`G @:diBITD+6fS\-/j U9@ܢb!]BY>,'?$}KFt`S.T( S+OG `J:&gsZjv5Uh Jduhd9 qG4 ɾ(ZuC̥l e D!Vx3\CIRpi e5qṣj c V/ij8N>i0u,qtˀ՟nh11(6vWs\Kנ{q;@rbY׳:ULAdx>u{W}6#1zIX G&ikuHCɶO]ۨbFf G'mMr^=$ PrsAi9CJn(j9;݀kk`u XEZ1,i{\yFi%egKZ1,i5{]y{sV>(b6膛gY相LVVcVĬ- 6ڰkqI! 1uKpb6"6 r{9yƭ-Xm\!wqEߢIY[[ <U'[1tVhCW1Ua'[xZxZ1-qMUnGխJ]*ejԡٛAUG;T2%g.i*p+RLRhCELCM S3:҆Cui*@;Ien4beT F UF(qII[[q&W%hMQy%XdtnK Wh9h4%%h#> 29{ MjLAJФJ'K1 m:iZ(b41O0bY:iZ^77 2cBbV75s%OMCL{P M+BكLhP I+A +PZ2Yi+,=$Z‰#)|Y9*ٝQ4V% -+u!DZ19{oɏT!U3l7A2pb QP,ʑacf Mr߂8XkW0jXitt @s,L0IgEGP`H)$w*@ˬ&YD"i8r@ yVR LRh'7Pl A(!y 9UL ½-NV4e:AXS>i] TP9)MDiq(i|qK̩7&YV$CquLD03G &Ԯh5BjgmܨAJ"lD艀Jb8NgJsXՒ\)SfTPJU9L00h$Vi,Wjm'i,bQqLQ3sRbTՋTNlrnWb選" Pܥs֏)H p0pq(T4 S u,@Yp͓pPNSL)! 47/vka YTv\c3fp˝|1 a`9V- K*kaWST@qjv8}3xynz>o`r"jlﷰRIv+S>ewC\g5麕e{"[ O([:nj>o`rcc J]Y5+sļ&lj7掛W {5r9nX>=uQt|xyzn Uyq BZs;1_ru8߯GMsS\]C\خGkZum]JtuЭ9k|jn FCۀQU'5n5Z:j}5Uv:Km@WH驧#kʜDq'ԫtSazPb5D:j |ePϦvjLيm@s:'#3)N1*n:fχ'&h}~1pb}~1tt?7\z~n-)n:Vj u IåS '0 `@=e;2%;OKHRIUiXQLR"j k1C0^A`diZ-9fIw xL@8gΘ9܀E9JU5CRRyj~~ܽç@P+ H$/D) WvUgi957yj}CԭZvĪIT9sU0 p 8r*Jjm;]_IjXx9*5(<54R7'U"D@7;ϓ+wA GJT}3)ZPW% * (2`E iy`-Jr[/1;5^?Q(M8|$ @ & @9nS'6ѥSKsrʣ)JMl̉"@(;O@$7P]:*Q:Gl_T-Y @)u*QɪUe)' gR2P;P3nQ1@9&(q_`~N"ߢ=oHY8>Fӌx<07'y2"ox!f H)qTAv`Y%lR#m ;1V){T7=$-+tﲗS?ك}%o;覇Tv`ߡ%aiP^i00nW1V>:7+I+ J"O =$)*H u<1K$)*\2As$ Jo*Nd9hq ġnpz`u/ ġnpĥYfJ1)s%.u) &pz#ø-$3LuƁipC @ *Q0#$&jd*e pݩ/Jtn: KU#l' b[8y `X~uGԲj2n]N0ɴp(ax)s3 NZ ~J6ڰDjLZ  "),1@yJp@@@?j2EOEĢhZ[GO%dDR$'$9@ v\ `n/@D"HĐB$I#&艠 Z#ĐR1$bhDj8DR !"@I!LCr!"@9B"p`pr1qN!"@`D⇷CLDz18$9 #R!G(P99 rHKD5 @ $DF r1hk?IڍHlVjqK5Q3 L$HQ91BC)L``A+c8a(s2hk0"b*Ho d#p&y3ssˎ 洒Kmg4-F`HMQ*kP(J`Ly1G@Cs%'<%BQ= يĦwr#SyEȚ!1 IeKST:\iQ̜h A"TPݪ]"l ަ_[K8Mg z#\N=^u:꫺2LDYj -+, )L%)D@UJ&Օe^YDTS#*c8Xh*hgj\)0dJ[*Lr~_L-":6;b(LA*  ` \JWM2 d*;#0!` &"`<h1Ւ|BFBF BGD49 #iP0rrP Bo#!FB BBF CH@iЀPQЀрQ @ '3?M@d~>/&]Y{D@ eŝ5P),qW_[aU RYjbX ?v,5Q?%V#),qYE|X0F|Wy),ِGtVXa)6 K(|LlQy!-,s_mU9RY@gx2᪝- >-j|dտ Rҽ=T Fwx(j|d R_w Rov& R%us~s()pZWC *pZW/P+pRW8~i-PRW;h5Ky{tj()*;jc<}!_ JJ(-*>cJSORgzS+ Ml;hjo`X=jCM jKILslRO1!H-%L5 H @ $H{e,ǣt JNxFiY'JqP3s3qRЖO(i9Dw7*y3vB^8P͚9d(IӦAGm\iWҨIp6)`T[71S >**MlmCPQW #ŒRn9{n E҂`ґF E#: @CH@ @ e&gRk,?zaO,uCfFS$kNBҭ^L(3uE6cùUc)qTI2)m̩,ΕJJldLT8 Ȏq EB`q  QTUJQ=Lf n$!eAA@"q3{Q9SVReU[ :R'4&\6D&+#t {qL3 c7::Xї g*dNvį[f (D^R1!1) qpռ5L+j5E8YpuLp*fڟԲW G):nz>o`r"jlﷰZYI]]g5-֮G+QwhDqe{Q" ynl>`r3_n FUڀQuX'cdTr>1[j FGp>0[j JGME6g#ZC@U,h>Wj F}W<3-N1r88&l}~1j:fG' f.LGKCu͟Gҙ1v~n9%a֠p:WP~`:U8qsL$H T4VTԽD9=7QɄEP:e@D `@pǐ`}o)J҈HQ9$ܹwi2%ɬ@dMUA1TLcg )+vMTpFDJ) *(pb 8"ġq6YUA(4yrY$vcb( n) L&%7!"#-Zr c1<?Dʰ=@` qDJ9@ݪ=H&ȹj$9[q˗MܘEɌ7)( @;L);!L.2X3wR3Id!L2%1LQۇ+9b:{P; p L"Rq80 y;\_&D{o_cx p}3ɧ12 Xܟ@W3box%,Ŀ`GUwȀCa, ZY?ÎoA>(uVYՍU@id^%FJɎwZYɺˎwbYqgGUZ;-UX EpcIN vw0ZY'(v@skUL;-,¥U(`]rѶ#L.CuUer_ vuT#ɩxHCM-S@Hꞎ K'A:c :CҰÿz uNwa~Xꛎ Fý/~4pwc}wdPuLͻJ#KpZVi{䦇TRV{Sl@IZWOjRV}:%mӉ0v;0Rv}5C%A:/rv`w%愴u.;0RTcu,;0ZTu*=PBt)Pz è'P :=PJrԇQ`, $HfW)um,⛤$tyrtrE"0b g2 _EZՍ<[uf O.EԱӢ:(7"U8 `_Oq)ʦHK&3=`9Bo7z !b($t=e0fʕ(iZ /A#\J.zQL4/lt0~_q v*nsNL*B5L.ċ&j f]S @@PlnQG8WW:-7+ij> I"3NDJu !NTՒ|o @;`D0o FѴ4o7 @ rr0 r09`D0o`~x`1o x`4@ p @ 9DZQJd&ӚF 6 : vB( SLS戎 d2񳭮 U u ʍLfDAJ]N$J#8t]SPs 7-M 1*@ (((@)p0JKzmQIZFng0}5B&V+(h锂RÀvۧb[kzYOMgN#' StbbJaIB3>\'Y\s4n^t! 2* b8m6mu"o &a@Ol05"MeAw^Sb 8n%y伫q1|EI( SxY:/#/BuE);4҂^VַЯ}1$#*wM( 6)*7#eI1$L^sk[2BW}&lĒ^s{&76ַIädQ$Wi3mk)`w*ޓIz\C3Imk/w*ޮuGxgI'd5k%pT#'ꃈftZ-pnm9vCr]K26sZ& T#)ꃈtZC&SdY4r{28gIփNsk[QHʺ)&ַZ:spbR|uFW)&ַZ":sथ;t#mkq+; JSh5gTs4qb*w'k2ިLi7 !9Sഥ3e%o}8LXBk2i7+(@04􌻪&pw'* |s7 ++k#OI;T Ek!GN/{:1(W"FPqL}$︂j$KLڍmģSI;!1aq*,̡i #W:ws32_=e%7?1j./Ӿ/ MH!s}xl<}GzϺA;;!_KΐB#gOw2~!g= \sΟ fe NcLo u8#;™KӘS^J9_fPH@LA8~t;B}$,ǤpwgC!{'Ðs#W1^tG7g )s؎s`sҝP7 0-[)8rprwh\Gn !|D @ $|ۦI>dfj:kML]nY )iOfD'Ub%TMtrgꆼ16+WEwA^jaisĥ I y$ҩ4ԓԼ 261T9H1+q` {CXH},$՛Y߶LPʘ" {z<ᓼeV] Q꺎`Ir](pX5C6(+@A)L@) cegN?cQ_P>O8Lhj\ ! A5<1 zc <eC@J採]9U F8!sJDԹ11 K !CP)YhJ F"VpZZ#u F8VpZ:b*!CPPb -CCQjDDbZ"P)-#Rh@ RhDRH@b H-.x@tDT%ISII$T: BZFF @ $h2mm-P'>jFQ mjyk8Ҿ׀Jw־t6i9Z\Zc NV5SYbַ^%vZ[zێqk[L-c J45Hn9Ɠzŭo(Vt!Y5oD7V%rُ5Hn#ӚkZ)h:N. J38jG4ֵR04Z\fn%.G4ֵZP3ipRU#wF1v RڈzC%}Si+Niw\JpԦT:~"eE S9ӋkVY)}3f.O7=(DN%HTJd `HR@f@0y6- >Uq{g ٹه14 *"*^{Z\Ge95\M]SPK3I+6F9:ݒmk+b;1"JL}[cZu a%cVMC]c=^%O2\RWtC iTWe-,؏-ԭ#+}iMe]Ucyt,,6rVjYmFhvpZ9AAsA{ ijZm FuXvqzy@1YypkZm EXvqy/ ȏд_UaXykZm EuH}n.Nr|MkQ͠螩eߛ>k|Zkh*'Bqrw揄X䠨 eHK:n5\>?w,}b֧xp6\#U[RLkZKh eێ:nV>=upc[ vl9 q9kuo!|.gX#pj7BrgZKy.!:.͗!x-wSrgZKxq vl FףG.v<6kZKyh fj7n5H>8qZZ[ĭD8]. F66kZKx螩 e]:tU8ۃk]io%!l5Y ZZ[ĭ EuHvpj25tuێp٭k-V; 9Wz>3_n5uBgUa#qjUOKmDvkZKxPoVapƨVډp٭k-z; -婧#|2gZKy]h;2n JMI8-މε֖tWesRn>Wj$:Z[EuvXmIV&v\.gX+FHC,k:tv71ukxQZYmVY}1&5o*Բ\Y=1̇يmCj>ըԶ\S:1juf>kRj[e. JRpĘ6\G63Wb6֥u6\A5foG$xkZR_Vڒध1YA᭏MkQ +Vڐ1)t Ht4 Fntr?~7\1"ZC%Hx~njE-KXE*@>r8o\1"?:XPR޸qݝD6hEɼ\G~8-a2a#Z_a#ZȲaW8fŢ @ $q5rukTW7^]6k戵1L6Q%Ll0aj VOfUiI9Ef*5AtntRtDXf0t)zuo+*}b $AF]IpU> Bs'Qaת<7QS4iM,N&L@QvjX33uf9@Z{/gKwRIIW*8LUFWcJ:p6n^\y¢,Z^jis&6h"f0fb8y2?&[aCP ՜kH 0'!1*}gݹz),yO@Րn;ו+=iOVc!<ġ#^T}b O#Q/k&:/p(ҿpꑬx'ЗÝUx\qaDHݟH_6XuV?Z:2}ņ#S~Jy#foGΝOS# ~duUӾv).&Ixxkcbo.nδ3{id^>nήnv' G'P/Kb:_>C3{idF⣞lĬuU<؟=+=nUAq6'OkdJc:eb\lR'!pQĬ~(><ؤ>OkdJ\>1h<4|\szCDq4 J :^=+pz~6Ru"Il Xh%+FSfD.Ѭ&JV ߽:%l\)l&BvZ8uMw͹߲W\(EAI[*DuMI0r{2wvj"MK߅&:%dM-e6e/}|`r'}— ee6 ebI@N"wW\"^% J!{覇Ts2w%p_V)BN6po/ J!{SJm9 N@վ)*LD:|P_'}VbADL Z^KS7'O?dM(p`躤)*xĤu:4&?8%溤%)CY`s"iGGO)i(KZLé쉤o;,%ZBSz`u/"i%?+p?Yy%f?~$Ag!"~K>h:$/32mR$e~#8Cs)iZtGQi3s~4I!8yT @ >gw6ZFw}]]_T9uM-@tzGI+)s?&<,۫a>.֣E#`)&À5ٯ.-y t%4GԺ&dިD]`SHl 98{P[("c7H"$1j=¸J01)mHTI1+E|IP7 H:8r4A(GdAqC _IXq$>ЄZhB|,!>xb<1 - N%e1hahDDT{Bщ4 J FӁiC7) CD9[ļ`e)<`9J70C~h OJҀ)<)(  J’^4''鈊P"1-hDE(jqJ@Z!R @Z!D(rZ"S@'Kӈ/N"p!8 Q@ $Hs[QkEJPʉ.$3`:#CQ(4!H@dOuePy4sG#yUAE*B)HL"*i@052J,tIBa/u#;Yr e1@P4Dq(l&yVUE%B_D)TvA7djͦLl@R/@ɜ~M`O4;>s[d3xn77E)쁉_{|?cpŹǺŋx7Lǽlr,ld7qyaXEȰ}Hz{NE/,6G 9qq'oOOb )ȵ%7"-!2K؈8 r-IyaQȰ>$a="ԗ!\/&JCG8 Z#i/$K#܅DG+R^1%09e[d=^D|/i-i1Ɍt LG}THXVj&k22./$j&c]uGD eӘhվ-o'T#,ꉦNcM  K}bTK2ިaL-IGVio Já[iwTI0 s#°4چ#GXkivI0 s!04cBtPkxZTu \0V&]fpy%-*ḞrfQ<`֤rh'gCV3-*Va+\Ts86@ Jܩ[t.瞐5kRmV@V:ETsX6N>Jt ="Ӫ; ZԛEgAwl%:Rَj4V&])U턧HqЭYfQ<֤*ZX^Jt}Z3^0ukRm+Jr?h)*6ߎ~6َAjM)U\A-Rw^bԛEujQ72I|ũ6v{WyzLߪ9d6)/NB!ptSpA)Z<YIyRm Y)︽:b NE<郠&о5CBG9-I-dsd4)7&ttk)uG|ℼթ6v@]}Q$/5jKpHӾr0iHJrVZFΝ g"u)k_Ae"N2=̉q=d8,L\Fawu)F/5?Y 9PeؒRL^Edx݊c>|;)Gr? 7>əIrҵ7Ԙ-)``i5^ɦpD%F9R$y$u@ͥe4K9jtΪ+s̙0DUJINFP=C]$ZgOB1M] tPˠnÄH!F6ȦU]tyWRL%&L`հ"x1n*q(()0 " mbE(ä30,ƟsԶj\ay" [aq!J[`B}@!dM Dd"pdߞ AFm Df4Dɿ<@Rhɴd&#fDT`4EE(j\Q*@ZQ*@RDPKPY!QDЬyhUpr4*5(!8 PB!=A*^MAJIA4R h^9A!Ú)K AJ='i.&Z@PRB \^xkErp֋QjI$H7BYOܪ~z&G!8j*LPDhl$ 5*8N4i4Fx4;#m(t l11 S8ij^;7ʮtӽo'rX]y2ԭch-Ll"$D18 0լ!WhU3w[@7|)BPɔL J^@5Gm:R_Zy;nIʩ'2iˮtPp9H@YHfU%ENPM_iĂk1hf8uE!4 7 Ď-6|K huDL9QB0 81H*{"+OK*e1\X9nE\Sg`LS9q8J&`i% HktA5d;#e&{rggq'ֻ*")+!Ö7Ź=_rb("Q4QV?\oc|_y ٠ڋ-~.&X~vX5Q3A8z?i\LJ8,E!н4Qi-צ;Ot_qYC նi(\L>E#еjdE3lCxGj'F#kMN·,F'D#;ZN k%:a|rD;>"au6CcxrǹōQ1Yu ~כJ}EM8][Z{y\Qmmˮ*:>їuigV)hC⣩/CÐp-)< rakFje]Lѝj0FՁj0'늎޳oB@9ik- Z2ˮ*:-ԨJ4sz0:ҴXe Rrӳp+BҒaxJtMF=6 1+::KIuZm)Qu,hWCîxJTu@!َ-HuwuVײo Njl8-!'e):Nx}ȧTsJi/ J<=TI(CîҚK’g!P=~QtW}\!geuNMS1iEwuuֶ^?5=9iFOwun[XdS0.v?TM(.R֗'% nbQڇuf+BI ț6{P.RAJй9K M J:wP.RAJи77T9(KkV<Gj]enBJй9sɛzY[hZIZ~La#7uVI+.#!:0Mjen a%eɳ\4 =s:Y[Fi%ejISs8Tkиdse&5nnnrP??9nE=9%ZԢɜcH @pMT'ETZz6R\3EUPMLÔ%Dl hyJeSVZBjVu0_p%@)Yq)E!HD)wBQAۀiRMw<t1U&7ETq )ΩHCr$ex3HR^5Ur4Ku6^:EB(va)F)Dl0kw*zKtӋ4ed3٠N6"qC7&"P{Pک8-aJMWՖ[ +SI&AbgJ8l2*C^[qCS= #jB$C[++y!jefJH擷),ڪrSe%)`0yEe b`N2y8|gٹp4`ұbCFn'z (v,YQ9æV*/BV~oZ{hC,7;BV:rQYm_+:n%Z>=u-#9ush--+r~UX֖͢ -;qT>Kޭn FWJ>8sZVÊ(ޭn Fc6kJaxq=աmzt֕-iZC>ۯ;oVa#u+aZʡsgpnQoVat+AZ jGۯ9oVa's+|>4_n#ԏYmל7Cۃ5xcVOGk8ޒ1-kDZƫMڈ%b[u։,6nV:jm]f%^Ah?n JjimR]f%^-h?n B9jI-ODŭGvXm -E6gODŭ!a%ZTCڎ1Iy]d[pRU@:gAjQ$).ۯ+%e]>3ɐ1MRYmוԲ\W<3-MRYmוBOR)pZUDCq0e)J^1-je. NQmۯRKæh}~{iZGۯ9mSlI惦fM)nԗ%<,6, Rs , R/ߍHNi׉Yx: R%4z:^8g5δX/$*nrOMioahH^k- =7|A$ֵ֖[=\8Wɝk-4Rݮ?ǩIc[Ŭ6f@9XS٩c[n̮jsfZspe]\a}5Hn)߄a혍 sC,߆tֵ#LePܽ{cDZԆ$fC}zEāQ$H ͕VMuDH RI?JQeAS]d &"S8 0d=ymƞ%VhI܎r2d$ :FK 'LyLw+.#uTJ fi JcJ&6m /%&{PIÆ&MBUlٸ@ J:z@L*:*[hy2=/TN*9fdQjĂQ %VuT Z:+~RwRH½U7BVNGBɸKVKAW߀䧝f;?sJK@W߁.>wQB7…UD u),|&qP\-h3RV7UUրi|1{iX[?Y93ߎ8|1{IPT\G v>^1iYuO>s;Otԣ~R6|SqriZuz~)+HREyH-8J?g(wFH-8N?g)CҏSariZmz~)+hBHy@=kMT%nH^A41$xniZeW#v~!)[XuL I0^/[{V^LjRtduL I0^/[.ȅWű{T6dBnlx'G&^0 `nZEZ-$:|u? `d6dJ,xK$^dCuC1`]+<ψBtau={pn*z+k!g]g%:} L:T=;=bnԾψBr$ө@vPTV+4K&LʇS 'O׀vB&_MeuCBDN+0SXzg.N,Mt;^;n&p% ]׀[-##pZ^jQq&gK5(Ҳ׀TZF٭ J*& WAj/");l::FW/t̩'!"'H+Ej3*DPxjQN{k!]?lӞ] RIm~1e3(45NrWGS2f$?`H ޕe* ꭒO4frJ 3r&9s\P(OH+;FRY`)JpKN$A%/̪PLD Jg9]Mۿ)g"iXJUd3β"iP D "`.EWԑ.`YIE۪MId&,VTS8+*0q 3 6 ~LmE0B G3WeT@AqP`L00$q$S2-.fi9YU&dCQS! SOUU5ayTʧ2>?9&v pf@E@Ys8 PKPAdU"Y@(""bGHK_]ہ**t춋'唊hf33 H2"q)8A(gXjllӹ! ǍSm NP%8JhBp)h( JJhbz!*X@a,)8BhbPдB腩 "-(" qQ)"CS F$T1x Pyh)CP oA*1(RZu J1-֕jPHWP4 9u NҺһ1agһӇB'%8sE)zpP Ú%KAJ\^xcH@Yiy 0/N1g$HeOjiOuJ^3;lq JLR s$cf` `iiU-&֜kK6rDZ7Ye(T.|"؈r&[o&]ǚlFJ,f@!H bqWPϙ=l2[Uk:fNWW ѫ.T!EDb@Dq 9T6:guJ s)# u rKp'nE&s@! Cbm]TURiM#zI"r:4gvh *)瓄8`v}=W)o+VWL+K60L>q2b`P'DɎP 3C p&)Y9"I˘8uHD1^bED 3C ƔV5$fYc5p-FhLKwO D1wgxn1SЦ7)ŏ&/9j:EVw19)ގBђ;ҥ$%\9 yBOZ.Ow\s%ѥK%`!(Tέ.9'7s/HJ: D}iqυ'DWl9Kx:BS.g'DWl!9L\wBSy ﭷZrtIe!9Lw:BUZ=y_[n$W Y_ NiP!nHJGGg}myaK+)Ln- _\Ah7;mēT Js - _\C(ﭷ O,K+)ߘOq3%m]WBV|iQkω[vH5e)Q.O /Yk(RcfG<t`}[vN|5F_WK+Iy147YgWBS5 ~zxM0:D'>#/@W5 ߧDͣ+nφ(%@j}^'L '>@W= |xM02>]Y_ HǛχOHk[vCj* e)1ޞ)LNd¬UR JanGG+>E:GݐQ Tm7-LN{n؋ХKt'n-L}i 1Jl%$(Q5O ɧ=զτH%^RMh\4YD纴9z$ I3$/(V!Eү|%6OLN{M{^*eJuē哞dO^*RcLoDJSQ4%ӜtyWCiHJsZ\sW1*HG!=<M(HKq8ī/# 71iCANr\sܼ1s4!'9{@*7%IC, I 3T4].JWّlvQ9TJuNuAT `RO(٢rZ2@̥4 0 UL/l9(`\EEI,܅oԒIC)i\M pt4͜*8hc}njW$⍯I/$`5gQ9&p:S8QLHnKK>mAVs +ʆ[+8qYMډns03JL,y̓m8SS=_>x# K@(ZQ³-i@#$Gz]DI j:p7 B& Dp9b7C<5-- i4 Jш5 Z&C Ahjc9玠oc9[D4=x41945451hhjZ"P8O@M B㤐=BCP$ !it @@M ˢ I SIe@ 9}cj掑U}T2lɄn^n\.dQ!8><@l0uuB)K$iZHKf bMEE')H)i07n~STi*TRRppRÔ9V4sh] jAfhє48vTPSM$4((RS 66u7rU28~e_0:rS& pq]ͭ .w'4 ɝ8a=UTk@LT@8 DJ2^f. ŲNhʪDœ嚔 ` L( ST S9,y0;9rbH`1S8 XKyD[DVݑ -e&{rggq'#/0I];j:#|ԨJҿe TDwߚڄ/<;>! q;8o1 Zcxv|BSx5R_߾cj'~>-j:8/AY O*V5RQ8Ьx%wH_M LjRyObZ No1J[hV5H>29ßڼNquhVdbN3óǼH5JwcN$5'sqF RXi6D;>!I\{ԥTR;M^|B=A[i2w1&e}MS_\i2wM&[eiGR; 2BUțjcIIF̝Id%:?R@D6dbGnY}% :lxĎ`qD55Q$;$VڂS!+ MKE;AP}-%b 1ptIؿ'&SA*/%Dq ?#bI9d"hEğ~eIIEo%bI5=4RN ?b5KĒj!4rhEĚۡ?Iɢd#;-ə G qcD,+QH[ pR_H;3+ZHI,"pOݩ_64 @2]tU3.>eP읾rb5* \r%Q%H\S9,[)W!_Ieo+7g5jbe%` :G2@a00 kuMvyҦ92C?9)GL~,QKWO@H Q7R8Z{؊hj:e9o1`,DY5$B@1|Jorrs:N}EI݇ tS7&@Ofc[Rt>Ify[DƉRk(rtf,PLXLSCsK]f-r5rteP)3r pLy@i ٌ޾MƂph#( DK #}U-]pJҳʘ׌Z?ge6nvi sG USg<1$V{j,y> dvMS;2yUխJNdqկǛ #5uJN\4GpD,ީ(Ry=]Plk?{7qV|(JY>0[gYߢ(5.B膛iXߢ(gu.'`xiՇHoJGgu.ahiMԺaU{Ej/Ծ:w+RJ>sR+pZ6N}UnMC5/#e i*#uo14V$Y[7Ďwq.ԡ'5.g.i*p+EjS_9u-A_9؈1tV:Y[Qui*@'q"-JwNj]en F!6 "-JG5.jpʈ3zY[p-)</)Sۺ4Ӱj1AjQ%5u5 TfrlxoagY٭b֡)v9nj>؞ob88ֺ O({>+O|O7kR]Z'- ՘ay\VֺO(;f^]"88g5έBR8ܺtwyƹĭ%;u%;tMʬsq֖7"D7nΠ֖7DwoΧx|֖o帕hIs-I^:nX>=u4?7u- qGM\ bi-dzo\Kxb7H!DZÇMioF^U;ȊƋ7u5 _9k|tn9EZ:ݯMqRwKZZ[UЏ-mQmwkZZ[Ѻո!񳍸Nj9u5ZƠۈtֵ:s-@qE;m5G6zo\Kxj7*5l|fGFZjOM]ioBUPpkZlֵ֖nV:jmL]ioFr>0[j##ij5&uo JMG7g1ֵٹc[AP͇D8L}b֣RjcX1Ң39] Zsfc F}G:وkZ#VGLd>Sj SVlm5Cc3v\GLkZ9jM9:*cXIkP9难d#5obi-aITQ4z>?\skZ5"Z’LyfOc[ƤG(Zs'Cu8\αխQΡ)N&s.gZg Nl~qSu8\ε֖I}Sus:Z["r.(n :*;uo&¿11uky4.Mu1ukxBܬ!ʩc.cXxjkf5o HfE[3XHXUû7{f#ij̪f0NjbB¨n^ XlhKZĆd9?bi-a $H @k]XQU6Nv9ȁMSbs0: 0gwӹ+HfԋAxJ\ DM ڈb +y*(k73E=bLxB@)/1XH@rR;XV6|i#:. TZ-D\vpfgcVCDUwRr kIsnj&5D6$P8g@R[\\i#&̵~ؒ04@D()8"4 R&xL+c ~?73цy=XeB3n,yWcIn!ʎb;mh2:0ˎc-ZO#2:oO)hô^G luU_J)!&HF VtuU"fBuvώc&oBVNׁzy$&9b'q(N ߀Jy(k}H ߀By*<0AU|L>oVRl/aU|LGZVɀKv⣜Y3ܷ1=jfjUQQ*^orI$!BMQSTs4֡[ K'BŮU7AӫZZo1_ uTOh-Kq/ ߀ZVJG?Z\ε ߀ZV?\l:/q ju8jĬY 2܎ CV:_Yo-+$|$P|\sGV:IE"z+~Y\k~:H֧\5(OXo-+:|!Cz7 Z%bmEBlG<ߤ5kSr'CHv7 \1z'O׀ZV:!~C IõD;GT6">ow:᭑Mt;^I[CJ@uMf#sIe!ߍ&:zG I?׀ZT"%ﺕS@و?ÒO-*!ﮘS0وOh l_RTj!E6:!z{2w5‰I"S`17'}RUtXJT%@:TGpԖ]$%:i"O9dbKVH ̹Y FKgj51Znk94)Ē?m#Ɍ$\Un LOsTgƗb ب`690L3D˄i۹S];ͦ2bzYРdȉa0ZUQ6r,L)pJ*k%kŲF01#Z[tg[T䦑uV;ɴv)/Šى`0 @5֓TlO)Oz0|Jx%B%+Z:bHWPbHWPtCS4B*J^J@ņR)C! Crhjܡi AuG45.h@a*9 j0Z@yj=B!J[hr,5,=JeihZ@D-0Ii( J 9Ӆ KD@& RZ"!8$ KDAIr|áI%(BqsTRQD 5*K*]8vƖ$N@EN2$ Qfq.5 UV%P4ej=]2PP| P0< ""S0K?Ӕ帔UKAiKbIЀUAUHl B8,jbkIKoe7iaVT34oͪnj?ldp<.iJL Xsk%޷N9]=>qR(xe5+tI @) C@ jd?I7c y,*J_ <LRGk1J@EdLiF0YUE]G)1K4 @0#ooUL $2et> P:d1 J$mmlV L3 1*8T)p C@q 1QNе= c|? qfhՐ=Us/ˏ\C-*Ki'#!&n!mkq2Qt@^xsI|GsOM zzBO6;P yK(냉'S ӨS %uxwI~ w]'Sd xK),sp|Ok.%O1/zDN+{$I׸\J%9 x:K)%<︒y U}p>KQ| okYi*|9wK*$rysokYqjw?UIY$D\2Z\J&Nb] cקK_2i$=%ķA4=O kPR5Nܧv:BW>$=a- F% _\ww>4=a-/;{]uOIw [Z[o|XұS;oJ`-؇j5WOq\xy0ޕbIPShD̝"a#k]ҡp??Xy0#k]Ң94~dasZ섑:3O7fshmkt~<="+I7泞lNzV! Is 療qnNzV&-3#kY!n"t0x(q,t'}%8^ 2?5NJ|4vSa~k9Q&]<?sc'*w^BI9!~OdxTNI?7̃|p(ʝa{+ pXʝ$tA~B<&t. KNls&b;L^@b8Nl'\N)s~B;Bqnn7/ (t'DĀ $Hȧ]et3RY/;Y:AQTPDDB&)MDzSUA^MYͮ9D™Zhc2D"lG1"tDLsVʵmIJG<uPO߬+2i`3#c!p1 +0"U̻6w+v''BLug+ƅZHÊp&z˙n*N#f"f #yY]w sUoPe8͗#1NP+.q1@x Ph%BIAA Rh& R8OE @ {eI[ӳ93SQBfڪ|F%b t](tqUU!sG ̝Nr$|H1 qPS%@ίjQZIyM*#"E+R@H$UeJP1rjm;CY>}-kfE!HH% b.YU2'1\iUR 6'2c  h׮v>UPrKo_<UP1#-!)펙(1Ô`ԊlJ΃c(M=IcڔfN` L( )Y[|I WM,2 p$)(C(@H l1T =ys1![`CW՜WH˙i0/o9ϢǗ\Ƥ5L><=|{!gXkNՄ'`Ei8zzztXoVKĵҾJy_x 3_ׁɒ3(RY\j:!Ĭĵ3(RYX,j:#ĵs|N)>%fU'f%tﴡ)eH'gU _ׁ6&iBux Gk8dzKjR^H7)n%>y2LĶ%scxa Gkf%^PMn҆P7+n%iHDRvӆT7,nq&ۯ J2>5RDx5ϵGiNۯ J3v5RἈcuϵG^ۯ J4>5S!kuC)^ۯ F5v5SaqkuGi^ۯ F6pN kuGnۯ N6v5Sqs5Rj%^o[[OGu~ԯZmׅ%wTj/i^ۯ J>h0# Cu~xQ-C Z:9tZmׄu7xHj8д_q'_mׅ%u=сO] IkKq'_m׆%sn(q/k94Y}^(HOÈt,q7z:n)Mލ( |,q75’Ep,Q/{9ƳӾӯ N(Mwˆ?/ux{\KxRuGt5KGA{#sZ[“ !9O !`q\e83- U7{Dx +i k-)UeHdp(?WzVS}##5ukxJU ,547q3ukxJS҉Pjkb<osŭo/$T56 7qXqfJ 0pkZhA^8Dej^I!MkR? ϡ7f9EZ@ԔGyfcM%ѯ䣛3Ik-+ro87 JZWnj$s{ncgR,Q!/ăpӛg,*d7(st0ds@D @ [̐%{:uTbÙ56E&,_gTpl8PP*〆O* O]"kJLgReرA D rx |ÈFl/%\')QP0!(Ci@<[: 'I*f^3Yj8 'ٹن14 {/oFƨYj>#!k!Dk[Q\{{wRZZK͎M+ O' j{OwQ1ײ^sbY:ݐY[Ii/!BJ1,.iհ{\{񄞹 VuCmhn>O\IyI+ G'mf^n>S\IxVV!ypMsm%V#4l5ՇM>wҚKŬFi%a؛cn*CJk[i/!ftFܐn C[i/ npl 6:vWZIy s%en(anp+m C\#%W&p 1*p+ ֶ^Ch+CTLb#嵭/!9G]4EH'qr֗ F!\GZ^@5 W[rѵk؈,Ծ5;_Z8؈p}ckKbPd!?ZXbPm`i)x} J1(Z6ޮ 4 P@T Rk`8#;7oc6N[T)qbi-aie#wGM׮G3=RK4rc7Vlwje.8bi-aIevD9nn>a͐Զ\w}=ka{J>OR)q&PTt}Ò2n &P7Lt}ۯ Jb8s YMKlx֐Qj1񻍸O6\K)n1[΢8ۄRJC>ۯ FփƮ6 )-mIq4:.md:j}JR\K'.U`:j뙯 YXԁƓaxjW% -A*BmnV:jmt,6׾ӯ FGMM9T3uW8I8-=Bs\Kxb5J:j)=]l̅OͯLKxZ5F:j 9]71eZZ[R>UڊD,6rkZKxrtt&CQUŦZU;Gjug*)eQפukxr4GnuS*NRf#ijE61d+,G-eNjz<n]&YlhKZ: ~njYlG-a)scuV~ohĩdFGcUh;H"%7{bt%</[ :1CIb"Y9f%rdUd;rRx^%iҶJY,PYQXWűsֵ%< \uV%/բ9\HGeUx!LMljXZ@@Tl꫇qƽ%$ۍ![]lzS–qW}mZvQPSViuOI7=b J̪^h7J;T#ۃmvBҳ*@*ʩF"cc:&޾*Uv j䮔&gM&y%Y\E9 B2 c ƪBZ\YJM0Sge)IG$1$ 8 yWU;YRtTEts7k Wn)L|L(?+)ڽ+Im4k"M[dWI˗9MDQf8&Sc 2nA#t!a.Mźu%bb7(ڪoN ٳ5mW2i, >xy_̓h}llcKx%ѧpZpIisJr)({D(b\+8-@qC)b$T1-0 B"D5$D5 tΠr$@!1-#Rh, Q4@ Rhߞ%G49Rhr<Е”kCQ@4 @j' 5iDG JQ&Ih@#P8$K4N"I ӈ/N"P & Izq iO"u ӈ4J MQ\q @ 4[i4ڞq(72Is1tULÈ 8'o,ê͒!r%4eJɠ2 NR98mG#ZV/[MVIՐI܊N$Y9rDHfRKpg'!@8Kuns BCY͐#yJ.̈VꦿnD)NmN %3Zrٔ'qiE&aU (ؤ3t L/5I,|{!_AE7MVK  dSf!R$m6K-)Y[nO!\(Rf a DG< ; c|/ fhߢCLxb1i'@j7ˋ/x27fF{GW? ;o_Oa3If Xo L)='%bQ?Mo-B^:O~u`)% Dԗ_VzxA]HY셤õĢ G{CQg=jGn%3=k98^{C l@VN @9OK9y +s2#Kr[sb;x:g.!Xsq؎!3sp9ӎ(\@iGt[i87 ӄst>?IoAв$ $HrGl.-6/e$tR]PfU!~ En[88R:;7wQܜY)fռq⚮H퇄E@ E=SS:5[.Y_/;IiGpu*( (i$'L.p *W]֏%U~@4vȋ[vS b*= ;fUeлuW/e҉I T8l`*" L"/6֋?=}_ߢϯ<L(Zp1xrPĴCWpRPPtCЮ$膴R A*5zzF!8b PP @4Bb (֌慩4C0KHB{CЄas”!jYh RC Q F4)G1-D5- Q K@j 5h酨 KLAFZQ-FRZt)8 i0BP@D ^p:\p%:2 $H$VڑU4)LTxdP1#Jcsgty 4->M\5nȂl=VÜ"+$lnP -,0U-Pan£2G : 8঱ rPGP\TC"! :VdjVT~5|ʜH̎qDLW.x8siITj C%&Ck9y3jw !82i!1N Q(^ەf4{oFvaq-i7-%Ě`)J8@uco()9=O2X7rݫ%Lݲ9XF6qĂNQ ƱvC|W=s3m8ԏQBI6s|=ŋ\Yq1iFbb;<1㴲H z!kZ<ҮԲψJyWo`5Qᾉ ]׀ ,%RF#fU P-x ZaCT ToAĵ!i'AψJyP>j{J 6ψJYN$>-j{J b- NBRțգ To`Fuq㺴+!)ZPJ#OXo;BPϦpJ# ";wVc)< 襃{"9KաX J7+XpDxz[~?f5Ssb9?do5S%Dxf-tlx#yM Tw"9 ` J5SۈK~ ` F7 rAb%s,!i]F#xq|K^xX6h !.-dܝ!ytj!_XjRó^jC: Rڄ,X:עe6ޅ,a XZJQ2ψBuqN Rڄtj9lļsqV Rڄtkx/^xoNpmBzcIk[% ^Jj RqƗz5'ڼKө$uxcKom^%Au8cKbNExD}!A }q)Wy'AɃS0q|}m)WzsD?eu8>i49KyWCPq|}epS,c\>62\Yr?p$!aflu'cg% I5(`ԜZID?x2 HMD$ZImR_wyi&X5%b\"!-奘t'`%t;ҼG#Ē# /Ŏ:\E,ķn$Hrۓd2e3 wL&S|voQuŌsv (mW47: ӧg,M{>fS+FXB.erpq9 SL`(4KfvS$N!EO3 eM"/+~WFsS(da>ЄhuPAM\de&Lae#7 G<`]*JA5MR+^O/#(\UYbb)S`q1ODVeenGmLQY59[ Sp |2򀪟HVn3GMLRA)Z< R' D{b<^j+ŭ4,yMl1@DZ`Ѹ9U>sSPbEH{UqcȘK'lk0w'5ʹIduNB醛eY相Oki/3ZY[Ѱ7D1V!}&zKԺV{bRzKGj]en Jn*M) -s-%uu.bXiUhx'2ZZK-=}1rCMNq12^GgW4ˮ FA4MH'qҺKqt/>ˮB4]D6" ;+mjek+PF!Rb!euC-f]4ShJsq)jE@[Q6l. v&ȪN#C8D.i4&ݻשil4p0% z/yS\ZIRiБdIdU8Up(r0-˺i>8F.o0cpᎌGՏy<\*_qtv,{xljy*$is5,hLA"k8Xqb*'Cۏ;(D(]6L.vGEuHvqQpzP6l}]TYsJ+CqU fəo}SyeG(n):.͗׸M;q$; 6\f[^??/\V; 62Ý}VUu FuXvqgrwum86⛤MVY>Vqz7CۊնN|n#oVa-A*C2*Ơ򳍸oVas3-ѭ1~m:gZ[ p_ߔڈd[qMԄ/׾ӯ3%ª'^Q[j#Œ:YmGRSu典5V?T(C,⣩In̷s<[#eT}+H'>ۯ,%T|ӟ(C,⛩zI=f%^fZAmeLRij%^XQ8Q.2n*::Kn̵N8NDTݳNB/E?.zoLτj#Wv/*z(YE.ᇦϺ~E5q,lCPE2 nzmLτJ'Wv*^-mB=5}xeewyFefEJ ^qGIJݲQ+IJݳ R׺n#TN%vQKĩf/p?iuD~h\K-+Dfa ~jS~q| Z[W\6WdW7Sv*9yFa|SqyEjTݲAyFA zSqyEjTݲEy6ˑ%zԧ}qĩewa4]RmD;?h\JW\"^kM0ȦLu/ETݲҫuIyr+:{K#~Qz*n؅0ȺLu/FhDewR{2.FzeO}sϪ3B%M+:yde\TG<4"TݱˑpS_sЉSvΚb)r7)W<4"Tݱ dV锃+b>{Ѻeg92=Wt)dZ2tF>*C Ld^[s֎}M1W??QdY/tGh>F^Tȹ$A鄋 ncyEuc*V$1#Bۘtvn],Zd'V ?t-G>@/9a`I=ж#!;6ֻ&A`{ms ?A7h^sk]0Z[u}M+;gdȹ,U| nwEw`[L%>ϒmG ݢm V0v&BۨB4[LX_ߗWuCA7hןlLUX}&睒6Q$:ݰf2ϤWuGA&]Oie!"U˫y#hNiu!vdT=]]sΩԛEwy6iaeRQuwQ:dt_Rmƚ^roݲ˫y%hKiaZN58})Z/6/qzXVfeҦe?WwKE&Y|S3 `d>sh+ >,O3 %_WwOE&]|m?˓HfJ,#,M gWif\j YU7q9e4]Rmw\!^ H @ $H ln<"@ r~ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @vedo-2025.5.3/docs/colors.png000066400000000000000000010340451474667405700156770ustar00rootroot00000000000000PNG  IHDR aZsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxlIOlBz#P"HJ(R." " Hw$$@zl{]ٚ<CfΜyٙgZ4oJ`1c1c1c1c1cER0c1c1c1c1c c1c1c1c1c11c1c1c1c1cH&Buc1c1c1c1c q?c1c1c1c1cO"DH*qQ̏Gd1c1{*)QC#H],l>ڐ $U#{tUUytZ-:D9Vc1c1"@O:#"< Xnnbn¹QTB"^_-WWt E|qsUpJV)ȱba1c1c<"tzR)L_D@& ĭ}%wQhdvuy dd5Qt0.q3,c1c1@D 11n"=t:6-DT DS'OT)H$ `ӣot D™ $RJ$R,?sӮA"X͏Gd1c1{RERRԁ2J]u<3/ںo7JvFosnN8lRz!@*s+\eHe1%Zȝ gi^]B4pw-7 {Жj r'moNUA J5] 3K*Z dr'©*F{GEqQ1:Hr8[ʷ\f"k;e6?muӨRiKQ.Hw{iY(fAg%? _H-فKd1c1cO =t(meۀoI͸izF:pG2.o?DmIBPxqѷ]4*dE?ht+pm2z Q%1}ϸ+n )u5Ⱦv[WTpa|˧{>+^P>sPB: ph"aDG/d1c1AѣaT$իR vVE}."#"p9-'">uѺœҹmQж+.1ֻ1c1coѣ8/j>r|di!&T" q ]P~/tP@M䮨YrA%5:FT /C,FJ $\e`=6uRcJ4ͭLL:QB+["uA oW8 ڹk^;ZU1N^m!cQH+"8XR} KQ ɸeدz Dr{ƨI 'O?4[t%B!ʧ<"lfErpQ)`L=¸O|KDuñm~&nfC}>lS=6˷<^5{Lz^!K:(w Hpvuώi"@ Oe A@cD{?wՐ8Bd1c1{섐 [bBBpUN A"<$xtt3PgC'c~d1c1cLpF]6 ]qґb@{G|.mh7?ZC_3~_ 8Եӡ\8JM{b ½Qj :ןkp'(3ao+,5r7Æb˵.b;띛 EeXq(N@!> k]FqQ{?\XQ@ӛ\6⟓{#ƫ!bd8=ׁTg~E~)x|BЩK; P goE^ jn-\jyթ8> Rwq)SIwbȿr4KaX0jW@ 5֟]Jh q p MOǰ$^oBo5?${3킭 ةn59x'2_{Cw{|~ oJ^ƾ5K,~v g3Py@na$ =0/wΉ`,],3|c1c1m: i2#A?\|2j~;v촙K۶ml zƴ)g..+į1a17 1c1c%Nu| cB\u"!OAKws#1(bႍ H}аY,\2ZW7#|727^>c1AUo#t=~!+Y]s,&uoY%mn{$,<]TDbh hU(P9CТrqd{Ң(ty/\C"T&@].WqmtnP!pI=6si(ɹkwb;,"(0VV$;Jyr46PL]N,KJP'@^u-]S2rK-(_Kd|)w|9u (xGE]maQ HHΡL(P5E[ϙuH>lPW@S\B+j(b܉XuUod[^rZ:Bpyۼ' n!c1c1أZjB)^_~ ;ےkĥK 2u<֯Nk3FtB@GtCLwB&0_:~Z y3p@c1cDA D#^#ـpE xZHׁKwf[24m ;esWh^i3c MbugvQ"hx`.mK =;BNYs}c_E ]h8cbl6hA9%Mª:4_Cgә}(,ϧb5=d2 fѫQ}T/ ԈT(/AĻ&$c3iXbAsX>͇૙FB2WWd;-FYr׽>rMp"8  J'%||\@:1FsB<ໃJ@&u\˳Z6tSmb#ۋB*tqL^LfN5[ M99M?S7 oFRbV_\c!,,. x"4BL:n[1c1cQB2hZ5;AtZ~9Vt6 5%*FHeв&AĖ--^ AmL301c1c=($Ud S88+q$7Z%2 ^(Ğ/Savy x!$i@B(vɆdۏ3PMPRP: 1`ΏXv%7An}ԑZ Z.Q(N}#]f -?$ad쨧k7N/olj 1u)BAUTlI˹qOm% n+sjKmt1مtnxq F!EVKHh M}mYa;e ^hD; _;w={sq]!TKYCzp]Y@{q5&|GNŒùKuGc1c1V4 Z޽l+VQؖc%?&Zg)?V*O_]u A_eix@c1cHN>Nj61p*;J JޟYzԪ7^ i bhD\.]JQ$C$=JJ\Jc%ڎ:L R_?Ґ#@@D]F> Lz@ 6F~ӣXGYG"]S:\QAHkxY Jup ]~!ʌDWvU#}rOiJP$I{׫QXN OO4j(hS&ޘ6>r iPI.@.LK A@HnYh+ןrd/`X@8opj {/qE +AIz.G;rqylФ$ވ'|evo { NXGcګ+e#X5aK(,B'.&M\.jJO1c1cD"Je1<<܌Sk6yJ$PC$6KGİZ~UZse;]ƌr0YS܏5ȽkI~1c1c1Rx|?4FrXW 9S:N(p$sGZnGǾ+ <̽P4IWf#6γ T|wrDvQ!޷㪦&'|;khRwvl6InM!L_[d_(&Գ.yTß` ξRڎtC,\FV$"g _C&!%\M{[ i~C}Q>.%Ñ.Kh 8p2+s SmOSWʗ218Xu1Ec1c1! puu1vvh[΁TVÞV1Lb-j"L~ks16 *DkΜFi=2"c1c1{$b;hѡ.2Bξ?qjcxm[]Ml'"&~z^/ǦCm1Y<}:kps@s5V~o^AMw9tEBEHuwq66 '#G$C~s; ]>* *կ!(j'xth{k {"M;-0Oi*(ϟ9e bzp jAFJ:2-z6/_ B:+?9dCخLwLT'hV̤=\>;R|YCHreym/voޑx9/C&v<}0c1c=zr)22n~ D00t̼ ']-ײeͼl=p&=p/qɄ(Iz ;rsqy@c1cnjSwRۗ*IǞgPb,}!9j֔ wp@ ݍX!c^ Bdρx~vCjdU¹v-Ewpz,_st?tV{w@|-Jhp9["D[q`::Vl[prs+hOxUȹygHbجwI}G@½V= ql<,..MC\gB+q7e Np Oi1\K uA\p&je<2STڙK.%pr-)j7MŴ?T\ $?ڈmdkP wo&!R0<X5@R/i<2e.pi=|h oMݫ1ߖ1=0up+_.v|5RwoZ_?_WcUic1c12jhpM(ͩz˒J~/ dƴ## ʯH㧻z @_Yu9PUw(*+(Suud1c1cO6i8~6ZƺOf` أz-ᒱ N[kz<얇N(ιld0>>0߿ac1c1PTWom7I$tA"1}A,Rbpbv+6vە&b~ 7c1c19>r$A@P:d??n}#qx#Bgo/ 8q;e1c1{tI]b||jg70L \΅+:=] ^, u4LY|/?X犍np`6+0c1c1{* ƩFpD@ީ? ?w. /tټ e1c1{I2x#??􄛫 r@B,FAa!$^CTR*ʥN*ԖvIqK\Q,u:)c1c1c1c1c=QtZ-4:nrT ' RO&|1c1c1c1c1ƞ02 {#=x c1c1c1c1c#2c1c1c1c1c!;2c1c1c1c1c1c1c1c1c1{ ǎ#Q;˃R?VU':qcՉN\XuǪ?VU':qcՉN\Xu˃LEԭ[caO5jpcՆN\XuǪ?VU':qcՉN\XuǪ?VU'Iuc1c1c1c1c1c1c1c1c1c;2c1c1c1c1c!c1c1c1c1c= c1c1c1ƞ:HHH@hhh䗓WI~:TwO\[ݺu{U='[o3fTw1c 'OD`` |}}q 2!"4o  ~~~o 8 cO7BPׯ_ XvikiiiG``C:x]hlɒ%P(VP~~>ZlPbs`7͛u7o|>]N>P( 4lذBݻsP(/>H*>||]a1{(=ʕ+P(zFgΜ]|j5cg}2ۼp(*ɯf͚8r m?~|쯺X!<ռqQ~9{-[`֭(BƪZFV; c0/$w IDATD2~)fΜ3gB;c̘1U{zm֭AV?}t֭^,X8&N5k`Μ9PTU.{߭!V VPbS6lFc7>'Nرc "aÇF˫жaaax1d 2 dO{׫40F?]_ٳ'oޗEFF"-- zo=7;99a˖-vq8~8;M .ҥK;f7|S!-{@tt*hKcutqq /PZn}o߾U.]Tw' }d29oFD"f͚VתU h񸹹9Nnݺ8F  o[N=&L @tidzUAcU˱~?]_y QFj׮HII &M8$$$૯2Y- 8͚5CDDڴicj׮]Ahh(222[o!&&;v-[[޽} G KSNEtt4"##޿J$&&b޼y 믿n7(**رcѴiS4mcǎ5la޼y8 /vڡUVB@\\IϚ5 )))hܸ17oɓ'5I0`W^ɓѸqc_2{gcȐ!sqJѸqc$&&bΜ9fYl3h ?}4bccMڛMNN ł 7X7>Xƍ߿?"##1l0#00GFdd$VXa^Ra„ hԨ0m4cРAv;co߾};fϞ]ő1Vݱo߾1{(:2nҥ ѭ[79r,VŬYУG"22zٳgMҽ;&S(m޼}Edd$w1ihAѣx{6mq:u  1.5j a̙38p ѰaCՋ^Gll,0p@DFF⫯˜1c8]d'OGdd$zT4D۷GXXuÇ[!))){N'=h ( DEEU8N:!,, ;wQ2t$)?JTbԨQhݺ5ѢE Z,݈#Sk4Fvb  3W~u֡C E.]pB( 4jzu:d/]NNBBBM6SN Anp9{a{ԟ8W^yHHHȑ#1x`̟?ߘ&>>޸ԩSe>YfRDTT{nkGNp2rJ<3 C׮]qAtt邰0o?4* AAAO?d4nӦM3 xe2%bӦM-Ɵa>"z\\ 4h/j*h1cFF3L%ϯp>mO ܹ;v0ovqqAԩS(ԩSP*x7еkWlڴ ӧOI>YYYXh cǎ!%%GFzz: ==v횱}n&u?FZZ:3f௿͛n:8pJ?NEEEؽ{7vލBL6؆ 407_|RSSqi,X30f\t ?;x<ŋCRaĉo1|L2֭3yQN޽Gtt4{=ӧضmΜ9c^{YhGEEɓ(**P|eoZZϟxJ%:~ [nݻw'4i'OBT⭷믿-[`8CNHH cӦM۷sNl۶ ׮]J¢Ew$>{z{3$w}۴iӌoNɈ7i3{饗P(gΧh`,[ HJJ¶mLz̙3Ǽy0cLq4{q1{Beff%(ѣGi̘1ԢE իW-/ b ٳ'Đ?oM7o޴MQQM<ڴiCԦM1c9Ǝk… $($"өS{233R(,,DQ=zХK^pJIIEN3NTҜ9sk׮zHcǎm۶>H>i43Y׶m[v͚53Y׫W/%Kq]v`_iҤI믿ԩS)<瞣;Қ5k(''ǘpm 3fNǏ'???ڸqc-=4h4~zuxѣGA4l0ھ};ݻƏO m`3KDQٳgӷ~K(RϞ=СC4eJJJ2=pє)S˔N'___Z~1ݼy(11֮]K.\+WRTTPTTDYYY$"]rbiii&۪T*:rɲǕ+WHEJJJ 6iɒ%Fn|)'QJJ H%%%駟?OԶm[9r$]~n(RJJuN`E5jd\jI&VZY>--~mj߾=Sf7ޠM6\{٣ZszKK.Cѕ+W諯"???***2IVnݺСCiÆ ?PjjIZueΝ@ӧOt4֭Z|9>}-[F$ɾݯ!Gӝ:uDQg}VZE^{vZuͥ{4iB1114`JKK@~͘Ν;畠 ""ڻw/Ӈ"""I&4{lz=ԫW/p֭͝;jY԰aCj޼9Lڵ+H 4?͆U?{߿gΜaÆQ֭)((ZlIGM6QTT9rĘR*Z*7=z233f8j޼9M>ON)))axU nݺرciѢE4sLJHHnݺW*Ԯ];иq{ݻmSرcIEׯda +WO?5vrVZѫJ$"-]l>Dg~hܸqk[z5hтDQ#FVZE.H/"YƸnʕC(ҀhӦM&qϜ9)..~**X-Zodْ%K^״Z-SNNݺuDQ۷oEڴiC׮](yfjժSkۢELϝ;jkm+=z= 9:vhe\bl1?~!{4|pGmtA{1Ib ־ 9zm6-Z:wsdtܹ3Q=wޡ{DQ$m5ٳ)22|4uT눈>R(HoM6Fe7䇐ǀWUvv65)((Xg-] fL(Ҙ1c(>>Ξ=k1MǎM~%*R]ud^MggO{z{Wĉ4m4:umܹC3g4ҫjx#66éK.$" }fRWwOGIH7RSS7GG+ˑFC~]g!}f?)Jݻ7H_}gUzԻwo:wǭ^,}-Ey:nppg됣=]f̘A& ԣG϶@Zf7,X@(ҧ~ju„ NOTZ dm6-V=տbx>%%%х L>bE-q{=z_C:XݼylyNNӉh׮]dr|9Q̙3ƿ kd,տQ!!!ZhQ4A~O(ODDGW_}HP/jՊ֭[g(iq􄌌 [RFFndl/CJyyyGC 1Io/1cЈ#iĈ4fY~L*z=]͛GڵK.Qy4l08l)SА!C8ˈ#}]z7tUz7L꯵}4nܘ,YByyy4k,uR|>k~Ĉ;o-.K|@t̤A^|Ώ*`E1222`ׯ'ZM&a9r}[t;RAAA&zJe8sU:RO"[׿Ke_pvkXUMϏ7nL;w4.sN+V0ٮ2R*[ Ѿ9ѓI[1ƿ1vXl۶ :oM=}vhҤ ?pm6m˜1cdW^1cwnu?}UVC+f𹸸?DRZU7o\x,m`` z ///(..6֏ۼ E+WJ2.W*Xd :vP!!!رc>l\hg! }gV5[ڵkXjΞ=gbʕ6vc8q"ykʲNR)zXzK!C`׮]&RSSsJU/Ft۷d[nU:?G}!|G8#?~<7nl,%%ƍC~~>3gիg3f^ŪFEWvѣ777x{{WI _~%[Ğ={#--dӧ+?GC|z8lقYq >#_н{w3_^^^ڵ+.^h/!!j¦M*`СBhٲ%f BBBϞNNN 5cMe+̞l/=,BaV1tP,^yyy9s&hqZƳqwwG͚5իW7ڻwo\p3g}a|HKK͛7q) >cƌ1oiЯ_?\z,cܹ?>u X,gix{{J3L؎TyL0^^^ر#nݺA&K.O>&L@ƍ1a 44 6رc Ftt4Əo;//IIIPzիٳgcرHHH_|ڵk 駟믿FDD Pr&L:u* )) :uBbbz[ 777$''e˖pssl5cŊ5j`…G&M0o<|Wz-GTT}Y8pzd`֭Cڵ{}ԪU )))HHHҥKK/4ir9}Y޽;d2^ykgr~bbb܉'b̙hժt:r9x +~,X?8йsg$%%AVcJ}zd[{s믿 4ȸQn]<3ԩYg[o/'^zP*QfMdggrߓ"[&Qq%W\TGT/3WvwYo\YfUkl2w\t:| IDAThݺq hݺ^VZ&U_ߩKQF<~r7o޴ڳK.4im۶N}˖-[Fh:4+{tYzhܹ&Νkvm 3:F@7R!Z={R׮]ͦ1\XvKXbI3{fj:qb,տBE8”(t Q Xh…te:<L7e8@3I^PVVeee(NCeV4 EDDG}D.\TjӦ h"a+..VXa1$$d*Zm1o9_EI{#o W 8C/::~YV^iӆБ#GhՔL(޽{M ȑ#$QAT:-(ApƍN'T*c˗SLL I7oƍUGutiQt N-V=oh m۶NOd^ӑ{Pp82#oT{2̕=Zߔ/G[l1˳bbbwl6aEe>k׿?bcciɒ%to(::DQ41oX^z֮];:,Iq;s&M?y]}7 +G?Q-[L<ȸ~wh'?/~zgtQG _w |߿з;CcCW}>>qsH*}~߫طeF޽[s>X;Sn?q]tEZ`n]}Zbկx^y.X@RoÆ [U}QuYxk;w .駟>/X{QOO6oެ6]q xCm۶3ϔ$s1/?Oe˖i׮]ַ59dz]yk?۞9?GSSM6iΜ94i@̓?:/~Q;vq[nEw?|=Ї>C9D\s[MMMZt>Ϗ5 _yyԧ>5?\֭ӹ+tŋlܸQ~&OSJvޭzJ'x:]ve&q4i~x -_\'O%\}cJ}W^y}s?g秝v$i޼y~ !SwܡJk׮9眣 6he(ڳgvڥ/| 7o^YGu? L7`ݷr)zg$m֬YZn\{yԹ瞫oYo /Pwy@_٩_2e.rKKuC~Sxf<5Ww.MȮ]F}:m>/WXQKF,G}tc/r#Ȱ+xŭ[{~}gΜYQkGgpM_r%lo#M3MaÆbss~i|+]w5C<{կ,YR7o^}{_mq\.77MqŊŶ%KNj[l)uYU/b#]j_W=S9sfu:_2塇*nذR3gN/qŹs;;;;mmm~ցwO~⩧Z;wn/[8wbkkkqÆ _/ G}t3,|_|7.pl׿>obssskϻ:::8믿^3g~,F΋dH?iպ a]uUŋ/xw^{x5w޽{T>vx;wR\~}qkmm-_~._&Zٶm[17nX![\dvW6?ƅO=裋'xjk_Zqܹc9ϧA7sǁ\j}V^8A<9s۰oÆ =PGH[nݰn޽ō7_a??޹R99a7{%I_~w߭3fH:( ϝ~+ty穩IO?xhɺtglꪫt=hٲe:5sL=뮻tAoާ\<>;Goc՟ɟ0ŚRf̙37Ĩ6"?V^ 6Mc~;N{ꡇұ*$A.l]z}~>w\~~4IF9Ο~G}~?v駏{644'{K 'co-׾6@]s5jnn)"{G^{u饗?g=;tK٣/rw}>ѬY>w^G?-ܢݻwo?ڀٳGO>?>}z$'> viz߯.L;.%~ l799s??>;iʔ)z'tj:_^׫Y/@O|}_vl6g}Vo6FݻW֭]wݥ38CK.HR_=+YoF]vemcH͔[nա*}vܩݻwoŋVA|к 8d%H*t%L?Ho+ǫzJvիҢƲ&\dŊZn>[o3? lN3u#VZ|W_OW9xRܸq IwܡoY?яozHҏc]yڻwn|71ۿɓbԧ>K.D^xhΝSN]wݥ~zyfr9՟w??{ݫ_tM7)86~ /?QuAiժUz%¸Ң=+WOT}}~iWҩӧk˖-G? .@˖-~:o|Co񆮿1W'?[vRww7Dڵkn喁؆uuuiΜ99s~=PtM {U ^ϙ3g{tw3~q/~^ڵk>O.ܹsd_ntI:SҢm۶顇3<:haÆ z߯۷E˖-iNf{g>|#ڻw͛o]]t~_o}Kg~я~t }{N[Vw߭nI{̙3tR]Ғ%K&7nԟٟI*r.r=#?sIROOr!Mw-[7xC={9|z[*Iz]h;kVg*}8,X@˗/N\p>聯[zn?Am\uuujoo׿y<_[y.W{x-]t`v뿔d4}tm߾}UȜaɒ%?뮻N:cҢg}V?Ţ.Bz#KH&2:h˖-M}@-o_7xCب窫qm۶IL:%ޱ}7kƍ6m.\+Vs'?Ivmn]y|ϧzJ\pZZZtwh3K:5o<}6 ?, {Lsvޭ)SGjݺuzҢEZ[[ b$mmm=$z'N[O<>oWȜc߆ ^6l͛5sL}N8QgM;Rn&:ٺu+뮻N_ooxKC\,?X*7v>O#gl\`%K,?Xe-[6 T1lݺu#ϖ-[۫N;,`nzO_s)/2˿~H}Q꫚4i6Dl۶Mo~Zv>OuibW<$矗$]K4k,Ґ2̥`"ʰj*Wcw|I]xᅣ ZZZt[ ݫ/~z-\@Ts)2<%9[G08غP>H HI|ǎz /Pm۶~[lyqmgg|WkkkEkp^m[ee֊~7?3<]?U+!6J۱_xaL6o~n_y|?\Ekpю;GK>۶UzeKe'7os|Q*ZF|ckg?wʟNQ 5 )RF_ ?ٲ3e.:G%gcǎza+TyΖ?Tx%3jm8P;vЋ;_T ?y/"?Qk/jzq׺^ *-ώk;OꐟY-E sRߊ2%}@J_*2%oN*`ΝT ?\F?ݹdF΢8Pe˖3L_ntQCW{{u9xvQݷ|喇eXߢc˙x6tQt::p_Rw&;h::ޮV{r&>ݽ{']ѱHLyzuL1:Ny~,D\꾕MD,RDz oQݷj.ZL˖i[ޢc?&oTmt:.%/Rw֘|喇8~}L_NhBu}}e"M|喇ǫ㸓4X3![uNDԱC󏚯qսtQdu,ZVͧWR5&;|^iQG}>DKKL7xׄWRi0 C yQuC nqjaq}?@ nq}@T?P}C HP C O@ =.; C- =.;id U7~&@ nqtQuC 7 dܿoNPuCk76n 1vtthҥ< D c.=ѱ&v-]z<Àvt,ҥQum8CKرCKO$v,['رt)CM EZz|a@Tp;޾XK?a@Tp;;IKv"Àv,RPumXLK '?Tp:-B| fYo0 C ' fgX༡ðM"'k%n #%8́^EBa N%8́Ey, 8.8;PE' &n qֆn TXȉZɟ#t'X gRa<' k_Up.tl믵oYG0X' o/ B8.럽KÀ6-rl@am`  gRa޼XZiϞu7JnT\Q\+i} no?ִ6_iAI_qV\/=.}imH &Ik${\p{|zۏ@u~s\0C]+]+~,:.z$=IIܾջ~~${\pz7TSi7${\p[1i׻w} nO#iӏ5JMM5k${\k|TEĈn.'퀒յ‰l7t;$uu]@P { $kaov@I꺰ˉ퀰7t;$urb; (I]+V8 n . G}˝{ =9NlG%I]gv@|\pw9O$u-_v@|\k?/wb; " b\,@4F\v??(SN'Q}YseS}?f+Q}m#FX+1>?u7'I8ȏkFQY|`h/F{n|~|~z|4NfJ'ȟq% cp =c*^Akn8chh%C?n̿k;4%cq|5q}6mܟ'Q@y쯙5Jc'p1Q^ܛ{Vҳ*oT;~,rSfIR0mEF?F3I?SQݣި8. *?uDlwȏ\b0qi"5ڍN {Fn+78vS!8"Dl >p a>@hFFFmCppعNCSఋOy nA a<y nA a]4@hHB_*cMX"N jM EY=oqUEx*/s4<ڢκ:QW!%I\.Q5Qk:e#6䯌 ZHG8Ƴ0ߌR3oD)yne-GIs? Jɿu3GʇUMJތ SF:Bz+A4T[2˸_lDJI;|8uDcm쨣\ W?T@0!D0L;БLa. tlD2qKa30 d)N H/r6- pijK([.*O.W @\γ.KO.#hʳݺqU/w\ȹ8 o\<ߝqsq%E//}rf]B99ns ~/F*?H @-=&(ZP?ݺL@6wdJO|'U d8KOt$NOG_2e#)F)5$Q6%}7@vR:6^( ~#oe_ev1פGc u pX4XA: LR!4? a'F ;A: R2d 4պ8,/~T1@1@1o]߯.}@n` v|!v)e~!%a>GÐ/_9R% ʖdK2@Lfu p dd!KCI< 0/dD;\`3d ,?Xd<0K%K2dF0K%6lW @s /[>;0[>;зY>Nj]y Glx.ƅ›`"G\x+0/qṸpN a%/wo\x.n0.d DY(.&( Kâκ8?XZ DMv&_؉_؉XWE.nClDf؉D ;a,U: ,aZ!a' 3%aa pKa30 2CavBa( j. E ;a,U:iډK<\z@wF'K;=I? ;<=$ɓː?ɥh%O.EgɓK ׿եKKYP1/yrJQK' IKJ $$(K6.fY ;:0n`);N#H"MHɦ`$OVUu pW?XtDY .N )\=Afu>j]$9{u h8_,_m{޺H \ܲúH 4պB G߭qw+8pGb3Ⱥ8,YEI%aQк8,%a-#-$_؉?`'Z؉[Ey_؉'[Ey!n3Do]%a {v; ~=/ C~!%a awu b,U: ,Lƺ8,4?Xd=,e<;z;`RP# a(#_ɈvR yu p<ށ ;;a?X@xl`!o*/x+<6ìK<Ž@KΟ`%aa8׺8, ۬Kpu pXβ. p./mΦpvu pXvY΢p?"9(.&( Kâκ8?XZ DMv&_؉_؉XWElH%aa'/pj@a) y ;a. Ca?X , 32Ca_`'Tu pX(_ E ;\`ciۭ Ӟ.N{ƺlup, 0yC_.yɺ.0DR@[..x:ru pX.4,'ː?ɱ r/C:NNӬKra,U# @lKl6k]Br3K8e{:Kt0Nlu Ͱ.?f$EvzI"1IM6_3GRdS0w_";)}sf0Nn͠MRΠHK HՏ%I5g>8,K }`AHn`)@  L }C)Drj]vW?XF ĸo]v|޺8Y;@l!v.Cag qj@[&.dx ;2n`)@ԓ?0C2 2 Ca(#_ɈvR5g>fKò%aíKò8,;v,eg=/ xl@ ;\`)s .Nj]up& h?`0e~o]\/,mz޺l@" <0c4xG0q pK4;^=#XațJ ;d 2#aa%aa`K$(Kâɺ8,(.V;Qvv)e`(Ru pX$_؉D ;\`Z3 xaZPA[qt^'_2aƺ  %`RzGas:/ / ”Nd3)}$S:/º>ɐ$`]BUy_6RNy$A:~/)?@$C..ɐy%a@n`)w8\N.XHG ;"ru<YD ;9W?XV ĸdYlwl6G t;YN l0D`)@Nb dCYNV%a\`Zc2}ߺC%TO/_Z]4XPժՁA:߁2zW @rٷju`t)?Ձt~ Қ2!o9{J0-oc L_^~z`TAJ72^w^!U%TXF˯@)˹Z c'@+V@ĸ|?A2~u pt?X=;~? ~=/S+CKnD2? \`Zc)2@L&G Ga'SO`' ?X7ʤ`$C@ʈv2~T1@Y.<ϳ.*_2x^:BL&t%CJoxMoZ:H'tKojJt^ƛl]AudX ѺìK 6'tNdRdHKj-11EQd]EM%aQXEQu p@؉DMM.R-v"W?XfĘ0.!&^.Iag! Y_Ӻ'!%; p}^.Ma3ퟑ0 W g"]BK^~ٺ'u<$m]B5XE+IAa!$i@ \?S..x ;g]tr@eG ;9a(Wiu pXN/pj@|ݥ0D`%xK,?X%5?!D`k6@_6.fIKlu pNa'?2$C CI ;Ya'F0~T11A`]LNvа,;AwiP0vC0hu pX _ D ;\`cbc}ߺ8y~u pv%#7?C~=/ C~!%a>a/l!~Tb0"0L&c]BUE20L&$0ou E&#h(o]F?EgYKwe/2ioeR>Dg_;GeRh!_,#%`Fy8(od0R?,W?w_,@yb1u y%TUWj a6ί$gZR-lgKLxSSgÂ7ٺ g wn! an/RB0,OYPUqw8ߗ?,x)g@ fb1rJక+WX?XZ\క+ϴ.[nYC`iy\w^`]L_Yy&<vȟb1ɤ䊢Ⱥ#EM%T( KL&qI(._|9poE ND ;Q@HW / |$eF0HxU$_[__U;f^:&nmc֦)ȸŅ1GQsAKMk-hp+Z0͡wNZ y5_j-php1Ǎ/M!hu 51_^~k.C1ck-C1c۹֚;W?G_988888888888888ȟ{b5(q 0lq +,?X`X`X`X`XVX"111111D|>o]}ߺZA|ߝ߯.60;t|~u ı?叢s+/NG'CGK/nz߶9%`uoKuXPS9ƉC'Ŋ3Ǻ ՏML&c]qõ?oe2n=&^<0H&3ɺ" wKƱ,/寑#N2nMIfc_F0HƱ@ȭ/9p+] _T;`]&_6 lp pJpYZ)/׼?,e>X3m*;#%i1YബGKc-ex{ K0Kn_ȟZ/l+Lq h. p p4rc11v_Ls`K`cl+TLq @l*/ǰrG"88,q 0,q 0,q 0,q 0,q +,?X`X`X`X`X`XVX"8q pmEQ$I Pmmmڊ&IRjk;¸{䯶4w0V$f\=?Z-G9ڎ Z[QS_j;VԷ9d6ck+;7"RZԷ/?Z\kQ߱ԦÍ1U6r pmEMZ[}P'Wk_.%(RrfK'LA dyq pwvZhQԤ0 e͖ e2z DL Ìr9oP ?NI۬I(SNR.Wl4ud&b;VswwպD`_.')$ߗ2ۿ}su5F ;<d7 p)Rerz}k7gՓVi'<QS P.Q6hhРL}zߡ6w P(yoo4M﬑^8є`_n\X0YH:ɛl[_}m[hѤI &)W7II}_&M_w2&s_.'"5*TrJ́Te4UxPw)TrʪU _2PwEJq "5)T2 :jeT/OCڽf TI}W1or☿Dt<<[[1W9:[ VI UR)Y[ 9I UR;ˈ[ R쫜1kˈ[o}`b8xtZ`_p o+ UL]w$r}/}SX8O2bk־BC3W9 ;o]Fl W84D`_+׭ˈ[ }[쫜¼F1xk_A}/}SNF1xk_A%1WIy5kˈ[ZV ]([`b`[sK01x}vߛ}lϻ {`[sK01x}vG9 ck\G7h}vs? ώ4>;9%<>;6G ckG_ N~>q`[̱.8mMs Ko=e2*}ɑ/)ҙ?%E&"%G:W}_%F*־Hgڗ[#Ә"%G& [#5ZPqlK?%F:־H_ߏIܚ^+>l?a [0揭}C5fkRcڇT`a,<}Ku>}?5 #!锘E~}lCJ{g`FQ~}lCJ;CݻuQ7>>5ckU:x`[P.u?^f7>\S/657>\gѢ7i~}lCO=?.R~}lCJ+H~}lCJ{Ufڇry 7CV5 "锘#%GѢE$/ Uyd-ڗ&-Zt$AE־4H^vjѢZ %_#Z}m|Do_ڗxF-}/[/q۴Iڗx߳;}[/qۺUv"}i|R~"}i=E }/[/y5lKo5}ckZr?Xںukw!IlK]w%IlK}鐼Qڗ_Gn!q{`k_*$.־TH^_BJ_־TH\^/־tH\}}}鐼 J寯ek_*$/%\ҁ֭[sl1K ,1K ,1K ,<.z[`ð"˰Y *iVV_m}1mQo+wKKr˵lqI3 0s`f 9s^ǣ1s8={>| @$~ t @B @P@(P (  @(//ǩW^BH? "!@$ DBH? "!@$?N]E*իW/B(? "!@$ DBH? "!@$ R^C$  AH? "!@$ DBH? "!@$@B @.K.|EERttSߞ|  (,,6Nqqq~]|wv:~hRSS)&&?uy0bׇٳb}?~|'G,j?Ob(k@I>M;vj=}Yf>^XXHVGm6;@ŋSPPÊ q) 9 "Z~=QPPiZ:vX'D>|;}駟hKqqq; \5FC;v]4dȐNܙoNZy•܅#gwCN\?9\V____, pqe~Y8u_iM_%$p]J1.pɒ%pBZfє]~њ5kl*FE+ܹYs}g`f?̤O?֮]KSLU-: u{@ 3WҞ={lϞ*\i^@-=TRRb8Gr}W?N"@0DDoS.嬿Rש_'f8;M`AAEFFR~~>SO=EǏ'NG/i^{ c^Tz͞6mK/DIIIަkjjG$"##iԩf۽⋔Doy ""2}(,,o˖-#GR\\ 6yjjj$":uٷ͛G 8ϳ>KٔL_|1͙3炪rY׮]IѸ.T^dmץK @'Gl>SͥCRLL ^7=o}9~8]tEQll, >6n(+o(::N8AG G555oy9+--SN=C pӧ谬Z%jiÆ >#"-ӿ/_vv67LDD/ш#d~<Ϗ~''Gj.]mWj"ș3Y?ۚ?wy:x0:#@+Gch' /sL>~Μ9L?igwMB7|3:u|MM ͞=)==^y6y4?ŔH:Nv|oV3w)11ȑ#tuQ\\r-DDD :hȑPtt4tM6ODTUUE3gΤ Ƞ3gY߇gVVGI|}}iJh ZDr[,3(--h)((ƍgzμJJJ5I~o%I ]8..m[{Gxƌ|Y.//[ov$9sĉ[oqzzzXYxƌ\ZZgΜn_yʲߖ_MMMw^_N׿Ǐ禦&>}4{ʙ>k׮1cptti??khS+h$IpB_~eNKKc^ϯ*rtt494f[9"".]z322xƍvJe۳gO8MeLL mW\\ӧOg^qqq}Ns5k[k&7>Kl?[ȑ#cfZNOOcǎYWwmaj=j IDAT\cc#'$$Vӧsll,KA899WXa;rS?9JKK922###⼼޹s8::tz_q!7pGI_c0>V򯩩X4mg< 6u:O4K ⤤$nllr5fF{k.mU\?{̒$qpp0۷tNzY~֒~ʮRm'u~O0>[_>r+V0+o~'kkk^kٳ7syy9r-4hgkYگ=z4[9{af qxΝ\]]ͻvqƵY>srMM }xŊ|- 9E$Ӝ+> q\SS555|>X{SSS5+V˞c@f C$z'3IIIf}vߠf6$=t8qdu-k= sСv䎜Ĵ;p8"" fv<8ql_N'P2KW__ϕxee%?l7xݶ74Β$qu… ?`fC\tt4g\RR›7o椤$^xi?Æ yӧ׬Y_|1kZ6uuuv_˓w}TdWTT999m1G,gcSLᢢ"~X׷)$tW򯱱/"9s&߿?3k3H_8$$o޼y3oٲgϞAAAi&vG#G>_~%oذLf~CBB;˗c=,I^m۶%I{wsϟ?of>~]ٮԯt:7oq833S59HVl2>w_lӚ,?^hl+{^ff~XUUU|^xT7e޶mϝ;Gq~3M|Gm6kxܸqVjcQg%Kx۶m|A~988,Wz- ֭[X$¾o855x ;:y/w^]YlyDz1[a| 򯶶tr,i<7;eO{̅sN~Mƿ=Ǖۮ1>`fٳgSW^̓63c^O.K'7_伿P^t?#""ȑ#fǕۿd-_0,Ϲv-! /u%I>rod-kY妟/tagKYگko3l0>tcjw|d礤$/ɗsrrX~>JLz\כ=hZ79:? 111<}tu;3fdNII3fƏ `tY9--xggV6l0m[^^γf#Fpdd$1g͚es7!!FbbX/\njjↆ6lٸ?0b`[{,!!o koٸ?~'-ìe'I7ϟ?o]VVZcI{ `cc#oxaa߰lWTTѦoa3s^^D dv&Ln8771 >h}mZD13/ZGxz̞᎜UДϟM6qBBy[ȑ#g\]]0;~GoOl埥A`SS'&&%%%9$II>zh~뭷{yȐ!SRRxѢE|A.++F>sL4,5k֘~޺uk1xO<ɒ$Y]Yʿ%I'O۶mGDDm&O3fhSvwr^^^644eee61M< ÇÇ}}ruHÇlA,埭Y^?snnnvVj8rԿ/ߡC8::KJJxСQ(g;suuu,IرwevQOq x̖cݻwsHHVƃ|=pJJ GDDpvvv훚866ׯ_o{弼6m$VIII!w/u>g^]ٺgOǬ͟Z|m,}7f/ZH1Z?fO֒v<%%_}Uqӧی>'}gΜ#F0/z6\f7#9WvMOY^;ʅͿc3hXzzz"͊:20.`?[/Kq1Vn}7#G/E]dz*={?c|@{Ο?ϟ9Kqqqųfロ8??lÇs\\2̙8''%ǐKƻd=|/!Ǐɓ'{m6-[ܹs̙3oVڵkӶm[niӦwPPRcc#:tΝk^KϧQYY-^nV_9uUTTPrrIIImj^*:}]#"?Iכ=f={)((쿥KZSZx汷A{Ց9}뮻GZѣUVVwm/ǎRhh(`oh.}k3緻}#.wҒ;^6>}j`Q=Joѫf8eFD諯"//6{nCuu}Y{{Bl͟ق4(Kɓ'qiZp!}wf+zcqtڼy3g#WV={ʂ_>,΄ 詧*jhh5kwaz~ԨQt=Б#Gt}G`` }GTQQAJb;vPuu5mܸx /;3,[TTTdv-#^O7nٳg̙3iݺumG{b "zWK.i&7o͞=6nHDd<YfV"ziԩRQQiZzG;ǍGͣyرc/5^}Uz{.]w̿кbI2ٰܾW_̆˛ogNHH0.%>>yٲel(8&& 1VSkX$6m33x,I03sL~/U`^}f6mKSN5mqFxW_}ꫯP~933yСo޿4hP,X`wff&GEEqnn./ZCCCyҤIlX 7l8p -[lqTq"W6+rlXu5G}fÇO% OVmklmLN|+Wr繘mfvҥm~Oq L+y455qii)/^8\zr] >(O4{1뮻ݧ=0,9v-! /Ͽ㴗]w]/Ly̙911 xӦM}/lO8$$'N̆;\$''? 2~)'&&rRR?^{׭[YYYӦM??m74nmm-?䓜Ʊ˗/7kٰb<<WVVi;v,믦߷ 9̶%Ijs¸㋖'bYǰQڽ[ֶmnv֭[9"",}HIIi}f*yyy|׷yξV2^H,5sD~^{cccY${9yݺu?|l2NHHUVqII _ 0 9,,.\{7[ܹsc$Ϝ9gΜ1Oz=b2[δI2J}sll,?Co>.**Ç$If r_{x>)=~We)Mi\RRb=3믿noݬiy"kqFFoذ97ns}%I/nUUU|?>1l_ /E+_|_y6lڵ&LhSp稘lc<5._SSӦOpg򯪪{9ӄcIԩSn0aBuuuf]Nצx疃ɓ'y̶O:\(7>Y:& ;_wǏ}K'GH?Q˗ɑO=z͜-;wy8hcǎ$I"֌:8q9_:FMMM\__gϞs皪cA9]{9==ӦM㢢"SUo.\999Ç `&^t)6###yԨQ`vOV\ƍX朜3gݻ EQQQ,Iaaaf'OP B:t(GFFr^^Y옷v[I"uqff&GFF_}kZNHH0+t:ܙ3;`OJ_ ,ߵ^3iollŋsNNGFFrNNf6IOO7;Vo;qzz:yfOfk?̣F∈6l?|if6L?ᤤ$k)tT̶㘘$ǎW\qK111fݕ۷oKW]u\\\seNgVw^ iӦڵkyӦMOrRRgffxѼh"^lu]ɓ'P~gyǎ.sMny۶mm۶6rg;Ixզ 2G@ ;)Sxڵݧrϳ؟466rBBw8>>Z-\ZZQQQf䜏s\9۝>}L,|A eI8)) 0n^9c<}v1bGGGĉK/%I2gSS/[GK=sfy qPh,v ڻ=1dffW_}q]\m6؉u_.\II w)))@w"O>(ݛRRRhܹ":,ɓ'ȕ)SÇESz@ 3RBBٳ4pTR:u."!""OOOGyͶi޼yk.H0a߿x_h4d{'رΝK7pmذyڿ?=C7x#}M唒b9sЍ7hw|r$^OAWhJHHjUVQBB+B89r$;v***(88;޽"v=(;(0>pJȿCQVVߢC+--/VZE:קDB]˗?LDDGؠDn?|'MDLK,}}?A[n1.:~8-[tbz|ܹ믛M7DǏBӧi۪**(( IhVh:/ɓ@P>Wl@'NS=O?8+󯦦:DUUUxb駟~]MuGӏ?HRBRra|J?P>@t?~<ݻ(_g߹soAK,nݺ9xCH?R={6nH ;Y IDAT Dd({衇LP֭[G7t͚5 $*++iӦMt7ٳiԩK;w &Fҥ }GitmQPP?N4x`w޴rJz KJJhDD4e GLLk׮5 tI+ٳg]wuTVVF!!!4tPExׯ<==IӲeP&մyfRZlSPP\)K/M?gffҮ]0V暭9gzFOL=DDԥKzg/Lw֍f̘A;woz) \1@= DBH? "!@$=hРAe  +p)))O?%\<<.ztOOc+ݕCFSn_G<3>=Bt/rsr(>Qϼ =)!VI(wp.Ɠ>oG<3O 9M8rss ϼ=):bBj.f؁ODxJȱnB|"gP.D!7h_ 9MO9)~1w?rl?4rfR|\,%''Cgrl7qdS||%cC=jc+ݸDL8O?O/ZeuZJKHp(S$5lvZ};uᔖL((6ӎ* /$"C1.BGi)iҡ q|>~-uєVWիP CɥOwJ6\8t:JKL#]ʄ>sωP (-- :jŎʹbaoBj.£(-1tQXP&mCPŻiEn"2BB(eP""":LZm!(֊ ŴbC1uQ!2tXP&md{#hחE;ˢDd(ESJJaʢV~={"2tB:]2iVM+w%&.$RI?U h""2b")% =0qk6.50:JG))iV@p C!f: (Dz-#j^MV|(e۷mN!ꀠ}ODK ?ꀠ|,au@Pc!;OvQbN: (VXc3юD͋9ꀠ+w&prPL )ꀠ_ *AꀠBMꀠ+w&ڽhaV0b"rA9l\N?+iu@  )ZHd(,bV Eru@"CA` X:E  :t  &MAAh: ?cAh: `lVNru@"CA`AA?-W$2Bh: 0eX:E W)ZHd(̟<Bh: 0?VǂNru@"CA`ec: t NFD)W(Tַ 6qv4>(lEv|5(k}`~?tol\O?pַ 6v|PNvpv _8WW08]Wh|QNv gpַ 6 tַ 6? ol\Pol\PQ2;'#VN4Y[073/ŀtKٙ[07{8egAӵ:`nNeA:`\ʾ(ŀtK8koua}Q[0'=d\t3,desfҐ̋P N994dH&t1\?pV1dkouriH?<t!!2(Q  D%4aTh}""xx[??ゞe[O˟mjÿŋvܺz޿yzyY|Σn=l=VümQZj7h[78_HQsz멱޿w޿zѿ]L?[78_OQsF~Ziu3Ͽ?q""o+_~kz[]O}翧Y9eyh}y"mn#H\~[>m}|mգչ""zZou4{F~v`Kÿ랷kٞcG۷_ݭ\ "ѿGXo'h彘[xFu?6 ȕ_L cO@0`@~;_@cy5[l0uUvj\Rt[Ίy{Dzos}8nO}#7@رACT#:P^K/h! Xg@D*?Gu$KtbRE*6Stb7.xC E X@͢PDFT,W+:P`!ExFT,"{Ad X'@?!iG:tBG3ގ1t}@oᄁC;iݨ@OO!8 OyH!gSOy;>A X>#5 %:P@7+(O@Tg?!qX'@70(O@?6 }n qbF3MMUC" P `cI!UZpAt@D}E Dù!Q@j_;{: 0 zsi!|AseC"ںsC"\i%@WtBTch|;,krE*65K':PiC+R :P+.ؤIC8q@&bę(:P E*6~h@M":Pq8q0TtbcFN$EQ75hzLCנ5hzc |G[8O F+k?W+k%3ǷO!  JW@?f.hA^#5E 0 oo\q|  A  A dxF @[hȻc0P ] `+@X@^}E*x{q*A oy%3+H޸y{A};'|4ETL.P @ _>(_O8~nXEtb~}ݯCٻo;3YI2ɐH@ $J D ">VDą>Z\j+.(USW_Qk]WpAAȾ<_@fΝWۙ;wNf~8܀9AX,@ł_Kt`d^&ȱĠȱĄ_ |s aXP{aQ.9>C3q?cFTdR#l䘣##3c 2` 101)?chc2!@@ A)@ G1a Q)?'>INN ,9jh(XrRt``?9 ?HJNIJH ,) r0 rprp/Ԫ}t``m;6Jֶ!j y!Ck,XSSt``[1r7n q?A[C;ҸK:0#?!ޏp2 AQ)h h9Jtt``J,(8-A HA `2 I 8D*h rbtF4! A1cRC;"YM4~r㫥Cϑ 2/O:0C+++ 4  @PQ_*9Q!K)X!*_QM|<.,B͖$B@ceY(1IGqq!9Q0>PmΖ! jN! 0 ִ4ǿА%B@4p Qy$P3_ '7@N8SbXpX""CģJ7ȱ7! '9, LcA,cA |c1!ȱD r, ̽0r̨ ns^!͸r̿1*2)fʔ3C/>7&xa ++0ɕC/1ʳC/1}w0) 'H^"{C/LοK1g^=wvB S/<{T S.na!JLx/_)x{`m!L cf 0#C/ Lb͖iG(JxfMմ]GG(a^Жi# Q¼`?k?M۵78pG Xڮ[ DJPl*@ $(aοm DkCIP¼jLm y@[tM۵:H%+ڲjڮ >M0LM۵5 l VW٬kmm p$7lk=t8;JD_ִ]+'!V 9ZqWBlbd3y!M-H6nt``CT9 r&MBI1rkIV?V:0!ף!ȩ?S??S?FfY:`̘l _؇3-prjD8Yu|tӯxmyBO*C8ӫC8L:3zU?SfUQ_]" (~&FIpW~Itg ,?"R:OH!eK u1QnR0%N!(nt`P J( Ϳ*0EF: 0(EQh^<0E9sH( 0 CUhcRX}aA)BO (t H( ]7UxA(tӥRf]vt @ jjFJnlI!EM8fHDT]BQ9[:@՜*BPTW#Ț&BPTGQVdtA>ee$F`O2¿Q!=ÿ Q!ɺEPU#C7¿ QuutFz1CUG?=/N:?=JMtXƘ 58Z3Jn:5#S:p#5*Z:fBNLbXV5)1~ӧdšD L""GJ H pDDY!ZeeeHnEP?}J6!(CPsjpYӣS ( _t)9pW; $Ih $ 0HB`6 mA$Ih $ 0HB`6 mI7 ʊC$%YCSC$ x -JKC$OcT&"*-EMbBtASZӛHc$O 07$@:8NA*KI-*)$ QI &!J p7 IH6F@"M%TT{})H]Bq.+ʼ;R$`o>N h`EY;v)c\DDeޯڎ6)cTȿ Ev_o Ev:VxϿ EvqqY_Qۀ`mb7Z R$`g>@"8S-8[\qVTy}h";Kqn;x0H -|Z1H%>V:)/>Hb  0HB`6 mA$Ih $ 0HB`6 mA$Ih xtmA$Ih  m0A$@$Ih $ 0HB`6 mEw m 8-@l9!@f͖2N ""[M:cDDl\%$BPrzb1C*_=DkC@-ЉlV`YV ZrC.̊n-?=1%BPl'fn٬87OWjND?=1)l>zg6h6kSdzg6@c/c]!Ť,䟞"u=㟾 64zb?c2@X{3Y@!E1@?E1k`MzDDJT8` z\wEQ[/ JQbiaA)B &J( -`t`P  JQkRΓ JQ3gt`P 02Xf9F: 0(Eٗ)(t aA)Bpt`PucjRst`PЬnDw &O>W:8FQ `"uCcU$"<`&MQIu!1JttA7JoοzD; +RL?P Vvtpb DDA/>EPuCcVN:8F1 q %€qӋXX'bO/bvOIh$  $$a$ +HB$?@$@8tma̘D >i@CM~A6zQ_-ևD >TI map`D >I m4ʠh G6zQWm01J:h%!@`}ȏAC!@`}U=t;©X{{@$e%I jc {"1f ~ eDDU"1lstb_[C@$e5J MDb\ִ4TwͿWVdtb"1,փG"1(c!":ֽ"1ƼLDT=jc-"1d .s0s Quuc- Wzq+AUwk@ J4_ĸAL(FSj5jOHM5КW:K5p%nkFt-kV/>TŸ )q,k:οR"YjEISUU:1 QƬCD.HD!=p?yɦ!1_ո7q'V$"qiƭ@?$Ih $ 0HB`6 mA$Ih $ 0HB`6 mA ʊC++:U:0C+-. JK rpI0rJ C+)ɗ    _@Pi VTK`hIIDUa,)t*p;J:Qe!Z[UOR'r䟤ĄDU+)12Q:Q?IϿ%%6K 7$%0QE9ORBo\EYt`DDe!ZBq[OZBplDDo G8h,+!h,+ XV >!B`Yq}oA XN\ C`Qq_6L=C6bmeY}meY""C6,!B`YSumA$Ih  m0A$@$Ih $ 0HB`6 mÛb65fL lI"<3}1e pDQNT e)nD6V_MDDlJFWe|eS)+p48*ȚFC9"(3*S6@*+lIWiT_fT"e(C*>V/g$eD[QΚI=)#Um0Lz\'/`[~IgաL3g$ G#_zD$2v."E}Q5Y8yh\J""JMR̀G86޺::HƌI!-RS()sUBBBfsRc|v'EvIδt.KUZB"K 9HOmo9j@:VC9Q1MI"Kd՛^p> IҪ)ۜMJ*%)+}c!shL7I*s(˜JJ%)Xc"sBJK޻coښ'2/iiL Db6IQHEԶߓ18r0eEdQJd %FvNGē%B)8pBZYYeffRJJ %&v_\\Y,2L(ȿťԲ'  IDAT4*2Iޝ2Rԫ)0w<{oJ-HҊ{FPFH:g%[3=#3uxoRᄴ=)#'Ѓ- =ɬ$SlOR!Vrxt8!01(ԛLsqܧ)1g6rX:_OfJVJHk!9S )WWQ\HJJ\IDIJgo|ǩp;g$R~qfdu5!9bbd*)5JI )oɤXH5QlmZ$;J俤ЭUJh OـD/<'nuWbuRHG_]ub ϻUJ:+aa_ALV+lY}ݧhtյj_Qtaa_wϻU: ObЯU -X}J |U: ZX>,>mߔCV+;u ؓU;`a_l @OV/L#",N%DbƓU:X}ػU:`a_A`V;9'O82l9!躰Ur2CuaɱYCuaɱeۤCuaɱe>Tc1huY؇}rlVc.C>961>TcuaɱeYCuaɱdI >Tc6>TcGׅ}'f5>Tc_ׅ}'''ǘ]j_w lۡj_0B;:&tUBG8Q/tcj_CվaV/P/tUB~}#P/t7}#UBG8?P/tp,}#:1Bj_w (t뭗w%Oly駈'FQbitZH|Tϖ 2qSM6o'OUrL7Ý(t'wIⓧ}9ɝ b( Ϳ*CSվL""JOL N(t5_W'OUr:MEEQh^yڗݹȪo__Qnp)-Ye:* 5JBC5'OU+CϤ^k'OUyW [NЅ(t [CS>ڹ1-7vÉ(t Hⓧ}pi}b( ]7+OY{uӎݏС( ]{tzrҡj_M%"$(B.}ҡj_fT]hlsv3n4ݹuNvF3y9t׽ NKD;^T7I|}qhk0 M/A;^T_/оohY̤qeUFUL4I|}qߐ!CЎ`&?';g_78.x v=rEDO^{A4AvS_7/1UdYЎ`U NG;^7/h }Ў`'׉//+B;^8I|}q_IaَWBȜ1YU@A>%mQ| U@/?TU@P| d`T_9}K ۰jC>%T_U@P| dj)B7t6/1cR\jKQbiިSiI;⺰U_qY؇}/EQhNz^W_U_5ӊƵ~2>eaE/_aV,C>(4t=C]jKQ9s&K~eaE+MV^WⲰU_JBk~g>T)J,]VWHouE}{,C>(t?&F,C>(tF^_ﲰU_%ˏtY؇}/EQhi\Ng$,C>(4uOO:[Z>Tӏ:Ԍ A @Kj[iwoT VCչU تUъ:j[uUc A*E\}lՎ6jzA,)j%6j zMD}|#G wWED7=zPodpZ3e"B>ՎzܹB`qP]vQƏC_s˿c_T P/L\>B.ڎQ/,\:B.j_Xh#"Bվ0rAD}a"H3˿c7P/<\CվjwP珏P/<\5tj_xصkWhU?qH? @$,IX$aH? @$,IX~0AX a @@! B ,AX E$hjj/X: 0 O<Pfffcݔi1ի)%%RRR(55m t3gҷ~K~!%''Q^hڵwѣGtrJjmmuZ>Cl?|)9bo锒BYYY9rmݺ5Qv! Rt6I=ozݲe|tG| 5л]vQFF0t?q@Wcǎu\a@N;wMWpD^pꫯRKK cΝ^kZ3j(ꫯ/ f "͛7YgE=z-]T:f;%KPssmRSSiݺuA ,Zaڨ-Hѹq/=={L:!л$Zjp < F%=jxbZx1utt]@уccc\ODٓ,I6ouhMѣ%$$PRRIݣn4h9Cƍ?DYihTQQA4|ǯ{=*((ڱc]veTPP@555DDDӦMLiT^^ bfZB߰a(33n&w}7YV2duHiСTTTDv~Р#"zdNߩgwS?OyyyǼ|Z~o_o߾."4h駟NuYC< 5iذa裏R{{kZs~2}tZT__OtSQQvmm8@_=RII ]q{nMMMt7SQQ7yꩧ(??ߥTU6lBl~?S]]Sii)tO6> )''nJ^x!ѕW^#")33nˣ+W:=ӣd*((M=d2)"0@\kWhGx{?8Qyn-= _38 F܊K.""GŇUU~Ǎ_51-O}Wz~߾}??~niiUVqiiv97|G?njywW.<埪7{ǪK/t|1cq|nnn￟Nxok<+LwO|vO>[ZZ7䢢"s<_|G/kkk{ugu[uV^~6b>o;= oǿLR+ۿ~tVUn׮]ͩ|-׬Yóg|.//w}u?3Ϙ1 x|E/̪rff&ٳOΪrJJ oٲ׬YӦMSO=~p쳵/^&L'~wii2??[[[y̙'~Sr+**vm磗/v'{\wUUW_}Ω*}jj7|kjjjrmm-w.ݝ5fS_wz~opuu5ggg xӦMNzݤ%_9Owg3O5_Çf &+)))<`noo{kT>}:s|.**^zß<5~p?UUyƍa?|E 4ܹ.\t)#<Ÿ~)\ ޽{8p/_k׮͛7_WNKK#G8oɒ%\^^/2oܸyఫO>xѢEi&_T~577YUUnhhpi_~x loPM8Ӯ׭[wy:֭[{wx\PP;vpaa;<̝u!m|aKxtL.5} g͋}=%Pkz_~OÇwY`u߶yf}Z?__/_݀cUUt]YTTt={t 8o]G<v?쒟O6rqs=z(l OGqzz:_qsʕ+yʔ)lZW_?Oϫʓ&M˗ѣYUU9r$X/rf˖-lxҤIb ~ꩧxĉkÆ mW^v-s\5kw}|W833oݺGɷr +oĉyСN?`<q~~>O˗^z){]yʿ#F7̻w憆~xq_ޮ۵S+^co{;;w~+**/osͰ{zѣ—]xw߱?rGG۷{ᬬ,ooaUa>k׮)SpmmvqMTvZZدsO?긮iZϿZEyOC)ϟjEEErJ/Gu6oZ޷UUϱyĉvZ^hmw=q96mV{r.))zyࢢ"~৞z'L<|k@f檪*Vƍ /\.--oN_9r$}ѣGyӦM. v[rAAyo߿}O|~%|uXyy" *;v\cc#3_+J~'yݼe***x۶mNۺu>l|>w|o OWUUYfy\6n`?aUU}pl{ee](g̘A o IDAT3:tKw_}YVUWXxl۶m+W>+))x7ov޳gIyoZ)vZZ17w999.srrWUU9nF;w׿ɈurJq}]4hf>>:ڕGU_^@ǃQF˙#FpGGN?|ܷo_uqMN_ѹ???]ngff:Dοvtgih~18OK5nٲe#wiSc`_:- D;Z?;r⋬*ysٲe%%%z?!Cpjj*?m۶s=Ǚs3fI&G/> 6rÇ;mk֖ɾ_svvt 8#t\hO:Ç_wYfqcc#766Y\6uի^~ᇹܩt%K3p\d۷qƍ/8~)3M񗕕˹7owNK|D}}^+}=ǯ9r׭[siry͛Gn}>_p/_NܢE+nmm^{g͚xK. .`UU]~!~~튊'w \x۶m`'Nț6mv޴i{Nzo?}.hy6`qtAi{\Yh~;k֬w ξ}r TUuTu7oooZ.--ut꫹'oݺu|yq9%%SSSyذaj*vݮebe\}sƫfU\uf.))G};+7Υ2ןq7ZHQV:F߱cwyw999aod:PU,XMMM/25J{3k|G~?j|TU /޲e _z饼`|2dj=<|yyȐ!@佻 dWޮ+f}Lj{嗹jgիKz<~]r%3?#mSSSi֬Y믿g͚5Nݻ]s?]|xDDtac۷o?\͝; iT\\L?͘1 @DD ,h2dUVVRtt4-X.\HDDOt7;ԩDDtѥ^JDDw=cGDDyyyG7tҥK}GD4|pѣѣ8 ]vM<.B߿?5>:uϿoʔ)IG3gRqq1]t95\)|Aͥ/rrr(22|䏷_;i…TTTD .CRNNz@DD{.]~ԿnVQFԩSϦ:sh˖-T\\8ѷr -^ FI\p,X@SLǓj0`Ҝ9s&NH+qܵw}.y#8K|.b}}=>g]KKz^뮻lB>,}ww3<5Eiٲe7?O .7^ Nڵk顇_K.yS촌+#t$&&RLL }NC {tUWc=FGy~S=3ʟGDݗF.ǿtZ~k7lpB?Grr2]xC=Dcǎ}I8?L&=cԯ_?*++~""ڸq#\3g 4/_Nsi={0:Oy.<՚/ݝZZ_>NZo把 ~WyƍrJs9i޴oCCꨀj@g{(?G׹0oL^hY^z5СC59##)Gבo3YUU~۵]w|ꩧigUUNexWZŵ999X3޶yoy~R?яr7n̵?|smmm38#w=r7[.}P}}ܪUr+"=ܜ;O*n@ÒG`up5BTt;sgr_|؅C=4vo_%O\ccc駟=ӹgy&w466o<8v?~|?r\~V[[[cX?A?qkjj:)WN8O?kllc?Ϟ=l^zi/} _}_an幖ܶmۦ\}^L6_rr_1ŞtWl];rHs+W̝y晹zDsO8;rѣK暛s?яr{eٱFR}1Q;k\jU{=}iN~;v,pO?=O?t=wYw?S\(ߓs嚛Oj\.pO /0f͚>lLW\ccc׿N8koo/Px`&hl믏=J1 /s]v٤I\]~뮻[XY35> ѣk&w嗟˗/_JXl ~)ܹ3wJcm= \.ggܓO>kll=SOOsoۓ^{sOַUt|(3L1wmMz{5b?s/&6:eO~klO;s ]vY T׿@."]tEꫯ ŌoK'^8g}կGyDvد&}B٬oL>Xu]ڽ{N8:~~Sz{{߯a}չ瞫,nt]?~\{՞={$IP45 Ar1=Ò~XjjjV__x<.IzҢJ%I?c=ŋKoV7nTCC}Q;vlg2IRKK֬YsR,g/X}}}ڼyZ[[/{U.?Yرcھ}$iD"jllԁ~w?'kڰa.r͝;W۷oΝ;'ݿ'?I d2ڱc}YIWmڴIǎU&Ci:re˖iҥoY۷o%\-[]۫- Nlj$zt񱯍<`׮]z'oO;O .ׇ?aqЇ>v]r%S\u 7[V\O?]/o߮_~YS;B|QsaI+rR=gs }O?n]|%7g׮]Tݻ%I,DR߱c}O:r~__V\[ڳg?뮻N}}}'?lT{!?Xr!}Yx O7xc\)\wu'?Yt.Wu C2/Rԧ~J3w~wF8M̿;wj``@G$>򑏨G]zZf^~e=Cjnn֟ɟGUMM.]}۫^{M~tĉIquYzG&}ҭު'|Rկ֦իWoT,{_|E ȑ#;w>O~}ԱcTSS;S7n,5&+T}vw}wW_}UguXz׻NzknI?H$a}ƍuiGկ~Y_1'?UW]5\8W_Oc޻wnV?ԯk544hɒ%ڼy6nܨʿԞzHGNj_sد/o6nI?)_twoP9z/ĉjjj9眣ZzΝ;Gʿtwk޽x<뮻Ns~_tkǎz'$c暱ףѨn~c_я~TsժUD_R?Ougѱcte骫R__ߤ8_z%]Vǎw߭ /$7(ݻw;܀%?X{饗tWڪ=:B\V^=i |?՞7?X"`%?X"`i'xBb@P`rƪ IDATڳg̙d29ssݻ/}mSWWjnn>>>W4ղe488=ǞuMה[oӒ%Kt}iΜ9;ݻw .?n|I p3g~~D"'o>/[nErK77ڷonf@Prǎ?,IzРxfw߭;wJy>|Xӽޫ͛7ĄSG (%K襗^r>n;tvܩ^zIǏWccZ]:3Lb?'}Gsmڴ5C ҥK}v0N~:Xf@@h߷o|I_7Js[J^yբ;nZ[Kۯ77ofIΞ=ݯ^ʫ~ H\\o>ooߞ=%~w*pz׿W~S{.Z?kk)i ._NUJ/%PW^}ߨD"V;5Gᅯ[7 GSwo.WFqڷ7Q7ިD,fG)Iމ%ٽݳ8S"W[3׿ԴJ|xoɟ۰aCٵkW.ɘ{fny5k3ս|u8dfw?jUտWK/R9%ϻM~v]t_FK.V ߩ3K}&?;.Z֫w&Nmݦ}s&?;߯%K:SbM~vmx2},=Sg[sJ;&?;6ޢ i^:Sbyu綻L~vЭ[ dbuwsw*n}s9kT_/Yn?L~vЭR_z-\O퟿U_|;ȿw1A׿hz.u/T~vT oz-^T+[o׶S>-^X+|*nVmF;}}C[ŋw*nvm۶g]__x@?3dmÀVg6t"575XXߟSIfl{zRgg;hB`=rߏ}?o.jWOo:u2H %$ͱ%py'z也H7fgY:;L,Rs3ljS裏Gfӣ|:ܚXXyNR0٦e\t"575s=E=y{Ifl"tsSO{;ovt[Y?ls; G&) ؑmQOYv3HMSNߪ?URK=Kz]lE"N/l/w*2<8UOx!ۿh:Գ,ev0HM-=[j|RGWzz{]EjjTغC;oPOo_jǎڱc K==fߩ۱cv}}POO`?@X340LDp5LS t@#HG*)++7_:NX3w^R8"87Jm3`~DVw$ (id]"8ƚO0LDp6~QI t@GPt@GPxam62M1 ;nI_u"8vlݡڡ/d`"8̀җF `"8F4AH`(7_y%QJMW逨|C-W2pF#*|C~逨7mt@TR!p˘8%1~:o-LDE(7 逨|Cw31~:ox?PJ@2~:o逨|Ct@TR!pLDE(t@TR!ppp*耉G& QvNL$4& H&x 7 ]6q]tDNL$4N& H$iDM\<:05q]t/(G%bIPvG&bqQvNL$CM\<:0CyM\<:0& X htT׮YO3 nkzzչ4즚ؿnV_qcB(kVw>̀(^b7t5 8oL5uZQvSM@Wqj:`_V>f@TzkU4c즚HRsVf@T֯ת .n}Un}}j7t>ZeSL3叇&OloWOw3zۆE+ޢXiX༉ĺL}/]0uѲ^egY3Ꟶ٬zzzXiojû)٦eN ΤoELX^'g26q:`C==N d8ZmCZ;p:-9ˉuT/*b!kf.,ub]+go!f@㯵AM=Krb]pgmt.:.o&NPOo3Ꟶ;:ĺ`ٛ8C===[@kkN^ܽ|qtf w/?8:#HG*u+\t!TX3w^낻v1PIM\d # ~ I' >68 ~+* (ǯ ^46X3 8~]pw7(f/1I' + (}{__ܽ/+ (m{ ק$O/ ~ix@t(1{ӾVW[}酯_N?mwOpl?σwIa ~pï 53'C7כֿ~}~]O¯ϟ6$;_z^ ~o_2=}mӟy ͯ-|1iӧ>v?N=N(TGP+|n O/|}3c-P'>][f~_9:.>=IIIr9ʮ~-C$D_=QG3W GR߻D>O~9ݽ馂.=2A̯;8H#S[)I7Ed_ 2n !fz}~ <}bOOm}JO)ݘF(~8C{fx<nz#ԿꩧoYK~fHw|n =SO=zJ7X .!P#\)E`چBph{m+W&88=km+W&83ϜP#\933mC\F6Yg!P#\i%+5mC\Fr4= q, qJWu_=}C\+m\}6j+GܳB7(iB+m+V&88kŊ b)m\bŊi 5 cJxJ2u*Ժ|F:l>ѠXm*r R3|pJ1?]Հ7IEg1-$A ''Q!9_D#/Pvٙ'l_"s꛸!R Z!Dv̼ה.E5KK*ީ_AC8NL_RR25h:MwJ ȿM[ٮK9KgnKAY\$< IRZ@VP17_r_R)iWԿY ;8v>;qn$P<c?8R ;,řC%?X" G#Z&>::8r8ZD}p}!`D !`D4aFD8|us!`KwC_ՈȽ/W=̿!`DÇݛxN vϳkϱk;iVާP=Z[[CZ5!a-దt:8?jАupXܛ~Nz(mNS`'.mH 57}UdA ; hL ZeR| vRPJ]!a,hTvR])T;TiiL4hx|fƠ?/xRQJ Լ:J R_X"> _fJ d<ా>Q\f`պ9 vb j[z90~G!a|T?#`\0/I/@TϣN&"XZ7W:_#aǛG  ssWLTh؉rCQqCGW:D?؉D"?؉DJ[h hĬxL ((a(꓀e EQ(a(ZLa ,E88KVPħNg D"? vl{upX:8,{_f!a3Cò]!aY?`'m6sm!a.d ;,vx6@GYXkoziX$CÚ N`AC!aib=줇J[?IK_hDiFЂvC !a&a!Ƨea'HRbZ RLkTW:8,N*UC{Xup؁{CuX?oۿMషpvb\Co!a0}$`(Q&N=(a(Kͫ+'bg;):8,g9$#j0\x v-qx;x y`sSu(R2 DM !H`knnEJf— ȿHZPrLU d2iB57/EJ$kC(&_P$u%Hhj*cB5e1^-̿*Mob\` M-\ MMԿ?7"8ukDp@ C$vbb!aD 8bQVÎ᳁ xupKZyIxI&ŽQ` 0ղv|`ȋͣvqX;^;0a'vPT IDATa'BP0S`'pP`')}3o̤!atupX!c ; v2 N&`p; _ɤ8K_4P`oP`on3o,[jo~j{/[!aoupY}7!a{up[Gup/hupkd Fk$`(ZVN 0I@؉ѨupX0CX KN`("CRDsC">v">+a'N(W٣Ei<శశc!am5| vZ[[CZ5!a-దt:8?jАupX~;!줇!a4v?T2iTA黩/t39Â6R)Pʂo0dH X:H%ɿ Ȥ$_!?%Կ H: !oB7R]! TW8D/J7PSD1jWgF,gCÒp~ .K:8,NP\sC-?؉ĭCq4@4(`'6JfH@IZ1*pF0$upXvb9!a1t5XHW# Lߧ@7&{txx]8'&>zx#A!uH΢8\HPH,Ek%6/guwh#A!X:߱eᜀH?Y ES!lGpa9p6#Gb/)P⏿GH?3Bz%!7ex!f#eyֿY<;BRue1GH?37$+O3oG  ,cKP`'V3:8}0?VcG,Pj?T?X4:8̛ŤFԼd8'"<;L)6+ >W0H@;y\`Bp;QN`(*!`(H;8H;Hy y`<Ej9(cIDC:2Ag}/!瓥FC(x t`_5DWNU4v#9Lū l{KQ;z2GD=Rٮw2GDp'`"9L% l>|̑`*h:vQ_H0h'f;zߑ  lq  lkQ;|/">SQ0g"VWH0HWgeS!]&MDpOfH$o$O|U!a/>l!a7o|!agip:8lpe!al#`iX nagp;sVU4c10vϳpwxY[|ueSU3U[M?&Ix:LL 0(uݵXG]=_Zwup?†lZ0(u?ߵa@U4Ju!` LX)4:āhA 8u&JQCCu1pQuB)%i`E!` uaz0LʍX)8CR"ȿNY)(I7RQˑjJYPSQ*H_UJ[}B0tԍm!` ncuB1jBE-SHͫ"ۭC}R-9F7/SH!TD{B0#q9VDu%bBE)LqFq͵";(Hs5WqGߪR3WM ka5`Xb 0,X K%ka5`Xb 0,X K%j%:L1Hzϲ$&I9Wmw!`dMuc&H&!TL9g[ I7VKRO9!`bV$|w?V,sCKzC19Z_5r+xQmbԿj78TzWX 7&KҊԿjտԿjU@WMyn5q0N/@M<_5y!TT-pP&?6] !׆a2Mn6J&}m HZ`f6|A$ʤ$X3ksRiꍓvC0Cs;&}О+h$8E3e.׿JuC0~T7C$`ERUؾpuKGm@h_f?U{BjZ`muKͫL{{uΫHjoZ} ;Cp^oL{Btx._{z촷rPuf?{q㯵Z`g-pxH۩qUbs6X K%ka5`Xb 0,X K%ka5`Xb PzCzϲ9;=g/9lఞsCVvV,[:8Kx;+zwup؊?YvUXJF]A(I+{yb)VIsp R:S+Wid:S+Wrl)sCpZX`j%L%|?zWrR,1:S9Z:S-_K1ͳT?K~\- uzg3U`[:Yl+kmŒ?[s5buXl+pkmŢ)Lؖ`[~:[/kM9`[^`S^ʳkmy5v<%ka5`Xb 0,X K%kXa%ka5`Xb pUGLX\Y#] Znw@Kx~_jIFb pzeaq4X\Ym5 "ju|X\iL&fhZyjnq{JkI'ebY5ۍjJ'$ITLM c pe5Oj9c k5hHTa=#R#ٔiN7k++=4RJyS])-X`=WV:=RR]ZJG_* _pt gu8yZED[#uɫW;83w?Cv[hm9ZKnH~d:)IFޭCYhm)d:Tb:y:E}p5}^u8VQükꔬZl^b5͛<>CYhd2W"o4}_)u{TFp5[L~HZCJKq_/>u8<4OqUlѫy4WSDs#>kt[p!oi0RR)yɤ"">o5nڦd;J+ՕR%.!k^ʓG#V5۶ݤ;N)R<"^JT$W$Bht m۴|GR37);n>;ܬg>;!>;n>;C01}v:n71N/g'>q571Nv׿g'7}v>>;٬o\cSdWMSJ)Ooⱘu%Ծwaj_pL cj_`qJ}}1/8xԾ}wej_p161/8x}cj_P2̿N+@<}_qWPf4Ծ3%IMɄYl85 dfMkޔ }p>cʌ֙$`.߬`ʌV?6l믿^=u(3njEFccYl85#p֡h} u}_?Ou(3nj_kC~\c}Yl85kO[24?= SoN{zu(3nj_Hk/p|ׇݢuu(3nj_7h|=nj_HeȿezBoY254eF}_rv7ԾfڨAϿk֡h}Mr˴ebé}_^{v@fj_SHP&jǎԿi55Կ o@4J櫮2om[`xyr=O0wv3x]}W76u|{[Mcm;6:^l޼ټpoҥu櫯4澥+jY̓3om[:^l4om[mec7_2yx]3x=澬ֳ1l"Kޣ'4澬Ngcl1omˮ_:^ n4omˮϲ1[Guyhs_6 :^ ybT5LLʻdv% IDAT}I9p13)`a&C>̤kڇs 0S0r^03)}I9װ23)g13)`a&>̤>VcjfPcj4-k,_Mjcjf=m^T~_[|Τ>a|צg~cڇ}_YD&51 [C:}-ukLjcjf}]5qxY>a|^:_=6הNLjcjf=]6Tkh>̖l-zmkX44}-u[wФ>aB{gҚ7}-u-h,&51ϿKUPzRcS0[Ko޽I}LlR;NOjcj_ӧukV٧~"}uko#SPڇJ[7F?ڇ[׻J?/ڇʻ ڇJpCv~ILC]طQ/>odj* '}vޑ@.ߨo4`1ֿ|?~>T^ƍ}%1߿Q?Rڇ ?œ]v8Ծpؽ{2/ Ծp\˿$}!\˿C$}!;xHA˿?DO/S Ibj_H.?B$1/$GޝUU8"IyeD$%^ʴ4ߺMڜx3Ҝ4SVΤjC Lx`sוs{yk8kSpq>X32?HKL#-1?HKL#-1+㏴?HKL#-1?S_ HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD^tI::uܴ(iGZb%iGZb%iGZb%iGZ:ui]rQnnn`V%iGZb%iGZb%iGZb%i EA֭ -Z0H3?㏴#-1HK?㏴#-1HK?㏴#-1HK?㏴T_ HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDveo&ѣG-ר]~III2{DDDDDts]QFi] "":N ___ڣ> 88X :v վ]v͖-..F.]bgXS\\Y,g9:s _Xn] 5˗zquF<|}}R+=y `ɒ%U&^D"5ı2KQjl{~ٕv؁"+R5y7FNNgI׷F~Wȸ_\nt3Ommwk<5&|NEr[NjEpp0p CN>VX>c?]fXص.Toa׮](//Giiٲ%%%())~n[NU]|iiiDEEaϞ=Vǚ[nczXz޽;~wڵ "R8ivepٽ9s&_^+=y `Ȑ!޾XWlKM*c~=l6϶GuXr~d|U:êUlUgϞksqB[nmgWf܄ϩ^7o])1cDϘNڵ+V\ Iff&V\r\M'zzz"&&ukԨڴic#99v վze˖hݺղزeKܵkpȑj^zhѢEMڟsHTWZjUϱ7nz۩z*=j9+m۶Wu{@@eXlKM*c~=l6϶Wy˲ P :xѿDDDP;#4šSNxWPPP^B||<ڷoh?3gDLLw}Lbbb~zBxx8,Yݻ#,, ]t9sPVVfu?ڶmp>}GF۶mk׮YݾoeՃgl/Q nr^lq]q>"{?u5ȁ5i кDzM4A~TMIIIHHH̙3o-X ԩ~s8p{/ tdO>`O>x" Byy9ڵkgv;K.EJJ )ݒt)w ???e׬Y>} ""X`DD={"""zš5klކnIK5 6*#F !!QQQ>#ѣͶV)// !##1m>^!"ر?3>l,vލ{111HLLĘ1coTv!** Cž}ʎ9`*~ #F@tt4Njw%%%Fhh(.\$''~0ؗ>:"5})5NM)~~Lyy9,X`p^`zݾ}{W^oCE||8vEu[X?{jKm+Sӿ+WGG>} ___׬YLc "wx*))iЭ[7?6؞ .\0aڵٳ'п߿_řwN/Ƶk/bΜ91c /f<38|0>sڵ V•+WONӧOasرسg-2M<{яIXw}",Yrssc9sc(**}݇~aڵ:u*7nlujX;ND駟"##߿?~WrEEEx'׳,]Ԩ-NAA"""닠 "_۩S`|ݻ7ѣGZʠΫ.J~E9zPt/2LFhU{]-Ϡj빐=;t-e֭C>}ЦM;v0*?n|vݺu{ W\1Y;CO8}trrr0`DDDgϞo@6Wq$$$kϓ?|}}ѱclW'UKzzL0A<(3FEzʨEQ˓tݻ|Wr9}ÇK\\Ç;wN~aGl3,,L&L +VEɠA$22R/zTKUŲj*$''GE?rDFFJϞ=eٲe#~ 2Deǎ&C剩LQe^*Ν3[f޼yҡCY~ҵkWQEc:("CY{9Сvѣ(+//חIOO^{MΞ=+zjԩ<˗KRR̝;W.]$""Ǐ@Y`C$$$DN8aT=zHNNlܸQMرcByy?ިw}'W_I^^+7/Gb.tdYz8p@ϟ/f۪WٳǠ͹vرèڶm˫*G'OʬYO[)**dy'WZZ*&M,~6 s{w%99Y֯_/yyyKd&[;^5!"ru*--5_gb.l"裏ʲed2|p 5'Nȝw)/|7ː!C$--͠}9yZOKdd?^O.>LuݖrM<߼y$!!AK?dҥҮ];s~9O_Gܹs%88XeJJJd߾}(O&N(k׮lٿkbAA("d٢( 2D~gy饗$>>Ϡ\K{[c5e*3חR7jmj>3f2yEDX)**rvC~GQ?u5g6RqZG\?[D]~ʕ)-{… %22REB}9ݹѣ,[Lo.lOm]~C1cիe?˩P[nݢ(t].]*9992|pׯſ0E")))ѿަMQd5ٳg-^Om}ZEӧOѣGSOS۰^[;kU3gJRRXB<(K,hsyEO$''G=*-"'۷Sɓ'syrټy("۷?\v)~իe_eQ^ٳ%**J>#پ},^XbccEQqFSuLşgP>Z{w޶nt#rOӿKpp,^ho< cƌ1}K 78|p;ڵkHyC{n6Z] l߾ݨ(+3'!!AΝ+G .HYY;w``DWק~Ztbr瞓 }O?m.eo.ڵ3Y7s1U-۫W/={A Jjj}9k sΕ^zܖv]wɸq~_tM'|"reLiƨjWVV&qFg 2gq>\edd[oeZyy?*--'Oʅ ԩS(,(ɑ#G,ϖrMy _||+`&N("]t1y]c,Yb֮(+EEE(9sFu}\EQ9c7G9tVOM_J͹SjTfcKXY̔KvL^cccE-}ÇEQٴi\xQ"## _jY9J&F9.5g[\ff={s$\c 6ڦ~V^qW-g`񸜅@sܹZv۶mkЎM17W9)իVTߦ}N8!m۶U}s[ێ*L_YYDFFo/^lt.ϟ?/O<$$$HHHmմ/"gyFd߾}&p9X۲esΕ޽{%twu98bgk{em)֭3xOꪼ-5cU{O3([ U9=;xo[rݻ 2D֮]+_}ݢ(deex~Su_.z@ygd…2m4}.ի|rQEs2yd CiKYIW䮻^xA>c2eDEEɄ nt%KNdԩ2uTIKKHIii\Rf̘!ȬYDQر;V222֗?}KBBL6M>36mK||ڵkEQyGdFܺuL4IEիWKaa|W㑴c.RRR7۶}(qrquRE֭[']t'7|ffj^9{T\+  m1 #/lذA#Oo87Q ((HnvߜxOڷo/W^\222 yۦmO`rL}fCt`HHAƾ.iTʙ۱c}-']t+Wm%v2ӧ%88X֯_/OpoR渰PE+WmQsaaa&c?%%yp$ ^͕0۲460<3\ &̙3e֬Y2p@yeŊCY܏_]l|ğH5ǥ>lkQm%ݻ ^Sʯ[귫ݯTBm9[U7p̙ҭ[7*ϟygx'cǎEQL,f\'&&'|"rQy֩E[=*eeer!^}UsEzz:>s|ghРQz|Վ ~2eZh;7y-[:PRFPPѣޖ.6Ϝ9W̙3nnn/bڵxgзo_gƍq믿Fpp=1X&o>$$$ OOO> +>yyys駟ƀToYܹiiisrrbvtʕ+h޼9ԩSFгgO<w-`ܸq3g>f2VZs뭷:w}׮]pwwGVlަo}\k׼'Xt)nv#GЧOiԨ:ݮk^^^_}˖-~'|7 xzz~-]PS5{^}s&ƺѲeKVZӻwo̙3 /Caa!wn롹 .D˖-1f|hРFsΡiӦԩ^כI&!33z+&L}5k}v5 Æ Ûoɓ'_F`` >4j_X#<Ǐy4hx |«jp,m~رc!"ۙ0a~a=seZB&MT~',Zmڴ`3pI>v:QFdž ~g̘1wmS^k׮… 񁇇}ldǏGf?7n= 2*_w*--?h̷Yfx饗0tPӧOQ~}|2???ݻѾl]=,--5z:~<}믿bo_nW@=%kqxzzb̘1cȑ#uL"]}7n ŋb fwN:FEI&F>֬Y];0yᩧ\^^?:u'N;999&v6l7 +**¡Cy| .aÆhҤ!XII \bT7s=xѪU+4k =Ѿ]&MzA9OOOl/Fff&lقo]t?^x| yDGG'N@֭շ^z©Sp=`ѢE=cԩv܉כ  /*|AͲs-Z ;;={Č3ϟ{kwwwDFFشirssdKFۏ?< BCCwyG1FnMQFӘ"001c|A9r.ի'Ne˖hРp&򍯵kZWXXfݿGM@jFK9wjXM5})[Rg^zx^unCBB<==rJ<32jؕԵ~>j^mRS{Dm?[Myh֬cʔ)F՝B߲HPoW߂xz L*/^l{=zmxxx7x:t0VUشik#G4YTkdee!++ZWMӱ{n۠Aϕ5hF¸qSO!22999xǏ׏?Ę1cpq[*pRm_tmn{F󑐐W8 Ə_|aaaضmLb6wuyϖJ~ׯ &`x}ߏ[.ퟪiwm9Ϯ3(5njMxmCƍ^z &M4ox'W>|W^5HթWUM袦K/ĸqвeK:u ۶mÞ={ ՂPquK|\~&ߏĵkאEQT$N6 7oFFкuk(kעG8p}]mT7x{{K.رcʵg]tދÇҥK ۶m5k ))I>Z?l<#ؽ{7ogj TT}իW_~K^ ^tIVXa03gm۶Ȏ;ڵk&???? +))NE???ydܹҫW/0ʹTrss%''G/_.HNNΝ; /++]w%_̝;WDQYx~Yb%55U>S_dKXXtŶ9ɀ)xMfr쌌 }ɓ',#˔Ȕ)S$66Ve̙SlKDD~{}(nĶmۤ{"2uT4ڵ3Gdd{)L/Vҗ;wyynj΍AAAJ||˴i UsEDkx7oHxx~R%--M$))I&L ?C0gϞ@ ŋK.]$44T233eeǍg#""k׮ ҥKOڶmkʕ+_~)ҵkWyWF_piF~7tPźNiidggK׮]%$$D6ܖ8l"":ug}V<33\Rbٳg̙3W^6oL>}W^2w\YhL8Qbcc_͛_BLv-999(,_\>^ڷo>"֯wuAӖWZ333R"XM5})5qf3#Rіϟ?_v*ҵkW7oQ[8qDyWDDdΜ92tP{Ʊ3rODAM?^mUS{\gߗ˂ $==]BCC{Gt=ʁ_Ev/j[XXhr KըVٳ$HhhѣG 66RMDԎr|9]+..7|So_~gQEЯ*.-[HϞ=EQXe׮]'儾k}{רql֖駟_~.mp T"S^h"Ȑ`INN{N?v)b[Tm<;+k?sϠDߩ7QS"k_yy8p@ҥKrٲel(%SSS [cn[^W[6%%E-[fT}E-ˍ^$00(7@y3Hpp|?''GBBBHݺuI& / 'O)SȰado s7o< &ȼy$&&FEٳg=ϗrٻw糗/_ڵk6H.]D9rA/";Ȏ;>HU_QٳEQyWpAyyyb20??_BBB :A2rH;7xCcQ\\,)))O`ٺudee.qqq2zh9~A]?پ}A͛7K׮]%,,L(۷o0 0j'T D{dÓj{ܹs(?YΝud?[v[¤[n/˾}`;t |ΝCii)~mt޽6wO.hݺu׿F!>>-nݺɓ_yֈ98Rt>{#pK.xꩧvDDDG޽YfaZVDdo uPTT9s`Μ9FΝ/`֭\ڴi;#aÆ?7q oٳ "kܸqm5h<vڅ^u!,,LuLL6 5·~F!::.DL2nnnLȁc-[Yf᧟~Bqq1 / 88w ['N.2lذo&֭[?ݻ7z)h¨^QQQHKK7#F_~4[7xuOK?#JJJpy,Z}|RGnŧOɾ]ꃩHHCTt㴮NhoO&vtCZn_ۿt,X@}; 1 QQmuuEh:|Α(0cdߎ.[ ғu{:|*MRlԌnXT{g?~ɾ]NHmp^뽷fWjoG)R%#*:_57-,Z&vte!5"ۖ/oaɌ%RvCdt4b9W-3z KLdߎÐ!F[̘1˖-dߎ.)) ;wFdd$bcC}or}%wd@$AXhggSW}/T$!]4~ڸl/6. "0$" 1*UpX[n[T$ ._[(~Vז/sˊSV;D".?(9Qum[sP v*1kϱm*C""wc0me~#yÐ!@\"ANNd`!,,̡Ɵ5M$%~b6Eg.U886.ۋ؋Mf$DZ1;qqlވ؈7"f$DZ IDATO ?'.P73HC `sqb6Eg\lF.>Cl0; 9]2 88|-Ţ3H"X|c2cgGE2 0; 9˖a;\v0; 9]2W$D;LtBg*lT+*T$fZQyv@"!0kX/H@EB`wsv,g*T+*T$f jEAqv@g*ىVTH^jEwXT+*T$1_g*jE}qv@g*lT*T$5G@EB]wU'gd \nv@/OO&dQ\nv@ՆfdB ոffB ոfbQ\nv@//T.ӫ Ȑ\nv@/O/&$P\nv@//O&$P\nv@/oռfjCuPu`^LWu`^^LȢWu`^ތ?yU 3]Ӓұƙ0-=R:&1ƙ0[R:0j22dqfLHCJZ jӺvCJ*?yfL똆)Ɛ35;`ZbR:0jғ9TL)i?yfLm$^晚0[2R:gjvnHd@qfL RӘE5쀝uC4!0{ E $ ]#|i uH4B"Ѻ .!m !1%lZ* ABbK,ܺ5?U0$" zZWgU$"]K,|k+Ɵ U$".&%+5߄Hа%ĸrrEsM!M c\b-y5}BdEoB`6:eCHD ۹F׊/Z'fW$F ]K,|+h!1 Y?CE2`pD]$89]B3`rtɀrqmc49;]2৫60\.G5m㲽؈X5 oqmF n\yx-F.`cFlF, Ӹv6~aWi8Ttɀ WD`cj\;rvdo_ccTtɀ cxK5ksv.6#ac9B5L h"K5m˗؂\,U^.մd@`qE,ۖ/T*%7~\p,m_ \p,Q %~yEBtcck dVEtH{ NkۃGrCYz쀤@wX@Y.1; i5t? 0 WyΑ7 Wyn_^.1; ir) K̎Eګ\pN=KrnZQysI{Ug7}v6^; kjG傓wu]gdMhib>Q%yY^i /7~35n:,njCe,ǟ)dI[T_#׼)Z?VA 7i`:LlMS-P1TpZy-HܛuiUDV"MD` h^Eao^^<&Y6ռnlbGc˿~ճ~ӆoTݿ{yEmS WkVڿV?+_s_Sw7q36AtZ6M_c7r[yi# W0g,E;-nj-*⯑6̳k`9~Y}w+VsӪu+֭ -nj/Ali>r`3'ws3ҴBﮗ~0 Ij" \Odf[ 1g)ήIp䲒`>0]e%!l›D8&JRn1g)ήIp䲒{&MWIpzI6@҃H#f,%Dh6!R"]e3ZߚH#דlBD8&Je6!R"}UzMg$8rY-ZMg$8rYwqل8Kn5GioVvkp8 e+rr^ei⯥u0(MoڐZ-Xyx[vDU s Pmjyc9`G 'Fk(:ۍ̻ {(Vvl7P*EKo/5|C&Eǫ~{] 7WxYQ;~Z_qjs<ji65XRA{{>ᲟuA +3_: [_nk7+Pkbyf8GmmMa9jGF)ZW.ly4o+_fѼMU qc6"fZW.|}}T!ݭ=sd2&ͼ,,yFTOT+!4ouȅ5պ ši]ra.9K㯨WWu˦i]wu=)*@7xuj]B@7x4v㯮pk+{o!.i] /[W4GsP |]H2@74kuj]A1㯮poWZu7_@7m[7CDDDDDDDDDDDDDDDDDD4MRbyCX瘚;ykțֺ T >>ZW.Us@yrϓ#j9fa9fi]#jKs15q@^;9f:KGԬѭZW.8Zֺ voɭğ?g$M9K9&i .DuG-f-#S3ofvGq/iǽs$cr@rLn-]o `;raPS&n6mjmq$11l֬Q=@.g' 5e)IC\%@HC#p BҒ`%y7Ժ uȅy#5Һ <^?N&M-f2yAb=MqԺ =@q`GqI;L@ -51i͓^IKn-8iǭa @.)HCM44 Z\㏴)Ҏ';!iGZjт?N i'_H;?%L! iGZ39W9 .Ӻ t[CכWw Jk]a.vSuH ùPP\uWl /j]g,8o]3]ߺ­-\ ZWnp%y;UuWJ.j]=rD* M˕ZWnh㯬L* M?{wUu7~Mܙ3$1@HPP("ֶi.j>ZkkyVkkS֥}ikuVVEd–'!̜ϻ/^Ν|9ss---!`Y }_>B!)2.z"!bvXd`vXX? ڷG @ ۦAOpRvXpvXvvt`1ϗQ̀ #/i'T[, i*h'؟C4K(@qžߐ=Jn@OR;X,P^,毮˫@ h>=B(?ȿCAS4j]\㖗k2_q3#r{Dv)C|fn ^-/< sO@gΖ/K{! {|%88lD (,ȟ@%t,fxqAOl ?, ħ,D=A!b`1k޾iv{ ȿ`kmۻ^;8g̔ڦDDhb; kln"ogײ~4vl"sm!@D|; P۪je^ "N/[[ɿlCPe/ -Ϳ-[C|9SFhM,6eH`)!bShMYpv䱓C&'gQ!bCŎvv1i!b睢,6a`kE-B_C2g7|viؐbKAVp$[pp´CŜ=Eaz Q̀"|!  iB @ϥpnC2' Bdq !bEAQߠ@@ 8|.zs\V@?hb@hb"hrl =lA MER,Vrz z0 Ey`Րr`1j6L;XjTIAOU ׿SY[,VUN =UCCŪ0 =?UVVjE|E4E]BOY;X,ԝ, =RV_P3vXpRvXpvXvvt`1ϗsR…l =a(TM=!-EڐvXz = @S@qk)W zJn@Oբ'jP䯮p5!b[־,e|!Ek}zE;Xmk}(kC6Y;Xlu!b?ح,i=۴ivH)_@"t㖗k嬀=e!bn?a"h s =n9+BO@!bRn@T;XWBASJA8)?'3: #kCH9/w e_w)Wʪr9mEi9ߪ[/W;/W 0|>gCH#CGGCHS+j|!e?(?VA!\i+%!\NI_\ PX4 v?b?s_$ P;É08̿@*+*&(dFD <~E0%Yz|||A+A8l=~ .+'L=NaX;X S&g)?'  Q =PH;Xz|.8sz(@&t18!& + @S+bEyYX2pvXvX`?)];XU Llpa~n[\8B ByE(ZҢ8R<8x _.Ug)&rA~ɿ\sB$? #\6? C_.p%?c%7yߜ(!-U!!Eq1\ @ )XJW =nyv[7@#ʴCГ b-@䆀CAvqr^fuA“@A~n P(w``1w0+A;zYz!bp~n $=[p^Apv3D;X)!@z`8|lmi l_n+?-b2-ŞmMchc[@5H~@'5i %_2<Ϳp׿m zD (wmەHO3'RBZC_vؗHS/ICiqh'rI2v#%9p8]\h)**JysVB )2nz"!bvXd`vXX? k f&'(=I!bI!bک!bӵC|>_ΝS h`pa~n,OG_iݷM;+iDDZTV;JղMHvٵcvV ȮOvWC@]];+jq%?K}JnڶO;+ +C U!d?kWWkvܩ(PDASnzr`1 Q, )P/BO@!bRn@T;XWBASJA8i;73; IDAT @UCAM"CAM4zh&_h&?h"z _vX@(PB7 =!b`.H=|Iz!bGCCh_8H;XX,攐PE4/$,P=b?s_THvS 8b`bzvnfvA"!![C/A?L7 =>EbV@" D丬=N1[@#ۂ H ASsB?0`@Ν SFh8|y~1nv#oʒ! _( 47k8|vi5yv) qn&p, &pY1M6C@N('vv#ce3'+ ]X;CHNq߄%KC@Ey~m! /Ɋ!垎۵mK#Ao^nN~Xjtܮ}[ zYMMUmv9q]Ҫq@+ T &͑7y mӐ+V1}o׿;[[ z{ OOCoA]Uݹeg#AoH;鸝{9 UC?ܶ7͑7E=R9[ؽ/͑7yGiϕ۾}{#Ao~CŚ,t4-],ִI;XT?i:zN$!bMK?Y|[`Bj-^xvS?Yt=-J0,_>/YvCdZVti C@"!"Ҏ^CH`_ kvAVa B̿dPi~&BePsOfgC CHK N!e@TҎ^ӵCH;柳KuÀ:ovKr]Wμj0`;S; Xu]9+À\ו'/r,MArƧr]W]}vpeeaRʲم:\ו_,庮v 0`)uK.r]W,YdEȬ_靋…CȈY'k^ p""2k_6 U[͝z!#f͝zۉeP%GiQߎ5F6@$"2i!_PDd\/|=bx3J7ȭsC@/!d9_6 Wi3ȿ䯮!#f̘za ""!!;?ȿ,eMU fMVUv\h\;c)׸vFe!d!CC@/vC+j^R0l(whr; S@!d_vqdh/_PBF e/+J,?e%Ԓ:T;q?kfwNYS("0zv8@-0EDF`ih6"Ӫa8pw`2a\v8;؎DDew=_}]v8@+ԏ$_;o۱H8_='݂+7f ڿэ!A!dL}#m%!d/8%ߘ1!֬("2![2 :T5!~HeU7!~}_-IDd܄ q3Cq#2f܄X;G)@H1 PwP$oQW >$2/;[4ko5C/bOj7wl4 h2͉رHcC[e(tr i?&2 k1 柷ݛHЩآKP} ENEEEi=V 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 }Pmmmmmmmmmm.YWX]U!j./""h?u]dZUYHjЅ؞-DhϢ-@DDjjC@jj*ɿlb""55\fǵg VaU! @;o6q!ib%8a2&NȲc9-˿j?ɀznvge˿PP;t U C@>>/Bv ys]7.Ml+@&?릈ӊ.NȮ @B MNЮ]g;(_V)= Keź@ ȿaR3/9N; Xu]9ꫵÀ:L0`)ur]W\; X |6>^; Xu]YvaRne3iK+.,庮>b0`)usWhK+^rv뺲d0!YW("Ҵ lصHC~]_hfeVMKj WmZڤs\V@i:/[XD-l[PDD/[ضH) C~߮-ED¶-EDX;W$E!dj\n,^xvدŧb@[t-X8h"u+ +t66DAMlMlCMlCM4B4 04 +4=mCľ/g mEeevl"!`ihmCdT pvkmCX,? RV_aljsmCP6!8P;lCP6!P;U;lӧkmKsdmì=nR^B4k?#2+l̚KwB$ U[͝gYV;5d`Fj&9"W=ۿ[w(Db`;o̚K7l-@u?۶L Y("2kn.*Db/@{~7\w%sz޶gB$r+2s?H(A9_^H(A͌o>H寮A͌3z%Xʊ V_,1*nyvj*|n7@*+iGif萡!Xoo7bvֳah%/^" H@;5Z6Avj2WbqqMSjq Isd CCCCCCCCCCCCCCC!k EDFk=R;Xzƍkנ,0zCGS0Z;X~/C MS?Q;X13F;YVkXSv5j ػ@@IVwi7nq(w B?m@? PUۻȸzO_;U3)vl`nkO;U,o/&g`vVXz `f{"X8Ǵc`]HD;UlmuiX6|.׿lmu^6HvXS qB!b`]E)**Jsd CCCCCCCBCC/4 04 04 04 04 p~58"3"\Oٽg@g=ɬȴPU?\i7E3"""*h pfE; IIKeZd 9LJ*h8""A~@aL m3+Tq,9Lڽ/jtk d`h pf%(""2P*Gm3+8u+ ePn pf 'HR & pfjR"cO.""*)$8|>_CPڟ/ ;GduHAGa_P-(  @)@zc!?ٟ??ٟemoƃmzprZda'$PQ/>L'[s.Hi"\Ec__qB!q\W9ӹ m&CiH6$n+\G+/u#>_+e[[v89-Rw&G*KכmoҲE;`] H6}s8߁:ۥew(W:_|g]6wؠNN ~D%I#wq?"0q|@E6jBH@;&S\ N@;P6?{guVprZ? WgߺWZBq+ _Z A~NPp8B)rrm~﷤e^prZp *_X*Ž/9q un|׵WVPjRĉt|  K@oȖߡO.*񕕉SґERKQ($s{Gl٢NN|qq"0`@OĈa(GZ]W;¾Tk=Rn10VU?Ba_44A0VUX/eƍ۴b]W+߿e2}0An#uվq"Ba_*5}u? R^nade"Ba_*Տ!uվ~"Ba_*7;0VUՇ}T?nL#ku]/:&}S?^~ϴZ]W;B RqL#ku]\/uG7I>u]cl RQ"u]dX/46Ad ۑΘ1c{#ku]oUõ ʉiuKqv-c>=UCCPѵUTRǪ}z AE>VS=Z;] XO_>VSSU}ڧRǪ}zjjZǪ}zjUikajo>VSmi׵UTW9ҵUTؙ] XO] XOOu] iվTʉk(j_cվl CH9VPH;cվܑǪ}"/UrF0?VA7UrF0}厼?Vj_UrGͿVV,Oȿ\㺮幇vjP_w $oNjIojKkjH6 ڇDҹ !!tnCȪ}H$Ǫ}H /!tڇDҹ 0!tnʪ}H$Ǫ}H$Ϭڧ'g ]7 sǎI>.RгU; {a!Y_%ȴzj庮̹jٕ*}ڇduuѮi(c>$u]|zI=.Rwr>VC\וgnٝ= Xr9[Ȟp>VC\וcO#BQǪ}H2iOrPsA>VC܀+3b}o>VC\ו_hIr}ڇd+3 &`pR>VC\וg'I=.P;Ga!Yʴ/}I[z}ڇd+SNMq>Gae}O ooVCM_Kj2cڜ@VCM;W_Ȫ}ȴisC=$"ڇ̛6{<UiS'N?j2ojTyLVCM(]DX7u8y|X6~<)O!/O""ڇ̛2nu[G !&;GUȋj2mҤI+~֭3%lsVׯɿgվsqUC_V˿""ڗ'r/hI兜?ٟڗr.aվq]&h~,X v Y^^.nB<}o8 Gt裏],]G>gtN:nz\٩L!y\z|GH{{{87tdb?oeb sR=OtܯHTwڳgc@_~2p@)))tby9@ ]v[oq<+ K~$E/RSS#wu̞=[eڴiX'""k׮O|rG<裞MԩS^9+dRZZ*"Ɛ!C7O?W^y5JF!""?=Zjjj>|32zh;wHV%^z=ZƏ/7p_Ddǎb 0aL0AVX7p5׭WfΜ)ӦMZ)--O:{[[[eʕ2fihho|RUU%~zɘ1cdĉ?ID$a<>益?ylӧH{{{y33;0 iƉgڵ"\p5Jן(D峥KJUUz2|pַ% ,aÆ=6~J5~L4_K~ٳGG-555h"YpkoD앮)^MɌNvvPHx≸}Ѳl2YlYB.?m|uWH}}|k_e9󥱱QƎ+?ٰaCreI}}?^x;'?ɰa|Yxy|^[3]w7nihh0_0555fcJF͐!CLkkͤILCCC03555f̙n3ݞ/1w6Gu4~ihh0&L0>h&r믛}ѣGh4jƏF{}o>sm3gsu[;vFܹ3Ǜh4j>o>+ѨYhyW̎;?oN;EQ3{lƬY<쳱']˃~饗>l޼lڴ|ӟ5? fɞ7>d>rSO5M{{y… u]~/[ 2<7f{v}7ܭc}17>F7eee&cc:vz9s17/z<>w6W]u1c9rc1NW7gΜ^lٲlݺ|syu~ƍO7_͛cK+:>?tM=sD'/_ĻxW?nѨя~d^|E3bcL'`?㪫2/6W66m2?OMyy~Ư^-H_23Ƙ^{,_܌9[>a„1̡M8vͦTUU|̝;TUUW_}5O(^va?|3m43ds1ǘy7y9|v2#K:EQ믫=?ty7677رôk,_<.̜wyf֭f֭泟!z{_mܸ 6,6l`&Nh= ^Rq~$́SCCyc{wѣGw{>SWW9[o455ɓ''&?1{/O>HW1cz|>Gkk1O4U/}|}ꁓGovg_{{_jѨill4/?o~jsǎ^k&vLg˴͛7ǞsƍҼ+cn3~xּ殻4jݱق 9c~s'x"vD}w6۷o7hԬ^l߾uBW^?kx}^㦛n2#F0?я̳>kN3fFA?466[sƍzu\x P_^i-ן(Dxthܹٳ'DO2%?]tn6ƘG}Ԭ]_[+x~cf̘a.2a}vL8єŎ:bLTc_yv}fժU30Ow}-[[oլZʼ[3=ƊɌüu>H&>/IśYf9c?g{rFMYY 'O{ Oc-)SfOnVXanܳf2hG;c^usYgÇFS8t^; n{_]p/~1Hcƌ1---oݺ zMޟxچT^_z/Cɼ^=4hwm˜x≦L6͜{W6̬YLUU9͙giz fذa ,0Ӝ{ 6,]ԼW^1UUU&1cγw^3nܸy( }^Y^'{}^*׺kxԩS3l@/͝;Ğ1E:Ԯ7{93t<6c?w7l?_GoN:$/B3s̸1ۤpƌ }^/֭[ghߖ=M7gwqG/t>O_DnvX̚5+6sE%OW.Bn_n?,3rȑW_5oF'4[l1ÇﱢL>7~n?{wѣ1{?avi|ͤ&X&OmueٵkWIFx9nݺn@y睱oڵx{A Gfڵk=Ou{_KDo2_4|wLCC|ϾsLSOu7l͛gZMMM}LMMMo͞=zc-[ff̘a#O^a^M^:Hv\6V7oYdy衇o~s駛h4j/^-[{'^Wا~L<ٔ_5k=cj,Yb~icLǍ?TTT/q>|7n\cq|ffرs1{lHd]6~> `1[ve={WͤILkk9c'Z|l_ɼ?'7I?^da:koƍ /v5˗/WVVv[cjSZZjj>Ϙo| .0uuu&O}S---k&7uTswvp;wnl_ױGl^^Y^_z}dWJE{5c} /3k֬PQQaNϬY̯>ϽsNsuיѣG `N=TC믿>.Yر\q5 .d/r1JJJDDdРA""gϞ=\y7u=#璎'v!7nn?ohh 6Ȏ;@Ν+>Z~yeڴiRXXҘry'oo!_夓N5kQG%ꫯʏ~ν|rw#o|r-t˗ʪUM|I׿.6mR;e߾}o׿rKKKWnOt˕W^)*W^yx≞K_\~&۷I? ' ]t]V֯_/\rI爗>DO>'/lݺUVZ%gc&[1ڄ ^#1OE/[l~[W_|P,X 6HKKK3G\3:^Ɖ/^$y$/^/sL6L|A)**_~Yv)o!=m;8W"|+""8_ &srUWK/$2yd OYg%>` >\f̘!""?d޼y@n*"">viOECEF +**d~yaoذ!?|ZJ*++~΂ٶm[gk׮q\YY| _ǟ?OI?mhy뭷<ogеr:묳믗oQ,X GydH$ / '""͓{L}QYr<#?QfϞxr)"g}9R.]*reW_-+WzYrL:Ujjj䨣۷?.G5JF%7t|3KYg%#Gٳg3<#˗/=5\#+VF'H$Vdo[~哟Haa455ʕ+{ޟ38C e޼yr9HCCh"9<ߖ|饗矏M 4H|>_}6pB_"/dƌr '~;ye"Q0:`|O=T5bhd?Tu^sc^Z1=sʏc9/KZG+Wueܹl2Y` ' "+V;ںuL8Qt\ ߉_D/QO"q3QgK.9sHMZ$s9'K4~7_K~\tERWW''|444ȵ^+ IDATͱhƯ^*ɌVZ%7x^Z{=yS\|eT$s˅^(8BuܔUq]z+{xT7o5L2k2929M29 a !HP lS{uֶۭmwZwmwn]P bwնnA(R CQ  L`k. 3k=g=7~_c۶m8tqmfF2,[ {~fY̘1DbO=1f|>477<=|B*'~ߠ_=n@AA:;;1i$w}Xtg+|>̙. /im|hܛn 1}t;v >_~y~;nFCCCyS?_%ʮHRϫo'lܹ򗿌}g??@iiI=ذ:z(n&|;,Cv&ɤ2jFs>Me k| jkkO{5\3gp xꩧ|A<3xN=Ν;~/ z衇/wa֞B'?#GFK_qF瞳fΜiEQk{衇X,fs=͛^{zGoѺKݒQ5m1cn:kӦMŋOkukັ,˺;6駟UVYrIg˖-'m!+ |OOǭkͧR9֑#GNſΝ;OTjkkV\i;֊+6;xFk̙eY󭆆zU*-TYZ*-al?EԩSwƍjllށ~C^c?\hU__o=3֋/h[m,˲n+HX?j]kS_۷ZfIcStqoVwwF_|>UTZ{Z/7?Ǐ~#zᇭ֪UVsso޽'p~g544XC 󯡞L]#oRn:F^xڿe}_fϞ}g4bY{;;?GMuc}ߴѨ5cƌnjF֦MNÇjkرCm sܐϚEPeY^z[`Iwq?5c +[s̱~tܱcUUU5p^^***h4j% ּy󬚚sϵ/ mb1롇Onqk޼y֓O>yF^˲+VXSNuEY?U^^n?|o ZV]]5k,o^{Q3yp'#GXz5aٺ;N[8y&O|=zOӊbɓPI=NKL zCꫯ>M%7!kqdy*9vӟԚ5kǭYfY{i]wu7lYe}J]*9xqȑ#֞={[nŚ7o-!i>k-\ЪMfs=']?=js=֬Yk̙=c=z|GVСCֱcǬ9sXOzÇo}[ɓcZW\qsYh7nܨWVmmiX,vv Wwiֆ Nz_*?R~#{Z/9hG=ٳjkʔ)ֿ˿X{֮]k[UUU-˲|3/Ty<7x>'yP7V &Ye]6ds(v\9ݱcŬh4jqko109a„!?WEÝRzjkV]]d^.+Bu)f>;?hu'U7\?~z׬Ǐ[yf^n6:C4h{VCCu[eYG /ƖeYӦM;l:M$ W\?F3Izu+e=?4?RYo߾ao4-ZdYeM2Ū^ykƍCoN4:^-Z{il7,ٺ~*H] 9b]uUC3Ѩ:kSN#n$;/%\-[d ===o׮]?~<6l؀H$hgd׮]8sO^:`K+۰d|v, عs'݋ӧt,ez;?n&梥rKvZ7DGGDvG4'#sbqEN?Rpettt̙3~?vak >,F<~*[q=Dze .<=7x#{1X6m/ŋqN$Gӱi&u]X`iu] o++W?Qg)++Cmm-{{W^/9r x9w1B"dggKF""RD Ρ9re/UW]ɓ'رcO~ &x{Upс=7f͚R}߫WX& 7,''PSS矖_"VXc娩;3ॗ^Bkk+/^{駟Ƒ#GN;vEEM>""/8q_א/pWcʕ|Ǐdz>'8xY㫮+GyW_}5 _O-ROy䑓jllD]]暴# 6+ݻQYYӧoeV\/| |hnnƃ>EwI+of|k_LDDD4:===7wy'."XDDDD1C!"'D"8pn}(((@GGn&dee p?7|;X|9W^^;o{#wORZZ]w݅|+9-oAAy|[ªUՅR;wu͛Xf Z;vc755aʕgwFDDNX ,@kk+*++ob͚5O4 с믿~;M3g;wċ/z YYY ó>;;v[ou^^>OC2]qx'} O?4ƌ^z ;v@nn.z{{|Q[[k_yǮ]pر!e}x 8-+X `"nKX$GX$GX$GX$GX$GX$)]]]뮻rJlذhjj5\s=߷zjqxWm6sҥKF{uŰ ?`'xi&`ԩ~ χs=HR*}k׮C,]@Vc=g}?Oߢ{.bdeea޽8r[zzzLX$GX$GX$GX$GX$GX$)\hBv$R?8> ++ شiz{{xG0f̘~DQ~tuu+SOaH$={6: /կ qn@uu5~mvmo`…0c zf===pfOU""""""""""""""""""Xx1^я~?~ߟs=hii޽{ m݆}C8|0V^͛7uo[tuu~m<8p`Ŋx3@v$+I$H$H$H$H$H$ UO~G?{gO|#A<JIbh!{6mڄ~8t;h.$""J.$""""""""""""""knn>-%_t"""""""""""""""""""=.$""""""""""""""""""r!.$""""""""""""""""""r!M]۶a7ر#mYNgox4mh҆ʊ}ڊMon<߿cgj杞 ֙Nzeh9,J竪뭷 Ft i|Uuuw{ߛ[Y: S' m<{{+翿O8;k][bƳfI륗VZZGho@e%g <߻`˖-ikގv`֭ؼۻxֳۖמjϞLSΛΩWgw{O4YkO~ @b׏g 3xA873xAbΚ jwVOi0dvh9l7hokdv>ml7S'8qG6jw睇NFjw>Gjwmh6Srw,POHjwvGjw)MG{TNDjw)3g}4nL?P8S::Ydvlډ)SwJJJD޵m.ZcS֦ ឞX_Z 51ႌ.pu׉66:O2 PO~NԧuBc5DepAxmۆ?qcQ]9oV\$rlӺ|91k<dtAŵ"Ǧ>-WΟj WMȱϤ 0stG3 PKEM}Z::1slG"]#_[+Xu-fΚHF_>O477#a̙'_9mۺlHg坨c_'ߧf96I̛:̜;6cSDT1|5sƉ$|U>oO§X"rlꓘ4 UqL5.@:vm= gp8{m fp͋C gpD_.t=?@.8:v^?.t=~@.81aǒ?.tKi N$Ky :v'*P\(P\,:vp9 IDATϿ0dpMMװ]npc[Q[]vdwL45vH]0lp 0ڊzk% nܿ;`?v&Z]0np'"^WvdwL$Zc`v& qvhmA vhiAG.wDK ⵬?v6"^# nܿ;`Sb"u(0l%{5RL<MjDo6#(^OzQ^Sx5%ĺh/aӔƤUT8M6ml؀RLGSUJBS8s[UT'} l9ͫ^V(&45b95(.t'>P-ńWv|?V>_׋sr`Wx'~Vt)&wMC&cXr^t [/,6 $&q(zCJ,|ϒ`Xl[='BUGbu(d&8+-MzI$څv[/jlɓ1Eh&b*WJ*8kxkkxk$OLqSPT1yŒ^z;wTUU slh7?'}4;xэgg<b84׆I(*LPG4&7Xׯdz=gOqӦsQYrŁ7?`wWǸԁ2/gɩ$_4&/xaϫ @e8g,Էw"͈L~S[|1%;gq_/vILF}S "Qz} )J>7 ~$/ő$Py,P9`WMKeEp@BDJk&=/E0/<9{/ 9(/FZ-Ndfa_(8Kls8`7_[7H, pMr qONiзn8o_Y̏Xi0"8o!p"Z]8Pv{ 7&y~{O,6"8BapnFΖk >Dq6|ZFZX7#M|I?56??Ja.73kg}JFZX75=7kc({o^,8| 8n#"#և~#_?'7QۻxI5  8n5M^#/ ÿ'7kgU`8x`' (|8HzX~4F?d+Vx,6"8!Њ"3/u37_nA_&-lqϿK,S] ǎ+<+OaEpPpA N"8YZgN"8rp-3ù ,S] [$y2`~r}6:NEpd#/NtT>_GGxϋ9i?Y8]yJtvOy>n/2e O~ϥLOpǫc>g|W(f /~{QG}ƝYTJ?Ep@i}~.Nm\"E%()PT =)-EQ9z&br).AQ$#i(a="DBY(sBdE( A*0M'ٍNA𑜡% >BPBi[@ n|Dv* Gd`qdEBS0V$$a$#&b=$Gb'dL÷n'?DvKr4>CI$''?DDDDDDDDDDDDDDDDDDDj@5; ܺHi6I$d(G:);$-0ɝ|>tR$;$-/$GcMO $֦hr=_k24 &!Z#(xm Mh~![ZMur4 s#UKh"o/&OHGQ05i!FD#UKh@tjnn@1N4 %E*1ot_<.!K#(Z#UbG#(hHGH$o:-Pd] %Crr-$w lFr@mtRX f{k KG FtR뽵WV&Ĥ#´:0-<"""""""""""""""""""@p.A $@J3<X `r@ytRf;4#tP:)KG ӻ hhHaZ0$G3ہ5wwtR؎HG ضM:)l{Ha9#Aۏ@ cIG xG:)gn#º#º@ {W:)=#gn_H|`MUt@v)o@@M,oYnH$(!#9Haz^tR_Oo $` `+ho-'wE shFzLDDDDDDDDDDDDDDDDDDB\HbdH>Dr I2|O O =.\0.$"܁#4$G;»y4*F[Br$~H$H sY$or Ha~=$$ɗ$G Kr\%99!-)@ KG EKJ#x%IRɉsGreHacy%9cʤ#D9#9hT:)lL$g _HИ2)-)r2.:w$A:HiC6InrGrAr#¸ I|>0Iw$IZ._H#9M&""""""""""""""""""r!,k6/Ay&AL׫JGP{l{stݶI *_ב#;W:-3KGe&35btwKGPHGenK۲et麺?8]:K#ټwtqb6o?(Ayb6>*AyZlꑎ<-PT2/,**@) 䈗KJG'}m`q1-zt+5rZiW\s@A:BrFv,..@)aiW\\"Rd+q=`q)nEq _Yt+*-|t+khuҮ/޻G j궀#yAx G@:)P03nLHazGr-$MS:)L7Ha&J"$H#rhFe"""""""""""""""""""@JY ;1x#9HlB ZH^I IG Z`{x0;_AtR_phF_xGȅRfpdP:)̐@J3|HQC?Gr#<0@ Ha"^I$G$G shFw G18IHEO1 hT}Dr I2|O O =IG ss#)I/I/xI//_:)L39Lr4=/G)3r$IsFrt&Az>'I#9~ I?@ !0.$I|.'9Z_/ qp X]\Caur k{ls'>\K;֟{xqB7=8bPtg[w?IGHgzo@Ë;C B`khz_wGH\H)&潽M~HNЃ{Ε@ 3KG tRRH@ u/ /)@ Ha00-`NL) THNBr$u#fsGrHaHtRQ$G# T:) I IL:)IG iuHaZ ߖ]=JIP0$'~!94; ;@ytRf InHaQ(#&JV\,发@ 9Gr4Þ0]uW}Ha@ ;wtR؁{Y$qCtR##z@ }_:)W:)lCHa@ wtRÜ&9{9a%HNU$''IPH$9#9?I y%9<$?H$H$4#9p rcdGrlLlL0,@ 衐tRnD#t]@ A+(@ KrͰgw)%o HatRPpGBHb=#IG uTAr~tR_Ehy\Jr0Hf3]e"""""""""""""""""""@JR!9$qcdsGrt>Nt>N0[ntR_g LI/I/xI//_:)L39Lr4ݞգ9lGr @9T#9:[ =$Ge$ JG tR$_>-/ry8Grr49 9fO_H$?dIb$Ib$Ib$Ib$IbM| I^H.8T#9$霨 A C9Ha$lIr|>tR$;$-/$GcMgUw}O:)l{Ǥ##$?{?%^}JG tRؾ}#;|X:)lHa{@ ׸j $(Ӥ#¸I 9L#9AGsJG E˥#ŒzM:)̈D#@tR/)@ Ha00-P`g2(2!9 @9#9Z@A:)(@HaQ*$_$WV&Ĥ#´:0-og;^kXeHaHa#ZqGrZs/ytRؤ #š#&^)7O:),ѹD:),1#HaI차*G,$g jlGrH$' f0 2˥#0%)Ha~_:)_n0D#ъ#´1HaZ!Hfׁw\ iDCrH$ p@dHG ftR^I IG FD:)Lu0_ w%90$G+ _qgR:%p5 ( lBr 4a)?r6?X$GHG yyHa~ݾHD#a `+h.'9Z-?\ugy{#>*<2vGW]Z߷$GWݐ 9 :Z=`ٜTJ}gsRQ,O}{{{mNB*UצٜTRz޽{mNB*Og9 (VW{}b)cGlNB*J3_Uuj/׸j @2!99a `d-hH4$HkHa\0nJG 0IEa0_^tRfrh}/G#2r# @9L#9z6$G sY$or Ha~=$$ɗ$G Kr\%99!.$""""""""""""""""""0:T:%{|hItJB[DKJ#Ptl4DKYN9nz|WV!]cyu2(G:ƔIG$(N{f4@I|>S믓Lo8/ǔLKi9LxE9s2Mow< )\GΖiHa.=9[p\0htRQIG tR($G׽̿H:)KG Z#´ #´@ϻ˔T %Br$){9[0?@ D#Œr.$9z8,flOOr$"10N:)L WTT(ԼLQ!'*)*S~NŬ?2?2? KG]q ϩWS%_X\\,tHGarϹ~tTr{o;A_KS`l^TSic#خzHs[i`:)o]6'!MЖ4QC4[M@i 흝z:SYN*TӦHGSMuO*N#dL{{t:_IGȘ)Sxuw4|uO6M:B )ts-WS:849!us49*- y¦:'{r64;nxf;֟s۰:Gp\sHXv^q9HG8v=P!!xs]WG!t"s_<.!X+jq?*/qlZc8Hm)s9+ۍ2'2G# 7R`ʜ`Sjk#dHm)s7R`\#0R`(q#Qrm)s- 0eL:Bƍ2IGȸShu2n69Z7kz;sPorYx#9ftJG Rp9rY̜;]:)lHa3gL3sLx%938Bffs8GrO\Ro5Z@R(@XUt $ [?0l 1[8Q\:X N Ī#Tx,V#Ft ~_:8N/WdU b"XΠ发 9W@4 6$mI$&IlL$ 0Ib`6$mI$&IlL$ 0Ib`u8r $Ə@;@b$ @' 1?iF & ( LhOZ@`$%%Lhn<, &1?iz;@bDC!bZ#(O7"$ u]:DktJ܁sE@:Imj4@ Ͽ8"Mp0iBtPL qtA-ͼJ3|َ'O_KҌBu-?izH4=#ALK+oH#ii,Ay~HNTm mJ{m4-fο]<'M ;4c0xo ! x[GҐjjc64o~[( f69  cDŽҐjjܳJC pρwҐjjܳ{PRPm{JC pwwPRPmJC 𻽽BiH5C~w!4ϔC~/^K3r]c`Y} ``i* 4ç0K3 ,]'+:6-͕ meuu[`l,M拨 6|auwX//_:(j? ,Mwjkj#(QVKGP'Kq֟(Xt[@?IzZ֟$=WKGPT{`N:tQ8O_IG+IZJ嫽?YZH/_Dijױ$_Q9/ j_HVT@¦O@O,I +dHR8?H$)GL~ A?#I?d9zipy1+2q/IPo@.3G:tL3e](CY3ۙ]w4M˾U4M,VYK?@:LĒ.,w4MK~J:~[`ŋKP瓎 4M,Jjh&^st eiXxc(K˂9,Ec-˥c(Kq%8MrtRؒ<%-@ [?%˖KG -ttReˤ#/D:) I.T:)e?EK82M:H8ro0μ\Llyj{p2ɼed /7۰f^p\<8zOe gD"m3OTHGp 2OU!<"<_<.1X+j*/lyZ sؑP_>B:'d!`N'9Y0rad)Tmߐ   @ʷ=U_>tOu7?N tOg#AB?ß ×ݟ|S~)!@v6YXgdgΆ|S~曥xBp\jk(/QR0 G"o{6e(`-ٻ?6n^t-JVDAu`Q2:(; WQ,*kYZy7YnҴI~ϧMrsI|s<'B̿=_k4m M[Uz7+4kf!д]#4mm~k;4 h&|~ߪe|M ͂4 MoM[D-Фys_*u%yKx7ivhڬ 63&6m&MѤ/[ ҥKnWhڴ)6m&M4ibeRl<M8$MqPK4lV.nWhFڡq+cA 4@#??_*ueWxm2((:o#Vh2ZU/ݡQX?4jFmB(8( w~>oU2M njF7Q34jfFZQ]uE{h.}&:V3OS U\v{ZoZRn]Z}Z>52\սO.P'}2?-rU|&:V3OSeVrUZLt@gܧ&@v}Zhz#ٹ2Gѹ%`>}{MUqݻun>XO_}jL7XO_7&W\sK}2߯EUe.ݯsK}..ַ!:a>}EDDzNU>sK} 6Vֹ%`>}G@I-}jo?WsK} ?rJ߆褾Us'HeͫV XeͫFj_=WkU%`վ[6תqUo]ؼj_Xeͫe˪}.l^/0,Xeͫ'GWx2UCBΪ}.l^?0Wx2Un$j_Wka}.l^yǎgվz[6<,Wx2U݈EVwu`}caONsGnWI/}GNI/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/=Uc##nU"¢nU"I5{UehfjW?;Uefj UcbR֛}L^2zW}K]Xo1{՗񯽪}L^2zW}K]Uo1{՛S}+٫>.7{U5uq9^rYJb'&F7.K.KIJB SZRS ߍdV-s9^rYߍdV~xe:҅}/,5=}=/,@5/ %{:>5?,RR3Jxe))).OMr䲔tr&xeɝ:&ݔxe6供"or2CF&p}͒s9^r!5 ,(3)-]cV)5ߙ=f>KcVMjեtlcV-fYRFf6%jեt{U.edfbY Q]jե ۷U.ggY Q]J©?4=f>K8e̪}Tҳq>f>K8Y5(..v/w%V=Ū}^%<2Na>/wį%<2JNj8ugUXՏŪ~'V#=UHOGzbU?XՏĪ~'V#=UHOGzbU?yM%""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@.\wG8q͛7׻'Gzb'Gzb'Gzb'ĉhxeA>y`^'Gzb'Gzb'Gzb'yh( ڵkw[G0H7?#=1HO?#=1HO?#=1HO?PHDDDDDDDDDDDDDDDDDD䁘HDDDDDDDDDDDDDDDDDD䁘HDDDDDDDDDDDDDDDDDD䁘H>ܹsѣ rWbܸqz7|Եkא;"66VէOStԩ޷y@Qkj`aa!;vNJJJеk5ԩS@TTTCADӧNҥK8rHMhAK{UÆ 36wطoG:ӧOЩ(;v,^~e?\u=`9rwyG{wj۶->s}=y8<0a&Ltny=S;?g۳>us=ze8aԩtw5{駟̙31sLTVVjXh㌈n߷ɓ5%ƺ+P^eؼ IDATV4h6mڠ]vvҪU+|5nm\T?]v /^M 4hkBCCѹsg=4i@lذ⮻rxT9۟6lZjUQ EwވAnn.~mTTTN8coFBBw5kh>Ƶk0k,t iii[ŋ߿?sa˖-HOOGpp0n6>^u JtLldggcʔ)N ^ _EDD`#998y$?"99}5 _}}ڴiHOOGN+hn;i?"G5N֪yuv,_۶m1qDL:SNջ9:o:N8pIo:t9f͚SNz7TG Xǰwlo}+1rH9mTɓ'ݾ_㲕SNEjj* 1b/ۛuԾѣG#22?,S--ώ  z뭚馛pwԛTkr/ ܹ˖-C>}Jm 2dʼnNDp7#'',y']:?l*~u ٳ' }]Ӿ._{ yyyD.]xb7°o>TVV"%%v 1R`\U;vD<#G">>Į]nwDDDhZСC;v, E͚5ժO=zht>)ဈ~.|SD>b˖-Vݾ};ƌ tC ;wbbbUV_~{n}i~^g>YZr%._EoߎW^yK,믿x#a̘1//`ҤI4icL<'|m۶a(--?KBQ< Bff&ydee>3@QQՉ3fҥKظq#6n܈/o[7qD?~pq?~FLL // ._{vVZhڴwHMML6 ƍN-O.k~z3IIIիkӧO#666mйsg_'NDrr2_ZO˵g5jRSS?6ϟGǎ7bԨQG~mK2T9';_ݻsOXܹc^C\\ _X_uw?MDTy:n8#))b?ZZh_SϷXbm۶!44d+?<,"OЧODGG#''=L./ruLyy9f͚!C %%;vİa,枳Mo^l;wرcD 6 }˗/#))I󸠰zi^VsGGybUXX#Gcǎ4hJKK].鿴Z/^D\\gϞ5ucǢcǎxW0yd$''#==~i'} NW_}køz*>#5_v4}GYY.\BL0SLmQ9?'ZV\\,("K~ݲe$!!A>#ٱc|ᇒ ȥKL},6m!CȐ!C,w5)**EQŋr[VV&[nEQd?I>sdÆ Ο?/ϗ͛7W^P}>|X>0=o>#G}MqqT;wJhh(R/22"`ݻ[=fEEϲdQf*++%//O}QٻwlٲE?(2iҤWw^m8p$$$H~?͛7ˊ+dС.[n^rZ.\ O?KttO?-.\.??_E`9|ݻWƌ# ҩS'yW-?y<) 2h Y`͛-UEm&ӦMIHH˙3g!!!믿ǎKZZdddɓ(ݻWG5d+[/tY֬Y#ŲzjΖٳg<~_,Oe޽h"IJJv$44TO.Ǐ˛o)!!!b v("{ŋ͛eԨQrmYOkjV)"'Oxҹsgٿd<߭͛'={J)//<8pduIIIIq[l~~Zj3gxeڊ7JHH1B~myWwޢ(tbǏ͛EQy'$!!A~a={L05?uEQ䮻KEQի,X@K׊""ׯ08q]V֮]+'N0Y~>g\\̘1C.\(vtE*++]jj=zgyFN>-/^+VHΝ%$$b;u<ݹsgeϞ=2o}Zx ˳G x@Kog`Yvj9XBeڴitR1cii>ϧ"q:z%11Q{19sL0AN8f+ZyN:w9~6ZΌ/(2{lyEQ:tl޼YOn171]7|#""/\U׮]Mqރ*U97q5={HLLɔ)S,[YY)ǎ3W^-{{ʾ}իv@U_矫οT5_v4uYk׮U;gGgs>q;}of/;ƌc/s*gr*++e…2tPINNpȐ|P;`Mbqk1!"2jzMza0d`ݱZ b 6HllTTTX=~BO's z>&N(={4=VT۷ojuj|_goԩS9rDEDW^2k,ٹs\|Y8LNN,_f$++K֮]+K,LxNM8j˗/}GONNcN@y [׽{w>}s.]AI=KMv9pc;2 [QE#"sNDDi[gu&/r͜9Sw5=>|=Ү&9{k/322^ʹs礢BΜ9c|o7Z-3g4=+#FtQERRR$>>^nVQEƏ_oꂣ@{ >ͯw:ֻwo?9Rz!zjS3 ?7lsee$$$Haa{쑾}ZƳ gݾ r9~;wNN8Qmҷo_紌 t"s̱x߼y9s\ݻwÇZkLCk(L1Sǎ?X"##eСߛޣރ3Uk׮IAAɓ?^xA$33tp׮]f5JQyfsrrE2ڧ^eGZ矝y\}?ʙ)S(2zhY`YlLC$""B(SLs̙3SN2p@̙3xb:K!Ɯ+n(h=㘻{宻ݻw˥K䧟~O<)f9y2 w&V+**tL <쳲n:)**'Oڵk5jȒdrEKKKe?{Ř>gqIٳ_.w(" .{W_nzO?`VcǎÇ[LF͎ي?-:(l:7Wϟv#Kuٽ{})";v|lgm~}zhﳩWkΝ;M+++OIM_As^_nݺUF!III,!!!+˖-ު}%&&FDpW?MǿiRRR*-V8] U595ɓ.Ȋ+L"""lQvkkZ;Oj_{dĈr9ɑ.]Ȏ;dĉ??}d\Ţ(=ZY3×4ٳC?EQV;ti}嗒P"J\\y*"ΝEQS s걝kuϙÙEHBB\6Zf͙񇯟'm,X '|b~*?ls&\e3gΔj;vHxxp}o%Lx UVܗ8+`JIkxmOնa],3"vQ}6lhlӧׯĉ͛#00v۷ǘ1ck7q}YEE~ߙ]hܸ1-Z⡇B>}tq{@>}~j7ncQyy9V^{-Zxe˖6m w?jcڵ>}:L7j*Fj0a5jdz]lk׮Ŕ)SдiS7ɓ-V۶mѢE Oo۶ -Z@6m:f6mЬY3lٲڶ!!!xqj_}SJusmwy'Ə$ >:u3<L:iii:u*uX$&&ŋX~=a0s1f$%%wpw?tP"&&999m۴iRRR…~͛7GNNv͛駟6={6LN:Zn L:~MhSN?틑#GbhԨn֚'( 4?mqƵ$S^z(".׼{i7j͛oGq}ټ?** #ܽ?_ϣ[nO=JKK1|]ڥOڵ+7n ={Vv;oJKKMϝ8qۥu~=k|'ѣnV|g(,,h?_qnӦ m6EEEEׂZY / >ŋc׮]صk-ZTmܹs1j(4ob;L0\ Ϋؚ.//j嫜?j|o6?믿+?jnȐ!h߾={=s"_yyyHIIqz5_|tt35nXn$}93Ϡ]vի뇴4t~3f 1Bsٽ6KSgxxb |1b233,<SN=eofZ|֭oIIIv׮]]ե>#INN˗KqqJZZZLbWNZU-WVV& R ,cZ,=S&e֭Ǵ7|S-ԩS-QQQ%52LYW\T cGYǎ*\tI^z%SteeIII5j6<Òbu)c5\g-;f%%%(?~yG/-챵OGDzѣGmʕ+ԯcZ^zIPN8!VjKLjϧO.)))? CL-\P"""wޑȞ={dҤI2l0vs9\kj/0j˓3gV{~Æ ;Xݗ}+mיknݺK/Txf͒\M{Դ::N_*"N.^(G3fH~~… M}aLL3ZUwӾNK@kD#GE ֞Sǹ]v5Zׯ_y'e޽a޽("Ν3mu"}~m'k׮͛7K\\Xh=_q^[x IOOŋˮ]d͚5r]wIzzzUDij ,ٴiu֙*Y]>{AURVVVꖣqAeekfkVֱyOk|U{+Wxo-hhmŋEQS%%]eeދznOyO=OoܸQEVe*[W8گ–X`y^ꖧ?;wg%{ϝ7R/cƌZOL%""BM&k׮۷˗_~)8-m#}\z1%W\1m7l0 0bH^^DGGK޽孷޲89sTJ?**J.]${PQERRR P;۷DEE-"O>l^tIbbb}j2[l|o];ׯ("yqj{e&L +VW_}U+V۵k(q!DΝ;Mϙ*++H6o,K,EQdͲyf駟,J'[oU>sٻwlܸQ~a)((p}vm-R?y$%%I׮]ߗ7 IDATʒ%KGZ]~]"##eV߳yfVQ'wu[>*w'Ihhl۶k?#;:f1KyѣDEEIwީZ2y%++KeѲaQRten=z?/{c!Htt\xQH%22R:w,SL'OZ>ų g#|wǎV ?)nV)((sG}$_$55UBCCޓSNWQQ!r7ܳgDDDѣeʕvZy$55Utbqsˣ>* Ȝ9sL/i9nee;:f/AK|ݶmHxxiKMjhm}EE$''+++$ NΞ=+111D-4ϓ.\x_*""#G,T!z_~E-r u{yR_.ϟӧK߾}nFsW$^tI 'm֞ҥ,^ڶ/_gۣm/ uᅲp=o&qqq/0Jzzb SGxiEQ$44T9lj'LU 8I:uJ,IJJcOjG_/44T6mT;zǤk׮!2rHYp͛Cdվߋ/m&hF-C 6H^ΙN]ob… u t^%y/k7tPӤnBB?ѩul"Æ INNÇˊ+,6MW{gS5epp,ZHN<).;v쐳gJll$&&Jyy׊[l#FHrrmٲb3gΘ&۷o+W&a~%pٲeV__p("O>+|QZtYY3 YfYޙ\j?x<#GKH_"QQQ'O̙3u---ŕ+Wo";;ѵv,oK|M68x`=:tZUm۶Ł5GX>|X>۵k3g:3f:t(pQ|^ׯ_|h׮ 44]vѯ_?}􁿿?~|ر#ׯ_ǪUVB˖-ѡC/^ڵ?Ο?5k֠t,۷L: Bnn.z `ݺuhժ`ܹx衇\+-iWImz7:u¢EnCiާ?kT=޽{MbN`۴n>ۧ8:Tc?1g̘k׮hD5rE}p|'՞_lgǎ|e˖V֞kРƎcZk֬o .w܁S[_x3???~qr~{eO<`߬Y0gV lٲwqBUÆ ٳMϞ=_|_59#11CE߾}Ѹqcg+W 11 ao V?}ڷoPYYLuV۷ 0rx 86m)?!))  Qpw~K/9ݞf͚a> DDDDDDDDDD Xzz:8w35ԻDDDDDDDDDDDDDDDDDDD<&y &yFz%%%՞?[sY̙3n_qqmsssPi7I' cTII J[snǜ޹ Dh8㯦v{ܺ3NjǏj6g_BhX[ ՞?[s77ߩn_㚷흏 Vn^s{91^Т翾}تBy)8GiI).\7Νuoq׭g7+-)ks98yn=z!007(--ksbMsx挛'Oin99 @hH[JKKqgN\u㯦JmN5VZRZ'?>G^GH85UZZ+_w?|?7?k֭'*5N(>DF+--A?|C_Ү];]o`ӥ ;;HNNֻ9.9u#-^}/\c{:C7g#>!)?WX9g.tF|b<x/bu93d@VNO'$!95]D{i6VPc{:C.ĎHNKջ9.=^_=t\o`ʕ deeq[oM\sY]TƟ+|e|] ݐե:"9%MD{m|n.tIqq@\l,nKkVRc{8dfvB\\, z7%P`.t]z k.:v!+z-~o.t D\8xs['V~˱=]Bb&23sϮx嗱t9KEf7+l^.t ] qqaH۷o=۱}vdp DGG:Fz7cm+BѶ"dpRn#h!?W} 10,& cYP 'WmE>`L !-1qΡQ`ొE_~  CFccYP"Ტɀaqq0df":.5ЁW`@XXǿNjˊ~(B7⯳aQa0F^Ǎ(q#c2`Xd )C:x;Ŏ{BB`HLDTd$j۹s/v4_bbBCC`0$!**5jU;]߮`L !-Q1Q`ڽa7vo  Cqڴk"@z7޹wn`L VԨl ؽac2`ht4 /jӮ=Uw~;`L qꀺ&{ɀj5EoHCMT)zCu@j2J)zCu@d@`P< jP\OjB{zt#aH1rm1&û0LFXL8 X.Mz7 aL !-' nӮMyjB<baH۴OojB<`9П8o< -OojB<̃aQa0|b6m&{ݘ CJO,ܦukԄ#).a!!0$&rS?`!' f?5!CaHyCjB,@BnBCa0rmZۘf`Q| 3 !' nӎԄ0&FGÐ`\prZέ#oWRXyr傓Stny;5uX.oɀX.lзqdRRR[r`CXd5r`Td5\.ؐj 8b\!vL$̗ NII'#̗ 6 oIzo'̗ 6d Izv9'̗ 63P0|OT$/l0R0_.F^I2 I' zꀤ?ׯ_H3_.8K@ۇDu@ҟr ~CDu@Lԙr ~Du@ҟr ~CDu@ҟr ] vku@&@LLmE%`ulҥ*++FlDm|Mk*ğkg-lNb[i8>mnqA5skj/5ՁǗ/Jk۴ z`Khhu_oySqa-@~۪ml6~jN Y 7knu&7|ef_(}[_ğݷVxٛ语$8-wa3!^"\%O#q̈́8{pG>玼6%¹7 |Րěm&K$89w6ig3!^"[gy6Gpg;m&K$89wd3!^"\$s0 IG0l]6^"ߒb3!^"\$1fBDZI#yTi腮]  a"8As3fMq&y]3h1+"$8qKL4*Fc\Yh6Ywh즗z< E-owz} Λ/eΕ S\6m IDAThAPpi)u.XuqC¥EDﭦF&Lh`1YR:'hzVE.'~~nН,4*cX[oOV)CwBfC% >[m8ic pˇ_4'_&P SC:Feĉir݀?RF2N8)I_m(2K)rMMi 'RR>^&MjNc4HV6JY*ןO-M; BCwTֿ/՗Ks4FʤIt>􃒒 cy_B(u# HYP:Ÿ%-s= H'gBvpz0qG_hf׀H]@:§R ;g&pf+{npȿlk_:K;Z{jcF:_;㔆CȸGC1n}fN_pFݰٵv8 ~S;c'l7[w5,og^*Ў :p;;imK{VAP:%9%A?zS0V;aQ\b'- FR??rƍaX𧠌fOnA@Ŝ" [@0UP:rşB8nPQ0@ k0,8iG0,X|*4|_F8 ==n~vs(܄'7'V?h J )4*)N*0  KCC"e999!bn.#X/s`1X;Xql=&7wFb&N)TB(Byf&g=հ=A 4#('q )H;Xu97'w.@M h # "N@hEzWDAWLAWD!x@W=/"PTg(44y|S;ccvjcܑ_ֿlZv8ͳ]!;kc ߸߹Gq./[8y!g};vطIe ;گ ׁh>ֿa_Ɏ{C@5,}>/6= `17׾kn9Cr@|v=0+c&!{iV } Yd JO#%B%-si9jCl@_,8*ov9ۀCu;y\zRz܂  ?NiX;aC[aؐa/8k-Q@0g#(H9O(|>ì*Ў`p ? 8HiA >D R778#?N =NX`1-,8\28yAG_h `O0@3X;"@ C M۵C$37KְڶgmQ "n~v*ۣDFib[! "nYv*mۦ_6p ,v"YmV >zbmݺE;[pQv lb vɖCYK;\n%BpXN}?=yd`f`[CŚ,|L`拖k574kjh4I3k5mktvXܹ!bfkEFC#X/s`1X;Xdk@d7wx?8P%8Pv%v)BSHAO 8B[\,f`d7'wx/@ hu0DXP4QMX(D ֣)4#?qEn,z MN=HM|:AMt&:BShx匿CŪǓSUOAOUA;XV;XavXUUvXUB;XR;X2z@OUUT;XN;X??rrrC\A[=nb`1X;X]>U;X䄹\=N^v4BChEcX(T:OɞI(&w,=nav;H;X̙P,_hr?/ MA7Z;lQMe|o-;C,C"GC{=`zAA[wi[!bov[;hz|sv{8Bo[M9!bNiX;X̭h1Q\'w?$ M0x *Ў6+f E? ǍDNIrsׁr?pJJ$`vr$$xO_8h0N9_8a7opN^ƍ ޞ*w? bq"Tlc9E(x qLP(_;a7?#vcǑ/AS#MM+q=?q˴Cov[V,MA,F>T>fP?%{j|@$-#A p=?qKC\@;X)- `Ob&N)T@"(Byft&g'pA(&wS=N!i1|z $7+PU@qMB(@( p!b4KA1CF,6zc?=fv2`28B@2?Cn_,hz^yv+;}@;Xl!b&g߶jq_&wk%`^~S;Xm۴C^z/A@c4#?q En,2z%zXg!~`hb04 {j|@$%''G;Xͥ.sˋCSC~MNKuiA)T JJ}}b@5nA-?㖒Th9a`1",F@hrFqz\ M0rP/Bf(0j|@$`v[B@qƍ `[z4#>g$@hrGP=N!=N>0R=nq7'7=dF4u0| ,((Q,P^yvHBP; xE#Yܼ`| h@CPGq'/<+ \D A?D0O<\vdPzu_ @QrrrC`v_?.s"˧j= sz2`1V?h j?Cxv`P0'ưBQ4mO޽{C=ui`% {tb%DDwk`%^;uvVr&^DvVr&hhTu 4a""]8h٣8"4pcρC7Z; 럊ʞ=C""ATDDt*5`k(\zRz܂ `14,VDCM(.AKha&:BS(L>_h hGP!@C?h"&?h")z¬PAM4ìX^`hrs=N =NX`1,8\&8yAG_hb04 ="@ C(҄PFBhqFLAA_,xCܲR`1'@a& )4(("tCS0mO 1 M=n~vh9!b&:BOA*qM<`3:B \YE; ) xM?_; vL3C`6_\; -.!dnAe37?>G; MlРoRѤI_6 I3kqnvJOqҩ!`(/l;W; eTICPB/ɊgϞ4GB$ vU'? n;VE}iq<Ҫ69?͑` n;V5LH~4G8^׿{4G}pU4Gip5ɝ{ ͑` ȀUT$u=U{L~wJs$H;VF,tR`K?,t_YUVzg999!WDe+77DDb/[6!`nb+.p˃6x]>U;c^DorYq.d-'L;+q9kYxviYlv^`w_sV/JY]; X*y5aRa/, W/ =YxvTdaR=Ea@AV̝;W; ""s?He#:=FXKo~;[XBF=cv;֎O]H; PBFN5HjsCܰ99Fn~v1g,0;"gȒ? 0ov1{l06 gRY;̞Me%'Af{S]]`K`x/ZQ/_Mv[PBFTGkCҰvQ]܊v7;0XDd|x0gT\K!`NWUiرsVaHu l QYʎJ0PvQ,B=g1`hb 041 M&Cc1`hb 041 M&Cc5""!8tiܢc`6ֿlXSi8cCȘVpĎ""-Ӧj8h1--?-#ED[dG6p'ϞICq9455iPD];'ThI 6ijc6"{)!8Pv7xvoY'/YnK޽;C ƖH""C/ȿLsFdV:+C ,ZNw=Hi1] EBƴNz}$C -+!cZ[?fM߶ %2)g֞oρ E'מ)C3C ƞOm_T:mo>eOB봡8f=6;;f(Ϟ3.lږ :e(ą Yf 041 M&Cc1`hb 041 M&Cc1`dUc1`hb 041 M&Cc1`hb 041 M&% kkkC@/999!dT6zqs%"g&gWנzqKCȨh}v CȨh_6qJCȨhG6qDV:/4XD$Z[zqs;&DkjC@/v~"hrͲ?s&{F:vI4UBydT*Fy-8i}yvŶ@& b/8_]ɷi^B bvev[sm?MlS7diV iGY\2vU`GO<Ų@?gQv-Y&daҥKÀ<ϓ,y,aRɒUWkKjKy'K\; X9 wێ X fm>ֿJA֚={~vؓ@lfisͨ2;?'"2{sB$s߀#k8!X䟶\/JisK-οZTh:ZҰvjkY԰gk@5C3*k/ϥQZDd|Uvֳwguv-?5! T(_ubfv`hb 041 M&Cc1`hb 041 M&Cc1v@f`-!b-m2evXK[vX˴!b--?4Oik4I;XI;X];Xzh5& .lcTe`v@Mn#DDZOeXSk`5`vZOU[b`qcCPCd呴kC[`?MNmSxXG_6O#EDZq*xNc)Td5B!#PF KVu`]Έ^Ҏ1\1z2T1XAcue!b .ؽe .'@{c 6 +4+1.d c Yf 041 M&Cc1`hb 041 M&Cc1`άߜSFc3+6uedHh18ʈ\h18=Qh18bqɈc pf{ .Q;^9}άX?qdĈc pf9亅(#YN^ٱ?Kd7N9},ןYD08b]G"L ;ze & 08TD8c pFSKac-ee"K` pM=rEܱic?}vp|-''ϗH>h 1}X$N5Xcmx_l >$'-w+N+nɱsr)t-$dۮ[XQ〉/7Dbq1u?Cۣ-4,nIO{q++@Ol UuSi2"θRLbqXn:ٶmv8溮8su?]'v' ;:+4-p)pw#ɶνW&N^yEk8aqs %Hȯ~%۶nל ^qٺuv8 B t7=OFx\Oa_TBE=$T)(P(Ol o-]'e-va)QǾGl ȖШc_ 拄B1~cեSW\,|>bc7lJPiOa_뼿.fZ~ZuoLn>Fӵ/ӵ¾,!0V}u=](>-Sɺ^}BaiikurvYw׾u=oL*봃b}Ms}æE֭#3P> Osk)7>]}çyJmad>]z¾aMmMA6hzu US7ܚȆhzu 9eno4 w׾o45ʆ?#{TM/Y(AE>9wa]D\zѵOOA; ڧ'Z_ޅ}tmtUG>=Ѩ^}t3zѵOON; ڧ'ZSwVFk#ѻ}zvk[}ҵOM4jg/]D,Ϳޅ}tS[¾,7|QM&Wkx?WT°kxE! ;W}/](x_GQtEL>?Gkxҵ?x}Ͽ]o .]*w%y,>Pk_o䨑jx'K>y_ߥJBuYٳ8dɪe%,ˈjpbzֿ eCIh}#*{p)bÉIbu3sCb>eيZXq_qYb<Ajҥ*7@9ck+Vȃ⾺:Zf>:x50cڇD9}H$mڇD9}H$cڇD9}H$_!tkI`!tkI`!t^kI`!kH`!tk I[[[ʏ]G>(d))?.^׫}Hy2eyR{[ӯ}Hy2eE䦔.WG>g;CoGSz[^ܯ}Hy2嫟Sz|j>!Uɔ)'C]&8'+kRe L6MI@!ӦΘ*G9""tCM?Mе7ub9@!ӦΟ#ݷZDڇk_P̱@!#"tCM5US=G>dZisE^J>dZ{|!ZM>dZy"O#"tCk_ڇ km)"}ȰyD/tCG{B׾@uҞk4.-t탊}PQ|JTgUΣkTֈ}PQRsq}P)Y&t탊ⱕ"c?I>(E}QTԓtJdet T7NDѵ*",]"\T!" *(& ?h(& ?hX?hH?h(& kPݻcy)(("&?h"&?h"&?h"wyGkK-4DAM4DAM4DAM4TPP 9HDƎ ,UTTDA M4DAM4DAM4DAM49QQQQ5kh@Jtvv }Q)//rzkٳGfϞ}2/m۶e ꒺:o us,h`[\jjjR~l*_GJy7Á򩢢Bx㍴޶mGM Xn*Ǐh4c2SOIEE !]NdFv_뭬9&ȡCdܹa$t!O_lb|'NEZ*)=vR^^>|x9rD9r2/1c?0&ԿO8k׊1F:ΰ?<E]$> U_-444ȷm1{w 'T ;Vxr4-[|]\2uTyGgp^W{!3NdNÕv,7xxݭÞ={dΜ9 wa_/9R}Ѥ %$ 7Z"]^w5ɧ?錼^qqlܸ1#` )?^;TB_ E_y]IuNÙ8NRAwAyWoԨQ.QFtߡd>7o^SY"*++RJKKS~q}dNo~SDD˕A&曲k.w#{P($'Ou{=ٻwvA:߿_/ȼy󤦦FfΜ)w}IЌ35~3YhʬYkSO=ߧ?>1ioo'ʊ+lذA,_|ˤIdժU.`[A_"3FRc}aD{ꩧ_SO_-ɟ,lyf袋9|yy̘19NwvvJ]]3ϔ:萗^z}1D,X !O=TIyyTUU+"2yd)//ӧ$:?C|Ç_~,rK~r-Ȃ N,X rtww;(//z(~>_'N.r!Go<,^XeŊ~$cNYf9K_wd#bJeĉ|G iii6ϗx{)//<IWɞ礒^IN$GYr 7Hkk̚5K~e„ ra9t444h>3RQQ!555gϞ>#g- `#"=ݛc68|K{{|'x_܉d>C `%z_DO~,ӦMK/TnzRy7YbLOɓU֬Y#cǎ!L8o.3eD̎;oSYYiW_}ռ榛n2桇^3H̘1<_6zihh0cq|+_17h|c3w6{nDQ /cy衇Luukڵk_o&L`"ټysJaD{asϙZnݺuXg6wuYriii1զ|5oրϵdD:{Luu4o1'wM$1bڶmihh0HDQc1oygʹi̷~ڵkͪUL{{0a0̡CN1X͟?|+_1۶m3{5=1csdӟL$1 .4w}ٴi Ͳe9S}g6ol~ӟ>Ƿ_TWWo=~+bhO&W^ytww;w۷o7hOJT̙3V]]]6пO6-~{$1>k̬YLccK|T֧TG7|l޼D"ay޽{OGag1W\q9sinn6_|_:S=?7& mXwe.23m4bV^mySSSc***R ʿTۢE=c~ߛ+V+V{d^|wב#G/e2{5H|[2?яL$1+W46m2_̌3M>_Sn'}@Ø*d/4ɞ%ɜ`x4664/;?d׿d׍d=iﭷ2\rI|]}}nF IDAT3snsws9477j3}tsWۻpꫯZSYYioSO=մכ0ӧO7?y޽|_6 ,0f_rx `*++K/dZ3{l3azj;I,va~򓟘zʼko6555}ckʕ+ƍ5\c\O>tP~ׁ1Ƙהܹsc=fq3w\DY׿Ưֻoݺu0[l1?2e[1lܸL2߿c_m_܉d~>bֿZ~g5)AgOy_2 $vm0Luu?ms]w /Do38|_5ٰaYr3gN'07?яw]pBD̜9sW_534sٴiy衇ʕ+Muuy %er3oF=:t<}֦-[M6 xNe1&X3͛SO=e.RD??ѣGs=ga[W/{D"s5v9묳L$1gq;E]'R릡{;4wqYre|o[1&c_wwwb?Ϧr~/e3`Ν;nѨ3gND~ݦ<}nŋRcY|>9.rs\>}w7%K}Ğ/mgDo?_Ü9s7~ͼy=-믿n"yw㷭X\r%f}nM48tww}C뮋g̙?azNyݣG)Sċjs%cz&Nh>g _MGG+7lnF3uT1sE"ou]cdoW^yY`A|җd/>R9{w{X|۸q7G߶pBsmc MwwٰaCd~.A6P_D"s%_OD"oD"fĉf+_jf͚~ϑzOɈD"}IJtf>np fΜ9v"ǻ۷{cno{53g4mmm檫2]w5kV A ?|c~iSSS3k&'<^d#b1:tD"ŝ?T+L{{yO/`H*9/4o:cσdwOgo}>c1v۠׾ZRY7]zPPouYfʕffڵ7HĜs9},_\}[n1O3qD~o߾}?yNW^y9s1_Ї>dZZZ}]f׿usw릭ʹů18p ĉͬY̗ese:jժq"EC?ikk3h4^p"m[n5Hܹk$Zb+kii16m |K,w=;0g6|ɼ/D"淿ٵkillz& Zp;5Xܽ%φ0}/~֠T'1XZo ,X`_mN0ȑ#6w1Hlݺ}>}k}n۷oY|?~/B~O czɅ ZAt,6mdl1=W?ͲeLccihh0k֬w^o}ˬZL:L0,[\y gnFs9瘉'iӦ.z=%̺3}:Ğ#Q 1=Ͽ??믿?c[Wrg"y嗍1=MƏ1>OO}S}L?~y/d. 9sK/dg?0JO}e4uuu)&GYw5; ڵA:em)SyN3as 7cz>5FͶmD}"{e+=z̘1L0ٳ|5)c0C@ŔJ6hO.ڵ˜yf`ix;pԘ{w*&o|-vꫯȜ駟6ijj2妢̝;<}q:Vl?kH|nw}&D֧TXL.CO 9Q=Tn u޷\IsLyl4Xƻεz;}@FUj :T_wG2^xaYјGkk됯?y_$1=1=~#cuO|fҥҥKͧ>~Ͻf͚>{{lO>ߚ5k>1+}g}ZL]  ={H$ҧ~߾}'O]]݀k̙3?onWb>O|"=KI&fTt"Yָ7PZoC{A'\+QΝ;>9S]]_5{nK/-zAcBbC5>gV^_yxϾz}qFj"}z5͛g͛PUL$B`d0յ'C@:t477~Wyͻk>l{]Wqb)b/RY*>7b~_˃T}Hd ɿڲeh,o~O0a}ѣM֙ @Bق"DmjRWm-mGkk[iEmVkU!V Z¾#ܿ?Œ I&0kfL&3W\s5j(qkcq7389&7Gٰa233[}Ne7_-Z'v@i/Nhs`q]ʋf׿թȸё*q2UqݻhڴiGx%Kt=V7oVff~돨}J9I ' Iʒx8##C˖-G߿0@ ,ٳJҗfRƑ{LÇtdǙ<8ɀԯ_?]Vcƌ$-R]]2339tg~3g]w%Iw/\;wԩS;\{4DS3:'1,c\}hu?LD}WkӦMz衇TZZ*IZ~f͚ۺw5Ĵ4p ݻwoqO1tPvmɓ'뭷Yg:}ܹsկ_?꣏>jv>Х^;wꦛnҜ9sԫW/I~gteꫯ1`0ܭ[K.Q}}>ܾ}~h…]@8x`4E;DҫW/=?I6msN?̙ӑ/%*'?<۷XQGڛ_s{Ñku`vv}_;CǒOsss?kۼy~z '5oǎ-׷o{ꪫկ~U_F>@ .ڵkK//Y]w2335e}Zj^z%z%Iwx# +W'?~_8u7/G}KlPm}@ ÇwfUTT1cCo6߿_oF A\r-Z.LW֢EKOOWffz!}+_ ?>Cs=8q\+W/}ho[}E]K/Tƍ~zhsBmn:|LL4O֮]]vSOm=z׋~W}k޽JRII٣AeM/~ ͛7Oׯ׭ުnݺSFFz={H٣>}h޽>KB222hzxbMk {OZZ-Z3flڴ)<~~D֭?UVǚO>YW^y>h;V@@?o=_{{_WߟhjFD;ueK>&IT~~fׁxR?O|HKKSqq~ki{N֭_~NPMMӕvқoQFQξ}裏c ?VZZӟT[lѷm]p>֭[7UTThkt-[oՇ~kVW]uU|Z`vܩ?_!Q{+Wx^GǞصk,Y w__ ;3F}z#_s-YĝtInذa3t=q#Gl}{%PC{/^8믿~,3<׿ul2Okgy }nh)զ[ :}wO=v7x5jT[y.++}o{egg{\YYrwyg8[y .egg+WZf͚o=\;餓C=]vE\~v֭n̙su;w ?~YYYnժU->?GtnEE8qbσ7jԨ--rqzƍnС.++ 6ر/w7ǻR=.++۴\ve/oksVy:thB>ch"WQQ )-ZP\yy۳g;p:uۚ%UEZʔ)[wϟ~9s_n̘1-ָ:;,9K{[nݾ}%O:$׿ׯIa#R9~nΝnݺub=m/ӧBw'o~jh#8Fq/۴i>|tEw?rrr\~~۰asιG}4\#UG? oo=Vǔ.,;vpW]u;cܤIc=沲Zn裏ѣG1cƸ{6p;ܤIСCUW]:ꫯvsu]n۷7ګ\VV֊,+O5'#-um/j5j*rJ?eee+W+WW^yueees;tv;c⚞3Ffrv{wWQF\w6K}Y/|= /lG}8qo{9?]ynn19xU4ߤIZ=ֵeeeN8M4?|mNsYYYnm~1['Hǫ?,K/^zɭXE68ƍ>OG}}nر.++=tdy7'g͚|IW[[{9կ~՝vi-5kִ:deeG}ܹ3]jmݑի]~~/sϹ^z].;;Eܑc_Ӭ>敊 IDAT'hvv-/ŋq\p+((p/?W]]ku Z;o߾ 6eee\f}vWPPಲ\^^[zuܹsȑ#ȑ#ݜ9sfVZv~,??D_ݝwynȑ͜9~n˖-~ ˖-sÆ jv&LOrss}Ѿ_w'}*pŽ}k$;v+  _ps@ZXXGv-jd \VV_ct?ݣ> \qq'nTH[܉'N:$tR/|wgk;rSgc>|{ꩧ=qdjo'رÝs9k#=޵wS⪫r{;x`ǿ$߰_$?KK/\.;;4{#F 6n>v@說Zܱc;%\29k%#"e`gYƸ)W rss/K,q3gtÇwSLq7pCxAaaao97l07aՅ'&z-ٳg׶xwBߣkM8 :ԕ}s8Q hKg),,tgyf3fL߻w/SD[ ݳm-7sO >}ӟv/>|kAь=6lwhmDnnn׭oQo0t]t{~~5;6wt\E?l> :_nӦMȕ??UV9sc9{wǫwz뭷d:ugOؾ}vޭo]w\t"͚5K?OԫW/tIӧ|>^x]~۷OK,$-YD Gm۶i咤K*##C3$Ms::oïO:-Mjʔ).H?կ/ Y8p@ׯ>Hr˭˂߿_9]p 5~x8p@sFlJ]q?t_^O?txU\\*+]cUqqq'9眣lI}̠A[[>~vi*//O?9>Oܿ^Ҏ;T]]{Mm۶-|=1M9R˖-[O78UTTXܑ~5AK,i[Gμ>O{B;DӦMӴiZ<ӯ;|plx[ƍC -saoZj-[`0ء:tx m۶M~[.e"effjQ?O ik~A4cϠAZG]G*L[?ֆ?#G}ǖ.]:s9edd 裏F|nuuu.(])4)W[[͛7___'OV=KC[jZtƃUUU;<}3ъ+4g? )1Рo~hҤIt'kϞ=;4k,Iҭުǭvyy{ݻWwu|I[:p5n8uY0ay5]Kt 7VΊ?=\o$??gy&0^ZUUUڿ$iKtR]|:pw_W&wd|x,X_|Q;wTqqf̘ٳg+333MtTkk'xB~^~e۷O4ґ<776}cnXBTii*͞=[TTTz`#H"^m޼Yyyyprٳg+ԩSo>I3cǎՆ pB͚5K'N￯ŋL[n7߬^5a]{JKK$[:uݫ=zhsիW/y睚>}zLh)َ9AmݺUԿ_R^+CgŋK/m6O>Y<@gW^O?]8vm~A-~lRK4z!OػᆱJڵKw 9uo :,Yօ^w}WS^^8 ͛7O{:`^l tЊ+K\={d+#~_~ᇒ.sN>IRVV~_k_ϟ[nEEEEӧy{~_jOS]}պu:xv-IuwwQEEnFtI1@ƺ $&avڥ{G;v޽{[oiҥ:ss5{k]im۵mK󿭛b6xmߏ0}ӔO{_#/[]]2dɛ/.-1ydW2XƪHeeAr:Ѕ,ݵPjw+).Qr,Xf]N.-1ydWR\ƿ _g,OT/M;ٕ?]&Rm]NT&JiTT\Z)[+UW?eɮLƍWQ.SP&JJJ4n83ukw+).ָG)wy)#Fkܸ?θ֟jww+\qOV1*Mw+-_{'c48t֝ eKL;j\y_'ݵ-&1TcǕXA)w|j体]y[Y`P1cݥjL;+ʱ* )83_JLW ~*XVkJj ` ([[VkkJj 2([[[ƿC_i ֮X+/^?]9E E,5580'@cUX8yu Ik5Zvɀ99y TX8NRffu IkڵZPQRAD+sK@yjݡ#F:$3;ۺUlj80gpY&*NR7RNkTFcQ|Lrr,:v]ɀ9WH4֭}]oDIrrrU,Sڐ\OUhj-80g( ɥE]+VΈ eVg7y? dHJC3H5]Pj8mLtJ͘MW'N6%(5N:w.K4]Mj5uԤ[ )@8|ꀁ@woZ0 ÷ HcC]phuLD]phu@ @V \F]phuq:HpvpvrCV÷ HpvVL#oZ0-=?۵VgKKOK YH=?&zLkƗs1qcu\qqcr?_kpƟ8ɀV7$?&"Z[pܸ?x.F#Z[pܸq?~<qci|9C:qc58nn1 0^Z[p\q⯵ǕkqǑ?]kWc++U>iVg'c!%Zz|__п.cIذQ/XihаIV_,kVMٽ[=z{ܹSdʗL65h՚U벿UZٽCc԰iVY.;4oCVT?fh[ZbZ ծ]{iiq}omܠ/Ԙ75lP_}YK?UVvvǿTFX{QC^,YJRqVXahРիWkɒ%W|Ѩa&^FK-ժCWаQ+gaV^%KL6nO-6yo4Z3Zښ5} O/``mڸAkVSKzsmvq^~EFM fkZקk_/oаQkVKUko~chWᇵg?Ӫכ=S~VҦW6ikg˴Uz7={ȟf?VDXhuHj]pYYж8O<-ve2Bs<]S#veA?WhutQmC XÒo\6XBVW?%vee#C X]]-veePQݤmLx sZ׍n]ph/ؕB,{RR?ok^*vZpyucn$ET+пn3ư2xAZժV5t_ėE65.dD$iƴ*,,`]KK$I3PaA!C5ݮ7u M .9~$iڧ>Elk]pI8IҴPap F5.q̴ip n\RL6MiSK4.xġӸ.ti|vqLtc3fK4.T4mƌCC|5.xġM6C]vIΝbJZ5SNUAq#"L<IqFP9$ȈFx y HK<| {IqF8Qse vqB7"8 /䴿D|NFkgF _8wďGQm~׷alk˃%%O2G2#{``@ď"k ߀~>-ILVR7''͏ddG~1狜] M$DG,#b8)mD"|~&I9α2#KRF?Nۧz񱗟ns#vjII%}NNNvrFFm@ Z~=G+.srr#۾6#I}rMt#_!_Jk"M}H'ENݙHG;40s:8DHvNv菐@ \t;rI3ssf9!$҉ 6'E7Ip'osB\pSۜi"\&KL"Mcbaܹm͝}nG3gv'?_sۜi"\\&sΝsV"McbnsBܑ;sLC,V"M$8xlnsBRH1"t@{s?Q\T2F4M,Xj5_ʂ'T +SѰ_wydёoQQʎc5^bc+RYbt***EL:p@GߌtytmjL TV InFDE*++c5^/AHYa"It vn`;+7U"I`bHduK@d0 5V@@+"YѶxJ+1PXɊ a]R 4G[6[ۼ;Z+r.!)pGl޼պyya[C[v.!K[$[?Hjlă.͵m&{#$K 4˷%i8кtFt b" &_J[#D K\%$OI[O b%X-%_zj\GL b"-7)F_aRN @˅3J HVۂ fe IDAT|~ i edXW/#~1$@A4 e=z[WOmnl KD`(=ݺx#9@2볮^֝ 8O?x,u.F`(^F`)3|C`?3Y񧱒!p%K,Csv,qKC4+n`]ߺtTAČGN HQ܀,?XMB b#RFQ 䓛k]AI'uGQt~HBLHtҭ+uc]<S ezZWOK-X efZW/#~%ݔza,mm]$7oml]$N`]$I= 0QWWg]</,mi]$緮D]F ɳ Xu/1x4QFu&I`bf_q'(.VR\b]<vJn]a|apC|u Con]<>.{aH,}@aIYW/c `bO dXWO%`%Cˈ,!L O2du 0K2sK@[WsY% ZXWsG[1i]<,s_Xζ.+9H$V`DR0*u 0K|~u 0%`%_X%D`?X`y@_u}+Ѧx?`][O il K23+?XcrS= @Wb<%&` e?&YW/ۺxm* ,uc@X%Cˈ,1 qd/Ql]<ĺxXI1?ݺDg]A\.tO %%e% ԾWRB;40T<ºDuqU|HQj%% ނuKpyK@$uqU<7v_cb 蘄lJEy9yQ=o-q^SPJЪ>`N^AT۲uG| AR|h?$D79ўm@F<_C.`(wxn_)`nn~T۲e[+AR| <Ė+E{e+31">#~uq3"w+ #.K;+UfZYe]UVVZ|b]T?&2Q>O7UX"ޕ%i %&Nh]<&NatB+ HI%5=R@I8qu hU´q5q"C*O.l]A0#!uK%iGFKG7 i Ą #*K{~~u |ay_[&+CZx` `I/1y%_X,&@u]D/)`<-hcKU/Npq4u]fPlz?Lj/<㎋qg #ú.3vD%@%%%%%%%%%%%%%%a%= 5Pbb$Xb`Xb`Xb`Xb`Xb.X%, 0, 0, +,?oI % K1R"T4 Ta0TtBKµqE`  &m,Iw%寸غ4n]A*(..My+~/9 wt#?X"O X+R4oMxLxݽ5o 8K, _Zͺ.E_b/x+~/9 7ijeu(ϧSˀG5º xWX_Y|.TY1ź xTWa\kʅ_.5e,2Q>OSN.4WM7Y}º x󖄛(IUfZYe]؈0/$ky7~/tAg]<,?/ߺxX~xsuf.]P9pa_Hk.a] lG7lu ͵L0_sލK]666666666666666D!a'JR0Xj]<,X.,e%ÂeK#KC K\1%Âee%?`Piyu r_!/' `=ju 0?X=nu /ݺS0T>=?[ ݞ%XE`hT9)SF3T"ּDy<g]efZW`jq?g wXX_oa`c6zX`mamamamb`kllؚ622+06Ƽ?g %-A%%%%%%_X, 0, 0,۰Km 9, pPw,)=׶6]{O8$azU7KeYHB DKl Klg51X::۶6]-n=nGٖ_W ]^_R"]56]l޼ƿG % k;?D_W%6˪kT__o]<& e]. ?t6Ru[v[6N?HX7MlK@mzXu6[ܺmӣ'v#-u?̈́~JuuIr=ɅCHhjY m\]\u]+ p5` {R$Y`c>6˗-V]Fr\Ɖ}qCHh˖>hc mzߑ!Dмyrs22t)B۰\WzxdqbUCStIIįC (5nƺ xT4e5ˬˀGKKƺ xTpXU?d]Ekjľ RS[wb&ꧬH`ľX ., fu`T\1b}}1,+eH`ľX Zlu iݛ<ĪX( SiyjHdMW mľ)-/U l[UB;v3/f_;8I1xXaAu 0?X*^d]XLaGbo:Uz>V!RM'jM'jM'VjG,[`>V3SP\`]h4!J%@?"D`ɟ.!X/iҬK=VKyeվdC D`HUFjڗ,ªiIRJj_Rgīy K]I1ijeu(ϧSˀG5º xWHoٺj_ƿfԅNVhNrLGbի:UˡRUSISe#=1HOe 0g2JP/g#=1HOe gmYxe +gM1HOezYe +gM0J AՔ)USlHOεk#m{{yY'q>smFw['q>sm❶f}dgggsA Ĺvmu \8aU8kٹ6BJN[3q>3❶fH.9 IDATidɹvmfC8kɹ3d2CaXYN$@XXi9FXhin9FX(?OXLG`@G,,%YXXQ /HOa?3}T£|Y|xYӨ|2HG]Yv 'Q9cU=*ٙ~'>wIt\Ft|!/o.xGzb'g0uGPtl^Qc˗9k ΚF`U=*t?HWL#"""VGzb銉W'鈉'WQ%@""""""""""""""""""J DDDDDDDDDDDDDDDDDDD*!&UBL$""""""""""""""""""HDDDDDDDDDDDDDDDDDDT 1b Q%@""""""""""""""""""J DDDDDDDDDDDDDDDDDDD/_ֻTM9ssՠjGzb'Gzb'Gzb'GzbΜ9W^ջTMs=`^'Gzb'Gzb'Gzb'{튢QFzׅ:u0H7?#=1HO?#=1HO?#=1HO?TC HDDDDDDDDDDDDDDDDDDT 1b Q%Tm/^:] ""*,z | """"*T^ׯ_ǐ!C&`0.:l8q_t)\\\Zi?̙xzz]"*Fzz:ˬ:u5~ &U"VZEfsTLR+۷`0`0iH߮]ꪶ.\(lnn.ڶm[׷B]sDTYFv^r[c^^^[uDők:t P6z}Si&xzz1|L4I}PPPԔb|AGrTt߯['d#G Czz:֬YSF5#-zҔءC,_"ܲS0 رcGߥK,_F~T==cXbN?nܸw54l%k 6Ē%Kʬ=y$:vj?[3< ׯ_wzprrĉ1i$L4 F999zWJ<_"##~j.,, wƮ]`4Wd7n:^YFS\_rmڴ)qaϹQ={`׮]ü[n'5j˗kN;woz;מ8PؿTu8 | D>ٹB}Gܷ0+*Tqݮ]w݅ȲKrrrB:uJPTF ԫWOjT:/"bbbwU4l%kNNNhڴi?''YYYe[g [PЮ];_~ekB<_Pn2=UNNNhРj͛K}Zji*wu;vʞs' 6\~wuvv\ڵkHMMcuD믿:|zB^_8|T{3M:T Gxx8V\@*Sӎv\r/[.GϦMlZōkNU#K2=֭ 6A/@W׬Ynݺ={,2+:v숐̞=[-wUKh׮<== Zŋ񁏏q={ğiU˗sEn0sL 44Ԣ{ŠA@[]$h=̝;CϞ=}v~ To該՗G}T:dܮ]PbV}y߿ isSNY|?PأGbС@ӦM1l0u;v .{%|}[{rz,++ ~~~pqql/lӧOKF|h֬"""_~~~V3̛7hժ6nhz`TܬY2lQyj,5J֭[cɒ%vs#009>͛g72o<5nܸ`x{{c@-n:CDiѢGzjt!-"hٲ%bbbXZ̙3'еkWsXbaokVuq`ѢEܹ3qơYf6g:+zg8d 88x]tA˖-^^^j_xwȚqYIc͛<ظq# \\\ТE L} k-ʔ4ތTM_vͪYqq䱿1;`֭:솕Aff&ꊷ~aaaj= ħ~j->`˖-xH9ÇJR.//}ѴiS_~68p}hpEre@DhDӦM_kI&ҥK-ޣKJJ {1XEaU7779rDs{̀Zh93>ܹsRʕ+]~mYd{/HJJZnΝ&<믲i&-...n:Ȝ9sDQ1c//Ȋ+*gf4e߾}?(Vj4e({' ,=zHttFҵkWҥrE}SΝ;'oҢE Yv;wNy2ercQEz)׿dժU2o<ٰaZҥKʶm$55U>3quul۷OE8Ypl۶MG/_.ˁd Xs˖-*;vLN>-SN +W>>Ү];:Pl ViAΝ[J||[/''GgW=SF?DQEΝ;eڴi#V<?#;[cEQ$((Hrss?ݻmVy9~}~⢎m{U-[Cѣ ҦM5k|(ҦMo1u>}JPy*?d.M6ˁ{(Y]'ٳGn1n~e߾}T8믿iӦ%Ç3gH6mx(~KMr(_lݺU,X (Ž6-=aͮ_ U,s\uWTe\VXmk׮-ZիW5|}!ƛ6lPG(ׯ_Ν;˯~&%EJk/+/sɯ*2gۿ*pFٻw("oVv*?.ǏOOOv횈h,...ˬY䣏>-Z(+]ĉҩS'y뭷dٲe$}6mX~e˖2f9z,^Xmޏvto;w^{M%$$Dlsܱfٚ`z6VЩSdjj3X=~ 2DBBBEٳgK"*'N*22jR1؊?u˔)Sdƌj?m6ywEܷСtʒ+WJ-, h_̛7OvRLSGuչsf`ttL>b9!`/Ç|F)]taY,}b *H`(2{l_%ٳgʭYFڶm+F* V/[l߰aZݐ3_dwE… K/IDDxyy7I 7}l+nnntb|Vջwoyg3zhرe`-X7 777RoQٳ.w}'Kxx={V姟~EQ$**Jƌ#)ꫯJ^I&r 1]yxxH޽7ߔٳg%00PFYQoQ_>|FH6mdV4ikj{I`r&M؞/ Çhk oΝ!o7BztQ'7xCz>XݻEy{۔o%QRVIhYfž>,]tHOk=[}yq#I2.2|W婧R_>\Njq,{Ǥgey CѣGEQٴi\tIZfյ1<`}Һu"Sך'.\EQ䯿>ڶmkҬY3/k-g'O/ʙ3gDQIKKxom۶m//"q8*OJVpiժL0A&L mڴ>ҥK?az`4k׮ҷo_ILL%KȀDQy衇,ʦDF-G(_\rErsseɒ%˓KװKQ\_ݱc޽*٭{l/m&i2fU^uyWm-=SGu/7 tUfok-gzqc=xh4l4+;vQl5gϞE1e ib[K5tP߿矒-w.kIۼivxA曘NrZWw* ZG &ݻwݻw+"{~3f~/ fޛ-]TʥTJ|po5ɶvҥKM5P]~oiݿ־<<<$((]**> jVҶ)߭~Vҧ-kZE*\ٺ~z]'J+ݻw_~^]ONư9IV`I3+jF;vȀ$88X\\\`0H۶mej!CȠAȑ#-v*YP߈ysbӋȐ!C,uYn?Vv[&M`5]^~"NU^ Z#{ۋus_ݻw}ԯ*>I*VmEbb3+<O϶f/իWk*o۶mb0$::-##CzKAׯEQm۶jĖ7[b|]Z… ڬUL%%oii_333K~Py0P%%Tx\e,ya𐌌 9}XݫwLj~ZǛ#G/RN*>Kʰa:w?+ico7::sJ$Y<죸rNRk-'bk}Y\!1''G?lڴIRSSի 8*OJVXҷo_2dH,waN>-??_^~eIHH(;x`ӧE%}y [lT%%^i7lٳgS֮]+gϞ__"g,=SGuչsK\*8//j[ڵ1p@<۝РA^P5ׯ_崺>.護ۑe˖<*{jݻ`׮]U6lh>ׯ_uRݱ~8`U`0XCVh_Æ q]wah׮}#//IIIXhjժeo~!??vZl Pƍ1{lŋhܸ1j׮r/ܷ$"޷߱:99ڵk>651cOG}/FڵoTDkr IDATޯ_?ƍ6G)?"""ӯYf8<^w}4Ca>S>}Æ ̙3Ѻukg>%EѣGHMM-mgzzz}X1c s=K.xlٲe฿jժ iذU?AO>A|||wLZ9s$ WZ믿={Zo}݇#Gk֬p$''[|G0Kj ڳg;w-_#Hwymڴֹsgx^u]xWոjժ6lhFf41eL8O<ƍ5kr]H_-h;C^@1ydӦML<?^zaڴiGQFz?fSoii_6lkƮ],[>]i|}>;sLECX111Xh.\xtjov3f1bg1(i޸qcիW*)<\s Qp,\AAAcǎ[n̙3ǏǴip5ԬYSV,-{PzFZvmyXt):wpY\~~>~W,^PZ0vXѣ/϶m0uTԮ]"K.aٲeʹWiܸ1 /ٳ'JU7{h=>Ϊ_>7n Zl;v?www8qrfK.xd4lrֶm[L<x'n9QF <39r$pYY/"Faq/.\ . 33j...6mv܉ `dLl5]zU6|pXr%Ґ[_MYf!55)))駟ꫯvvm2d}Y̛7[nW_}?ϟKKKCNNl< ׯ_p|~]w0]\4g<3 '|+V`ر.nݺw}guԱn<w_nsP=o<"y!,,Vo8̜95kĠApr=~urqFa= vDRRܹsO"00&MŠ+0i$C ͛]V7yyy .^ .X|7nܰY'裏bܸqسg;1cX܏o1eݺuѠA,Xٳѷo_|L4 m۶ի‰',O??bprr‰'/tڊA;99aĈEuϮ:o?-隬4c2ǎY_ :z(v؁vY۶m)OQm[+77fZ#[[vLQԮ]ǡCcȐ!x駭sa8r;?*CV|}}sٽ;3gٳѢE x{{# zŸ;{,rrrgsiKf*xmil|[oGypUdgg[6z_eĈصk̙{hyav57|#...2rHo_QEONak_~E֭['ZLcy@0a,]Tƍ'nnnR9tl۶M~gQEm&۶m}K>|XE+Wۮ_.{챘j%;wZMuN+j Լ<9stA}2sL勲mNa5%66V|}}͛7/ȪUDD!deeIjj:shhz|(͓vډ_ms˗K=$ @|}}C;Ç>-͕'Jf$((HqٰaJqӻV'Z.8va7nOOOٶm͟o۶MԸ)zcǎW>nMѺutt,\jyI͒? SQEu]v`wwwIOO%KNקUYQ\>rcǎYfj7n%44T/X 77WDQLEt]E___-[$..N]v2au9MZ# @hm۶M:t C֭[s"[lt͚5S/Һuk H1-m2gСx{{KoQvsssesn^߿Z⯴>1EQ,=::ZV^mUرcVe[nm7B){gm^^^Wf9߳j_%raquuEQiӦV-6o,]t///iժrQg֯_/=z___iݺ̜9b_ZCkkuDue ࢖4/׳g"(ڗU\!㏋,YcQQT 8PE'NX,??_"44Tg F bTR̆H```iҤ15鯤%KDߴ/EL1KllxzzJ-d̘1_Os-ҫW/Yp iҤZcǎV}`[KkViiK˞={ʳ>kZSЙ3g`0Xl+ii6j(ywDDdƌү_?s227+n̞'ӦM6mڈ4kLF){yU;p("K,lq%1WZ%FQu։`^xA-Z$s̑^z`h֭<2k,eԨQ*7HZZsˁw???ɱ8oG)v%-?[m߽{Q}((/_cǎ͛>OOOm~ ٷo> <޽{-m۶Z_*񗟟^{yyInn`͛7˅ GKhhh *龊eĈ6a-S=\CsΉ@(f͒\jjxxxEtAIHH&MH@@tUN*.]اrҿ ֭[ˌ3,ZyzzJffdff&{k׮e޽zjqqqwww?t萸(ZM{] CI#Ŷ'NHrrzذaҽ{wYYYңGy'm/܊{o11|۷o7]_*[/==]<==>eip?}v0`4iD4i"\feҼys~jgΜQWϟWoG}fm6f`k?^gʓO>)/Ҷ)Z¬,y5%>h)C*]Ut>V񗑑!ȅ TqOq)&9Ro;X=zʱcǬ{7ݩlGdN@IKm|(Ev[e%*E>g+WTm>0b6>>^Eٮ]l֍*+rUUee׻t ߕ+W...?ٳgCt"""-[5R볏?C#~~~.O=T9rD[bbbdr95Y< QZZz>;w 6Xϑy ]I ڵ u[VVKBBB,>y? ֥{`h# yP5kh4K/dKQY_S1;wnkV@'''  ׯcǎaڵ_|tb1MKiذ!RSSfis*cɒ%ʺaԩŖY p1_xW+XlZkȑXz5ڶm=zGʕ+d)7u~A'ZliQSN1bz{֭[777q;w.vVZ0-vZeVZN˾4^V ׯ_Ǒ9s uѻZTiO\$uy}+Znm_c OOO$&&QV-(,[W^Aǎ1h <jm%^{5$&&k׮xGcݺuعs'лw`I7zGrי 6XR*7x˛oݺƍC5X; sA>}0dEhhբR6l-[)S CZvZ;{z)[F¼yƨQrbشi^x̚5K].55/-*oU C]%r0ggg l޼gZ}j ?C`ѢEVۗ/_n{y>92On͍7{NBѩS'899!99\g :t@ƍ}{1<h֬1{l{Uo">>qqq!"Xzfڵøq㐒FaÆ سg`ܹxqw ݒL\v SNEm.MӹsZ-??:t(~g?ggR<0g={`РAx"жm[+j"U|%߹s[o] tCڵr/_ĉi&pwwGLL ^yԩSGA\\rsso6z)DDD ==_5u֭[ɓXr% |M$%%f͚FѣGDEE!==ǏHvT}|TƍHJJc5jOOO}+FU\egg?ĺupI}2dӦL<~:EEEaٲeV~fݻ#!!?0lقGy1`ʕxꩧ`4m]v`BeUOKVl2=5kDxx8ƍǛ&ҟ&''C~~CBBҥKڵC\\rrrpmaر>|86n܈ܸq5kѥK$qa˖-0 ȑ#ѯ_?_j=.\'lj'иqco߾ҥ j֬ϘVoyGiiih޼ SNE^xdm۶8z(7o۷#** nnn8~8vLϫ߰qF_|:u`&MΜ9 ?D:u駟f̘>/_Ƌ/ ֭֭['6lPtRm)S?]w݅;CZNN^~e5,11[nU_ۊYOOO$$$DO=VXoAAAprra0ttFBppc>,r8[WUrUYekFNo^zzWnAe?zlѣGѩS'bŊ:u*n݊\hosիWcС65899ᣏ>#<@˖-x_>bbb[o`0X?~<ۇƍ#::oW_zSNHHH@.]pw ))I/Cel5kf1y'1n8kDVq݋nݺY㏗U|Gze[M4QEUCE?'驪ŋM6#PU?ش$8qӧOǚ5k~ԪU !!!xg͞}goiӦ .\_0|p5IN:ؾ};j֬HdddN|gѣիWze1SO=e1 ̃>/ޏʉOD'''ԯ_NNNDZZNȩbG³9JiڿLִlQQ'驲T5v+ADDDDDDDDիW1{ldee!''GŚ5kп&QI&!//͛7׻:DDDDTYD4jԈVԘHDDDDDDDDddd`믿pwcǎœO>wՈٳqy;0`x{{Y=F?'ڵkv9ӧOVZxUQFGVg & :uұfDT14qssCRR Jѣ2e _:u*o?\zGǑEQO`лzDDDDTEըQvһDT0Exx8;w5DADDDDDDtj]"""""""""""""""""""*!&UBy+Wpe/\tq.fd8t5::TGd =s_کt::TGEǟۿ_FZCv1qQ^=Ɵ^[7ͱv1qP^]Pn߅*ub(Wrstv\޼scݪc9#i;ڿL[w 9)l?l\ފn;ߙth:uǭ2?v_{s:Q+rF{muև2_9nk{se{23?>g63a m:Jfff9şcg;>ifUӹsr IDATQF|)H~s.ǮFD6 Dpx)uI9bpS*GǺ;7(aazWTϐ<']]E"]4|Tꔊ7yg˱+;vѶ|֌)<z("Ě/1㓏,]]耈mP1ӉH^4EDL,|֌>G⥺CDtK )1/d.ǮCѲkwuJEj"W- h _`7a[3ɿ,ؕ_H$"-S?C/t9vef1c֌!9?J/(͢`/oi__͘:ɉu9vef&w \]<|2)獠0xrv"FRDʲLɀ?EDϏi`л VʚeHY )뇠x2jdPB)I; >h O_5raWZ)W"eJd@χV\xWZ)D7ZAaQciR$#eK2S2AaaiHaWZ)[g"ePljpQZ);w#end@67gԈWz) ed@)9;Fr󅓮UtRDoPOo?Qӻ VH_H$ n qv"M5f[Z)#evd@)|5WZ)w /(7OƟ^=H9xsOWF5ֻ VH9x)憠xzyUuM$HRaM*HGʲH|uU*S2`RaNLۄUav@(\0ʚ909ѴB\TɀɉX.ܤlƿL"\.ٻj+3m{֦6iK^-R*PS@S=ꑃT@( MRRʁjP(-/̐4[g-+gZ!""s-; ܰh8ˊs\püE""2+B_q s'/; 0TÊs\pÉKβ; 0MDD枾Ԋs\pôoYVt&u@]Њs\pC.#(Ts\pø,+B_q 㺯-XhEw@9.a4+A_q Mo9.cB+B_q McEDd1ܘ- Ƽ$P9Yox( k+""+ωܲ }Qō|u!F/LG5^DD* '`y~,ˍ%(;n?~?HF5?,>f>,~U^cscI^(/ctro{U"r}1_אK\eq8H}qc㾗oyYD>񟶆#$*ˢẺ}Ia+q)"E__htW|m^CeTE8s⬏%q8-nwOjw;oy^DY5T}LeyҘ-+%N 8ȏ+BqS9,wYq7NO MٲOĦh`~_yDz'%q'nsmGaT"PwhE1/)J0qc8yCZ!1Α_ű(^EϱwH.X*-#Ƶֿ8'1׿)A?} uqSY#n9qE81=nO_CcCTVFHX>4YR;?b?1Ώ92#q E/U7EpVGCEԂXp[[u .V!\J`Q b ll15zA\B-:fNZ.%EpNq ꘻ jA\B* E-U"8XcIXp[[u1/jA\7SWt|q RStt̋ZsKYl .v683jA\BL(jGIYgeԠa2vPF-ѻ Q2$+#drDIY*a dlO!MjkG0 J|¡QU2vH]AxIiG}24:Z;GP AJ}rW"chs9$D2 -\jdl}-z>) O*jje>`VRoXveA>tiԈj;> aA|2$oDS`82ER*T`,QqFئQ) ˊ31C$#dlSS A²RJ m(DE5fiE 8dj`bIs70 Y(rс* E> 3?( p E ;nܧ*훅v^Am?@zPKC@X}?ŠE}v(o~V ؾG;D[3r+ھA "h3,,ܾkGve[;dp2ء T J$/ GRp,[Q _F*bp,J 8ֿ U㿌pEE ֿ _(*fH(_fV/CAS_(q0<@;جL;، T`d(%(*]` E =AM4Ș[;wk0׾[iG ;m=@zFv+p[aܺW;D[ާr #H\~\ ׿;C@X}ضخ7x6pA:mgϰ֭gd٘;C@X翜xGO:cC P4avYx`<`#J9"gvY!}baIx _( jG~(ʲ.K#Pyv "Rd ݬhGbn ""ܣDD]TlޡDD$oV bmm'dY] ""AK-\󄠥/ `m޲M;dhGb?X0B;XQ;XrTvX:`ʑS9?詬z*YV;XF;Xz*^;XN;XjHdqvلf#ͪ#͆֎6+afPG ($4 b`vYPPE](""Ef|Z-q Ee|Z 9"gvY!RE9EA_(\E?;km<lq/ =l۸svFN?h]!bjGml|gvƷ#6 =zW;Xl-!b7,qFSt#͆WiG e `(*.׎6+ J#Y(lP=H;, Et@vY1 D 0ߌӎ`'2?pVTVlVZlV\lV`dPTfyP@dl"( E>,Bю6%) QĕkGс b`3OAEAQlE9t AfA_( rtEb ,hrE'PTEAQ^vYeSE /QM&?h p E~,,6T;X|vXYyvXY9/BSPzʆr=T6tvXzʆBOA/4AMee6S/LM!biG߱W;Xl7CֿG;Xlf`o,~v7^[?Cֿlj_vA,C@ dL 8fP[lE9`#͂Pd!1?(|8$@$fqvلf#ͪ#͆֎6+afPG ($4 b`vYPPE](JA?iD4iG%CȿPӨAJ ^AJjD pI)oF(֎ %8>=+e?3D!9|7C}eeO?e_D;$§ɿ i 2Dl6J;l(`̟!˵#͊8.AQ> "{vY|Z ׎6b":B_;Q   s2D)"?(r8"`|?( 4 ֎6 EAOG"CAS_(b0S/,*-ÍF #H҄H AleDQI!PMqD&)*)NKa$ȟKj;x8 &'Lz 9۽` #ALv)? <IۛHO;&{?5Xu{Rb ?5A_OO;%?5Y9Dr,$J˪QĔkG2'%ppEvY2D ` /EAvDAQ!)գ)(&ן#!N 8B`,U'"k/*r)ٵwvv 8]#TWDdn_ȮݜrYOMٵ>]wi`ThG Ҏ6J(* kGqE%fPKeҎ6 B׎6b":B@OjDAM4DAM4DAMCAM49=m^ 0E0JhGX#YД3X;l/E<`3?h p EFCSYvYivYqvY'PhGrE|JX@hʦPd" )+G;,(JKS@kGс b`3OAEAQlE9t AfA_( rtE~! b6,ZbyVüE! #N8>n}v߉yZϏiX #HioDK ZC@,>0ӂ>q|^0nv#X<_oX @rV9!Ͽu =n災 +'*G&gSQ#<۟@п| =HЯR>?>_jz=S l5 =n])5 ]{R ws'*zNNud"";wr" =nΝ)yeKC;i١,~!bKY})~ƇCڗAO鋵CӾzAOB?CM Ok_P;(D[\Y\Aʹ3քa#H9_ӎ X}_-|xN@΢?ю m[؝HeGۑHҗT c1`hb 041 M&Cc1`hb 041 M&S".Cc1`hb 041 M&Cc1Lhb 04AcQ!|ҪA;dVQ䟧Uݨ!'מ""u#9ǶS ,;9R;hGVu#Y<%ϲocBsiGVu#=%h[)Aˮs)A{FyN^;g9Ԗy-.=UYVEyjGVu1E䟧AyL^viEyL]nmW[dekN 쿞bY ?h vKymJWr\W.V; Xq]iR0`)u3Àו?,帮}?p\W>rvJےӴÀו ÀוSq]i[D; Xq\i[a0`)qm>@GWq Hj4\H! ̵H{2fY63;C@Xwv+p""KY<""K9| 3x3r #H%kwbcW6g kH"_Z.b]DDr3,&ByJGgdYxyFeEC]!& M4hb 041 MAM4d c=b"kG1Q;^;<T0#֎@c=?siG1Qh`}yua gX}R111` G~/`Ȳ{C}wE)'@sܶsB$ku>m=j#P:w^۶ jxvjZm]f<iB$+֎@M~*bbN>m[wSbԴq% -^Ns֝;"X""';+Db;߀iM!-gmgM+K EDZgm6?UV/6>mݺC!Y8m$VvjGhUC#"R]_O]u J#P˵yF Tװ Zְ?kG,?( 6wd 041 M&Cc1`hb 041 M&Cc1`;xPDiD`ISCŚ&MkԬ,2Y;Xi"4?ijf !bM?i =MYi=MxzXi8b.l ai6M; wHTOUT5OAU-EDLnESU9MWU~v'ʷ|p,,"(o4"k~׽R7`O5z@; յE qdͯûzu+ JӸfY(Dճk_ LӸ Qٵ/Xm qdͣûzv ߿M/Qqf^0J;= ڧA;= ڧn׳}jFY: ga]ԍga]X,k#Cѳ}jFZ,k,kkga]ԍtYG>5u= ڧߞ}tSc׳}jCѳ}jͿ}72-.aѵ/c! đ14tC)L>đ1tC)L>đ?!]Gj}-G>-u\Wt-k丮4-V$?9ay>!IJSrOѵIr\W~@d}O[G>$q]i:\mMCG-k丮4ͻVdѵIr\Wf/$ǀ8ѵIr\Wf]+"IѵIr\WNrѵIr\WMN9ѵIr\W&;hy>!IJS ?1۷}H|bO -k84@O[G>$+&pA_>!IH ?1ܡga]<#>4ϛ)Ov}A>Yҵi|)ҵivt}A>Y9"vҵiYȺ/ڇ4kn9AD6t}A>Ys4]f-}QKΈ+NkT85"M>pjEZN>pD6AS9B;NZdt g;С"Cҵ*e"CNIqT8"RN>p0AEdk8CDd]).kod֕ ?h(& ?h(& ?h(& ?h(F@( Q@ D @2d @(  ڹsv o-aR4DAM4DAM4DAM4oˠ}IQQv,P~~BAM4DAM4DAMР,U^^,FAM2( PSTTDA M4DAM4DAMt hG @2d>˖-ژO:xL:Uƌ#FJYptttH]]֮݀]dI?O?; wؾ}i\7`>s>|8rrr瞓uɾ}R\4w:th@^u]y9%~d͛7Kmm']vɉ'¨K^Xr}ڽ{9R*++瀽_,RQQ!#F8=ݻWx㍨˫~X***j@} RUU}o۶M;v!5jT…Yf|̳>+-ѣG˘1co?Ǡ~w^с'9 a-gUUU<&Kdك!k~eYzv@׿J]]TUUɛoo" IDAT2@yy?&#Gȑ#GR8#=cHK_<|G8p܏z>j\:;;)NN'ʟgy0ٲzs1 1O~Rf̘!?WyI?ZD<v풙3g&+뮓뮻N:;;c^Hdx{P,wٽvgx@iԨQo~S:;;zX2}Z @_r)Ș1cdrKgggB/o/'p=ZN:$y#{RWW'7x477ԩS{} r ' F%Ki&z}nAeOFn?x\2sL8q||+gϞ_򗥥E&O,7tSRDzl21btttѣdѢE 7ptuYbL6MM&+VI+'^'qz|ii<)^ևv)SHEE,\PDO?]VƏ/FM6'?I?~̟?c]:^#ɸqd̘1~',f͒F>m}k>\O.8,)**z͕ɓ'*<%eeeR^^ʀ*((Hm۶ɖ-[.qI]]&/k9:P d8p@W<N>[>},#,,k~V\\,O=v@38'ߗ^zlڴ阿]Q |A;_nM|Az\9׿/|A/D뮻СCsNYz\tEbŊ]w<3r{9Olݺٵk^Z;^Ͽ+W__^x/~!w}s""]6m$O>YF%,s8p@/ȍ7(v?[nEDb+O?<Ӳgτ?doJ]]1Yp<]rrr"q^+d׮]۾/ 7 O=Kr뭷#}}K/$K,0zhپ}{ǽrˤII:::!reҥ2a3ftttȺulذA>lillEz/e2ydg?+^xa&^s9GY>яʟ^Ezj9e̘1xbٽ{۷OƎ+UUUO9#~$եddI'߯k9SA̙#?#""ӦMj9e̘1|G9=z\2g9rducʈ#I&'1F^9SdĈ2gw9P&M$駟s%Kbw;e„ ""5"1 7+"RQQ!uuuvʤI"oٳG.yĉ'(=PRL<9߿?rigyYQQ!+WXO=SԩSeҤIr7Kmm444dk%sM0]]cdC^ ;hPȼ曽n{ԩS}^}U܌?כٳgy\(20s^7xqo{z~cc B}>}1Ƙf~w{=?c:;;M(23>~^ӦMf„ ~ş)ystuvvw& ɓ'O2z9rYjU;v0wuy̆ M7d޽{Sz1?#+O&z֭3Pȼ+l۶-;ywM}}y1lذB!3o<0K.5K.ݻwٺu BfÆ }OWюe};'l:;;͑#GٳSO=??ߴiSԟxxu]fҥL>,]ԬY㣭~-{=s '+VW_}<f̘1& G?TWWO}S7ygUW]e***O<yoaN9/}<#3gy9sL`GfܹfΜ9h|=_>Dߚ5kLEE9sʕ+_oOnByڵkMuu?ox O󦺺ڬ]6M6{΄B!}455.\wu梋.2o4ɫ}k{1 .43f8<4/y$cΝ̟?h_O8Ѽ[1V_"sǏ߫eӦMH8wyh_Nj?SDn_rioo|m6seI&G X̙3'r_HΝk.c1g}ikk3U9zg=󦮮Vů0p!3uTO|,Y֧o2xP("{={~O|L\≖o Bf͑۞{9S__ommҥ /S~̟?9rļ[f=t}qP(dnzC`:E˿Yfkmo:uYbE䶙3go}[}uיٳg= N:ɼQc Bo|)VN&O*BYz5kK}  n{~CL(2_;}L(2[l1f„ 淿m 93Ξql޼لB^6q>oZky7M(Z( yx L/F{\pP{֭[%\bZZZL}}5kVfرfݺuW_5P<3fǎfёul s4Z$obOțGCPM 6DѣͬYYgeL(co}TVVzO||k_3'L}}47pC?L(2s1ַƍ{Ν;M7d,Y-~ߘ:3qDOFn_n?n#8xY`1W\q5\)Ly>p*ܴiiii1&M2\sя~dbZZZ"ǎ> B /4?xygE -^<6.^5dc9Hxb߻k>s=\{}Yj*++)ܸqO~b̙gi}s]Ž9b~oфB!s-PS3g~ȇV\9V4W63f0'N4_ ̘1c̉'h*|Ԙ .L~WUU*f_ϼ {oBz殻2_|0:(ON;ͼ fǎЇ>doأ34{5?+*Wj>я7|޽۬Zʜzꩽ>7|9ͫj*ĺ;̧>)c1]v9skf^usP(d9p~xW\q?moo>O+"O3E/B5#G||r|o3{5cmڴՙlڴɌ5O%zwYgeonZ[[͌3K/d>ϛkM"~/~uw}Yt={v ֧o2^dzO2u]ȑ#fÆ fŊ}+8ptvv~ش|]?{E˿sךgylذ۷Ogm̿ۿ.=/%}Xn]{%_OOcǎ>wa7nq;v= ^z)fLPȼˑ]5Oՙq_=;YggwmBP.Gߛ=_/-.Z7?oIgOX=0o8Xk\`;<+{^x泟-bN?tsUW~|˱huK߰ʿ6SSSݻw|#& x_W#p;4]քB!3k֬>EZ駟ܾ`s'G޻w;{z]p}'V]uU& va3}t/~1ru]g*++{u7Ƙ^zԘ}sQƒdO||CwЇ>d>OFn?h>G^rek,+:.7Z?+zD &ϞG"~Hя~dBE? B/KۓYz ՙ|0fn̈́B>{M(2v["=߱QP,_<ҭטLR&}8z& o|} ^}q_sx$'pHs9G,rKKK\z饲dg>#""k׮˸qDDdܸq2n8/""^{\}2qDe̙2j(ijj={G?Q9DD__DD䬳/\&L ~ȍ7(˗/H=O~l29dر2w\W_}+ϗ>[-Z$ SO=5c˖-y扈8x/+R󥵵UNKN;4o+ɩ*<^Z-Zg~/9MD3ϔݻwȑ#[׿\W]uU$Xo==z\p2j(xNW;wTNN3Լy4~ܻ3ٺ"cy睧:K[liw3<#Iz'U\\s9GOe˖>$kժU:z?GyDO=v!IZbLИ@@[n|?X{b{${>Z?a>q4o<]tE5jT:h"]uUafRqq.\G"!vڽw2i$9% / ߯iӦlٲEƍtҤ@ u<ŋ;MMMO~g⋝[nS]],~.8Іꔖv 'wW8`Ybf' :>qݰaڵ?zⴴ8@贴D%] ` ʿÇ;O|ٴi"0]t|Yf__ 2YfMs,9r>|s;8uuuΰamuu#Gtz)gƍ… 뮻.2t8E?'8oK<}QmڴI{5k֬O<M>]#GO<x@^{.\/|X?֮] D{5sLڵKSLQFF,Ygz$:!lڴI$iÆ :p$iذa|kWz:kJ͛Cdgg"2vWǏ":.X@&Mwܡ;S#F!{|'%\"I*//%fffԶm4x`M81I/rqFꦛnիkFk׮՜9sԿ=U\\;#29~xu]7N]vyO7|~W unlCE>9^TT[9rHbgݺuѣΰa:}풒HXjɒ%ΐ!CHM69EEE k֬9a%ߊ+~;'?ҥKN9NKĉ;Yn ][k֬q3sv?NYY_)//w>SgΓO>L2WFjww;ÇwJo=㔕ul˖-ί~.;qo֩U/3m4[niwc=wy,[y7bkqޘKwބ=xvt픖:_|zz ͮN pfϞ?i-z:F%,^}{q~߶t_s8qy뭷^xCbQxOݻx| fIiǍ7Vo$鬳:N|Cȑ#?6oެul{vH?X"`hWTTL=s8qbGjΎmm 2D{ntj֭ڹsgUViƌ*++s=c~fΜ-[.coUVVr=3zjO… #鑺b98qN8VuuuݫI&O>ь3TZZ={hŊz7UUU_|Qkҥ:z$G^ԨQwp׫H۷o/K9ŋ+???ᆱK/TYYYڸq5zhݻW=&MtjX$'|_֏~#kzW>W:'%]ݻj*8qBRsϗ%txݻw_﯁jժUAOW~^}U577__OF+))ї.Fqt 7h*))~;ԧhXǨcǎiҥ3gA\s>l /k_Eߵk~kܹѝwީnMZ`q8p@_Wu 7HSOiܹ%\s9G|VXG_v8qBǏןg=裚9s-[V~a?!3O+B}^zN޻w}QڶmU^^믿^]vYdڵku5״{ϡӧGɱt=zW"[VWW{UNNN /8p`dعsjѢE~N;-_=ܣ,3F=H￿t]wu?g}VO>||I͝;i+-駟_X$O_cU__'|A͙3G˖->S>}}OW\qwss|AÇ 5eM>݂U)A 跿nݪ>LC ѸqtWEX=,.K,DK򯾾^of~JKK5k,͘1]ŋ[o\ڵkqƩEԯ_?ۿMuj۶m***RyynvUVVvy3hҥױc4e? H-l٢/XU__sGW_}٣F:$B!u{K=:/|c֭Ft߮o=i+W9͛ȖwXj^u͛7aTǬ\RvK/Ն  H V%I .Tu _?|lċ3` 7wqrС$߾>_˞>_+k ^k1<]0׎/?xa a3?.1xo_|%|EsL99UPP(t;Ra]_N::OEc>Z999\)cN^^ɋ/xf~cn(ʂU1bu8.Scت * #ziƆ&v5jʂe1:^I[`n>\cU,H҂gM^Fh*+cSJGi/<}5d`T-xY5\in 5v8Qւ>v`pƎ UTWo;v|h` |_z#c[`566A;64Wr6L;mִi6Z XPXTR:Og(//:jڼ^MK - ȿkڼYM7K -*(,P OouȿBW z /_o5AMmZ XPPԚ车ujjj?TPP ꏞ`jjjO[MMMjjj\PP ꏞc警B J%%Aƈ_zi6J -,((Ry2oz_$cA^rHY ŀ /IJpbn^ոh͚WM^!{~ VCoC/h"_xlfk#$2khh=mI*`wllxIR+F4.qJj]0D wgk\BR+F0.+Kj]0D wl\XRhG?$Z;LccdE466Jj]0D uZӯvcLcC wll\"vXZ `Ebu:k.68Km ~a$vJJJ]v7kԑH۵$NRk@uH.NIv`Lh]\0j]\0$N@r.8-IJJlk]p0ZS[{JJJ!:Ni?_$VZSPpv F}<779|Q~ϋ?c ]>VtVw7 91ǐ‹)(;3 z~Fb~/ʅno= { >cMu)EhNm^0z[h4.2é!:}^韺I?u~fh; vL|O'#b; 򱼼Q_7t_G;_^9 J<8 ;FJ H}8\%p?U9XJҲ:exG˞! {ZXki!`7lTeu0D-JX0y =e<{_H%$li\3\% | D@ F@OV>+Ӂst?u0(}nݨ:F%B,DddYGOK-g2Q2ɗo<rM5ݼ:H=!@i!Úwu#Exl<,5sK0A*\s"9y5(a#CFRpa  CC!Ø?;eف[ D@ F@OQMR@|qXɠ,сd%o<2 ϱVPTl<:xXAAuBv?`,Z+(f<?X*(g+M.,Q|qޠF2K,@ (`[#,QwuvY۱mu;[۱}u۩?`gm!vlg;;(ahٱ`\5 ؂?+ z2_op+IDATuUFuqob~`?Xϳ1˰ ywn/ SN^]#&iX1@ n$/,Q|qޠXإp:| D@ F@oPQ؂ ?`<yE=謳C4A! ;?X4v ʷ K,1|`6u[C5mla,1KD/,q%?;2#ʰFK$_u4N5b,Xʴb%ou4.Sp*p!{l St  (`h<Su C@TWpHUpa,Q`#/ ;`:xX08:D5: +C@T)q"a?һ Msb:C HE1w`GΥw;#tD((5$8t.%ʄHui^|cEtD((q[P1׿xF1/⯠ WKʺnڕ!꯰VW_o  l|>NT3: xWͤ˭ÀG|~\B>O50F(.USu(ϧ)aB6BWcKT="Й!I\h:$ CT]RDHjvCUW_f:5:h:0_TE!SD.H4ȿT_b$KEECC@ HsC@REB1NQQu,ek%%%%%%%%%%%_,#Cyd `I*a:FI*F _I!ȿTv?X*/[4zo$EG%7 ѣ>o߾$E/"`cgCo%GPSYY}')xQe儨S~Xd@t;/REBu;vGR5-Jl [l KlK, +, K, 0, 0, 0, 0Rn`IPVFuIElA(I%!?X*)!RKʕ UR/xC%%%!JJ!$oZA? }\uC@;}H*/Ր@Do-'R ? Y?XXvXvREB1}>jjY T0Q>O5ÀG|>LU3r0Q>_5PS%ʿKÀG|~/نY`zb8%H?)[a[v`ȿ@?X"Rw`!@)*::剄+*b"YVl Kl Kl Kl Kl Kl Kl Kl Kl Kl Kl Kl ](I#FZ+a<:xK`%_X"`:xXy9Ny9/씗[ Rz`1!x[Fu?kN*GFY˰Te%g+˃dg?VY9:˷?k^?? t6ּmeZ`mamamy}e`[^?v L mL #;ywq4nZԗ jKRfԷL{NYZqmnncUhQK H*tvm~knܼnh psGѸ]B %o$(4%)# v`SТ>B мDRsZopmw7Gi 0?$[m9ْI 7%} $G҂۽ v`S^wB5H9S\ )7sD6w'K}].+;/3OzI,mW'u/oB o>um`X'؆;:}}9 ]\ ׯ\Q Ztu/@RN.4)t!+DwgN.ja_xq߽ntimbدklܝ>:}}#|iG%҃+zu+6*Kh=VFV럮't5_x"܇D))-FpBIWv:y,(%%^ݎ7@"yTPRRb<$h*^ -Hnۧ?ͻTHz\meo}(=~mca_I[/g]ܗ>̿,K9p !$@},KE~u v1_6ga_a%HUS;M::tѵ/?MBo֡Ġ}>'vu(ϧI m#6,s;ϯIK:bJ ڗ?>_5LC׾CnTsIuP]b<IY'="ϧ)>%]u?c)r]i"2RA|)P,I} 2 Dmڇa5,|~׋기O}[޷1 :ϯ1 :SyEu ;>_啽 :Z(zYtX׷Sy9?_uۛmg¾A ulwL F;¾窫Oc$j}H$m}HѣCE?!*GUh5}HѝtC0%*+/tCrUVm]\SYٛ`Hz$i]`7!|>u0nHH᮲ i, t@t/ 5?u%0? oD@?.@\ p!B,X b .@\PXڵko<%?X"`%?X"`%vڥ<0DMwPIENDB`vedo-2025.5.3/docs/documentation.md000066400000000000000000000255131474667405700170620ustar00rootroot00000000000000 [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://en.wikipedia.org/wiki/MIT_License) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/vedo/badges/version.svg)](https://anaconda.org/conda-forge/vedo) [![Ubuntu 24.10 package](https://repology.org/badge/version-for-repo/ubuntu_24_10/vedo.svg)](https://repology.org/project/vedo/versions) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4587871.svg)](https://doi.org/10.5281/zenodo.4587871) ![](https://vedo.embl.es/images/feats/teapot_banner.png) A python module for scientific analysis of 3D objects and point clouds based on [VTK](https://www.vtk.org/) and [Numpy](http://www.numpy.org/). Check out the [**GitHub repository**](https://github.com/marcomusy/vedo) and the [**vedo main page here**](https://vedo.embl.es). Find at this [link](https://vedo.embl.es/autodocs/v2023.4.7/vedo.html) the documentation for the older version v2023.4.7. ## Install and Test ```bash pip install vedo # Or, install the latest development version with: pip install -U git+https://github.com/marcomusy/vedo.git ``` Then ```python import vedo vedo.Cone().show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cone.png) ## Command Line Interface The library includes a **C**ommand **L**ine **I**nterface. Type for example in your terminal: ```bash vedo --help vedo https://vedo.embl.es/examples/data/panther.stl.gz ``` ![](https://vedo.embl.es/images/feats/vedo_cli_panther.png) Pressing `h` will then show a number of options to interact with your 3D scene: ``` i print info about the last clicked object I print color of the pixel under the mouse Y show the pipeline for this object as a graph <- -> use arrows to reduce/increase opacity x toggle mesh visibility w toggle wireframe/surface style l toggle surface edges visibility p/P hide surface faces and show only points 1-3 cycle surface color (2=light, 3=dark) 4 cycle color map (press shift-4 to go back) 5-6 cycle point-cell arrays (shift to go back) 7-8 cycle background and gradient color 09+- cycle axes styles (on keypad, or press +/-) k cycle available lighting styles K toggle shading as flat or phong A toggle anti-aliasing D toggle depth-peeling (for transparencies) U toggle perspective/parallel projection o/O toggle extra light to scene and rotate it a toggle interaction to Actor Mode n toggle surface normals r reset camera position R reset camera to the closest orthogonal view . fly camera to the last clicked point C print the current camera parameters state X invoke a cutter widget tool S save a screenshot of the current scene E/F export 3D scene to numpy file or X3D q return control to python script Esc abort execution and exit python kernel ``` ### Some useful bash aliases ```bash alias vr='vedo --run ' # to search and run examples by name alias vs='vedo --search ' # to search for a string in examples alias ve='vedo --eog ' # to view single and multiple images ``` ## Tutorials You are welcome to ask specific questions on the [**image.sc**](https://forum.image.sc) forum, post a [**github issue**](https://github.com/marcomusy/vedo/issues) or search the [**examples gallery**](https://vedo.embl.es/#gallery) for some relevant example. You can also find online tutorials at: - [Vedo tutorial for the EMBL Python User Group](https://github.com/marcomusy/vedo-epug-tutorial) with [slides](https://github.com/marcomusy/vedo-epug-tutorial/blob/main/vedo-epug-seminar.pdf) by M. Musy (EMBL). - [Summer School on Computational Modelling of Multicellular Systems](https://github.com/LauAvinyo/vedo-embo-course) with [slides](https://github.com/LauAvinyo/vedo-embo-course/blob/main/vedo-embo-presentation.pdf) by Laura Avinyo (EMBL). - Youtube video tutorials by [M. El Amine](https://github.com/amine0110/pycad): - [Visualizing Multiple 3D Objects in Medical Imaging](https://www.youtube.com/watch?v=LVoj3poN2WI) - [Capture 3D Mesh Screenshots in Medical Imaging](https://www.youtube.com/watch?v=8Qn14WMUamA) - [Slice 'n Dice: Precision 3D Mesh Cutting](https://www.youtube.com/watch?v=dmXC078ZOR4&t=195s) - [3D Visualization of STL Files](https://www.youtube.com/watch?v=llq9-oJXepQ) - [Creating an interactive 3D geological model](https://www.youtube.com/watch?v=raiIft8VeRU&t=1s) by A. Pollack (SCRF). See a more updated example [here](https://github.com/marcomusy/vedo/blob/master/examples/advanced/geological_model.py). - ["vedo", a python module for scientific analysis and visualization of 3D data](https://www.youtube.com/watch?v=MhIoetdxwc0&t=39s), I2K Conference, by M. Musy (EMBL). ## Export a 3D scene to file You can export it to a vedo file, which is actually a normal `numpy` file by pressing `E` in your 3D scene, the you can interact with it normally using for example the key bindings shown above. Another way is to export to a template html web page by pressing `F` using the `x3d` backend. You can also export it programmatically in `k3d` format from a jupyter notebook. ## File format conversion You can convert on the fly a file (or multiple files) to a different format with ```bash vedo --convert bunny.obj --to ply ``` ## Running in a Jupyter Notebook To use in jupyter notebooks use the syntax `vedo.settings.default_backend= '...' ` the supported backend for visualization are: - `2d`, the default a static image is generated. - `vtk`, in this case a normal graphics rendering window will pop up. - [k3d](https://github.com/K3D-tools/K3D-jupyter) use with `pip install k3d` - [ipyvtklink](https://github.com/Kitware/ipyvtklink) (allows interaction with the scene). - [trame](https://www.kitware.com/trame-visual-analytics-everywhere/) Check for more examples in [repository](https://github.com/marcomusy/vedo/tree/master/examples/notebooks). ### Running on Google Colab Start your notebook with: ```python import vedo vedo.settings.init_colab() ``` Then test it with: ```python import vedo print("vedo", vedo.__version__) sphere = vedo.Sphere().linewidth(1) plt = vedo.Plotter() plt += sphere plt.show(axes=1, viewup='z', zoom=1.5) ``` ## Running on a Server - Install `libgl1-mesa` and `xvfb` on your server: ```bash sudo apt install libgl1-mesa-glx libgl1-mesa-dev xvfb pip install vedo ``` - Execute on startup: ```bash set -x export DISPLAY=:99.0 which Xvfb Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & sleep 3 set +x exec "$@" ``` - You can save the above code above as `/etc/rc.local` and use `chmod +x` to make it executable. It may throw an error during startup. Then test it with, e.g.: ```python import vedo plt = vedo.Plotter(offscreen=True, size=(500,500)) plt.show(vedo.Cube()).screenshot('mycube.png').close() ``` ## Running in a Docker container You need to set everything up for offscreen rendering: there are two main ingredients - `vedo` should be set to render in offscreen mode - guest OS in the docker container needs the relevant libraries installed (in this example we need the Mesa openGL and GLX extensions, and Xvfb to act as a virtual screen. It's maybe also possible to use OSMesa offscreen driver directly, but that requires a custom build of VTK). - Create a `Dockerfile`: ```bash FROM python:3.8-slim-bullseye RUN apt-get update -y \ && apt-get install libgl1-mesa-dev libgl1-mesa-glx xvfb -y --no-install-recommends \ && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ && rm -rf /var/lib/apt/lists/* RUN pip install vedo && rm -rf $(pip cache dir) RUN mkdir -p /app/data WORKDIR /app/ COPY test.py set_xvfb.sh /app/ ENTRYPOINT ["/app/set_xvfb.sh"] ``` - `set_xvfb.sh`: ```bash #!/bin/bash set -x export DISPLAY=:99.0 Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & #sleep 3 set +x exec "$@" ``` - `test.py`: ```python from vedo import Sphere, Plotter, settings sph = Sphere(pos=[-5, 0, 0], c="r") plt = Plotter(interactive=False, offscreen=True) plt.show(sph) plt.screenshot("./data/out.png", scale=2).close() ``` Then you can 1. `$ docker build -t vedo-test-local .` 2. `$ docker run --rm -v /some/path/output:/app/data vedo-test-local python test.py` (directory `/some/path/output` needs to exist) 3. There should be an `out.png` file in the output directory. ## Generate a single executable file You can use [pyinstaller](https://pyinstaller.readthedocs.io/en/stable/) to generate a single, portable, executable file for different platforms. Write a file `myscript.spec` as: ```python # -*- mode: python ; coding: utf-8 -*- # import os import sys sys.setrecursionlimit(sys.getrecursionlimit() * 5) from vedo import installdir as vedo_installdir vedo_fontsdir = os.path.join(vedo_installdir, 'fonts') print('vedo installation is in', vedo_installdir) print('fonts are in', vedo_fontsdir) block_cipher = None added_files = [ (os.path.join('tuning','*'), 'tuning'), (os.path.join(vedo_fontsdir,'*'), os.path.join('vedo','fonts')), ] a = Analysis(['myscript.py'], pathex=[], binaries=[], hiddenimports=[ 'vtkmodules', 'vtkmodules.all', 'vtkmodules.util', 'vtkmodules.util.numpy_support', 'vtkmodules.qt.QVTKRenderWindowInteractor', ], datas = added_files, hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='my_program_name', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, target_arch=None, codesign_identity=None, entitlements_file=None) ``` then run it with ```bash pyinstaller myscript.spec ``` See also an example [here](https://github.com/marcomusy/welsh_embryo_stager/blob/main/stager.spec). If you get an [error message](https://github.com/marcomusy/vedo/discussions/820) related to a font which is not shipped with the vedo library you will need to copy the `.npz` and `.ttf` files to `vedo/fonts` (where all the other fonts are) and reinstall vedo. Then add in your script `settings.font_parameters["FONTNAME"]["islocal"] = True`. vedo-2025.5.3/docs/examples_db.js000077500000000000000000002055031474667405700165120ustar00rootroot00000000000000vpath = 'https://github.com/marcomusy/vedo/tree/master/examples'; vedo_example_db = [ { pyname: 'buildmesh', // python script name kbd : '', // python script name as appearing in back of card categ : 'basic', // category short : 'hello world mesh', // short description, as card footer long : 'Build a simple Mesh starting from a set of points and faces.', imgsrc: 'images/basic/buildmesh.png', //image path }, { pyname: 'colorcubes', kbd : '', categ : 'basic', short : 'color schemes', long : 'Show a cube for each available color name. Multiple color schemes are available (matplotlib, bootstrap, vtk).', imgsrc: 'images/basic/colorcubes.png', }, { pyname: 'texturecubes', kbd : '', categ : 'basic', short : 'mesh textures', long : 'Show a cube for each available texture name. Any jpg file can be used as texture.', imgsrc: 'images/basic/texturecubes.png', }, { pyname: 'colormap_list', kbd : '', categ : 'basic', short : 'color map list', long : 'Show all available colormaps in vedo', imgsrc: 'images/basic/colormap_list.png', }, { pyname: 'colormaps', kbd : '', categ : 'basic', short : 'discrete color mapping', long : 'Assign a color to each mesh vertex using a matplotlib discretized map', imgsrc: 'images/basic/colormaps.png', }, { pyname: 'light_sources', kbd : '', categ : 'basic', short : 'set up lights', long : 'Set custom lights to a 3D scene. Direction, position, intensity and color can be specified', imgsrc: 'images/basic/lights.png', }, { pyname: 'mesh_custom', kbd : '', categ : 'basic', short : 'colorize a mesh', long : 'Control the color and transparency of a mesh with various color map definitions', imgsrc: 'images/basic/mesh_custom.png', }, { pyname: 'color_mesh_cells1', kbd : '', categ : 'basic', short : 'color mesh faces', long : 'Colorize faces of a Mesh passing a 1-to-1 list of colors and optionally a list of transparencies', imgsrc: 'images/basic/colorMeshCells.png', }, { pyname: 'color_mesh_cells2', kbd : '', categ : 'basic', short : 'color mesh faces', long : 'Colorize faces of a Mesh passing a 1-to-1 list of colors and optionally a list of transparencies', imgsrc: 'images/basic/color_mesh_cells2.png', }, { pyname: 'mesh_lut', kbd : '', categ : 'basic', short : 'custom mesh colormap', long : 'Build a custom colormap, including out-of-range, NaN and labels colors', imgsrc: 'images/basic/mesh_lut.png', }, { pyname: 'multirenderers', kbd : '', categ : 'basic', short : 'multiple subrenderers', long : 'Manually define the number, shape and position of the renderers inside the rendering window', imgsrc: 'images/basic/multirenderers.png', }, { pyname: 'silhouette1', kbd : '', categ : 'basic', short : 'draw silhouettes', long : 'Generate the silhouette of a mesh as seen along a specified direction', imgsrc: 'images/basic/silhouette1.png', }, { pyname: 'silhouette2', kbd : '', categ : 'basic', short : 'projecting silhouettes', long : 'Generate the silhouette of a mesh as seen along a specified direction', imgsrc: 'images/basic/silhouette2.png', }, { pyname: 'cut_interactive', kbd : '', categ : 'basic', short : 'interactive mesh cutter', long : 'Cut a mesh interactively and save the result to file', imgsrc: 'images/basic/cutter.gif', }, { pyname: 'cut_freehand', kbd : '', categ : 'basic', short : 'free-hand mesh cutter', long : 'Cut a mesh interactively by free-hand drawing a contour', imgsrc: 'images/basic/cutFreeHand.gif', }, { pyname: 'shrink', kbd : '', categ : 'basic', short : 'shrink mesh triangles', long : 'Shrink mesh polygons to make the inside visible', imgsrc: 'images/basic/shrink.png', }, { pyname: 'boundaries', kbd : '', categ : 'basic', short : 'mesh boundaries', long : 'Extract points on the boundary of a mesh. Add a label to all vertices', imgsrc: 'images/basic/boundaries.png', }, { pyname: 'mesh_modify', kbd : '', categ : 'basic', short : 'move mesh vertices', long : 'Modify mesh vertex positions', imgsrc: 'images/basic/mesh_modify.png', }, { pyname: 'connected_vtx', kbd : '', categ : 'basic', short : 'connected vertices', long : 'Find all the vertices that are connected to a specific vertex in a mesh', imgsrc: 'images/basic/connVtx.png', }, { pyname: 'largestregion', kbd : '', categ : 'basic', short : 'largest surface', long : 'Extract the mesh region that has the largest connected surface', imgsrc: 'images/basic/largestregion.png', }, { pyname: 'fillholes', kbd : '', categ : 'basic', short : 'fill mesh holes', long : 'Fill holes of an input mesh, identified by locating boundary edges, linking them into loops, and triangulating', imgsrc: 'images/basic/fillholes.png', }, { pyname: 'sliders1', kbd : '', categ : 'basic', short : 'slider controls', long : 'Use two sliders to change color and transparency of a mesh', imgsrc: 'images/basic/sliders1.png', }, { pyname: 'boolean', kbd : '', categ : 'basic', short : 'boolean operations', long : 'Perform various Boolean operations with meshes', imgsrc: 'images/basic/boolean.png', }, { pyname: 'delaunay2d', kbd : '', categ : 'basic', short : 'delaunay in 2d', long : 'Perform 2D triangulation using the Delaunay algorithm', imgsrc: 'images/basic/delaunay2d.png', }, { pyname: 'voronoi1', kbd : '', categ : 'basic', short : 'voronoi tessellation', long : 'Perform 2D Voronoi tessellation of a set of input points', imgsrc: 'images/basic/voronoi1.png', }, { pyname: 'flatarrow', kbd : '', categ : 'basic', short : 'flat arrows', long : 'Use two lines to define a flat arrow', imgsrc: 'images/basic/flatarrow.png', }, { pyname: 'shadow1', kbd : '', categ : 'basic', short : 'cast a simple shadow', long : 'Project a shadow of two meshes on the x,y, or z wall', imgsrc: 'images/basic/shadow1.png', }, { pyname: 'shadow2', kbd : '', categ : 'basic', short : 'cast multiple shadows', long : 'Project realistic shadows of two meshes on the xy plane', imgsrc: 'images/basic/shadow2.png', }, { pyname: 'extrude', kbd : '', categ : 'basic', short : 'polygon extrusion', long : 'Extruding a 2D polygon along the vertical axis', imgsrc: 'images/basic/extrude.png', }, { pyname: 'align1', kbd : '', categ : 'basic', short : 'register two shapes', long : 'Align (register) the red line to the yellow shape using the '+insertLink('ICP algorithm','en.wikipedia.org/wiki/Iterative_closest_point'), imgsrc: 'images/basic/align1.png', }, { pyname: 'align2', kbd : '', categ : 'basic', short : 'register point clouds', long : 'Generate two random sets of points and align them using the '+insertLink('ICP algorithm','en.wikipedia.org/wiki/Iterative_closest_point'), imgsrc: 'images/basic/align2.png', }, { pyname: 'align4', kbd : '', categ : 'basic', short : 'procrustes registration', long : 'Align a set of curves in space with the'+insertLink('Procrustes method','en.wikipedia.org/wiki/Procrustes_analysis'), imgsrc: 'images/basic/align4.png', }, { pyname: 'align5', kbd : '', categ : 'basic', short : 'landmark registration', long : 'Transform a mesh by defining how a specific set of points (landmarks) must move', imgsrc: 'images/basic/align5.png', }, { pyname: 'buttons1', kbd : '', categ : 'basic', short : 'add buttons', long : 'Add a button with N possible states to the rendering window calling an external function', imgsrc: 'images/basic/buttons.png', }, { pyname: 'cells_within_bounds', kbd : 'cells_within', categ : 'basic', short : 'find mesh cells', long : 'Find cells within specified bounds along x, y and/or z', imgsrc: 'images/basic/cellsWithinBounds.png', }, { pyname: 'clustering', kbd : '', categ : 'basic', short : 'clustering & outliers', long : 'Automatic clustering of point clouds and outliers removal', imgsrc: 'images/basic/clustering.png', }, { pyname: 'pca_ellipsoid', kbd : '', categ : 'basic', short : 'fit ellipsoid', long : 'Fit an ellipsoid to a point cloud using PCA (Principal Component Analysis)', imgsrc: 'images/basic/pca.png', }, { pyname: 'manypoints', kbd : '', categ : 'basic', short : 'large point cloud (1M)', long : 'Draw a very large number (1M) of points with different colors and transparency', imgsrc: 'images/basic/manypoints.jpg', }, { pyname: 'manyspheres', kbd : '', categ : 'basic', short : '50k sphere radii', long : 'Draw a very large number (50k) of spheres or points with different colors or different radii', imgsrc: 'images/basic/manyspheres.jpg', }, { pyname: 'colorlines', kbd : '', categ : 'basic', short : 'color lines by scalar', long : 'Color line cells using a scalar array and a matplotlib colormap', imgsrc: 'images/basic/colorlines.png', }, { pyname: 'ribbon', kbd : '', categ : 'basic', short : 'ribbon surface', long : 'Create a ribbon-like surface by joining two lines, or one single line along its tangent', imgsrc: 'images/basic/ribbon.png', }, { pyname: 'mirror', kbd : '', categ : 'basic', short : 'mirror mesh', long : 'Mirror a mesh along one of the Cartesian axes. Hover mouse to identify original and mirrored.', imgsrc: 'images/basic/mirror.png', }, { pyname: 'delete_mesh_pts', kbd : 'delete_mesh', categ : 'basic', short : 'remove points and cells', long : 'Remove points and cells from a mesh which are closest to a specified point', imgsrc: 'images/basic/deleteMeshPoints.png', }, { pyname: 'mousehighlight', kbd : '', categ : 'basic', short : 'highlight mesh', long : 'Click an object to select and highlight it', imgsrc: 'images/basic/mousehighlight.png', }, { pyname: 'mousehover1', kbd : '', categ : 'basic', short : 'hovering mouse', long : 'Visualize scalar values interactively by hovering the mouse on a mesh', imgsrc: 'images/basic/mousehover1.gif', }, { pyname: 'mousehover2', kbd : '', categ : 'basic', short : 'hover and fit', long : 'Interactively fit a sphere on a region of a mesh by hovering the mouse pointer on it', imgsrc: 'images/basic/mousehover2.gif', }, { pyname: 'mousehover3', kbd : '', categ : 'basic', short : 'world coordinates', long : 'Compute 3D world coordinates from 2D screen pixel coordinates while hovering the mouse', imgsrc: 'images/basic/mousehover3.jpg', }, { pyname: 'spline_tool', kbd : '', categ : 'basic', short : 'interactive spline tool', long : 'Modify a spline interactively by clicking and dragging the mouse', imgsrc: 'images/basic/spline_tool.png', }, { pyname: 'distance2mesh', kbd : '', categ : 'basic', short : 'mesh signed distance', long : 'Computes the signed distance of one mesh from another and store the array in the mesh itself', imgsrc: 'images/basic/distance2mesh.png', }, { pyname: 'glyphs1', kbd : '', categ : 'basic', short : 'create a glyphed mesh', long : 'Glyphs: for each vertex of a mesh (e.g. a sphere), attach another mesh with various orientation options', imgsrc: 'images/basic/glyphs.png', }, { pyname: 'glyphs3', kbd : '', categ : 'basic', short : 'create glyph symbols', long : 'Glyphs: attach an oriented mesh (here a cone) to each 3D point. Colormap by vector magnitude', imgsrc: 'images/pyplot/glyphs3.png', }, { pyname: 'lightings', kbd : '', categ : 'basic', short : 'mesh lightings', long : 'Ligthing of a mesh can be modified at will to change its appearance', imgsrc: 'images/basic/lightings.png', }, { pyname: 'cartoony', kbd : '', categ : 'basic', short : 'cartoony look&feel', long : 'Give a cartoony appearance to a 3D polygonal mesh', imgsrc: 'images/basic/cartoony.png', }, { pyname: 'ssao', kbd : '', categ : 'basic', short : 'ambient occlusion', long : 'Render a scene with Screen Space Ambient Occlusion (SSAO)', imgsrc: 'images/basic/ssao.jpg', }, { pyname: 'surf_intersect', kbd : '', categ : 'basic', short : 'intersect meshes', long : 'Find the intersection line of two polygonal meshes', imgsrc: 'images/basic/surfIntersect.png', }, { pyname: 'lin_interpolate', kbd : '', categ : 'basic', short : 'interpolate vectors', long : 'Linear interpolation of vectors which are defined at specific points in space', imgsrc: 'images/basic/linInterpolate.png', }, { pyname: 'mesh_map2cell', kbd : 'map2cell', categ : 'basic', short : 'map points to cells', long : 'Map an array, which is originally defined on the mesh vertices, to its cells', imgsrc: 'images/basic/mesh_map2cell.png', }, { pyname: 'tube_radii', kbd : '', categ : 'basic', short : 'radius-varying tube', long : 'Use an array to vary the radius and color of a line so that it is represented as a tube', imgsrc: 'images/basic/tube.png', }, { pyname: 'rotate_image', kbd : 'rotate_image', categ : 'basic', short : 'rotate a jpg image', long : 'Normal jpg/png images can be loaded, cropped, rotated and positioned anywhere in 3D scenes', imgsrc: 'images/basic/rotateImage.png', }, { pyname: 'background_image', kbd : 'background', categ : 'basic', short : 'wallpapers', long : 'Set a jpeg background image on a separate rendering layer', imgsrc: 'images/basic/bgImage.png', }, { pyname: 'skybox', kbd : '', categ : 'basic', short : 'skybox environment', long : 'Embed a mesh into a skybox environment. Mesh lighting is by Physically Based Rendering (PBR)', imgsrc: 'images/basic/skybox.jpg', }, ///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////ADVANCED { pyname: 'geological_model', kbd : '', categ : 'advanced', short : 'geological model', long : 'Recreate a complex 3D model of a geothermal reservoir in Utah (USA). Export it to a '+insertLink('webpage.','vedo.embl.es/examples/geo_scene.html'), imgsrc: 'images/advanced/geological_model.jpg', }, { pyname: 'geodesic', kbd : '', categ : 'advanced', short : 'geodesic lines', long : 'Dijkstra algorithm to compute the geodesic: the shortest distance between two points on a surface', imgsrc: 'images/advanced/geodesic.png', }, { pyname: 'moving_least_squares1D', kbd : 'least_squares1d', categ : 'advanced', short : 'moving least squares 1d', long : 'Use the '+insertLink('Moving Least Squares','en.wikipedia.org/wiki/Moving_least_squares')+'algorithm to project a cloud of points to a smooth line', imgsrc: 'images/advanced/moving_least_squares1D.png', }, { pyname: 'moving_least_squares2D', kbd : 'least_squares2d', categ : 'advanced', short : 'moving least squares 2d', long : 'Use the '+insertLink('Moving Least Squares','en.wikipedia.org/wiki/Moving_least_squares')+'algorithm to project a cloud of points to a smooth surface', imgsrc: 'images/advanced/least_squares2D.png', }, { pyname: 'recosurface', kbd : '', categ : 'advanced', short : 'point cloud to mesh', long : 'Reconstruct a triangular mesh from a noisy cloud of points.', imgsrc: 'images/advanced/recosurface.png', }, { pyname: 'line2mesh_tri', kbd : 'mesh_tri', categ : 'advanced', short : 'generate a tri-mesh', long : 'Generate a triangular mesh from a line contour in 2D.', imgsrc: 'images/advanced/line2mesh_tri.jpg', }, { pyname: 'line2mesh_quads', kbd : 'mesh_quads', categ : 'advanced', short : 'generate a quad-mesh', long : 'Generate a quad-mesh from a line contour in 2D.', imgsrc: 'images/advanced/line2mesh_quads.png', }, { pyname: 'voronoi2', kbd : '', categ : 'advanced', short : 'voronoi tessellation', long : 'Perform 2D Voronoi tessellation of a set of input points and a grid', imgsrc: 'images/advanced/voronoi2.png', }, { pyname: 'meshquality', kbd : '', categ : 'advanced', short : 'mesh quality metrics', long : 'Visualize various metrics of quality for the cells of a triangular mesh', imgsrc: 'images/advanced/meshquality.png', }, { pyname: 'mesh_smoother2', kbd : '', categ : 'advanced', short : 'smoothing a mesh', long : 'Smoothing a mesh using different combinations of algorithms and parameters', imgsrc: 'images/advanced/mesh_smoother2.png', }, { pyname: 'warp1', kbd : '', categ : 'advanced', short : 'thin plate splines', long : 'Thin Plate Spline transformations describe a nonlinear warping defined by source and target points', imgsrc: 'images/advanced/warp1.png', }, { pyname: 'warp2', kbd : '', categ : 'advanced', short : 'thin plate splines 3d', long : 'Warp part of a mesh using Thin Plate Splines. Red points stay fixed while one point in space moves along the arrow', imgsrc: 'images/advanced/warp2.png', }, { pyname: 'warp3', kbd : '', categ : 'advanced', short : 'warping fit in 2d', long : 'Two sets of landmark points define a displacement field using thin plate splines as a model', imgsrc: 'images/advanced/warp3.png', }, { pyname: 'warp4a', kbd : '', categ : 'advanced', short : 'interactive morphing 2d', long : 'Morph/warp a 2D shape by manually setting displacement arrows', imgsrc: 'images/advanced/warp4.png', }, { pyname: 'warp4b', kbd : '', categ : 'advanced', short : 'interactive morphing 3d', long : 'Morph/warp a 3D shape by manually assigning a set of corresponding landmarks', imgsrc: 'images/advanced/warp4b.jpg', }, { pyname: 'warp5', kbd : '', categ : 'advanced', short : 'quadratic fit morphing', long : 'Morph source on target mesh by fitting the 18 parameters of a quadratic transformation', imgsrc: 'images/advanced/warp5.png', }, { pyname: 'splitmesh', kbd : '', categ : 'advanced', short : 'mesh connectivity', long : 'Split a mesh by connectivity and order the pieces by their surface area', imgsrc: 'images/advanced/splitmesh.png', }, { pyname: 'fitline', kbd : '', categ : 'advanced', short : 'fit lines and planes', long : 'Fit a line and a plane to a cloud of points in 3D', imgsrc: 'images/advanced/fitline.png', }, { pyname: 'fitspheres1', kbd : '', categ : 'advanced', short : 'fit a sphere', long : 'Fit spheres to a region of a surface defined by n points that are closest to a given point', imgsrc: 'images/advanced/fitspheres1.jpg', }, { pyname: 'convex_hull', kbd : '', categ : 'advanced', short : 'convex hull', long : 'Create the Convex Hull of a mesh or a set of input points ', imgsrc: 'images/advanced/convexHull.png', }, { pyname: 'contours2mesh', kbd : '', categ : 'advanced', short : 'countours to mesh', long : 'Generate a surface mesh by joining a set of closeby countour lines', imgsrc: 'images/advanced/contours2mesh.png', }, { pyname: 'interpolate_field', kbd : '', categ : 'advanced', short : 'interpolate field', long : 'Interpolate a vectorial field with Thin Plate Splines or Radial Basis Function. Share camera btw different windows', imgsrc: 'images/advanced/interpolateField.png', }, { pyname: 'interpolate_scalar1', kbd : '', categ : 'advanced', short : 'transfer mesh array', long : 'Interpolate the scalar values from one mesh or point clouds object onto another one', imgsrc: 'images/advanced/interpolateScalar1.png', }, { pyname: 'interpolate_scalar2', kbd : '', categ : 'advanced', short : 'interpolate array', long : 'Use scipy Radial Basis Function to interpolate a scalar known on a set of points on a mesh the scalar is not defined', imgsrc: 'images/advanced/interpolateScalar2.png', }, { pyname: 'interpolate_scalar3', kbd : '', categ : 'advanced', short : 'interpolate array', long : 'Interpolate the arrays of a source mesh onto another (the ellipsoid) by averaging closest point values', imgsrc: 'images/advanced/interpolateScalar3.png', }, { pyname: 'interpolate_scalar4', kbd : '', categ : 'advanced', short : 'interpolate array', long : 'Interpolate cell values from a quad-mesh to a tri-mesh of different resolution', imgsrc: 'images/advanced/interpolateScalar4.png', }, { pyname: 'diffuse_data', kbd : '', categ : 'advanced', short : 'smooth array', long : 'Smooth/diffuse an array of scalars on a mesh', imgsrc: 'images/advanced/diffuse_data.png', }, { pyname: 'cut_with_mesh1', kbd : '', categ : 'advanced', short : 'cut mesh with mesh', long : 'Cut a mesh with another mesh', imgsrc: 'images/advanced/cutWithMesh1.jpg', }, { pyname: 'cut_with_points1', kbd : '', categ : 'advanced', short : 'cut mesh with points', long : 'Set a loop of points on a mesh to cut/select a region of it.', imgsrc: 'images/advanced/cutWithPoints1.png', }, { pyname: 'cut_with_points2', kbd : '', categ : 'advanced', short : 'cut mesh with loop', long : 'Set a loop of points on a mesh to cut/select inside cells.', imgsrc: 'images/advanced/cutWithPoints2.png', }, { pyname: 'cut_and_cap', kbd : '', categ : 'advanced', short : 'cut&cap', long : 'Cut a mesh with an other mesh and cap the holes', imgsrc: 'images/advanced/cutAndCap.png', }, { pyname: 'gyroid', kbd : '', categ : 'advanced', short : 'textured gyroid shape', long : 'A textured gyroid shape cut by a sphere. Any image texture can be downloaded on the fly.', imgsrc: 'images/advanced/gyroid.png', }, { pyname: 'multi_viewer2', kbd : '', categ : 'advanced', short : 'multi window viewer', long : 'Create two windows that can interact and share functions', imgsrc: 'images/advanced/multi_viewer.png', }, { pyname: 'timer_callback2', kbd : '', categ : 'advanced', short : 'play/pause application', long : 'Create a simple application controlled by a timer callback function', imgsrc: 'images/advanced/timer_callback1.jpg', }, { pyname: 'spline_draw1', kbd : '', categ : 'advanced', short : 'draw a spline', long : 'Draw a spline on a Picture interactively', imgsrc: 'images/advanced/spline_draw.png', }, ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// Volumetric ///////////////////////////////////////////////////////////////////// { pyname: 'numpy2volume2', kbd : '', categ : 'volumetric', short : 'numpy array to volume', long : 'Create a Volume dataset from a'+insertLink('numpy','numpy.org')+'array', imgsrc: 'images/volumetric/numpy2volume2.png', }, { pyname: 'numpy2volume1', kbd : '', categ : 'volumetric', short : 'numpy mgrid to volume', long : 'Create a Volume dataset from a'+insertLink('numpy.mgrid','numpy.org/doc/stable/reference/generated/numpy.mgrid.html')+'object', imgsrc: 'images/volumetric/numpy2volume1.png', }, { pyname: 'app_isobrowser', kbd : 'isobrowser', categ : 'volumetric', short : 'browse isosurfaces', long : 'Peel isosurfaces from an input Volume using a slider', imgsrc: 'images/advanced/app_isobrowser.gif', }, { pyname: 'app_raycaster', kbd : 'raycaster', categ : 'volumetric', short : 'ray cast rendering', long : 'Visualize an input Volume using ray casting in different modes', imgsrc: 'images/advanced/app_raycaster.gif', }, { pyname: 'slicer1', kbd : '', categ : 'volumetric', short : 'slice a volume', long : 'Use sliders to control planes slicing an input volume. Create a button to change colormap', imgsrc: 'images/volumetric/slicer1.jpg', }, { pyname: 'read_volume3', kbd : '', categ : 'volumetric', short : '2d interactive slices', long : 'Inspect a vloumetric dataset interactively by slicing 2d planes with the mouse.', imgsrc: 'images/volumetric/read_volume3.jpg', }, { pyname: 'isosurfaces1', kbd : '', categ : 'volumetric', short : 'isosurface sets', long : 'Generate the isosurfaces corresponding to a set of thresholds. These surfaces constitute a single object', imgsrc: 'images/volumetric/isosurfaces.png', }, { pyname: 'read_volume1', kbd : '', categ : 'volumetric', short : 'transfer functions', long : 'Load a 3D volume and set color and visibility of voxels by defining transfer functions', imgsrc: 'images/volumetric/read_volume1.png', }, { pyname: 'read_volume2', kbd : '', categ : 'volumetric', short : 'rendering modes', long : 'Load a 3D volume and visualize it with either "composite" or "maximum-projection" rendering', imgsrc: 'images/volumetric/read_volume2.png', }, { pyname: 'interpolate_volume', kbd : 'interpolate_vol', categ : 'volumetric', short : 'interpolate a volume', long : 'Generate a volume by interpolating a scalar which is only known on a scattered set of points', imgsrc: 'images/volumetric/59095175-1ec5a300-8918-11e9-8bc0-fd35c8981e2b.jpg', }, { pyname: 'densifycloud', kbd : '', categ : 'volumetric', short : 'densify point cloud', long : 'Adds new points to an input point cloud. Points are created so that they are within a target distance of one another', imgsrc: 'images/volumetric/densifycloud.png', }, { pyname: 'legosurface', kbd : '', categ : 'volumetric', short : 'lego-style voxels', long : "Represent a volume as lego blocks (voxels). Colors correspond to the volume's scalar", imgsrc: 'images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png', }, { pyname: 'streamlines2', kbd : '', categ : 'volumetric', short : 'stream lines', long : 'Load an existing structured grid and draw the streamlines of a velocity field', imgsrc: 'images/volumetric/56964001-9145a500-6b5a-11e9-935b-1b2425bd7dd2.png', }, { pyname: 'streamlines4', kbd : '', categ : 'volumetric', short : 'stream lines in 2d', long : 'Draw the streamlines of a 2D vector field', imgsrc: 'images/volumetric/81459343-b9210d00-919f-11ea-846c-152d62cba06e.png', }, { pyname: 'office', kbd : '', categ : 'volumetric', short : 'stream tubes airflow', long : 'Stream tubes airflow in an office with ventilation and a burning cigarette', imgsrc: 'images/volumetric/56964003-9145a500-6b5a-11e9-9d9e-9736d90e1900.png', }, { pyname: 'streamlines3', kbd : '', categ : 'volumetric', short : 'OpenFOAM cavity', long : 'Draw streamlines for the cavity case from the '+insertLink('OpenFOAM tutorial','cfd.direct/openfoam/user-guide/v6-cavity'), imgsrc: 'images/volumetric/streamlines3.png', }, { pyname: 'tensors', kbd : '', categ : 'volumetric', short : 'tensors', long : 'Visualize stress tensors as oriented ellipsoids', imgsrc: 'images/volumetric/tensors.png', }, { pyname: 'multiscalars', kbd : '', categ : 'volumetric', short : 'scalar channels', long : 'Extract one scalar channel from a volumetric dataset with multiple scalars associated to each voxel', imgsrc: 'images/volumetric/multiscalars.png', }, { pyname: 'lowpassfilter', kbd : '', categ : 'volumetric', short : 'low-pass filter', long : 'High frequencies of the Fourier Transform are cut off in a volumetric dataset', imgsrc: 'images/volumetric/lowpassfilter.png', }, { pyname: 'erode_dilate', kbd : '', categ : 'volumetric', short : 'erode and dilate', long : 'Erode or dilate a Volume by replacing a voxel with the max/min over an ellipsoidal neighborhood', imgsrc: 'images/volumetric/erode_dilate.png', }, { pyname: 'mesh2volume', kbd : '', categ : 'volumetric', short : 'binarize a volume', long : 'Build a volume from a mesh where the inside voxels are set to 1 and the outside voxels are set to 0', imgsrc: 'images/volumetric/mesh2volume.png', }, { pyname: 'probe_points', kbd : '', categ : 'volumetric', short : 'probing points', long : 'Probe a volumetric dataset with a point cloud and plot the intensity values', imgsrc: 'images/volumetric/probePoints.png', }, { pyname: 'probe_line2', kbd : '', categ : 'volumetric', short : 'probing line', long : 'Probe a volumetric dataset with a line and plot the intensity values', imgsrc: 'images/volumetric/probeLine2.png', }, { pyname: 'probe_line1', kbd : '', categ : 'volumetric', short : 'probing lines', long : 'Probe a volumetric dataset with a lines and color-code them', imgsrc: 'images/volumetric/probeLine1.png', }, { pyname: 'slice_plane1', kbd : '', categ : 'volumetric', short : 'probing plane', long : 'Slice/probe a Volume with a simple oriented plane', imgsrc: 'images/volumetric/slicePlane1.gif', }, { pyname: 'slice_plane2', kbd : '', categ : 'volumetric', short : 'probing planes', long : 'Slice/probe a Volume with multiple planes. Make low values of the scalar completely transparent', imgsrc: 'images/volumetric/slicePlane2.png', }, { pyname: 'slice_plane3', kbd : '', categ : 'volumetric', short : 'interactive probing', long : 'Slice/probe a Volume interactively.', imgsrc: 'images/volumetric/slicePlane3.jpg', }, { pyname: 'slab_vol', kbd : '', categ : 'volumetric', short : 'slice a slab', long : 'Average intensity over a thick "slab" of a Volume.', imgsrc: 'images/volumetric/slab_vol.jpg', }, { pyname: 'slice_mesh', kbd : '', categ : 'volumetric', short : 'probing mesh', long : 'Slice/probe a Volume with a polygonal mesh', imgsrc: 'images/volumetric/sliceMesh.png', }, { pyname: 'delaunay3d', kbd : '', categ : 'volumetric', short : 'delaunay 3d', long : 'Use Delaunay algorithm to generate a tetrahedral mesh of a convex surface', imgsrc: 'images/volumetric/delaunay3d.png', }, { pyname: 'tetralize_surface', kbd : 'tetralize', categ : 'volumetric', short : 'tetralize any surface', long : 'Generate a tetrahedral mesh from an arbitrary closed polygonal surface', imgsrc: 'images/volumetric/tetralize_surface.jpg', }, { pyname: 'tet_threshold', kbd : '', categ : 'volumetric', short : 'tetmesh thresholding', long : 'Threshold a tetrahedral mesh using a scalar array', imgsrc: 'images/volumetric/82767103-2500a800-9e25-11ea-8506-e583e8ec4b01.jpg', }, { pyname: 'tet_cut1', kbd : '', categ : 'volumetric', short : 'tetmesh cutting', long : 'Cut a tetrahedral mesh with an arbitrary polygonal mesh', imgsrc: 'images/volumetric/82767107-2631d500-9e25-11ea-967c-42558f98f721.jpg', }, { pyname: 'tet_isos_slice', kbd : '', categ : 'volumetric', short : 'tetmesh slicing', long : 'Slice a tetrahedral mesh with a plane', imgsrc: 'images/volumetric/tet_isos_slice.png', }, { pyname: 'earth_model', kbd : '', categ : 'volumetric', short : 'earth model', long : 'Customized representation of a tetrahedral mesh of a Earth model', imgsrc: 'images/volumetric/earth_model.jpg', }, { pyname: 'ugrid2', kbd : '', categ : 'volumetric', short: 'unstructured grids', long : 'Cut an unstructured grid with a plane', imgsrc: 'images/volumetric/ugrid2.png', }, { pyname: 'image_rgba', kbd : '', categ : 'volumetric', short : 'numpy to image', long : 'Create an image from a numpy array containing an alpha channel for opacity', imgsrc: 'images/volumetric/image_rgba.png', }, { pyname: 'image_false_colors', kbd : '', categ : 'volumetric', short : 'image false colors', long : 'Generate the Mandelbrot set as a color-mapped Picture object', imgsrc: 'images/volumetric/image_false_colors.png', }, { pyname: 'image_to_mesh', kbd : '', categ : 'volumetric', short : 'image to mesh', long : 'Transform a normal jpg/png picture into a polygonal mesh or threshold it', imgsrc: 'images/volumetric/image_to_mesh.jpg', }, { pyname: 'image_probe', kbd : '', categ : 'volumetric', short: 'probe image pixels', long : 'Probe image intensities along a set of lines', imgsrc: 'images/volumetric/image_probe.jpg', }, { pyname: 'image_fft', kbd : '', categ : 'volumetric', short : '2d fourier transform', long : 'Perform 2D Fast Fourier Transform of an image', imgsrc: 'images/volumetric/image_fft.png', }, /////////////////////////////////////////////////////////////////////////////////// simulations { pyname: 'spline_ease', kbd : '', categ : 'simulations', short : 'spline with easing', long : 'Spline a set of points to form a line of given resolution. Control point density to create an'+insertLink('easing','easings.net')+'effect.', imgsrc: 'images/simulations/spline_ease.gif', }, { pyname: 'trail', kbd : '', categ : 'simulations', short : 'add a trailing line', long : 'Add a trailing line to a moving object', imgsrc: 'images/simulations/trail.gif', }, { pyname: 'airplane2', kbd : '', categ : 'simulations', short : 'airplanes', long : 'Draw the shadow and trailing lines of two objects moving', imgsrc: 'images/simulations/57341963-b8910900-713c-11e9-898a-84b6d3712bce.gif', }, { pyname: 'aspring1', kbd : 'spring1', categ : 'simulations', short : 'dumped spring motion', long : 'Simulation of a block connected to a spring in a viscous medium', imgsrc: 'images/simulations/50738955-7e891800-11d9-11e9-85cd-02bd4f3f13ea.gif', }, { pyname: 'mag_field1', kbd : '', categ : 'simulations', short : 'biot-savart law', long : 'Drag points to compute and visualize the magnetic field generated by a wire', imgsrc: 'images/simulations/mag_field.png', }, { pyname: 'grayscott', kbd : '', categ : 'simulations', short : 'reaction-diffusion', long : 'Turing system of reaction-diffusion between two molecules:
the'+insertLink('Gray-Scott','mrob.com/pub/comp/xmorphia/index.html')+'model.', imgsrc: 'images/simulations/grayscott.gif', }, { pyname: 'doubleslit', kbd : '', categ : 'simulations', short : 'the double slit exp.', long : 'Simulation of the double slit experiment. Any number of slits of any geometry can be simulated', imgsrc: 'images/simulations/96374703-86c70300-1174-11eb-9bfb-431a1ae5346d.png', }, { pyname: 'tunnelling1', kbd : '', categ : 'simulations', short : 'quantum tunneling', long : 'Quantum Tunneling effect using 4th order Runge-Kutta method with arbitrary potential shape', imgsrc: 'images/simulations/96375030-e0c8c800-1176-11eb-8fde-83a65de41330.gif', }, { pyname: 'tunnelling2', kbd : '', categ : 'simulations', short : 'quantum grid', long : 'Evolution of a particle in a box hitting a potential barrier of sinusoidal shape', imgsrc: 'images/simulations/tunneling2.gif', }, { pyname: 'particle_simulator', kbd : 'particle_sim', categ : 'simulations', short : 'particle scattering', long : 'Rutherford scattering. Simulate interacting charged particles in 3D space', imgsrc: 'images/simulations/50738891-db380300-11d8-11e9-84c2-0f55be7228f1.gif', }, { pyname: 'lorenz', kbd : '', categ : 'simulations', short : 'Lorenz attractor', long : 'The most classic'+insertLink('Lorenz attractor','en.wikipedia.org/wiki/Lorenz_system'), imgsrc: 'images/simulations/lorenz.png', }, { pyname: 'fourier_epicycles', kbd : 'epicycles', categ : 'simulations', short : 'fourier epicycles', long : 'Fourier reconstruction of a 2D shape showing the '+insertLink('epicycle components','thecodingtrain.com/CodingChallenges/130.2-fourier-transform-drawing.html'), imgsrc: 'images/simulations/fourier_epicycles.gif', }, { pyname: 'pendulum_ode', kbd : '', categ : 'simulations', short : 'double pendulum in 2d', long : 'Simulation of a composite pendulum by solving the corresponding set of ODE', imgsrc: 'images/simulations/pendulum_ode.gif', }, { pyname: 'pendulum_3d', kbd : '', categ : 'simulations', short : 'double pendulum in 3d', long : 'Simulation of a '+ insertLink('composite pendulum','www.youtube.com/watch?v=MtG9cueB548') +' with lagrangian mechanics in 3D', imgsrc: 'images/simulations/pendulum_3d.gif', }, { pyname: 'multiple_pendulum', kbd : '', categ : 'simulations', short : 'multiple pendulum', long : 'Multiple pendulum simulation by simple Euler integration', imgsrc: 'images/simulations/multiple_pendulum.gif', }, { pyname: 'gyroscope1', kbd : '', categ : 'simulations', short : 'hanging gyroscope', long : 'Simulation of a gyroscope hanging from a spring', imgsrc: 'images/simulations/39766016-85c1c1d6-52e3-11e8-8575-d167b7ce5217.gif', }, { pyname: 'wave_equation1d', kbd : '', categ : 'simulations', short : 'coupled oscillators', long : 'Simulate a set of coupled oscillators to compare two integration schemes: Euler vs. Runge-Kutta4', imgsrc: 'images/simulations/39360796-ea5f9ef0-4a1f-11e8-85cb-f3e21072c7d5.gif', }, { pyname: 'wave_equation2d', kbd : '', categ : 'simulations', short : '2d waves', long : 'Solve the 2D wave equation using finite differences and forward Euler method', imgsrc: 'images/simulations/wave2d.gif', }, { pyname: 'brownian2d', kbd : '', categ : 'simulations', short : 'brownian motion', long : 'Motion of a big brownian particle in a swarm of small particles in 2D', imgsrc: 'images/simulations/50738948-73ce8300-11d9-11e9-8ef6-fc4f64c4a9ce.gif', }, { pyname: 'gas', kbd : '', categ : 'simulations', short : 'gas in a toroidal tank', long : 'A model of an ideal gas with hard-sphere collisions', imgsrc: 'images/simulations//50738954-7e891800-11d9-11e9-95aa-67c92ca6476b.gif', }, { pyname: 'volterra', kbd : '', categ : 'simulations', short : 'lotka-volterra model', long : 'The Lotka-Volterra model where: x is the number of preys and y the number of predators', imgsrc: 'images/simulations/volterra.png', }, { pyname: 'drag_chain', kbd : '', categ : 'simulations', short : 'forward kinematics', long : 'Move the mouse over a 3D surface to drag the chain of rigid segments', imgsrc: 'images/simulations/drag_chain.gif', }, { pyname: 'optics_main2', kbd : '', categ : 'simulations', short : 'optics simulation', long : 'Simulation of an optical system with lenses of arbitrary shapes and orientations', imgsrc: 'images/simulations/optics_main2.png', }, { pyname: 'optics_main3', kbd : '', categ : 'simulations', short : 'the butterfly effect', long : 'The '+insertLink('butterfly effect','www.youtube.com/watch?v=kBow0kTVn3s')+' with cylindrical mirrors, a laser and a photon detector', imgsrc: 'images/simulations/optics_main3.gif', }, { pyname: 'self_org_maps2d', kbd : 'org_maps2d', categ : 'simulations', short : 'self organizing maps', long : 'Self organizing maps'+insertLink('(SOM):','en.wikipedia.org/wiki/Self-organizing_map')+'a type of artificial neural network trained by unsupervised learning', imgsrc: 'images/simulations/self_org_maps2d.gif', }, { pyname: 'value_iteration', kbd : 'value_iter', categ : 'simulations', short : 'solve a random maze', long : 'Solve a random maze with Markovian Decision Process'+insertLink('(MDP)','en.wikipedia.org/wiki/Markov_decision_process'), imgsrc: 'images/simulations/value_iteration.png', }, /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// plotting /////////////////////////////////////////////////////////// { pyname: 'earthquake_browser', kbd : 'earthquake', categ : 'plotting', short : "earthquake browser", long : 'Visualize magnitude 2.5+ earthquakes in the past 30 days via a slider. Areas are proportional to energy release', imgsrc: 'images/pyplot/earthquake_browser.jpg', }, { pyname: 'caption', kbd : '', categ : 'plotting', short : 'add 2d captions', long : 'Attach a 2D caption to an object and use Chinese, Japanese and Russian fonts', imgsrc: 'images/pyplot/caption.png', }, { pyname: 'fonts3d', kbd : '', categ : 'plotting', short : 'polygonal 3d fonts', long : 'Visualize all available 2D and 3D polygonal fonts (check for more '+insertLink('here','vedo.embl.es/fonts')+')', imgsrc: 'images/pyplot/fonts3d.png', }, { pyname: 'latex', kbd : '', categ : 'plotting', short : 'latex formulas', long : 'Generate an expression image from standard Latex syntax', imgsrc: 'images/pyplot/latex.png', }, { pyname: 'custom_axes1', kbd : '', categ : 'plotting', short : 'customize axes', long : 'Create customized axes with more than 40 paramenter options', imgsrc: 'images/pyplot/customAxes1.png', }, { pyname: 'custom_axes2', kbd : '', categ : 'plotting', short : 'invert axes', long : 'Shift and invert axes direction and labels', imgsrc: 'images/pyplot/customAxes2.png', }, { pyname: 'custom_axes3', kbd : '', categ : 'plotting', short : 'shift axis planes', long : 'Cartesian planes can be displaced from their lower-range default positions', imgsrc: 'images/pyplot/customAxes3.png', }, { pyname: 'custom_axes4', kbd : '', categ : 'plotting', short : 'axes for all', long : 'Create individual axes for each object in a scene. Access any element to change its size and color', imgsrc: 'images/pyplot/customIndividualAxes.png', }, { pyname: 'markpoint', kbd : '', categ : 'plotting', short : 'follow the camera', long : 'Lock an object orientation to constantly face the scene camera', imgsrc: 'images/pyplot/markpoint.jpg', }, { pyname: 'scatter2', kbd : '', categ : 'plotting', short : 'variable marker sizes', long : 'A scatter plot with marker size proportional to sin(2x) red level proportional to cos(2x)', imgsrc: 'images/pyplot/scatter2.png', }, { pyname: 'scatter3', kbd : '', categ : 'plotting', short : 'scatter plot', long : 'Create a scatter plot to overlay three different distributions of points', imgsrc: 'images/pyplot/scatter3.png', }, { pyname: 'plot_errbars', kbd : '', categ : 'plotting', short : 'plot styles', long : 'Superpose 1D plots with different line and marker styles', imgsrc: 'images/pyplot/plot_errbars.png', }, { pyname: 'plot_pip', kbd : '', categ : 'plotting', short : 'picture in picture', long : 'Picture in picture plotting', imgsrc: 'images/pyplot/plot_pip.png', }, { pyname: 'fit_polynomial1', kbd : '', categ : 'plotting', short : 'linear fit', long : 'Linear fitting. Use a MonteCarlo + boostrap technique to obtain correct errors and error bands', imgsrc: 'images/pyplot/fitPolynomial1.png', }, { pyname: 'fit_polynomial2', kbd : '', categ : 'plotting', short : 'fit data w/ error bars', long : 'Polynomial fitting. Use a MonteCarlo + boostrap technique to obtain correct errors and error bands', imgsrc: 'images/pyplot/fitPolynomial2.png', }, { pyname: 'fit_erf', kbd : '', categ : 'plotting', short : 'fit data w/ error bars', long : 'Fit data with error bars to a custom function. Add labels to the figure.', imgsrc: 'images/pyplot/fit_erf.png', }, { pyname: 'fit_curve1', kbd : '', categ : 'plotting', short : 'fit data w/ error bars', long : 'Fitting a curve to a dataset. Add a legend to the figure.', imgsrc: 'images/pyplot/fit_curve.png', }, { pyname: 'plot_errband', kbd : 'errband', categ : 'plotting', short : 'line with error bands', long : 'Plotting continuous functions with known error bands', imgsrc: 'images/pyplot/plot_errband.png', }, { pyname: 'plot_extra_yaxis', kbd : 'extra_yaxis', categ : 'plotting', short : 'extra y-axis', long : 'Add a secondary y-axis for units conversion to a plot and embed it in the 3D world coords system', imgsrc: 'images/pyplot/plot_extra_yaxis.png', }, { pyname: 'fit_circle', kbd : '', categ : 'plotting', short : 'fit circles in 3d', long : 'Fast, analytic fitting of a circle in 3D. Compute the signed curvature of a curve in space.', imgsrc: 'images/pyplot/fitCircle.png', }, { pyname: 'lines_intersect', kbd : '', categ : 'plotting', short : 'coplanar intersections', long : 'Find the intersection points of two coplanar lines', imgsrc: 'images/pyplot/lines_intersect.png', }, { pyname: 'intersect2d', kbd : '', categ : 'plotting', short : 'intersect triangles', long : 'Find the overlapping area of 2 triangles', imgsrc: 'images/pyplot/intersect2d.png', }, { pyname: 'explore5d', kbd : '', categ : 'plotting', short : 'point cloud analysis', long : 'Read a data from ascii file and make a simple analysis visualizing 3 of the 5 dimensions of the dataset', imgsrc: 'images/pyplot/explore5d.png', }, { pyname: 'plot_density2d', kbd : 'density2d', categ : 'plotting', short : 'density plot in 2d', long : 'Density plot from a distribution of points in 2D', imgsrc: 'images/pyplot/plot_density2d.png', }, { pyname: 'plot_density3d', kbd : 'density3d', categ : 'plotting', short : 'density plot in 3d', long : 'A volumetric density plot from a distribution of points in 3D', imgsrc: 'images/pyplot/plot_density3d.png', }, { pyname: 'plot_density4d', kbd : 'density4d', categ : 'plotting', short : 'density plot in 4d', long : 'Plot the time evolution of a density field in space', imgsrc: 'images/pyplot/plot_density4d.gif', }, { pyname: 'goniometer', kbd : '', categ : 'plotting', short : 'goniometer', long : 'A 3D-ruler axis style, a vignette and a goniometer', imgsrc: 'images/pyplot/goniometer.png', }, { pyname: 'graph_network', kbd : '', categ : 'plotting', short : 'graph network', long : 'Optimize and visualize a 2D/3D network with its properties', imgsrc: 'images/pyplot/graph_network.png', }, { pyname: 'graph_lineage', kbd : '', categ : 'plotting', short : 'lineage graph', long : 'Generate a lineage graph of cell divisions', imgsrc: 'images/pyplot/graph_lineage.png', }, { pyname: 'plot_fxy1', kbd : 'fxy1', categ : 'plotting', short : 'plot real/complex func.', long : 'Draw z = f(x,y) surface specified as a string or as a reference to an external function.', imgsrc: 'images/pyplot/plot_fxy.png', }, { pyname: 'plot_fxy2', kbd : 'fxy2', categ : 'plotting', short : 'plot real/complex func.', long : 'Draw z = f(x,y) surface specified as a string or as a reference to an external function.', imgsrc: 'images/pyplot/plot_fxy2.jpg', }, { pyname: 'isolines', kbd : '', categ : 'plotting', short : 'isolines and gradients', long : 'Draw the isolines and isobands of a scalar field on a surface. Compute the gradient of the field.' , imgsrc: 'images/pyplot/isolines.png', }, { pyname: 'histo_1d_b', kbd : '', categ : 'plotting', short : 'simple 1d histogram', long : 'Create and overlay a simple 1D histogram with error bars', imgsrc: 'images/pyplot/histo_1D.png', }, { pyname: 'histo_gauss', kbd : '', categ : 'plotting', short : 'histograms and curves', long : 'Create and overlay a simple 1D histogram with fitting curves', imgsrc: 'images/pyplot/histo_gauss.png', }, { pyname: 'histo_pca', kbd : '', categ : 'plotting', short : 'histogram along axis', long : '1D histogram of a distribution along a PCA axis', imgsrc: 'images/pyplot/histo_pca.png', }, { pyname: 'plot_bars', kbd : '', categ : 'plotting', short : 'bar plot style', long : 'A bar-style plot. Useful to plot categories.', imgsrc: 'images/pyplot/plot_bars.png', }, { pyname: 'histo_2d_a', kbd : '', categ : 'plotting', short : 'histogram in 2d', long : 'Histogram of two independent variables', imgsrc: 'images/pyplot/histo_2D.png', }, { pyname: 'np_matrix', kbd : 'matrix', categ : 'plotting', short : 'plot numpy arrays', long : 'Visualize a numpy array, or a categorical 2D scalar', imgsrc: 'images/pyplot/np_matrix.png', }, { pyname: 'histo_hexagonal', kbd : 'hexagonal', categ : 'plotting', short : 'histogram in 2d', long : 'Histogram of 2 independent variables in hexagonal shaped bins', imgsrc: 'images/pyplot/histo_hexagonal.png', }, { pyname: 'histo_3d', kbd : '', categ : 'plotting', short : 'histogram in 3d', long : 'Histogram of 3 independent variables', imgsrc: 'images/pyplot/histo_3D.png', }, { pyname: 'plot_hexcells', kbd : 'plot_hex', categ : 'plotting', short : 'hex bar plot', long : 'Plotting of 2 independent variables in hexagonal shaped bars', imgsrc: 'images/pyplot/plot_hexcells.png', }, { pyname: 'plot_spheric', kbd : '', categ : 'plotting', short : 'spherical coords plot', long : 'Surface plotting in spherical coordinates. Spherical harmonic function is Y(l=2, m=0)', imgsrc: 'images/pyplot/plot_spheric.png', }, { pyname: 'quiver', kbd : '', categ : 'plotting', short : 'quiver plot', long : 'A simple quiver-style plot', imgsrc: 'images/pyplot/quiver.png', }, { pyname: 'plot_stream', kbd : '', categ : 'plotting', short : 'stream lines', long : 'Plot streamlines of the 2D field starting from a given set of seeding points ', imgsrc: 'images/pyplot/plot_stream.png', }, { pyname: 'histo_violin', kbd : '', categ : 'plotting', short : 'violin style', long : 'A "violin" style plot of a few well known statistical distributions', imgsrc: 'images/pyplot/histo_violin.png', }, { pyname: 'whiskers', kbd : '', categ : 'plotting', short : 'whisker-style plot', long : 'Whisker-style plot with quantiles indication (horizontal line shows the mean value)', imgsrc: 'images/pyplot/whiskers.png', }, { pyname: 'anim_lines', kbd : '', categ : 'plotting', short : 'temporal data plot', long : 'Animated plot showing the evolution of multiple temporal data sets', imgsrc: 'images/pyplot/anim_lines.gif', }, { pyname: 'triangulate2d', kbd : '', categ : 'plotting', short : 'triangulate areas', long : 'Triangulate arbitrary line contours in 2D. The contours may be concave and even contain holes', imgsrc: 'images/pyplot/triangulate2d.png', }, { pyname: 'donut', kbd : '', categ : 'plotting', short : 'donut plot', long : 'Create a "donut"-style plot with labels', imgsrc: 'images/pyplot/donut.png', }, { pyname: 'plot_polar', kbd : '', categ : 'plotting', short : 'splined polar plot', long : 'Create a polar function plot with optional splining of the coordinates.', imgsrc: 'images/pyplot/plot_polar.png', }, { pyname: 'histo_polar', kbd : '', categ : 'plotting', short : 'polar histogram', long : 'Create a polar histogram with error bars and/or color mapping', imgsrc: 'images/pyplot/histo_polar.png', }, { pyname: 'histo_spheric', kbd : '', categ : 'plotting', short : 'spherical histogram', long : 'Create a polar histogram with elevation and/or color mapping', imgsrc: 'images/pyplot/histo_spheric.png', }, /////////////////////////////////////////////////other { pyname: 'make_video', kbd : '', categ : 'other', short : 'video shooting', long : 'Make a video by setting a sequence of camera positions or by adding individual frames', imgsrc: 'images/other/makeVideo.gif', }, { pyname: 'clone2d', kbd : '', categ : 'other', short : '2D clone copies', long : 'Make a static 2D copy of a 3D mesh and place it anywhere in the rendering window', imgsrc: 'images/other/clone2d.png', }, { pyname: 'inset', kbd : '', categ : 'other', short : 'inset rendering', long : 'Render meshes and other custom objects into inset frames (which can optionally be dragged)', imgsrc: 'images/other/inset.png', }, { pyname: 'flag_labels1', kbd : '', categ : 'other', short : 'add flags to objects', long : 'Add a flag-style label and/or add a flagpole indicator which can follow the camera', imgsrc: 'images/other/flag_labels.png', }, { pyname: 'flag_labels2', kbd : '', categ : 'other', short : 'add flags to objects', long : 'Add a flag-post style indicator which can follow the camera', imgsrc: 'images/other/flag_labels2.png', }, { pyname: 'qt_window2', kbd : '', categ : 'other', short : 'Qt toolkit', long : 'A minimal example of how to embed a rendering window into a '+insertLink('Qt','www.qt.io/')+'application', imgsrc: 'images/other/qt_window2.png', }, { pyname: 'spherical_harmonics1', kbd : 'harmonics1', categ : 'other', short : 'spherical harmonics', long : 'Expand and reconstruct any surface (here a simple box) into'+insertLink('spherical harmonics','en.wikipedia.org/wiki/Spherical_harmonics')+'with'+insertLink('SHTOOLS','shtools.oca.eu/shtools/public/index.html') , imgsrc: 'images/other/spherical_harmonics1.png', }, { pyname: 'ellipt_fourier_desc', kbd : 'harmonics1', categ : 'other', short : 'elliptic fourier', long : 'Reconstruct a line with '+insertLink('Elliptic Fourier Descriptors','github.com/hbldh/pyefd'), imgsrc: 'images/other/ellipt_fourier_desc.png', }, { pyname: 'nevergrad_opt', kbd : '', categ : 'other', short : 'nevergrad library', long : 'Visulization of a 2D minimization problem solved by '+insertLink('nevergrad','github.com/facebookresearch/nevergrad') , imgsrc: 'images/other/nevergrad_opt.png', }, { pyname: 'iminuit1', kbd : '', categ : 'other', short : 'iminuit library', long : 'Visulization of a 3D minimization problem solved by '+insertLink('iminuit','github.com/scikit-hep/iminuit') , imgsrc: 'images/other/iminuit1.jpg', }, { pyname: 'trimesh/section', kbd : 'section', categ : 'other', short : 'trimesh library', long : 'Section of a model showing how to interface vedo to the'+insertLink('trimesh library','github.com/mikedh/trimesh'), imgsrc: 'images/other/section.png', }, { pyname: 'meshio_read', kbd : '', categ : 'other', short : 'meshio library', long : 'Interface vedo to the'+insertLink('meshio library','github.com/nschloe/meshio'), imgsrc: 'images/other/meshio_read.png', }, { pyname: 'pymeshlab1', kbd : '', categ : 'other', short : 'pymeshlab library', long : 'Use vedo with the'+insertLink('pymeshlab library','github.com/cnr-isti-vclab/PyMeshLab'), imgsrc: 'images/other/pymeshlab1.jpg', }, { pyname: 'madcad1', kbd : '', categ : 'other', short : 'pymadcad library', long : 'Use vedo with the'+insertLink('madcad library','pymadcad.readthedocs.io/en/latest/index.html'), imgsrc: 'images/other/madcad1.png', }, { pyname: 'pygeodesic1', kbd : '', categ : 'other', short : 'pygeodesic library', long : 'Compute geodesic distance between any points on a surface with the'+insertLink('pygeodesic library','github.com/mhogg/pygeodesic'), imgsrc: 'images/other/pygeodesic1.jpg', }, { pyname: 'pygmsh_cut', kbd : 'pygmsh', categ : 'other', short : 'pygmsh library', long : 'Use vedo with the'+insertLink('pygmsh library','github.com/nschloe/pygmsh'), imgsrc: 'images/other/pygmsh_cut.png', }, { pyname: 'tetgen1', kbd : '', categ : 'other', short : 'tetgenpy library', long : 'Interface vedo to the'+insertLink('tetgenpy','github.com/tataratat/tetgenpy')+'library to create tetrahedral meshes.', imgsrc: 'images/other/tetgen1.png', }, { pyname: 'remesh_ACVD', kbd : 'acvd', categ : 'other', short : 'pyvista library', long : 'Interface vedo to the'+insertLink('pyvista','github.com/pyvista/pyvista')+'and'+insertLink('pyacvd', 'github.com/akaszynski/pyacvd')+'libraries.', imgsrc: 'images/other/remesh_ACVD.png', }, { pyname: 'fast_simpl', kbd : '', categ : 'other', short : 'fast mesh decimation', long : 'Use the'+insertLink('fast-simplification','github.com/pyvista/fast-simplification')+'lib to decimate a mesh and transfer data defined on the original vertices.', imgsrc: 'images/other/fast_decim.jpg', }, { pyname: 'napari1', kbd : '', categ : 'other', short : 'napari library', long : 'Visualize a vedo mesh in the '+insertLink('napari','napari.org/')+' image viewer. Check out also the '+insertLink('napari-vedo plugin','github.com/jo-mueller/napari-vedo-bridge')+'for napari.', imgsrc: 'images/other/napari1.png', }, { pyname: 'magic-class1', kbd : '', categ : 'other', short : 'magic-class library', long : 'Visualize objects using the '+insertLink('magic-class','github.com/hanjinliu/magic-class')+' library.', imgsrc: 'images/other/magic-class1.png', }, { pyname: 'dolfin/elasticity2', kbd : '', categ : 'other', short : 'hyperelastic model', long : 'Model deformation of an (hyper)elastic with '+insertLink('FEniCS','fenicsproject.org'), imgsrc: 'images/other/ex06_elasticity2.png', }, { pyname: 'dolfin/elastodynamics', kbd : 'elastodynamics', categ : 'other', short : 'elasto-dynamics', long : 'Time-integration of the elastodynamics equation with '+insertLink('FEniCS','fenicsproject.org'), imgsrc: 'images/other/elastodynamics.gif', }, { pyname: 'dolfin/awefem', kbd : 'awefem', categ : 'other', short : '2D wave equation', long : 'Solve the constant velocity scalar wave equation in an arbitrary number of dimensions using '+insertLink('FEniCS','fenicsproject.org'), imgsrc: 'images/feats/fenics1.gif', }, { pyname: 'dolfin/heatconv', kbd : 'heatconv', categ : 'other', short : 'heat equation', long : 'Heat equation in a moving media with '+insertLink('FEniCS','fenicsproject.org'), imgsrc: 'images/other/heatconv.gif', }, { pyname: 'icon', kbd : '', categ : 'other', short : 'icons and logos', long : 'Make a icon to indicate orientation and place it in one of the 4 corners within the same renderer', imgsrc: 'images/other/icon.png', }, ]; vedo-2025.5.3/docs/fontlist.png000066400000000000000000005475631474667405700162550ustar00rootroot00000000000000PNG  IHDR`ksBIT|dtEXtSoftwaregnome-screenshot> IDATxy|T&32 1k@ ?jTP>"jq ZSZRZoUPjXR@ٷ$#!a͝89wL2ǃι瞻yᢋ.@AADJAA m  HhAAD@B   $\H  H5|raƌz8Q@(:B!$c%.QS.$msssR  H 4444࣏>J;n;m].W:΄MKKKxdNp8n'n2cTۉU9C-j[{nUFc]W`0 ,ځ@ iq ^Dw D.Fc2-2߮#'m2XW]d52 !՚DFl!Q&yFnO]2;l4vU40ٶhTXWWw! Q\q1;x_ ',ذw=~xIc/xRi xz'0:ovΫ|-pSbDQE~N10!QC FsƮJMMvDݻ76oތ7&vH.+Pм\{E-r ۾{祜HN Ǝ-19pU nn;v g@F#*LӦlsæ"Ǝ<NG˕GSr{yW5"/שˏ5- JmU,~%@iLAAtݞTL{tXhC%ll֬/?ͮǽhwRol:nOv)d^EZDܜ肋xmx*fTgiIlܮsx#g]3t v=xգuʮv-7Ol0O R'#xI@Yi%F kx(69!v<ڱ^$x2sf#1#WjUKꑗsN3}8W5&圄1Mzpqyo`<ӹ(3!!D zp* ϰKG ?'tYdDFN铥lmΚ:y |5XD)*Z0uR"&"!B z$p8}WՕS=(*)M]sg:(GςU Aqxs)S{5<~dS(^Q+W>YK^Ú'M8ןGɟ=r]l,@n1W"l,sA34i](gM `/5 uFyj 唗sބiWViۯo$b())ӌ{~S;o ,I X1euj2d2[O:=We?soI|sd7>쬐6%a,jjd8u8X}ͫha-h X50<;JOh_73ez%b^E Eis.Ӫ*Z૱iެ/W\D^11+)#QO?$;,',v RfK`$%ʡW;˘.)cG°*/ |5+j,]tHSYCT#7~ %E8xȩjo~_{NpP}٫ˡOVT@w=Bo>|X>#Ʀ15ҒNLAB3_Ś%4Xe<;΋)_昦|`yYsf5 ecwӯjDvV{+]իϞdt^E M $O2|߿KnGVODq;}s*Zp7U@ϲW}8fC,b690,3*Z0~t hRqY=dY܅a:Ł'Ϛq#cWO<ϖžo=6c]p{?'9۾+--p&^u}W5όU*D%aPVZ/QUO?xC RxX~Q󐫺 oZ̚f,BWjL;CĂۛq Q^z?VxUPc}rsn>goہeLyofJ+1v!x,yQ{~y:(:30g.sC7a](+o؊i,{Շ?78Y?nzIO?x^Oʟ^Í?di5L?rNgAyYOsKr|\s<V~%_RF>,]Yݧ*%D;{F⯄E]}6|4|AYe;m;? i0"Gh]DA'ErUoβ lʄ6mK7l=o7 "S :xEy&TV}6oؤP |k'20ĠS_ΛcT"\/zk<>|Q +Rf*@JX;&ʿ+Fhzm"^jmcӲʸ„_GRGk_e\%ElQ~0o#7^ݼ]v27C=>\ 닟1fnj۽mz*>o5- *cJFIqO$yx|}=h9)T7ī?wKG+Zw'G딟_z:Eu,jDҧ gxZ8 *Fw<A$Gbav$}I's,Yxzsze6+Ț6H^iiauVaxp@$>]D2vӌpr0u{Jvtv\ͮ$ |G :a%=ͮVٺ3$'ӏA~HR6,8_W 9d6A$\0N.;'? h;o`_1%Q+b(:Mۓ$ 4ɌaIpͥ_b~3LL_CږZfO||\}a]s?@t]Ͼ[wo0%ʳB m͸Z{M׏.>A'~|Mf\}LfogCV/%lyNд,surcBoy9d93wiFbbrE9P_U{ڌIb{FKz߬qʳ#:Ġʈ:`$HL65J3^0]R6/ ٽ4@y>實tB/?ue+1w.jwkHal%{G^G4{h D1ת1U>木SĠSs3PyP>9+~#*K%xLǭw/Q#>넳r]Xkˍ0!Wxf9\?wgl"F|qfHcq:D\q.mA'~NbUv̪x2(l?x45sfFJo@Y1 ys ^.G-sKG̃ U//F|>_=AtN_H *kEjEp*ゼ͉9bЉ*\2 /W#Wظea pW~x2KCV"7b) XpEJ@!D*+gGB>PkAh^AcZTs$q1@i#@Nsj꾩ĶݱE3ϯ'Wzsi2;>P"[ksƷ72QO OubvCGiiaω'ӯ1}۱}ns5 $e%=.4E^L^|Y%&Ӱ/ۏGeB+NxcllثYsuͺ"#|{DKCeg!0p[qC:Z|!Q6R>7;~yᙖF"At=SpyP(c9!qK 2Q'LbЃQM3䄪_ę:N䢦_(o.%:V:!Ø5/y0eY].H3s7RVm]&&A<ܾgxo , Qd/}QUS3~u0vb䐈Fx 3N' u5<`Q6l.WO"ENgf"}QX/ E>V4x`P$ܫ]D'`l͛EcF/O0gz\sP5eyz/s*(TrcA(ʔ땉\:ܷ pQq=|~fL`MD]pͽr+WSֲ. h*l2XVLO=#ڔCD6m697?P[wfbڕtͮˍ h C5l5G293Ag'iii)g$uēǜqu{EaS8krB9+S<ԟ/fx#?FpoI"}SEӂy5.jij1jDщM"G-o8~˶hp# yBnv=^~i :SvL ag>>qV{;ݮ& *-3*ɔx2x~>pjУ>^9/z~~M;uShOوE"%cEIJuWG!1҉cE[7*{vx={}U̘3KY&9b{ƜT0wff3܅yxx_"ŢtBD~vA'v{@աXV?sv{>=g4vd;ڃM Di)jcV*^bv RY#l2 T(|O7ĠL?&EW<+wghʫ2 ؑ՘3sA=?繫f̱X{iy2xɭ/jW~~ ﳷQXΗ_n%]|8">xէYFMy oE@mj BN)@|-q{X0&/| jvLFY؅Ue'Se㙇~b8ܮ(/ \m#)M0mVcBϛg\"{ \mW ؑ1E]rC8X6q[ZLJ(op==tM?Z[ŊU5ڳ8O׈r}?̄!ƳVj0YϾJV{ګ|l=P 'rPv`ԤE];#rcHݍ[W{'URz.-ʍl<_rlT+DW0zU%V}l|cGVcHozPv ADt+9Xmo6Cx{8Fc`5SAςzdDPb[CɈ௟%tm?kLlSWoZ}O/ua挸3|+O=V7U9n8Wo\m `wiDpÍj{+b$ZoU }(ڣ~۫;)Dbljsy_{{dP*1b97žنqey ѹL2#e [T^ҡxH {_|5v>`./jiw*_Ak. 6ADhiiIiW)gf<#gWgw|~ISX :B% 5%KxйYD"9R)X09E8v:JݣY؅ /cύm b|Htb;UZW{˥z67uuDCj:7V'NA݉S$Ժ,/ LwkVۼlg]rV}gp9"-ZBAhwXh&NΣLJOMlŸTM|ƃC߲KA4bjK$) 477j'HnG==w Rm-DAAl6IB  8l)/)DryAA:%0ߐ   )l妦K#AAG  8q\SVEә2AAѝHKK~B   z:]%;c8F>}4Uj3&  p8vgن3ޙ]QB3g$  ) Ԅ{?=m,==Yzƈqby,n%qm">Ohe2X tvtHOLw3AF"c30(&᪣+e ,AqGYZ8Q{-+h( AD)N9=ݠ(KHђhH<5,՘`}.QsqhiiIy&PAFKHejXwxĒqTQ z.6I:P(˅δAA455HD,f+5'jĊ荁XSfRkz#aԙ(K 0|FQn()״& n EYRGQ(Yt-]љKw0Zv{m:AANG%!(K0@fffL: m  s12`.ږHAAD6y  NZZiwgE6AA:ڔ:BAAl.)AJm  %##K&  a\.Wڭ&  :%[ZZ`ZS  8deeB (u   "Z,ՊH AAe9ڝڑH.C>N$x.(P/_l:`Z/|AA$@(꒶;-0Ғړs/`Pg["U|O_E(0w.{m-0\9m+6}:Α 2o:tMn`doDXw<%]# H$F%Nh >%aC<7P:Ђwbpik?@܉s6tqfKbh(!$ve 6lEvM4~ x[Jl[P2P.P>ԂwwD"Nar [\ H tvdHN"70է$,,Fq(oi3ev $QӅB] VO""0gl34E[./Jzj{ 8Y^O6e?  ݎ`0%m$up$cfCv+$\;\>F$ 'Z$,e/r%}x@"7w59~r]:@"/ȍ#l76Gpyv%MdGXp=$Y.'/z Y#&v7wG1._+,x*0@@YȂ<%i %"(h.& XXʶl?9En`P bXG*r+ 4ec' u[b}@F eN0H WvIxeWr(j~Mc59(?>} Ch;7l##[/T(Ą\O]jŬ}#1yTEZ C+r\&Ql&4wA s<|13 0RC` J6Nx>2>xsq[n@ٶ<Mf 7'%5j\G[]*F (4Je$l~_sϋe"Txωإ"S9' _Dρ"A.l6[D 9!#$|Mb箚>5wf"[hV))]Y@0nJ +ng+nǵJi HcWqGTL?PlMc,LyQ5m. EnnvvO%ȸ :\[0,G0UV]ļz1j+<4c"' Vy+|KG {ogc\’Q9!m"8ރ{ |'F ^&Ȣ9;%|~s݉%R}]}\yO(fvj {~>f]՞(Es-h KVTd[F G@ |]/4>f ( .టDe)>dѶHOrفIB6DSu L' <>ɢEK߂^m5#wէu0p!ى %'2}mfB y_ЕUNIn?,0myl$q0b\}iDcOCx++dX#1ZCiDc0G:UޟaöZ ?lNeљ%S1j+!}:ÊM*b{a")ہ;D19W-8bn<1is"6[}opB>ؙgzaj2cb46WG}! zc8|q^e w[q2gBQ {zk4QC4-=x,w$k̍r *LCڗ)/F:9/ < lђ& i&_HrS>Aq6JP&_ <8O,0O-~D >=cO=0OH ]C*Ϋ?>$DP-#,gCs!24E^ %hlebP_QL$o4ebH[]4+1{b?!0cRP7հk=c_nxn Jm**oR=UfTw@h@X25FN̋q%[;L=1ɂE_Ѷ-F`ɪQGRA{%Bbx~}*ᢒ7ǹuTyrF籟?أ53+oln_ۤٲBe{^sᨦ/7[lcςuuӏf)SɎ_{))"ju积}o4y<1 La\&": m4`"+-¤>'j_Tǟ+ b r MQ>P#v=wKJܨ|ǚYFj_e?xh1Xpx#+)” ̓1޽V4yj>ܓw%Jf!h3 {?nn_" FOs6~M& j?EF_;Vnʈ>L#T6C^KXd(x[GwW括 }kY^NAq:Yc9f:SǸf |frۃi1% d[ԐkƯ3}(ԕy& u`/1b5mwP(w| E@-nT^2N@ȧU,V|: M{\,)aa #j>Mc,xn0>W_%?G_ls!AT ^ic"Y].#vryja=?SY4uWK_W'Xd]p{Oo˩:) t~Y/Sv7_| ,#_l(^rO';jY>e"kB=JXdA/)!$Fb뫺t%:WC >ᓺRvqX+$\؟cQ5?$g-DɹlRq*SRykr9 0㐧;8|ƞfQKO=C{bw|Bp&/c>7q\}xҭCM.]lDzǎsU ]p[yg)i6VN3 &]C!#QbN}Q m UVVFY/]rx =7O;#s x fԥLDiyHO"(yÖ^m<>ɂ_]n5d3cZ/ ͝Nޫ^]XT^f*{ k }rƿ<}|pf:ry#C.]D~yIz;ъ[$7 ͇x KĽ76.56 u Lg^!j_g{c£{1K-9(| +Z5l1<9{Sb`X4s?})N6 m{ΰj;ʎF4uz9ӗ9ff}۫#ߞ0@0-ّqO8Q,m6spԂw*`[ 8uFyC0/7^%kA;|G̽~}|v5H'ou'roE1k^酣O;!wbxʧ ui5UQC i3|]F Zqf?6;NU;aSٌyeBO=ymq"M6J5jf(pYΪ {t~0u|0̞U(֧{kl>Atze532$<ƲRz\+N$Ò<+|Vx8]a>{ɹ,_Yyp9KfD+* w@=I{SPB ^i6: OoJKL$KB;k~f;"i62rcm{%uޢڶV&cE 3^_~WSESՋaJe|jf/EeF]Y F$8mɷ^[ݶ>7Aa?g=P,|/ܘH?҆Cmy8ݩϾ8yo$7Ŗ&Fc+W\^bQ?Ӓ^84";Н I3.Zg2!54rl8x2&RUxDUQ+.t((ͪqxL(~u hY@zs 4f2&;ߚqqcL@2͆ζC:TlE[-CM.ʈO3( x{)ru oоL_)=zEV|7Y?YƉV( ݒx3ڌ'$D+[I/A$h6*aq^(C NJ>6%E }ҍ}x'yb֚ڔ_F6-`_x[+t> c4{[~m1p/xago=V044ke}3>c;KvDb~Ԕ%;l1.+dy-}ve, mݳ_C(mCr"AtGBP]˝hsMt*PļSHe:%E&7/k$UuU}yZAv*s-јdirEWKX$[h, !2"o?EN; 㷛˜;ъ4&6&xZ[',u\3(u,߫ͫ@:j~T ͊j+[5r\C³"˫%\aݥVSE ̌ 5M`^cX0@#`4:K{ySr̿-oO═c도5"6akg mŽ0CuX ޸X&Uc6^Sr Zz~v> R51*p8[L(CIG~]e/~|M zN{O$ 56l>,i&Sɱf  (`b,u© D# 'Pz~ ,_HMm95UtZ(fcI }-G\wEp+v=^M`s +4 1X\7PceWce6<I6nn+>ewFqac , ;7CE]Ήe%_]yn8J/^eWT+sHXn?g\ '[q2O1Wǰ3b+tF\#KEX0qׂ dKEfmh .ngլ2DRꅋG{;ъ?ͰX3[C UZ\Rs֚b21#B{^ٵ8.Y]>IlljVňM*XSʼ5|~ǩ}t#m" @hI1[fm2MТY/Jx~}poZ٤?`̫9m5'"|9mB/3J>ن'%haa9_S+~@exwjr lD+P*a-J@=ۍ殛iܕ35 ŒwF7Q 0p@hhj$nؗ Rݣ-(-Ȃ(y)*hOuf|$X/Dd(^piP< PRbM ۪l5ueT9ZQ:Ђq!?X,c3+#jx+G= j,O]IeNX%O7[ eJ\j]B'H,&{.ʦ#f0*"G%j[72'H8,铪"bkY_͒[2]2AA}466v>R"CjkkwT40҉?S8N-?Xbe(fX5P  ~$)uBDhjj`K襧k>ƂhF8P~ >]= K  z]_S֋?}C fBZZɑNUT!Y1q@AAlJheHèEeOfQ1Bv K?J$S#AA$KZZZpz" "U-QDҏԆBG>ҏ L,)K!MPR~ԝ)~DqA#A1zzQ{gz]1Ot# ~DDOGy% zt3`Ew4:P=Dy!&X&voxBxD۴?;T7!vyۿMYЊiv,Q#yE,I]6DAw6|نtFG@`cV;#x4Mecז".G?{eWU{Zs/U@[MD1oLkCNsD$@&,gw4j>F<]DO macWFy}yNc|^wGpp4a^)xo`p|6Cq# 7hupmFAY82>9gQSmDqt5"Fp[<&8Y>XjqRW,[2pj\zdDѺ4ԽP(N'MhP6i8 !cd0(=zhC/(^ !BeGOyq8ps٨eO*_4хaCڎVx`"  FrdžQB(=&ɍ' u'=9q#q5bl-\hx1?W{ wOqݯ ub51nW Z4*jU- ,"\h:<`S,Rvb/~nG52i AL<2"ʟNhW&~N? c?6, } |{Ԍnv_(yX<\ä>:C<}]~s>>~o8dx2l=a֌|:F#QNK3ޤ g~2=!]]OO҆j1~;1^.M&RE64Be J[@kР6`2GW 3࣮< 6 G$9*_;Aj ~\Țם'W OIn^&^L,v͚ `Eoq`3§qnxދصj6k79bFGj,)H/Vjun5Bqr v3ڀ/,Xn- aQ9kMƽ)~,wl"ٌBmy΅xÇz[ %00b׋Fa_}DK@dwu8VtI;pM J NGOD*!!M:nP%c"qP\^/E8^Ntԑ&: 7cjgG0/A P@u1jS%su,-A42ч:P c5<7jq㧶eP_7nAD1Nm6M I3s8wue JyjokzJvE&]$Zn.u4jDb.@Sch/<1՗t6cU8qo,< ,{L' ւ)ݸ`?L`ZE i'E< _p_M}H]h"oo Sd7V:בb`/'z02wff$\&ה,BPgb5K@<3l ^3f` ![I;,ru [,RoL #KlH|ixuᆪ]9ڲ $Wkb[OrAš.| +mZ'B\Ʉfqart[ʑo?i@՜`Ĭ/*^͏vOZdd/&-xiCŶ{v_[ABqbF˝Cf<i[zc PF_6沉ɗ&o5<.x2*٥i!BI;rY/8" ?T?i 9&/*A @) S/g".3E} 7y+J>l1x`x`9FuQHh.n#2WRX]֬`b򖇏ֻY6,-$. =@sA@h|ԝk(2ӆ|P0jkn@뮯Dž A熊w\iTawu{"knXD&@sΰō [H~%2j\T8Dž.5cGg P_zM0nh9#lD?FEjɟ޶2SA_ew`__W(.QGD wM1#I.{#=磊)#E;->xzI>){2\-US(8ffJ6&gcj4jb^+8&"wBM۾];vQ q׸K)̟Ydy}`P|?eէRk|JS?\_ RPm}NfCӸ:BBZf^ =sXiM%W\SMZ6 IDATr0yAe J&ZV-փFAK~(ŷM]8l1\{y/tuޠPu:^0I.=[9L8/ u(Kg Q%,L 7k޸(8rawxl<3Q,U?5X^v*iO8q|$]u_>C?b>;3S*É;[Q^iT32Y٩ĹXV8fpx3m8e(7t}D @g\M%H&Y\PlGd^SN,mLu$ݿkuׇrGa 79Ҋ`#0튚N0l17^Hğr8+`saG  [}faG&DD˝z$E|2;z)~hO؛jf (mNs]&?fb-aY#C22b̚$cbM|ͦ5#if̟L).oƵUlˎ$}2ac+/u*^l1rv.'w\#up]Ƌǎ\j&3ޓs8Yk}x_`ibɢp=~Bj/ XQ[[w9oSW-?hK$qjVhM,7;&6xB\ /-k#[<'(Nj9n5ЃH?>hFM\a#aYluuy / @xydCŌ1 %%M9Vo7.,C`寧 sV]gEŁտ:BxЦ,lCo.7yggy.wx2EQ"WOIu5vk8Fy~Z hx+g aj3Pƛi-=S2{ ħ25}S aXWłiX6cX`"  ހMãzL>򊁿%S9vuyq-9̘q?y⟿lf5KV xoZ5@I uZi CZ K,T5QXb)u:i䦅b]$GÍKWh+.:, e$LfSh8V p>\x[m#KXCa# oG49>e"ϝ\lc xm_Lmw4>\p2#"s+z-Vqؾ[ /}lIyJ%T1 +'(AtHnuRM.O彺bukVtܡѺg׵ɖ2X Vc?ьɳ9_qt1Lf䂚gb[:_;Ñm) xIOq@)m&t:tr:֑iܖ}*=|!ί/pǺܖnҾ*6k㖒t"px`_î.S?aT_`_84x X`eb G‰髱)NڇI>ngƬ@V Y>,잨U0S 1"^agA~:pܙ)!y*e^4 R@ +?gaEy=`xZg8F/うR7˼zL>TIbGhZRοYvli :7FޯZ[^bL׮5,)FtHG;k=vP9֌׮0b̒skc 0q(s20abT䅼x6xvN q(>hXknElFɀ~'p`!BqB)EZg& hm95Xڗ}c wP}" F4!6+zC{G4_XZic a2!q_Q )>"fy9J2 ' s813AGn$E_agyh(j b%&0\ oQ 6x:6 sP,_LV6s+A4vd E9l*[x-Q)g,8WGZeap>~g2833,{KkekFaqt_AtS1c뮟 k^#$h>z'XbS [A2\^&t_ws"W__szoV(Q#SFCֿn X11I rB)-{ }Zgx:6AE7뽦{Miu: UqChs:hVr}J[2fؾSy/BRcpqX,7'R[ A3b`RBKn,k7=ᛎf wpO  Vlj-}~Fw;eѢFBV@e}?9|&HK3'm'2['NY1XfP|8ӌn, ]Vr>[~hBP(3 q UK GxL+[,1b5&雞~Ԧ@qZ6߬b;b24 _ B8C0 3;l}\TtFkM7D:Fc9l[50Ra$QxԄ{]#{: /y'h[XD0&,,)^7ﶧmXnOD oz1L#˙`#`UJGF B8UΚ[}XE*:#g\BqOʊ' />,>9+_`*ۀŁZV rZFzpѻӱvŠ<mD[+=!ևݺ$&:^?>]#XQl< 0U4j/Yppx:0 pvŕ6 e, & eQ( řaj vEYѺFACxcb/ AM^Fs3T:Og u LdŊJ¿Y5q~E?Tcwʹ~>  _Dz.ќ$Dd5*~H\'hόq)Q6ᵼ=$"uDAo3ҎWшuώ[/V$YZR:{};0af*fVoV/0)j8/x0j:ebXY1`]IkWCZ[~ݱ٫3ӁM <=%|-wUM,tu8OR@R7` E{X3nb׍b|ԥ9]ǯ != 7h[ =WL8cN <̄2-?*"2(C#(v43۹q}ՌSW WvXIԛ= ţ̡ˎZM_L%t97)VBՠ&bH&,,vt|M{K ս?q\ݚ2Mn-5KBUD<7)CeO#.2&bmՀMǺ {]~[ٟc9j:_ڪ> N8u U7FFv'F/NgT'blllv5+kQ ~!|ж{Hcꄜ̌䅧x#_ rVXŎV Jm$u^#Rd 6iX yelG-񵺬y#+&.s贊+~W:8-$:'фu'Js8|&{ p]d0𔯡Le.~Xk/#=v/ Y;D8r$n `M1l(<r6zbТ/]@b/_hX;aa^Au6f7/([st J<=S m ^74}uo62q]<65žq2X!mۚ`]n/:9G)ٮꔳ=1 5 %;ַ_P.yZ+엄#Y^Sd<2nh5|F5T G%+kI$::|W"F|:,^Ӂ<Ѹ5bh HnjȒvRЎ&X(:F$ j/jAv un[Kv$%a^$$Xx] |y;"R@`qi~ce83./|wz9Y[B("b:[?U;~P㸲FY縹b~灢Ma]].,bv2w,?'F= OGN"1>{t}oecӘUs.qKkCjvIf6-Iw{zݽwm`C3[Z^Pl\]̺0GKZҐ:F7 i5Ph\ IDATG) ۍN0D8vX:_Z(E`78a`|VLh++Fn-S׺/xp~܊racIZ}z,_jXgpBǚ^ jk뉊eߗv9)_p2I^ugb:rjs顬s_߈:*d/VێكK{+6>vBlἇ˻m,/UK{+X^#16TdkNKrHWs*_C) -:֏[uw&l(XAh98ˍ/g-w%]6j:+tTh+N}pX?n;nFB$txn ;o:ڮRe>9q\[`u#׺׮.#]#fY,WgӰDώ"_ 4NLFs)ω½:hyӭ2"_2Ub{G1li9SH\=~C捄ye}(,tj8_Lt ICNKD#[F3Yu( =O Ik{"QZ.]~B+#8T1q/?;>#&aX!,fB+̗Z3[DՉdv=NB .QGֆί+:p2G[ՄL Ȳ.M+#{uGLQIZ`#'sAڞ*qynO\G'5V,d= PjK/VDgw#]]`cXXwѤփƬ:BeRGk'DZCzK{+0niWR:b{ z60k~HJ' ""ž~D=],Fpۘ{DE9R5&m?Mao0I7iXYaoVLs\X82°Wg(#,y}e&[J10H7_'y<}m!E_bfCte84s&epv{rOh4,qX ǨP$,Ԅ]~_dV.%ݫ3+l-ۙ3kQvVߗr[EVS?"lW^k6xkg3>>w%ёh #xdu 0Q$QXےIVcl79`}Ō2q(gcՌq5njLَ[Lӣk8-hm,˂e)i(72'r`<]qtz8 ^mmOȉ":ǵ2_;=>V0 r`|`ƖPEg6M\p`u-n$\t9X[5#ۂCx]A= G RyqcC3Uьsunk~Mc\G pAȋ׈ }]n񻞔u.De:a G ׻DY-Cvy֚6'2ruY\^SG q_}E5`"XP<5!E=&}S &8nw2 Bto٢VcMm} Kecw'< "?bXPlqu=`jGsʣS OQs^,h0)@ߎ*mϼ h j~LXW58`-8J8vIom4J@O@3;6I\, VL ~X»/y59 N Mh,zK3ՁU1 P o#3]/UKV0 WLkiLEh+>܇;+Vs/:pk'F(Җsc , 5Q݄\ϥLM˫y'2fyX傃rm,RX a-/M~ '4> R,J, WY92FͲՁ@F?ߗ2].wPk:ϗa3b/1PԿ[gQ֑3v0wzgW4P/7;w~KbnLJRL-ظ#E4>sTF׍74-s3kvEwD1oR!?k֫ȚpY⺼j`x`w ȓ|_Fu6* Ur n)TPbۋBeXQ@;V^s5R3D6ٌ`Ȫu~˅C8>;n2`,NU{ꋢ7/f@q AݹKGg(kKm8:.4l8DX6h.,79SU/N%!{\qט w] P}QJ48͸)vp;4,Hd p!'maD>;S&J+)qu0A#,Y4|*7U0k_~cbb%`O]tY8aptj m>أ3,h0{s?c̈́Zř`L 0eb4aq@KH&ybmVC]U,= -;w9]V$l = !f^wg| 7pmmKm,&2a'^G!Y/%Zg*ep _dq|xY4|)l =O#gx)xr/B幼R@Q؟v5&̔GgX[bޫiUnՋpdu~~DfSɠHl)`S~G3:DjQ~>!ш#tzmD^Ɍ a}^t2IU+ RoV#7셜`!;|={u>N0z ]pKA0^'ii5tp9^kw!'XZ"\#{liXѐo#6]"k.2X>>Nج`ZT{yg%Vk1=m|vq W^i EN#ϮS$- @+x}B$wŬ}{tnp9#=Vb7RdVM4mc9ߑw>`xNql/:81,{q V"+i昸51 HݮP#}fPHe r@MZ L?7kS60m%gl˸ Q** n%F}l몿~LI`Ƿ煜.$t[dW (1=k66&.4{a3J|9](:QϨ#/k&@h6 q"#Kf41=hw5 Z-)^idh'J4 Ǫsqa59xjAաʪ[bop-!tqI`h΢ŸZ[VV /)dMA! sQb(ύ+F[wiH tlc3Vжm[YGVBsKbrBų`U؎0~k:WL-ßS^[9AKJ|%dK>kX%޴euE"lrx_ xC"nΰ4N(k=j#iԽd$m2r=W6,.M#EVAU}m՟Hx$ vdy,^49A=F$YByLefQ]r8Й) Àm*P(fNeMg(kTn_x?22}25g#͊ihm>N~WQo٫ќ SA f5%[,]?C?/!E*_MOukZwlfIp@s>iQ7KئqL _hKǃ:@Vce#_wVf-51~M.)^%i!i,b)ݫ4:*ǕuDPuq&XFo>&{wDo9>8Sit9XLƳG V=iVFRgL+ke!6\!+|61 %d9QF$Em6dXH?~M0Q}Sі`YОOnڪY81ʐo6=,dϏˢUL@)E:=Y[뛵5) B#AJY5 thE?@ b#P^Y$eG] r kdevq;reg?6ey#gYHd{X?|3\hޙ\8k-Ɍ"-xhcX',߭6>PqDv ugRlq~$;IJ+ BqsXc plQfq"$)nߣ3Ixi GgrwbߟeOx~$BOwN~>P+Msr]y^[RR`||| {P( Eg9Jx3Yۤːbf#}}}q(3rN e,ri |uk'M۶]3sS\ BP(:(rV ljԎg=TS%W( L%5vG[q9UG\uv\hN/VP( J+P.ݳh+ C |%ӁhSBP(`⁷R?99_/+(o~cP( )J+ӿmmg?x\AG/K(~~6,>_VPX S68W( B3_'iGW*lǣx˹{(U/л<{8_:|y -V( B1,(eY¾?5(J0]G83vkcp|l|n>7'n]wà֣4xoBP(NNv3D>)L;ѮVu% G'o?{͜pTF]HA3;1VGD}}0߁S( bߟ}0#Bn b f2'g7ů,Ě~0tw/WoI7[{SjҟLBP(8eY 3Ihɻ IDAT^; Zw_x69ZI":}=_%Uk裂ʉmw26#  8~x>or{,^]fOmNP( řp9:cccLO hE~šfzo9}P\އ3>"n|z/k⍕Gk[_ZCx{5dg p]_{Vg0ޕ[޲A[2X[g,+8w>aw{ABP(Z!me6951=6,smű)G_bȹ5\o8e$Rwi. zP0mTuYJ炻 '5\t}\9Zg Ulk8~ovipSMºZQw>3:g:;A s-믺P\iٞg'0st)) Bhھad\`aUԖ eXwno'nT^ؗhE]9f۴wSWa5/E'y~ǂwpU>HN`i,D 56!I||~w폍c+Y}2;/{WW'{ `7r>-JRna3a59q~3ᒄp$'ppLs䒁d;lvo՛vUJGU*-m}.զ=<%=z6=Xr\.F @e֑7nވT8>M lj0@gF2$ mZDE jb o&0)ԪM5>}?z 9!EcML~gCgTb0?_AqZ?x$L qyڤ" &ohQq׏pDDIDyP֛p$ ~j/I$vf&?zT'7$/8,Ę` @Bu2l*@l8cQuayE"m>$ ɀjgu\fGlw:dt_;W:@ 0Ldz1-#v l'DBd{߆TWY/c poDj/1S:)X׸W6L"Gk,0ZF# Ԫ$RrkM1x9K/:/,sX(ɎƇf3-,jXΛ|bWvF1*~sLNQv\Cz*@#g5&x֢z|ن ZmCҊc@ 2s<ڙLVF{MUedoM6/brK)Y|fL`$@s$C`'LN &lL!a[6,D*Stž$I]6A؟Tfo#<+=J o&*㉋֛ݠ&0³!X^`Me5o=o gߣ?&6ĘAf( sEJ}z.n>Nl"+T,],ufG6lȳՖ:d}Z؟H]HIP@ CӴR{2uDX › p=҆U8)Ms6~w*Zlhu(PZ| o&wh,+]ax6Ah{8$j~s4Ϧho^] j`q 8;fXq]Ь_|=q539>JXT':9!;>+t84JVK{xz&N z& Ep~/Y "W9+ p\X6. Đ`8kHIrBnmB""[t! 4?*V"׏JJ,鳙>˗lDu2tؐzk0{(" { ləz¹`X8ɴ7z$_N40&{8DeM?)Ng5^G4_߆5f]hS)^Kf݌  N37BVO/x Hb}%p" jJd ;lYDנ v.V]ԽتQ rߒ(S"1=$^l* U@%[_Q avm"IP,_}"f T'}H}սgm(Gд^B{i~j́EM6G*eY8Pq~/jvsfZH\p,+ KP=.{u ꝛJkD|z;'=EՐ\;9g-iٲM,/Z!@ ԃt:]UD[FW~Yy ?v̕h+<$A6} IsM! ‰$bV.#2Jrj{bH~r({ ŰG%dҊOsТ{Pd1SKdJ1%iV1]U ‰$\ޟHPu>,#1?7 ]w LICP-9! wbh"{?nR}Wu΃k-(|p\C1$'~8!(l Ai%y4\lCg{+ۚ|)'X| 46d"R?n+']RY (+o g!XfkFfu{"Ha[2_%?]!LVLnJT)h6};%|ʉ2rR|jlb2w7fB4oX^eSlru6!0͡(jxkI//q7_+c*JdjF SG6&Jm%}}XyFPG w2rra|]&OՈC곘$fxU? jRp;ߴw!Lr R5}WyuDLDa[H31QTm(qRQZBi4>4[H3=."!J)s{c^RQbH+v[C=ҦmF)/Rՙ.T'p}3W{5{! ٬4p:KOv)ϞxG4RykA;>>pA\ M ),PKQ ؕND _T'J&LؓD,8Xov2LCQUypm`M0ƿf7O d\YàkANȂ4[R٭~lmu3adGEX.iD~#zu#M9.c=.?́LD|բW\>#3M~#)`fxh}}̡* nvfW:;NeņT;n{a.SNF֒!a[Yz2ȱ_UxX:lpP mً?4|3&Wz-LT4Ux~Jul"Xq$UE##\߬}~${Rbͬ1Ty0Y01&r{ njEC{Yr6u>7vC#z6p&xP9B/@cɁ W2C \Lruy==:a ,Q8~TWA=7c}P,RAE13%`{ K;l2 8mA~[C6E.D~އ7s,{#m*|~yޯBp!Y> z hRy!G!:;6DBú NqCgY{dͽ A'>;z疃}/e8}눂(]w|\n|=>˃qSrDET;l/L x2WNr9H?FU`b^r9'`;I}TmzAu B\.ClhQNul%DDx7s q?*7Iq}Z[Lԋx7?b<Z | Ln s lK Mo~Kn2ǕLffx6 Y>&B',{CbH@.:׈^gTY.ϸeL )X/qB4=V4&վ [Gz/N oT{1?\A>,w~/#3-˅u $gLyt: Xop^CDJ/{'\?])aҋ29Dv{0tqGSGaڋY,{}H3H~ѽW>#"lhA}WuϕDۋll8mɦ Djg#bM%4xs:;܋Qd6*R͖?y.d#P~9!n)Z|g\7MO?TR /%Iז-ym2XnrP>cbL0f,ȻsVzG춿h~{1ĐnL)H" ۣ3:L^ 21Q7PMjFX/w?TD|18iaj~!i-@fT {]={C^ɯH%O$ڏ~! -@H&O3Aic}$[!|]'RP~f :vW{Budr\V%pUU!vS{`9T׏da_8,hDm}zKQʵе5ԣM->f T-f z$~yVy5+<4heW?A4&8ne_"YR: nQ\C#Q2|[U%M1GC 0)x6źϜEY`C'5׭_ϯj ̐d}*R,L 3XY.I`Z(% Su }IM-UDinmV]O_VM; %kEV_P[;;|[, 'N W bTXؖPxsodGǣܟ?cbZȑPyO,wqlsYP&Ƅ_լ.sl+C@]e6oĸ` vw]L%36+7$&@r^X͖$@[a 2kť!C_io64/ɏ"w5*3C:y±ƋGm<۪oIYwPEc륁F.Q dF6 }j]L7D%ߤPff9 tΛ=4%&2"gUVLb 2*.?lU4lF *gz}ONT:Houyci9bdݭ{ym %Y.CrOw^M~di8u &$g,'`aBdb*9Ua^) ŪJ7FLě6(\R>ͺ2"4|8,j$wa{čUD5" M~6Rd=əLDԵ_'n8Gp ?z8Dֳ2~3HJ+پޫ6[=(x*lK 2{ - 9b͟H"-(دk,y?@,Ο?M` ϳϲ<`D'N!s0߅@ũ Eh g"D`O6ػ1MՖtHr젴?Yrc ~M;e?PE*{1؂x6v+8R 0{(Zހdp^mH ۤZ8& ?+K< q7_χk0w {W#?, )3S\E q]t/q)%J&V g]N$qORG9]ɂ"'b#V0 lH~p(l,u`4B(bH)Ѹ6XF:ȉ^? gh ͆t~ݹKA>Bhzo/F!dc0vV%$D{] D,.4]qQK J`'qM2 dH LDۻ IU>JD IsXe^NEVPc<\ٍ_.4)ķH'ۥѩAu*_o]jơm`9HNHW )N*H]@lPՀF'6xzB2\$ޘ*Zνok;w4kf^"#/n 9N%1T' *7{"ws:&L,μ6E O?nN0>#c@n}#fJI#Aؖ(9FyMRbĪ*ǭkl# HQq#O\ݒu¶č(?-Epje6 qXr%!,G{qYd'? l=KBҝ'X*QRI?H_iӵ,iN>?ྭ0 Lfd'03+<ڄIxJ[塞峈l"T0"Ǒ6Ⴂ&<5˝pK]Bz]uOZʕ,N\E%SmI>?kAdX٦l"c/L*d_~ )l9hL:GzUzrRVngA N}Rs {04& -lK Pn̈́]j…M3KhO(US8F>9>Ƅ`ʅLT<V40&=\ő{~2 ]jgC kh`M0(=EX,$Sc/N&DhLfBS\/IiFQsF7Ij=*<!@?uS4Mk, (y'ئRT`2D4z |-?\yN8]M@ X,E{N6T.N(2 ?S.0Z`Y,˂a455D:MӆX,^J|" B@ L[b?B91" \X,yмtG4%B@ ?!XB{*ENX;|y@  EQckǙL6m҅v!B@ P 44y@ aXf^D[EXz0A'p!AQ^;E ki @ E!Lͱ!B@ BnԕIN$M8 B@ ᘙB@ h!B@  " @ 8eG:'C%DP9uhM y@ a ' mRB!O 3Vh…@(mVdy{[ h|J ʿ Ád29eǧr\]P6D"vO+ Rt:yID@ b HL[D[\z@ Si!B@ LģM uh#@)!O X,UdS7<( @" cXp* J@  " "ELqp@B[E8NbV*&4kť ɾK;t!mqkc#6k߱}RI,Xk 4XO~_O3(KeɀEuF> x1@ 'T1"FbNf?g`wbђ>X,Ym-#hB~X,Y7ˬ4JD E s=97,㹈F͊gh: $ W댌Zj%3JR @ a&Pf( HbBk493$JSIȩG9BosӰK,k}rX:R84<@ Ѩ \ʄEKJqŪK1#Í8~ԥ\'*ְ&ʞ)p<=Q7dD @uB-)" Eޥ{p)T@ ˲ɗʯ5A2 V+*=@Ym@\\mMUQ:œ1w~$V¥Sd,aE@0%>p 6 Y!i & 3%X- |Bcc׀d҄xׯ5Bǫl9K/V`.>J[,YP,Ԅ+~NdDTVO§M^$ ๼}@X6 ]#Kq͵Toǁ} ZZh+ cdȢ2ׯ=2>YLO%ǯ9@ UhiBӍ^B +,cN7ŲbarbY?4SXы>nS4&Yʴ& $z0^d'$-s_|TPG"nلEK8ce1Q7AHq` GKO"a*Xל2s^~VF߁ &N@8af#ܹ(iy.\tRzsDnǂEE} 웣ZppmKn{݈F>?V>#7O fJ mU.A,F~} r S~%#R8|-.ַspPX܅ta<5 x̊۽L`ђ}@UYl +[ףP/8O nG"13uª2 á9Xp;.a4C}.`8 >$~m6)\P)Z};G{[09]o|!'Op0u_U,"p2ʝa OSylu_>qΪD#fؘшGDxŽm4)28WGhXף]XM @ 3%V`ȧqm d18J$(]].,wlW{ݝ_: $D8߆5] sݱ +TȰ3}9m}Q72 _'=g 71eҕOv$uit`MW@Iڄ=;fgxű#x˼oT~>Yv"L9MN'" BbK՛{Ϳkh (vrU =Q!mS{aa4'O^20L/4t%:ZeV/~0~; _ϳسۇxC!,$=JC!vUsƉ@0=%nz?W?U=cxFG[ȶJcm0yR~^qrh'5ɓzv$c m3`ko8YPD+8uՊ\JD{K?Wl{%eΰfJ?u_zC.=lшRUl,ia>#R8}Ҏ$̔cϳ02-+[ZXĴ 2$#fYD#Ɵ>?gzBZ焪:u_D'z>Ez{`5ho+̄ZF/a2.JH@<&s&R@ J`jֽZѮ&r:Pkn4?Ż1\uN"d;6`"7u=~8]<(KUN t%֝B x}P {޵ ˥qA .}]+<@ HP9L/цP(eA%[f{ ebMWv{<Ϣu@$l rs!2e/[n,6?\jR[XǬ*+G$hkU2.5U}F@z|~ʞrɵ'?q1eE68fҎʅg)v[ < Q4O'MaPW-v}S(ke'޹(S Õ(wuF̞ÙQC4bIjKJ QvbtԌcGfi733bVWh:} }9z}Mcx>~r~Źt_=WH'paXL&HD`Ż^f9&ZSjUkbT2yfؘF4H։M>酿ɪ RrV<;ܙuUg/7) ji#`iG/"q-*ݶ^5P2.#I+%@YtVk\ȪW?#R32S N EQS{u?EJ={!NzQ͔a$KGUa+HbN-dⳏ0IzH_DyX 7]{v,AtMG~qsXڑTU= R jv]1CVx̬;hvxm&y iD uO$Eh\*9 W&ﲅ|^j*c'p3StӧhjL9ZXîMF󚞪EFpP30l]ׇgU= KnGO "4P6.ά6!eʳ^Ȑqȟ_svj˴ȟ='Rk$u/4q"<i.OyUh<_~B-gj5ށNٻ;JEEKÆ"3͌mU;E} sGfmwk72d_7q5A֧o hVB9 /0`Fy"5eQY Ŵ4~Qt  8DrZW}102{X9;cGfat sFp8S`,OHkG"nݮhkkJO *}DJyPz@"@,"ڈx+- u\L"ޥe(B,ILޜt{EXڡ^&E̠G+r5}-dy{r8sʌ3<ůӣsr%ǰŻ;\p# ߙGsr*I ͢hF@ڦ(7~OOZ`[@ymCsPAraV(vPLEe|1 p +.@3!4`kmÇ>}EY$hIfDŽ'=3*%{gPL&֞(ZL(R]nN 7(*|*ՀT҄:`!kPb&bjy?{aOb>x>$H(8v-iڔ.,Zҏё6=T@h4-=ϙr`hӏV)|׊K;@- qEoOvpcZe87|X{"#9uW%MgP[:?޺6ME8n!P)6mZX*9FWW̊ޛNJ/X,l+d9{t@ L"dɌRP(~VMlnl+Ϣ[?JY8]9ˡymLEV;f&-/+]H"K;027|c| ^+|#8 . -AyEcц}힇];p3>Ѕehi1na<7vW*"|dˍ~j W>xF?Wd_8.'eH%MS)D?XV b2Ν;Kvzۍʲ&ҥK5ۤiCwp<ϫ{"@$R]5Pr5j{a|ی3S Afђ~,Z2waǕWMW. qQT? >7|X[b'Ygݞ@ 8^$ +/%!lÇ@0chY*UC8s{vazo  L3%+0ˣk/ Z18 z a/bQF,Gߧx>J;pn0_0"fsH$ZD wCQ) wyRB]omM{1nwhݞwk,XVx}\v];Kɲ3LLHS,\UYrq r r`<{M+*,c<gNQXzIݞP,.pUax9iBh+JzV3c2oSޓFbؑ1"iֽ<@)"LySkfI-K j N L %Nit2'+.,[bH XH!h3nFH~lG> Ufp|e?jƙS vpU$vᓽ f0PNjD\C_,nWf^z%$]ΒjE(Եƿr5ˁBj}ipTR 8b|=!/v"1 kd^kn,XU;0#p$Pk.݁/+%nwwqWO U9b<2djhvprݦ ʫhků_H;O]-+VJGR9{02(4ϡ6 aN'xo"_H:m*ybK []瞜>đCvoDur:+[=|FүkZrAh4:cvupw:Z{2ԵhM6J4S_O-)fm--ctxI)S(d3Qv0fR9T5b(,{3Z'ASS ]/pz~:D͔.3 %*Vu9WZ49]9r i 4X{.w8ZpsvWu?M+<땢<2%G,ٜ$4`Ʊ#-J<]Ep$F.^Y&&CۋLKk:{7#@:pMpnC@@WYeA FZr]}}56!e_np-xρe "-R= ʒOx/D63 6; %Xi8kN/_x8\Ia§ #m0GZk{^ppN]pp'!J׻yYzpRuEƪךIh0 Zbp//+'8,C L#&K;\Ҳ(ށ7G:g =H w// fT>3< u9o@0Z[[ wYEe żM$@8?xwr>HQ-]D;};f=6=)ݍL"9r)lۆ)¤# Z w'0D.w'}K"N6dPb2vmnN W^2l܈ѣxp;wN´>b^qi0bXH$4 w@JP%@zgj˲ND[ݍ .uɣG@ L!]B^m7ϝw,hB,co;sIۑ0cS}:a0U½" B=BHD]]#D6l\H%h~֭ ,@ U^zѾ};عsab ͰkH ?Uݨ BiKYYafEٮ} x~iD-^w{w"T5i\O>f+Ѳq#Ķ|}< wމm'Zts3v쀥 YҾ~[?:D&PY1eˤO.uڽ:ji9'}a;:I&1ޗ'U@ " CO0y5ØXb4  +d#{k;jT۶)¶}v/r/!? nNx~-7b7y' H };__F{l[ni?!mOqe0,RǏx| /SI 8B-[?1`?޵ka_ WjM W^Z]]3f@@;` MJefZzvD|^y1?q8PlW@FWm?:*o*\01 G*Bj쩧t-^ c쩧 l[>;:xs-7*B;oض6yEGE"{lA&Uzbń}ԲeRy4rpBif/FW0c("JaSTptk5y8Z9R˖s$N j,܁{ ZQwq9E 8`CIbЍRniv#6vr4U-@\p\D~>/ *Q:zTs޽[ؗ/0 ><ڷoWo~&w5l]@F\w77onK'0n<$ G0\DJB!w…bCxٲ!8-[:X_*( 7ܠg}2[/m~]hڰܹ#$d KnW( KEʢ(3 rXG&ݔ G;h d-V,( #F𽽰-^ {p ,"܉;`_\y}a8/ػ_0DZWq yط%KJE]wyFE4/iVVu-L4L8 1/+X7Wɶ2_IF%Y}t #G@}iD{M=~KBy<Nsm}01 F v-o]~轊:_hMO> ZOaSoHQxY;yt)+]/.#Ȅ!sq:sЛlj5k47mB~$X. hA˃T'җb{(C|D۵z5M`vf//(˚|C> X:w0r%)>dw{㍊^{-"~-[x%,ӟJiAN_7((,]VaPpx#+W>ѡ. ʀ'sl:PVńnU~{/3?{*%wb =?]|R"2gy']S_\# @ f> p/GBSׯ'6G""C>GUz, ga_օ !mݪwWN׭ _@"/(bkGNdb1p,_1+]mw:/+E1_)o^-g3g|yD{>tK.S "qH9;T$Deقm~A_wO>mbͬ[o{xSu}氒I BE!-vpU)r^[ᨃ"K8#(}-ϫ( ޢedf8%B) M6ߏC9s]^jV桇cH 6TN]'̇"ϢE8YX5kPPyZnw8O2йs'l|KLD1?Cp )k-U* FBJ$rL7Apxu޾ n>n:^}CSOrrOH}i:_w7`0 ѕ_yVVLbg8fhz(bqX1"L$wl*C< qibq &Il`aRJh/m#G7 w8ZF&z=Fϰ56 j\'G} ]}uu,Z^ϳȄ L$(Z8ʥO>AFE+*pl75Ҫnr:}8.*puay]]yY~MH swæ8q3U&3f[o1WT q5fd+.~Z(ٸGW.ik@O'ھ oHSR".NHOȝORRҐҝ&v$h3( fs-"g6da!THvaꞶ6?T^L ~1*в|xMvXi}: 9xPp|]U^27mW 4# Y1 ]o&'?9F} p1BoG}klzuAcsp\ŋu'V+YUUtZ*gf̙il 54)ttHGH((O?O?EBA\讯Gݎ 0\nG^yZlى,6Gqmn?1)eep#=n K!$F#k|>}7 5iCm 0k@ٳZcuu8i6Cx1TPknj!MJi+uu8"sB$!inڌJDnr:4'G iܧN!PPpK$qG2^}{g6qDi$p17Ö.x M<)}#Q0!hXˣ<-C>; >(R:~bik@W\L+fHFl J1GҫB|9x٦WNǠU1L[I9ȑP~e]ߍD4Lt.TIz IH< q#N/!Q(0lRWT )x< y2\)usmjBBAOF#c\ ܩBp+B4ӣ>0lRרܹH|ΞřJf ѓNyY4r46۶ Nߠn 3'm4B.$4Oo yz:}65f G(ЕBEN!*BEIO͛QQljezOc# '.cv4s}Gϙb.N'/GMPk!F#{.^|/,s[2I>`Ak~,pc3% |v{ќ"""wVV\㏨ȍbħB5z4~8_zUz$F  JFpc+V`'Nr_^ 0i)."7c*{]8M8wԡC8YXa4e#p \޿IEE$ᅬٳi i$ 7sx򦳪L[$Ay6iRA&Z{/d^}_Oҫ"dWw54±p->ŋ+ Wk5}DkH :Ћ~bx9_}CI&윂GJi)|/LNºu!2xEϟGwgB"NC pϪTEϷߢtBWZzB;uJ *= h>P(Ċ`C`pE4Ov\裛Bvp8SWCеs'Ã@%/lÞv$WD4?,ߦ P2>^Vb0lv }-<5'uVHFɄo{];w"2`yZFt<\gφg/ƨO>T賯h [F#<(g΄n5P(v%D Y8Oc0>YUU0 JTƈ %Od+SBU^^Ȁަ&^S\᯿ +$xث3ik@=a]dj>YD}3= |ifYRgODD$:*Eh{!w"w>&klތo <23!jEGh9ppbO^+rso _A?g~+\ mQtO<o%<0~\6 M^pͬl+# A_\ yZ.n$hu,z~LZ;-[>&NM^ahz7Ucl!U{tLmQ|v LDBȳMQ= }| t!6D`ȕNvQL3(!w:a Yর <,5:FŰatgS+ E /RlM\||pA׃(Ex6A en.. 3(8lف*`(Ag6CKJs@CWV 讯jh? gEFEE`?e/"U1c@C3iG@5~ ʕ+`X""B͛wSq^971]޻8wף>a] 35i?y0زY B?nYա?~6jz5kpqqrwGnz52**M~v;+WE?s&Ѱ`L& uZu+ P9?> vm^[ U^lR]vBl8~#o@ڵprMM l|]JYҎa%KN;)￟ bH+vΝKL{l_ Wk+}Yi `F톽_ /@ަ&k6#}Z"sB8-_sgEon˯EDngL&q"H TDl?o-2HJ/u]n55H)-嚚p4[z^;w$ uwܲeH7),ǎ277 F#<ˑ8~<\Id3hχ%1\VFeZ%̞ yZzhW|Y^[\Z؜3ios`Kݍ޺:$uJ0ν޺:!Gs3lnXo̟U~>P ,ѓ˗c2!}\H \ڱ^-5 rK+r!xnaPMhy,ȭ] gp TO=h}yfw޻Boٲ06 Hzq089cf3OT^]paGr~D#ٳ>w.ݎ{>#֭ōo1h|6TTD|Nǎğ<镕hXLxZ[C-hB5 3x87gWUU!mM)Jf4"y_}U~>n7Z-ٙ!io4{[rY}kɓE-r!fmUCɭ>H_+WC `L&K0 dF->Ko]]H3Ҷ{o`my啈"8!MJfC2k{ʪja1 ynf3WK`FÖ-?>Z~5ii4~Z`L&^=Dd _\8C{уj5MV7nl8dSϖ{4?N7pCYܫ2kj\k/YZ!1>z@n qb\t͙J";/X٨pi0""32 X['ˡ9~+᧒kc2A1qZ} (srs3tH2#5=ގ!mۼy efT8{*?#ޤ?oʜWQ2h[u8U~$TTĩS!Uaml|aUUp47Souo]mp)S[W;, `L&*yq "n y8u*$ v"c^`Z ŋ866 5RZxzlҰ);4hut "WaL&h&NDۺuQuQW zA-0zIwZ@STDD(oe WB&FdM?`ܹU2(njK&™ P%8uqr 祇{`2B0?%r}=vLq2hB[*]*+i:.͸Z[ˣ-O]cRbARQon/cD>4tx pllP &\)#azMf4">z-MJnDK'p o6>r^۶!m,NO[ 3gi֬?|w3HrPjw9sZI'Cݍ͛H((}Hӣ4hXDQ.r!Js"_d@w[ 8~ >Cȗ zdVTk8ɩ lVfDnu-] ]q1$ /Z!qdw- t}.6'MBfEEVp-޽t[!0k 7P*vv7RN>_z x%߾qcg\STDsȬ@SOxv{ҫT}Oomj\pEP^DvG*VeP+C>3r$\g }+W4eT5=MM!2d"'Gж|kj| iSHph>"Zm#v⡇i$MAC3q-몪 Fy\ش ؼ)vҫd"Gs3.sOǑ#5{efGdDPc̟8/r5Gkj%$ m,?,۷G=G"~&%KhȌFH5@|FYۑ$|[}~[(P !\|뭰 W}=INNR M+C3%PR!>@_K T1'i &kjx,8S'% ͛ss&XE9sgBA99y3\(]t5). y]m ٟ}Q;vq\ $J'>o6` O(EDp[WS !tލ3fEDD"m6( >5$Irm+D>F1[dMidEo]n74'R\"v{|Zj2Tř t^-H&%Rg@g!&PAg#\t^ Áq1~WmB*I' ]f4"_7Ȫf<"""CW}=-:\\D""ՇcPЄt“*nr:0B3>N(/ w?ZMxnD:;mdBrٲ"^gq9ó>II;cf8S(UUAvPXrp!c zNz@V/Io˪vmK;&J}Zy9f<>fS\q;BrB[zʕA{|,FBAROw!Q(hVH2Ϗ.\χdrdX,詭Zp#tʕ+.X]q1zk͐ǒp[W #>K;v9g>oxm-]_~ql|2#w47C,tZ+WsQ\Lo=r@hes\Fw!; ٳS_۹b|v;~4G*M&d(g ?;WԩKLDmwduMi2AWVYJ ZMՇ#""""99|>4 l61`pyjBSXGs3:l+),2'':&@^.n]>0@9r|h} N[u?gݜ7k6#mTq) qA!ZM Q:tBxe[ׯG߁|.mD a? d"$J%]45!aχj' sf¹? W`Rg̠..$ ͛{Li2A;e {{Ӄ~=`ojZ`,M }K? >u.VEDDDvwǠ 턄Qh1Zgφd"7}k6@+joH~I(WX,KW_R])SCVM l_}E(S""6t:0ٰ~ ̓ |N*1!N y`,aGCw ЯZKuu6J 49Ȩ i 8Vf3/pdF#2ضML'- B=u*TC.\/P̙tteB(ƍÈ^KyB[`VHFM @}*IZ0w6'NiӠ48idiiڱCP| Yd %US(BF~m[dWh ]MNE Ai20 7nTFc0zœ9MEVίZ2ښb:2h~^UdBo~xv\=eeԞ*JJnkvh"yAk|Pۋ`[E$M!\*M&Gĩǩg WƏ0O> 6oJr ]cPLR6c:^di'~z~ f3X,P兜di嶇mLHѠ֛<_MIt> ^q}{zxgLosolhoS!@")gyk7mvws< ê!hвlCWVFS<3n7.ۻN aǨXnV!{.> 4K%mHTI1{o}$4[/+Lv6ړJۆ4r$\*=t Wk+ sT:ρU ijϏj(:xk6gh ies_Sq;쨧Ð&^RX,|]=mA=u*2++=E^y c a=êi?E/>G^M&jlc0`kѣa?k xϋnʔjBDioPrQ)4b܇ "^ oWf̀"U !N%0ӹ( yF䓜u7;HԵw/4!ȬD#ī; qZ'}t'~*$/C*f…c6qi 饰V$t7b(Ȩ k I1%k5 wsӦO3iPpdQdژ@DDdh! uD1@Рul"FqlK79s ho8R&tIY_˫WG˴i< =yn]?ǟ|2Dxp>֗_VDꊊ?f X1),Ľ55!#4g n C]]9$qH3UDž`?ېdvu͍o"%R'Ii62vA[!J2~Ȱ(HTT;W#$W{UUp=JMBz{f65,TY:ίZ%(xdijqH_Z`] =MM ל'N@ ۈ6k&A=u*o1ǏňXawB]#d}}VT*rB[h@'LIGJZZx ln,&Uҹ\m߸=Rs8ى<[ 6Q+dBŁ'xЕ"}@i2AWRۍMֽ{RZ"d:]$h Iܪ6{ԄĂZ}z 4jh d4奇]k H)-EeßGBST˖^T_$*? =Sv @c5RZ `zgX5 ~OL1ǏCP@Va;#XHσbl? IDAT=U6k_ڱ3f+ >}ǎAi2!!U16~b-,48w:CEDDn/zŊMҎ qm?y'&`AmGT/uU&S+ӎmmꐦDFHwa\Oc#nw*0r$8~^F*[MN$eExH3r,&0RډRZ ɴ\eBZZ8XzC] 'Lo?@yz_ }Gn.XÇi6<xkj?6(Ag#.%.b֭C CΝ1cɁ_z 55EmUb]z!DBR sw+!f{A-p;+VV86z4OK@5~<G %U['a8y2DLz$x n7+r{kk+ 둳o@V47t)/] /IN9VGHDsVH죫w`8i#ȌFd3{kkYr>$˝k}QI|W9b}$RE1BX?s&<8qՉ !25%mK@P.j5J V2V*>P/'hILr'bᆪ{!R' t3f-%Q(x\/5Xڱp/nZ C]]3 Q(pyWB]]ݰY q !b^]lWk+5Ѳp!F (j%$׮c68VyVdiiP琥cpDvyVL4Rː)fS2CDœ9lZ-߱9c1{bP+iiiWl6\.8Xyv춈Lϑ#w872Z[Vc%lڐp2Y_zȌF vaR_|' \:lKi 0Æщw =))M«_^)S@ *;C~1xM8>e4rHR` t}%Oq+ cF=82&Θ?ଯGݴO \$;p(nTYͅFa:cK;v;@^սMPеCh_#W e лXPۍee!Ԥĝ;v@*Xбy3f3&流1J!b.An&cǐx1t$& jE[&, TkKᄺF톕q8/"r7.e nK ݎ$eF#CmHj情bom-kkij8TUՒ Ȁ7D\&O$vzI'j$gPaҥKLUUH>B2eF#ǏDQ ht"d!QKuuﭭbFi2A2O$UUH? GpE\(˝T߃-6w*?R9삇0kMXh 4wPM\s$(Bp@Ԡy/^ K)C<6f{Xr|v{`є^We%Z.$3s'oPXuISa"y{kka0`p47/'!!>VFGkZ TzBXxTWSdg#' @yZOC…H//1#FqtȈ`7x\cdVVBg=/p $puށH,([qgbAR~xYbU W8Y0I9X,p'R󷲤#x((KJxV,!Xz--tQ, F#/# B\`s!IHfzugf q=T"uD*urx6"Թ u SȝJ֭CfܷqLDƍ43R?{(ՉҾqc`Z̪Ă"#CZe=` OkBTWCWR`GnM&5d?m` R;$=8 BkGk^h a۳w8۷w`f u\A|8X/D4nQD{Љdj_=Xj!Ui.Z VXRa\K N>|*3@5f /O;eJ+}'N q=rZmVӧcy=jď}]5RսgVSde&h <*|}9ϩ ow7;N3b$ -\ƈB bNjo%%^] ƍH)-UV d?$4"ဲݸtf}} #=%hUw}ۈlBs#Q ħM~!B=R I~^[ȝE8>rlܸKJZ"i$$="ܿaBWTkcCn 4el%|M3Iow{84=WKˀ^!VS**m_|~zGNǴEоh ,<aCkZ!7.`w2paFXzh̭so4^manڒ,9V;m w !MI +d8ы rh;-B}7Z' xe" u`bu`]nٺ]&6YR\--.UJnM(8zqxHݻy6JeI ?a:2ʔPeI {w 6k[ٺ wO[:b57}FmH1B;j?|D$~yLl4e@Jė=k*U|En+nP"$΃J~ȵMi 0Bl0׊P}_|Ac $ |v;Β͚EGRfb!7㺓RAE'tZ̙H<|,}ݐ(t#DFe%۶ Hr>aG-dMmhݗТ2s ˇu`v__XHb򋈈0PL0Vgz7WdVUrcq7ZX6n$0*82ܜpgؼ1chʌ5&~y^͚^?v$vCb;Ezy9z}~dXt}%۶ 5 à)_* m;2ЈF.b򋈈ȵ@@\T%jƍS1L":&^оq#zn#Lrv6\ DGUROD@76"~x|R8aB [4(8̵W;  lXpU^4!KLs3oT*l6ۭ>D+"2n\L~Ds-Cpa%%PBI U P,~\t::a'c:z?Bfe%T}.DkWk+9sq_ oWYYFέw}eD Tq1Ʊ1~i1 m&;c`#DT*iC!-Fឮ0DD7:%ZDcR1EDDD\H@;rhs6Be@J,l!X׭I$Ϙ&++D;CsYF Ud@ h."+N3Q6W_Mh:`;tB,)i22'_~u;kgPV?=}~͎pd""wb򋈈gcژ?jFm }x!xũbƍC#j 2?l0LRZIh|'z=ov@ gueI D;~­[>NFoq*ЖFDZc!ǚ3SG1 m~YO\^¼GdnvK4D."2jtGsM,d +Q4}%53nK&Bzzx7 i`] WZ#EDDn[Ç_\5f mm;pmT;ز%dpѣ(z֡NCyy9֬Ys%A01vu] E =#ǿF\==?5 %eBw)+׊ukF'qcǎ V.2 s~򋓽4t:E.""rM[!d4 ν6JuyZڀUW w 1c7z*ܹ *(NȏocOL~K|z +a8t| {aϣcz[nm:}!{'Pi^<EDDbBzrr2J%M~ '=6Cź"""rorHHH,lE{ ύxy +qL}V ido;gP60G rEkRkq> Qf'޾@z|TQ{ܞGٝS_>+2QP?tVEDnTD# iiiH`ǃ*ԉE"""w!8C! 9 4Oz ǡ=}&HABԕ ') Dt ?B%+DҐ_э•5 W{P7AOI]O3Ywge MH1$\<)x>(_DDn"72+ry/Dn8NQ2J(%>P$‚'7{ϡmѾ /s *P@~h#;?7}N;V w&mOa%$>w&$XNl*v%r'g(ӽ_*U7; ,j#BC" *8GPdApe=89 y(Qi<44 44"kSQt*U8C'J~u_*ٖ zD }۷(~{mBFQepK*`l7`Ii/8.9GvThzo5.66@a`i>,9F!=($/_EEe`/!O=LPpώ.=!`̛\uAP|aWCӴd0=XmB#[H\P"v?t+n\s=|?p bbY'U/M gn Swz!!lHֵS1y$0 W A纀cKs1LFh btZ_|_?0-1(EKk>|쳌7T/B]u~QQt:5 7I9o8] ;{'>m{D8xBp v?ï듈{۳G7I|NtoǮ=mK$ӖAm"E$@b6kҽ9u$f\+sAؐs){<$?`}!ff Vh;W***A9dh2{/*w(n2#ހ@Rx'-`me`А|Ta {A ùZ2rw^h3yJRn&@Ԝosv/8rb [O).T憻2qз}v%-L%%$YX\)^%iv,'w#z R|>=Jr[m;ФF17Qbǘm<3V9**D[4:ȉT_Tr%t:\vng6h`s"4[wfth|m? L_ M,Y˿d1 r ቿvW6 O^ϨJ=}Ack|ER&ʥ&" bŒ43B1~5Cax 0=m VnH܊;vQ]NOf/“H4>~pJ9xfn9 OlE]C׈ "7=KRB 7rpTϊGg\6+!;J 2l\fVTTT2s)_Y4/**= m=^)dg!HtQR-*}OvdIh_=yh/Ru$1eA<N?iU1쑬w !]kTwmtl؎" ]R#њ`ILG>N;E tgA!}stlP_ ӥ_֕M_4CYARoF9Z_GDž*UT~%Ec˕ EQ`Cڃ!RȌ7 d"@lomv687XRD,+osIPa;4S(xI>WB[ ;5qނ3uNѾQRA!'K8ݶ%m[<3V[>M>@t\Xy+f Oj;GrJƄR,xZL(.U}vGbȘ9}d****t:t:q^}fu~D:>X4+$IJ}U( B1׈H)7Zo]Fh Oid8o:2fHHu#D9GM1Uvdіcgi}O9`Bތ`0D#j_a@ oWSNX ALVVoQSR&֚5M_{kۅ+cm *U_9T- 5m4aqS^u )iu(}Y7p#|xP#1[:PQB/d-ԕ uOWg`yo 8T&?(T̆` VW\-+ dK6WP'I Y.|#JQIoB[\UHT}G3lJvl9E`;.~B3f\\wҽ-#;Ӟ6$S#u"J6"J02fD,eXtzhݭy˧).h خ7{%B;dC-e @ "LpyC1"'ΝpKlMh]E[֊oZ k&= c>_<(ש ƙBjN@KQ?$Գu~Bn#\˪zTGSu ShpIU*h J6B[q\K^AGR@DM݋$-O5(= ןΟ"o2qCԔF%5aYhod#z30'%EYV}Y Kc}D6GD׉l50IkcpHHMrE0`p\َ/: 1K!\5+aҙ$!upyC۞X9T0'\Y͓KVo+Ƥ {+Sz:dcXTrHrx3-µ[TwGahg#l 3WcǠB^;,^dt>_lPH [d[N} &\̀Ye0L$WvjQȊBNgsdh#aPׂe77 MR*ߺ]/$۾3/8a{ ?!/d@"@:}m͇Au6;pq;Y=zR$Ih'"+zreW.,(a6B]H 0 VQR۴ 58Q.ԝ?k}G+Jb 5^AyP |*Ҙ9xh#a\eowzpTEEER/Ǐ˲ܳ H$JBdȆZem!ǿOG0) Vo?D@>~&k'9ww9ѻGS }۷SA$-r]Ⱥ&AL׽`5@Ηם?&9/os]|9.ՠ=m7;!Dslu XSP!ܷ.$4R-C.J2NpxP l*y+HD ^EEo{` w*tMA{;d)N"19UQL&Co`ϟq:EdD23K.yMI|O z1*廣Lq9t(noMJx,ȝL.Ak3ِSi]h( [8Ԅ{L_P$cy Ux-z;aQSEEerمʥ#\|Zy낢] F=N"BrPހ> Q#6B=,i+(Au6.'\LHf1/߷Qxjrvh,1i5T܌eżkLlE*f%4} |B瘊·@פ{W=%X6ET@E MӃ:= #FrVE劅MYm_s- aLYvAZuKs ȷρN&[NkL5 Ymv(^h{1Jێ|,'w^#"aew&I`w'"aCqlI uѺf'zԜsaQvcIqȘ9p^;,y%./s61؊Gc[ HP@ށkҽwWM ]Jhx*%sh ߕ'΃Efք~ZZ_ȖS&#ʶsbRQ97Ām^:5"EwXVq #))縷"XF>=%_3{Z᝹ 9[_;Q rPLK1ZRh;/5i-Tt%R'gΔA6'RYJdDIbB9;$]Ϡ=EGGz \/+ة/J9GvI2f+CGr,'S)Q5e`-*;O_Xz ,Iux6|wT< fȞmg3x%[Ng7Q`g<=XE֚(jR{b~_lpn`Ch J8To)Z(%ѼBDㅆK"SlFWgLP:SiźLԝL;KnΖGyƽPi% ;Y?Gԡ7>A290f람"d4FŐlgrjbR!CNإ pѵ04NFA)u pEd}W&+:*dCH xu.crhĿc2̆!MZ{`H>uZ/@sLH^gGW#nhB>fp)1ʴ54} #&hA/Ϧq:#tA_ܓ瘊mg%X\Pp96Mg^Ґ; aоI4TBXd%iPALg*:+D8H`.6{KzXgD߷.~qBkq:z HS"K>"al QCLo-й[E {p";p#T J"1+ME.ڟm1eu|VueGWC,{H%#S KR?n?~-w?!M_"RzB% A \{-E|??y. W*E 4M_&{-R+p *r$#;@6} .\c 'g6)`r(XT*AΑA3 WJCXT+ZrFg>ɢ:cVςв!hup]ͱT_+d^j -"2^ }rl\ S0g|nm,..~` Vؿ؂ z;I@*DFwU;aK>_(*jiBgqoݾJ$3{=tSp$[eiCd8р*_3m>b6,ĖT@ќݶ)4!7ӖwfkAnp0w%O̔r;AZ$;Dv{-#d,1[uY}]GXU#ڗ,j/6ʖ'"LWA0oiA@Ԝ@xg_d&GVup-y%w3HM>B4ImZ{k>u1C^X؂@,vގndC-Bf; ޲JI^DNc*<w(N $BBk) t^hޓ*/(uD:# Gٞ0S y oelsLL) 4z{tF ;J!bȑM2|/{Nj; aO'嶼j16w?2f:[[x #ok+Y%2fNmT (.}r@b@j?wCMG?~•+GrPs#ipTrP{7` Z*TɳsOx,&@ħ#ev]l6KWnj^`4AT"yps{br[#;X>/րrytDWqa0c-nmWJAfF!p;xxܓt HWb[[T||c @{|[KrbX @Q2BAqakyR}Qc<=ׯϠX,&rYxY CwОٟGe/1*"qs HhSaiT88G:o}oK [`>Y zzPc9-VG?!D5@גW "Z+$ N*`K`|l[еUF,l(=%:v.h Wn}s7= #}8a7m@Ap*m ZIw/ +=G; S3`95w`ע}쥢h-G\`ELo_r~OSr*Cgpch[/ޖH le mgSڨ}%:f@?Ag=ςeeU`psHtzDѰA%ݓwGpɫ0tJܷ.~M_MD)Q7ѱsz֣&{蜵 XlD 杹c;d r)>߷ su/a{6}o垧`.ڀ mc-;a1Ȧ{\SBH4 U@?1ڈز38)xF̧D6=sT!0\[UFz9e8anVv?_n}M۞Dk9.ɠKE%2LV-(]sA2} GLe@6HwWôIlHQଧG z>AŨEr:~4j9k5yW6z"E["neo`mѶpTS + Ӷ'A(5nzwWgՎ6^y@r?2tGlirÕ+";7߀%͠}x ;a1%|lV箃gͰսާf$gCc&gXp̈WdE&`=)& ]K^S0o wG᝙{ƋʋǷrdL\ߘ YOy=[ Ai=~!b9 XF6n(=+gf` mea2eWNoh.I'/T/稂{$Xo-up3,1u۾E1Q*5Kq7mSʀ$IxwfQIwQk;FTfVբ f8'A'HS$%#f)pnDsg Ql p֢ľ| xc|B6u+*i}u ؇%{*]y]d.~i <|,ܡ s۷ XQL ~Ų)}Va9 +U]&Tў]*$)QSLN&X !J{=tOB:/ i)[g*~ɽIP fڴukCg &Ꜫ ~HDgu HvnnU٨X"f+g8,>r_?2a]t RўvD́6te#8wWǵ0'{3LDSCB ``$f)-z LnZ&p':dS\j/I^J~zS+ tTDѢkM}P6C |`;c?䢺eR.Y*y*J*`8]< FZy'ça59kO"tCn[ BV~35C 3l$]R.$: gU?vHd.I"]' Ẃ6 FKt]qyNRqn?Hqֲ[ϯ@Ogq?an=-+E-!_[)Rhރ( -*DsNց^+yje\ul~4%/!nAh 9ruvt lԁ9;a1DQ DI*YWs=Ofp"pΐE5ZAܒ蜵 iM% =a<(K$ta"/c-uѸOu;T-ynuR”r3|0K^6St-|E#an= Zw*!5RbB[BZ7,L^z-ikY&ӟ=#s~9?A܈ 6MѱsVa~A0|œQQm ׃9tP[䈧b~w5*x-CMv|bwZ\*8àmillQhH=^Ů^#w ^ g=TTU^hj:9f G *! #,,u+,k!N'Y){i_8G\<q/QF]hp0tK|6\ќb'ᘴ1c{̥FZՈiK=^wݶmJz:eKLZE {wr wGzW4MB;@ 6Bt.fLr& T[(EK S)Q@:s!I_,M' tDT mn7й[vԡ~Ȼփ޵d 0m{wW+p*8YQzDI?:ٲz*m> dTTkfҽo{lwNhNX2lY wlhQ*WeP_@h\.Uh ~W{9ǑK:6% N+1ﮆ~?ǵhai(E~:ڀ0cuK ki7=Mg폼ݯh= vt n0+KAtGM%}\/e1 S|/q|ghB>hؐDnp?g [A$Γ03Kuۣ0g>{7:k عUI)B35l9wcلXtQ;q NG]s=;~c<,;O5';|^U[)W 7'E(4xUTTA(UF##lWskZ?t8Γ>/crTqUj{Bμ}oCfLd{zp^mkxO^Ú/َػEQ "F(8+ꓨbG׀ ^;ymC˒P|bǢ[W yvd.x/ؙ?ɸԜRCތi:O"d+%"x]8g;{.xM8(i#e[+v8ř;@܄3j؉K/I;{]5Lr+,1{_1{9wˀ\҄ !WQ( 3+|^mfs_婨\=fq* up7ER8״,܀B_AqU i>+h</g˒.@T "2 P": a WGVEE$`#`0j#n& ,"C!#v# "`/Ohce'up0~D9oWZ֦.K<M[`pCOeOC=u؄Kb6"Fb቞ y}][t͇2{-l>(ȖF^»nFWga!8:e-#7Cifʿ)S۷}\?ϭkR%[0ߝvB:~ $`?^ygyw!Ӝ!S8Q4t_;AQ1:@1-[lgJ47A> ^OV\ĝ:I]z)Ra&"hh_oM+*t,Þ]ZG*xZh Pz+'΅9e1{9SƖz5~1c\Ӗrz?#oDE(]= N] 2Mcϧ٤Fv.:SBS!G\.}onAbGbG]H ȑR$Y%|zJdn{~/>Tܦ:EL-ɤhx&-B𔕊))Y sJ&/GAot]rz5Iz,GrE/'8@V:7pH t5z2 @ajGhYY>y ף0 B-K 7OOTRL*053m8JB%}z; ,|XN^pLI$ԖY/ W̑,T0ȺMu0: AZZ2YtGjj/8?GD²o"XȪpnK C{Chu[+db.d&z.84չ%5P*ՔɕV[V GE]{TPy1'V.W: M!"3=](Izkf:I$Bpqէ0d(ϕVy(y̨w4)}3X.jP!WT"O=RXhiGpl5IbX|/Utb1{9"Fk `T+Ē'gq6 3?f/zPHdGEYW_5j4mZӥ/vWHdі*Crš*W d }Ny`|> ]ӗ&LH~ l1E#2k58R2p v"h(g'/e G@_'.ܓuR.KO%jtѳp8Vg^ܶ$턦-V#RJ oi3LAlJVv(NfPpEfaQ-O[ \EDS,ͻg Fl;#qIF("{7ܓvDV0ע`ߖW1)\iZD$O+A 6EQ=^VTj\epA4etҦy)SV"8u G! )ZH(61 3VLs dscE_2wS>md㣭xq,Er}#XGi1{ddĘ]$?^|'l8UvQ-1q {;+(%7;!N\ME'v&9;;Ⲭ3 P hLeS@\SdrX+P*N6?ޗ|`H*@4Ձh b{H|Z]qt4Ta8w k b"$}YEGd,<ො([`8;B[pI]#}k-񀄣 )~Zo'w+[q賤.mlPJ]鳛S+ B" % ى5v`xo1,Uh YXػASKqpy_u˕^K FX,vwʲ,L&b*^}֊>?Yv**F OuԞ:')wıPx/g+F>Qzhoaк5X|oyv܈i >2ԟt@'ϣmO` ݞ D}{p po?1q[vbbNwQp#_` Hw(:~FLGAw4Py"񝈎QEn| Am e+;i \;%+uNK@e?nA-P'7b4 eUh :z,KKKZ+UT Î_ t(4'@9A3]1ڔ] n(= |B"L3_,AAO"+ԶR"cp?:7̓1D)v?zًt M}g r<@[@Dܡ`\$pz?Y}4|ǡ ej6]Di!pv/ ncϖHPZq˛[z{-n?ADO{_ZoE;1ZwmqR5g,3G}_܁صUJF3 tUtRth:Od5{> 0i>8SR=|Aׄ h.x-[_VSz##& aC0/3 ݞ~Pxq A=sNvt{^D׍wJģ 2Jן[-~2BH@Š[_@AͧxS[0_7<в9ք mm&$hA瓅zN\ s C}?K5kw7Zg#i7Tݾݝt;!B 0($ &@ȂʪQ!:@8@ǯQeQe 0%"[#1+,}ԽU];!z]O=d3z̾-7/\ O&7tL4Dhg2|yGGGhE1G0ts[QL1HpZ[~Ji+UL-QDOENVu6#n"uΠ{.:~wkc+Gl6y5lsreBbIbK8,Ew |ٗa诮guM%,kt}[i~N6 Ly^M93 ߃TARxw}乊-nXԾS:L̾]l8<4Bih7zǎڵkYvm-CJM]6p8jG}6|,ްjQ:S$B>l/*ťnVΠc-/;*y,-%ӱ'KY$F왫ڹLs*DnҴzElkvD ڬ#gpA˶'E+2dȐ]h VUGiTO۠Hf&U-''7YQT*(#03|{qןT1ڶp ]}FnzI-,VKt@Mb;{~Þ_D= uv›S=?yk9:GnExS͈r7\CzꟿjizbvspXus19,c2ъ!.Z|ܡw+3PFҭ#ֱG_u'3lob%N+Ww ?L9\N Q=Q[ֳ`=JTtN~yt|CQ16 ѷ|Q^Ś_jvթvIkk+6;!6#[ho z'=7o.ZXeGd0Hy:f8oϕWz֙\(#_u뎃>T9ftIm{1ڋ*Ցɏn&ޟ%4U&u%˟DFX5زeK$ihp:9큋Vt8vZc$`H-Xq()'(g&bA EvK,U=_Ĉ{ss{sR,A}}nnWBFo m/' aJ5i!r+Yvv"7mTG_7Z@ кPh Ĉ4r8Ls0DmLnr1'+\MܛPc>DMPWrsowU74yl>{)kKc#5p6g>C<:?|:C^hز>7T^)_tKN~n;BMEM}19z^F[V :M2 ( G⸿ъa<*]18}=mվSЭ2xz>N_ǒe?٬9O\(O/f$vgql K u~^uHnc9E|պ}T%>w=X!#6N(5twuQNϠqZA<$3)F2hZ_FazI >!qlhr?DoUC<-1毒7{~C+$ktXhYonԶh*!^~d6#_Dsɏ(w#!־HLG +KTch !C4: #1!ԥ qBDlM#Mh0Xַb' D~U q03prYzpI}^vIF{M}Ǿ8,ں퇽0rʪrw:hlsCVZE&0!-_Ǟid2O Yf@[ l#FT6^6T})l 'u Z3RC6Z/ۯߵKw$D1!گF;tk\BvazID4oXD:l7"\ ޱ,Nmyh B|!2kC9)E@αv`sP+'GӁ nZC?!abBEz~p8϶;>/l$5,k_Qnz{^|M}DZa9 w ݇˰?o+?fFuh"h; xq ZoA4Zkhzx\`Z'oמB~xvAʹvHy,Z?RLG %cLF1y!.C9h&B=R'F,g7O J]Ut{>pܬXQ_0Z]wݕt:͡יLU~ yPoz͋TR[Crc}SX;+ {~?Vr[y2[v7ǭV[[[nDʹ@NmB)j=\ 7C/. NG v\Q [h'_@ʋ4J-@skKykNlGcy-vl)/F F (QML|XlA-h}#U qBcpm8n8܇](ֱqF79hbMUo!&ZG~!&[;FZn0B6I.A p`BBD6Rwy z_g'{Qg68)OC0~ Z  p`8kގRl1!VmoI8;*gpx8?ъ|ذaiƍG*ʉBT=wCOc6778֑F6+JM^}oק"%!ƤDEab+;k)7)-!>Y>C֙YTi~_l8!QJKyYY1bZR !F)c Wv8ez49\ֹW=w8 >jg.A:yR!L%i+xUxޢZb/~JelkvyBtbDtJWx[pdC)&0WbJ0!ƣԒ%D%1zoKl@FψT_6Y>=ɵ2)O߯K9$aLC鴫;; ͹`](]e'"f A![Q"OBc}FC PXh 1CcJd(֙He|iَc<䄶y"oS9yʰ? Zl(yO#qDO0J1ݞ-5Ly7z{ ġ1{Nqt"(ǶVL455%Nus4559v%jhWC l9qj,ɖ_ ,'Oj6)2e!>ݑuD9R D2k[lw-QgJ=^MJ.Hz~l! +W#oTi-# np#PR֓γ 3tؿ̍ؖ&nڴ@wsDu vv$$a <k}=A*RF16 J"vY (G1VC+U]ÑLx#Њva׳baU< pIu$pg"D^*ws2Yƣ.h}JL8y^ c6.du֯^M%| I6<1g_19O|kloX?1)O+:FȚx4{#PKe>lQ68$Wq g.? +vN;E+:'Z4qB{`qMR ªyWT7R~!w|{IBLFjW*c#`IkޠL~|~FGi^RC6cȍLf/A>[I~a쾘ɰџ0)!@;Z^$ʣ>$U_^;C8w8YG=D TēJy '6Ze p=GLjxh @6"kOGs5Uk~!N#^e1C T [*))h Vԅ&)3VhSfѮˁ08a&|G <.7QޘW]]'̶V,LnqъF֭=m4 ڽ 2Q4Hy"0لMUKƶP&M +%LmY{!!JܚBo'cQhn*ш:%M.ݣc(En< Xkǿ|a j&P H9v#L11s2Cj_Sr|N;;'+Zs/---Nh;#&ؖDCVĊ[94Bh= WYi*fi^+I;o!.V013x^I"TZ@ fJM85]A~00NCmୢf|:&l8hE %;R)6oaTh;NP7oD)!vGhxx3CMt^4J 6 lFyT.My I0Lwj}t )y0f,E<_ƼiL&N5l$R7pr81ъ7:}r  ڙLT*ը;9JUXۚnB܊@ ߯R'䐏[agr.&VLP8 'qzƫjZfzsU^>׉Ga&;Yy `R~NwD8"du.B`FmB h=x 8)ybP}Y[{9q+J%pZ8Lӟv<^e욒cNL&f[e|ZvAp'Z_ۇREU: !>k;cBp2(qRNBʛLK 7+:VM۷ii? {nt ~UZ QϠ5gEcк9g7NS H9 //h 8oW*R~_UKH}rn6zh^V'aӦMNh;vj?B{ygy'k(u.B9إ}>tۀ7ihў;dc)O!OaL^ħ(x9w&o܃uv`K~c"N;vdY:::Xvm#ᨓ `ƻH!6bn(#19+ĸo6rR~,6|/ o_f9K6{ BLá5`/v a`HÁUr~"Aԍp6Ȳ],ҍ;N~4bN멶Z8&@ bqjsⓇ[m%8m_{ *~. G@hJ7)_'"Ř"y)bdI-&/[Zct|7H?YQ-MMMNh;v<w\P>$4Rx\ۡOy&q2RN.nNL{+X/cғzv-D?l[71pl'W͟jRaJFGQx^M HyU*ojַqND!z5G4y]opfbCXLQ'k5856YMLk⠲O0jEʯ"^߱1bci}%J47h{ys da| ֭ *Hv S^Q~[M然ᄟn7ъi} 9xڮ#: )O$B:)'LК!31)Q:vR/{4y2h:U{mډxQ|umdc*40jqѲ`^mZ\ |ϕ(5pOddc,{@h![StmAEbg,A^@sr0QڍG!Qȷ1b:| #:~ׁ7-1 )'ܠO L)1׷|M{~jѕzzUwf:#خ.ƯF$xf H9}O#JSFR !Axl+v'`<.@G?ޜ/D #Ǻ*̣K3yR3bxޱh:E$Up\K~ !|;;l~(8}}skᨏR?$-~- &"0Y[wcọ-FgVUhCCxhF_k ?޵טfLu2|>^%e&gdh}mnRYO#8^ykmsmL[.xT{e1qOysrNA P| ymphGȃgY9%ld!^~#.BE+b˕Z#D;/gha}}'N" }}Y[~MGgʊlߟH*RI^p@ +H9,Dc>HԼcg)KRt׷}}{~lvg( AĊmWQ*xWXg^mkL6y\]\/'jۓ y2 {]3f˭ܹN.ߟO*| Rb.JԹHy|C*9R)6k1_?'7AigB'vsOsu2yR?ĊS[z&pKXI"Z/-b^*?1dJ=MGh}_N'އ?Y.qc٧kƚy3B웻( >&g|`r֪R8f"]`j4cRi֣v2Vx=O5~n3⺎YjUQ5 h:=0Gvy7J݉DA24C_DDDL*!v_u$q6̴q{Dz8Jut3>ƨ՘nӉXZQm>@OTף Ry-rPʣ4n1;;(5"1!D쓟k+`;b*͇¦(phJE睆G[9A ϻlԹO,clpRzrcc,3 ~ hv$|u';/>Zn}_`J=^$΍ߺ/;>smfߦb5m#_-wy`!935\HA#Ogg'[Ttd0v*j"ii^ _%U bQǣ7G0ϠKSd_/BALÄ[Xu&ur lq^1h\dILD.lFʏ^Gm%wiǡŸb2 9B[7a 9((ow8KuI&}q"nQ@V̥<!NCL4h/Me1״Vܯ?O h;&Pyk"9m /f:osV+V}hVr, Mnh]UhMiSI yUE͂JA랜}FmYaCe2՞ט"a)1anXh*"0Y_,.!APu"_57LBVz=egظiE3BBPI͏=t8477;v-N礼 :o*'o:qvgZl);&Byg"Dn|2|)HHWC++-u1RNyGscY)Al5b܏>ti(0@h6%1ZMñp=l0N^0>^ 'jWk}Eo`ҹX뿂]5DE6nfƛg&~΁")V<ާ}z;i  31y qatM|&g dbO#e"w~?8vVvΎASS6m B;ʚ5kXfMUۏZZZ=ztQ&w0߰a===ZS.4[BkJJ|Z":zWKIn&Z+sNO'Wy $ y(%UA>ԺxrևRˋr>S}E*cJoQjZAIa&/Fqpclֈ}.bI7:Bε]QM'X0X`>J-#@ Ap{Lc*v JRJGq6G(F_#ůEHy%?!1Wb0O;'yr|Q)oIO,HUfUIye.1Ik}3}}7J-. ]dV+M:!!l_nxJ\vdYڜކ^իW//I 8!9>Kz!LQ-H96qtwn_ciٟ[|)J?rJU./ETsb$Ap[ks~xa}=RÞ1yؓl*y4IaGZUԗj[_RybD|_?[D إ?63P%z6:6ZV6}R mGqr")ybGf0>(mxޏi(Zara`/n&'\R/ٜtNLsLMsH9=LeeDq־`٬&:8I6+ۚB"夲6!Ơ**[J&D1 )&zhn(8R~=f+e ZߌR'ydߠ^T4I/!i؋Tj!|7U VOQIf911^1lSX=f2wt1QҔ:ݍEH9ti@aG0A&)m'uL'\)ªM!M8ےv'˫XRɺT\e)b\B@]Sv !FE1 g8MMarŻmtW^MЬHP9^S:S(lT>{2p=,t2Wpl ^{5^{9r$tvvbÿS˻ܱWZߋRB){W_՟KqKm9H2%}}o%&٤Rkޡ͛7p h{W1q9qgf3y+k6a3dÎhQp &˜j1cJ{{{:thYKq8U\'.;Z16'J'[-,|BK<8 4N4`GB!CT>?ֹ}+`Yp6+XE,z^F`$];tusZ^w ;eV\zͰ[ntX0Fy47U'0@rtѬZ*;;]NN-6 R1nIr';R{ZYF0aCŶݭswfULO)jwX6dn\ϦM>GN$&t:;븳9#ޭ:|ג5DĿ0qtoO+ڟIF ߕO|S?'bk8`ϱUoa.=r‘~ɯRkØ9y&GN8Vŵn2$677'YI6p8;7 a-H੗c?ŗOW^_W~<'qLܝ‘%5DDxM;`O|Yu\YX!c0vay|H7yO,,墓ϡ-F4 NAk4c'нy߽׼O{FɅuaYJ7S07,} ]n6/s┏ /GEI:R\Lb;ʮm 7,.Xx>,`0u}7^悅Z=7&_}9}⥳xۿcʬ0UW%/ 0eQ.O_x}_s(]Ƒ<2fcyL8pB8{/%“/f-VX]$.8kK佑|N ^8c!~~s5Oۜk)b#c)15j8i1>~+WM{^tZ90ݟf/.8Mi1/H!'%Ӑ~<yt6k>X6/wqLOâ4%ܤozik/Q]W+mzAF%Z$ @ 0G.o$dbdLœ1>e*"5xxƎOٟB=G_#I,UxYf Q۩ٙ0\7l|]~<"fiqX4d9sJ^mH9YjO .+΃З:nP߸ޥ?YZER6! I,Sk$g@ۨ@xxxqh"t'888Юj~텽}=qss于/s/ 5E}YF5By ckv"55G[8sYͲ8~lD#Q۩I"M~nL|AZfu$?>8/Mqy1O5r,QQKai16H&&a7sRr E.¿Qk8r6c9G i,9+@ yYH}ثxh]>sOOO1RQ/l,eee֢)..iE %V{u'Cu1_oEx٦kF}gr?&ڿes'?eiR\^6C.HR#O1nd4Nc q*؈8{u$DOc5:kxlx3r'W뇳Y/X۾y9MJ)Q#&=9k6Ց*Z"@:Me4}}HqeThb"c=6"|Q@qq1>>>zE $Bh_'_{C&tjo,b>4c?1 ჲL~sX&qR|Dfik[`ˋ>X;X+qGM&GegȷG<|hI;ΡHݗOq:|A·x)64乓ύLx>GmMxp8)Siu}|B$Wǻ7yo.+݋.!?G<;XY**iurͱ 'sb7GdoΛOACWN 8IId*LDLJEMMMwOK-ѯ_?/H[RTQaa Gj=Ff?6[r؈8)}6%"6X5W1wi(qݲ$NDZm͑:vj\Mo^JB26"ۏ˓#SqQYUZc=A.*E6/ʛϼo,!&()8t,rvjsh(tZ;wߗy3ݟz)׋I|(ż `{,ާ`EqZހNʋ,5.4)j{?vjylHaL@HpހƮ%s[^ V٘DN'k)&QEV-rDڝ_k-~9h*x+)+;u_ i:ԑsC,5zҘe9q+YpJ|o7vǥO80U5|Y!֎%l&|u$__ЁCx:\a-./VOVԥ9*WY=GrxkLmMjʾ̽,[ȘaE s'\LM$Nm·Db7ZTnV$gX6rT7g7tZ.90mS$B҅Ag6>&$ح c9G9[7k06ٓ?5- 6C !rٝNԨKtB["{/a}+j)*/܂\J*/Ş[x#mݩmL됊1g#v}}=...7C {{{\|!8sv(c;W= W< ?so'(j|EfmGkLȳ~')՗:$0R=KR5-p 1ٗSȢ@q2$bP۩9pܾ̽,/_ Aثe?k,9{5?(Wu=c!Rܝ[r @_G1-zBh.~{:2~xB-1jhyg'ҭ7^ˋ7Us+-o'8yy\:ʢ;(y1VOa#Yg3ۼ0*p4!!\MguA{67孧ٕ*[G)eAwO~-̟Fҏy~,ag(,-@qAq*+"꾱r-&!z,s s%oZJblFƏSǩ*N F58c&SEy_ ?}NMhNbRɧ_RyfFu乓 e1sbJٶr#5-?сa7$kX+ۏsyټϊ7Uc8b7r"xݙxxu6ʊ+q7ݩ(()`csP۩7bo=LȉLZ\dk0kͤ:,}:ahll6x􈊶hDRu4:DWD57~ vvYGWbPNMaiBHn>_o발1G>Dh-1/rˋ|gŶ?OQY5#0/[/m;\!!?NsoKJ\q5Pj"[?ُ͑/$V]#]Z(\kzܿ-z\^'Vms>AwYj;;;.?ZWWWc0(//1zёFB`0:'>>>/DOn NQjc۪{zi'c/+hҾHcѬ$&" g _898)q2!~ATX`bd j;5.&i7ZS&PÜ9Šw2}6q<0d|A1r9MVǚWw ,!Yo^TfO佑r{{8P\^LA 'I898__b4hX#j#tv2#k픨'$vj}?y9G8r/=?3ʟFOEUg3,lQO|,#s;{q/[IWc#l,4Mboo/-#/_/)~Q^QjFoB|-a?s)A#,D͌8"UX; *!G|r/k֢-E_gh9HGQYKS2<0Iؿ,ʤsϸѨԤg9G׏?wgyo$uJdK[aQYSfEޜn#P,X<@|d2\\!` gqY c0Us s- ?o?Rtʺ0,`~sk;!g2-z: ;k -|Y[$!]W(認E}ak#?E~r!q*}<:[Ѫ#t|gީx_wŸmlmӢvEc0,ƭL2}9G8s#0@j~quϽ͡T$p5R1CsT>Bq҉/!p2f'_ HrQ  < =HqrU{dKFBt;w*ъjyGyD<]=ykǛ?E {mX0F&s4爢-zO"[_-_ ]Ih4[։pN!{BtOޖ LGZFB֪7 kJiIR=h"wmQ|SN*>ʌfѓ?YzEt.V;N-|0 B@],z#::qv <EeE>oʕ;a-Uݥ4/*+&[HAm[ EO=ydA*U:a۵c;QYSi12123=/7j}qm$&$o;sO~&, % /v}){:}4Gs09Vo C ӧguzBw ]v[n ?58s ̣9GAz4Qɒ|_wuϽm PNMVF'~)s.(2'n0| H~躄ikсafK (5q9¶3ڴcg{È}#HMrH|$!?lT\&;mԣԜ˖Ǐ 4쏧+<~'ێյ#mUUUwOApu\VrAOÚu@JIݗB}cQ۩8Od%>>df:ni:Nѕѫ?=_et`!CsIy~$I 0fL 1=]=)./m28Ģi 2"ۏ9z v@Rԑ6VCNN5jۻ]?yUUu#n5{[&†;1">A`$x:ol_ˑs׶w?xTqo&&DF1/})/-&bkkKeee}wOC tF,~rIKB zc~s?aC:4Z2ߡԏR9V[%o{Lznhh@txdM<^Kl䛺oX~y%\P‘F@*9rWWWEܚB!=Έ,{& $> "?|)/ -lmmߛHڝ%k)>6n LGLjQ쌓SMF#B z<\{ 7=W 00Z+vT$m" :*ʽ'l,UUUFy@YECCjokHPֲ=&Jp*|^!$A7PTTDQQQvOn.ʅ\ =%:<>:~j^NJM* -MhOdٺ1Ο'PN88["“LM`BAM-7r#EO.jkk{E bXoꢉ֍#Z7^`[vNrOc8FC('kOQAG"׾.lʠ-vzm'PK_**ȯϷ*l:%]m\p~/:@R%vT;%M% JWjZhhhhi\=Fhw00-2S4iD:!#Ż}I,7*\zV_I:==ن1J;o0CѠ$|lØ``__hn:&SXD~}>zG yyhhAg~r 'AG1BV{w?v݆=P 8XY^lȆ+~n(H6nK|yaawAȽ/w/8-ab^pZhl448s/?~Ry#cID&s.-,n-'kqNJ/ݴzi@ DEQۨo˪9BD6C7b7+ƙgsm7sx+uZ!Yb\`!lLј\HW+^ϫUю,*)5$&_t4G ]u-Q. uj7J+F4CX=PP**ܿBKϼ3x6KII%^@>ːquҪӪO4^-6yIiRGic)kK_ք\ ]ޝWк1B'3g`w :I)pwɖ xغq6.d- tŭ+p:bT>goc`e.fw\JK AI*[g[L,y1 &/B穹RCVm {df1!(wrrjs ފchTE&yu,z#p=mp~L){VF~}>r2HmEͭTM#hmSFݕ:br-=zpPu$DFhF :lIDRrZ&rO**QWz6)SjR?[ tT ?@ t=Fh N msŐ0ϬWZRn b 3!MﱡrG㥨IJRjuuE (~z\ RT*Fcۅ@7)壵(o@fX(&׆QP#l*OWLpyH15WOXIO6 *Z,^~Rˊj{[]n18Rs$_ ;x#eGt0`|пϑ#rQT)ٺAQCG~U.+񹺨Stf L@Yc9V}3]mMQ.5 *((~r@!T*Cz7`s[[[z|jRlSuW iZM~M_V{E*M_6t6%A!xXgXq&X3E3(m|,+G|^AC(cRKseM =sqܹ gggϩT*9U^Oyy9բJ.‘vOІ]SѾlI_D L֍c;w*|`ދ@~C>^mmÜ9ṡ<{kv*˾6)n(wqhwBTX?]; x9JEMM `'\ =QT[3.nvnwiL, R Tw5?\rihebڷ)D9g(oaUa6 +d&ppM^SӷR ݟ'Z7oj;}'tF,KUrsQ.EW!Aq+^JG.nv]nRyfƱc.r߽HH@3M7D8Fh,PuW׵Ssn/EcXjE3@v9Ao1񓛋r'LJF+I %"R:5&k6pW<QQSTEMO{AG"7bB -tźV ~)t:{oG mC[_nܚ-g|F Y$kjR(i*aCVqbuI=!m>l1NĹĒgcyJYL/VߗWƏQPʋa(*寸G7Ԗܰc]5)+۝j =%t-yE 4UdK.7]fv,Qۨ-r5SYxmQQsQKVx32j2}Bo)"[M$^q]e5Lk|WBQ ùiU* Ȼ_q)LsI`5r0_%݋\D y7~j UB`v3~rNG~r '<==i\7=JhF``pvvo=Iϱc hQڑlĜ⹼>Mz6oņmYlC6`QNQPnf#uW,7Ԥv PG"IT4VPl?R#u0}dYy*/ZjM>l䛺oR׍T6U gS >*ٵsa7r;/֍W(s'7m&J#CE;uWE H~6 jϺ" G zΜ9C]]+i .(jR)uxؚo>Fc>PQQVq@QiObEd}X<)Uͳ/u漟Kd|UxS*L{?i瞄ܙp$*OY\$u5E Ex1dyR' F ض˰]D:qj?vQy"AE Q. Fxo4_wʻ`›&h֢\TN֐bu}u;aaD|tAL'q+)]gw)Z>O[α&٥*mhcѶʋ [ %)s*+ߏY"D fpS'ζCNLfn9^|ʛoHNsn6㺎'Ltiz. !{w}JՊ`B ŵ⒠{I"*_:m XPk+ < T^XIO&HPoeFJ]=  y<LO'uMhXf\:^oIVcـt__w+w\NA/<00GGG'Mqrr?LIGxyyッC4!ZS,^W\V1X=7gjpNyـt-||\V s Ӳ[necuݬ+^/@&+R4+ۆ1߼;AVmj>>m~%/eŮ]?qmeCeMY/z_僺-P̆,"T]k~#1!Nlk],LBB=,/z;6pxhqb'S @2x$+zbcTkk>{(wvvfȐ!gE =Nhu4n)B gJ~cEBۺoRKn;m&26;ceůMQcg goʼ~4^Ns4cƒYyc˅/ِauVUB_&00p>CLjvmdylvwP\GiCA/3Z7Zy}}O^[[WTBh n+r" vy–KҚϯ_/Mp0`Fٌdf_S^8ʝK;!?ݝ#k2\qΘ.C+(j(Eo]s&=*_x[s.X'ZmD_V];t 61q$9HJq9 Is&&r<@!. әXk-WT k(-Ug]GrAgpSMg"y<46:gcCkdqiΪW,dMMwmPwZMLa:؟Ƒ}w쿜]OhuwJk|g^q20^12H=PkyD:EZiWL_ѳ{\RyQPFC<IjUp >*6Zҫy]o2dBBtźү_vvO~U*%!``b6fy7b˰[nUFڏ`tt}uɮtnxnS_|,B";˵:tkQۨRb>S vn#{U+,𜏗ʋ%[wN->,L쇠ocb y |[-3fTK׍T!;BOM~itOtͦA ] eНV0-Y~Ef<[<73x|Wf'YnC_{ǖ.l"Ϙh84a ~0 \4K,LtszǪqx00|Uf5T4Vb낮]Ps+՜5<_WYNUAcozWyT**++zЖեx]Ȇܟl\ ~1p@+j:bO㘢ti spړ-}ِա4l7yaDZeuSPPp>CncLpyGGfϑ}"T68XWW))c ŊjH>u42P{B13Z^߬.nFGCc>j5hhwՙru=q ̴&*ۨh`CI,_u}܆\I.2b]1oE}YӾ(m0:% h -9?[wl;6QgCiY_.K*^]HS㘝4BD AkES ToZ,!ubkyy-ScE{f })*Z*+p~G-vlJ/W>WFccX99E"!m۹a;;5O'ITi4U8WQP @Qc{\_;{"4#NAtQ'KT[^)T<=h 7;3%oRfDPpRe1c 5Vq(+ ̘Baz< Ό$%:^(Lo>rz?wqe40WWfQiޟ`~?h$%h'lWIxJC(:mcM^lg>Xi׼c_ñۢ}Y|AS4-M46X}z ZPcYZ$$$:坾#$G m^mCڱW#lK $be C9%JL[yXXCV6# rV*ʷqo 'OT HH@:7VeTfeX("X AYP f\ý#\.oڊAA(&xXj5oBeJS%~!CJ p0/V$$< ???3QB 2,{O.~LO"ԼNJT ºk~$ڟ;JMMM DV'HHW[iYLIXY!! ĶQ7Y*j,5^pV-I}lLHhO"{~Uy^(b|kcEdhbuHH2`rr߰2PmA Ml5"%$~@׷a'vSSS"%E*yD<;"G[%A.q;$NQ_G~t{~mF W^"t()Sl(Fr@\j'q8}UuiS꧐"ݏ"[ $$ %xkIJa܃p?XyBM@63ڇqv3q |U&"V*MȆBrlGAFe&+azt4mnDɗt"T=ljƓ v[ɘr-DcKypKx6%U*r ~ ZH?05LUm$Mێ|b'opƆ H+{m4Mjb`(a,OBJ^VH@5fh0 IlAA ~h|UÕ4 Pȶ/{ u}sIrsБF<\@zԚkEVnn\Ezӽq0P APjʰ3좄GV%ݠm{tm!]9<I֔&|$iAծ$;s`vwl@ Xj=ڱO يH:zN ho܀ }&Mav  0o )osL~:fo ~Oh{xto0,М ɪ}TFNH#{=){H('~R(vZT !i§2/m+!+9T*qQ,|)ԍ&UtG͵r-t};JH)4MwIY7n܀BLSZo/h5,cP|Q&̟mBz7:$@2mW@MEĕh;(..nq6 򦦦VWpxnjhGbr$cW^gc;7LhqWa]p.zCgὊn*|ʑ?`XkfI< :y/cP jxvp]p.yJ] EOx& y5Ħ8?'< /mtvw=w}Oh~DIu sjrӶ<$$)5 g`ah #dbqtg簄DW;nOZ0F»[y S(9mB΋ NFSX̝i@u %rd702E!acޱKyq~w$]N@䝑7Ay ѪhqNސy e2X&T)Di(Cw?;-L.vqx'a^#C=,"|4am+l-4Hz= DZ8dy*Ϊ0/l.~3^p* Qmy>c׻⓰]G"sȮ"͋&VZ33u:{jRQ4V[x/oZZ"ѵR֑=f74մ`_sԴu C0 O?eFl⍮@q&qHIwʥBouX\ XHP0& K%Ƕ"/~ q,vyxk)٭}7tH\qfexjUEU-39XeÁMsmސ'˟폏j5WV8y^93q=zVצS5*`1qs<>W]Gmb\ddg>]V\ʌW9lY}(5wcYu%%:J-o H{BG@ mZšRr Y̢B*0*|!)Tޒ#F>veErL@2 s5Bo˚k>_\*3z$=Jq}u&:o ZBD`Aow-9jK%XcT<JQrua,X+cM=Ol/wEb]N*\ r^ ra$A.&V.GOr͞RW5d4PZDHUv3=H)WmoUՙ]]uLB^':?GCW_k(-u4RCiAS4@E~q9TM ӯLj _u_k *LU"9 +?pIEf0--N$ZVEmmmG]HV;wΒF9i^՜ԸnIuzNV DSWa]I q;eU~iHN#/_-aq4B;!1Q&D0sE[n1fTUSߣtiݰ W"‘zr XcEIkAjE ^^^ =I~Bo0W[LW.iO- @+(FV ]\je]z1~EA^d<1|T+@ݸJzeX T"M;i$q)j;rC?U~?XS̤tT*DWpx5T y 1hQ&|/M6AdQ5=8D#U`X1h ,RPѭ;;p}qPeC7sM4>ڎj?1q3wYcC$ (aJD^kqBd2vDNpg8V(б$j03GQ< 7U)GU5@;XE6o w/nq{tߞDsû[VJ#3]W: BۋCE9g葑nlIMb1*]nG#WXkGq3+e7WO$BWMw8< &dzWJSΈB^qܵ®$:u(Z0Ԅ[r$? r~³q=zUBJ,Xp h cwk[|ĹMh.*~+DuErdV(èx izi|{D~vn!Xښi!7"Aa$A.&Z[BowoQn*ކ-쓽N@ꡦPSj ,<  -pU"U}PitoPJ|L Jǃݎh6ϴLQV94W*q|_c矟=CbY4HդJQ.$;c2װkN&[b|%>wFlS6W%!x9"òʅ3>APm+KQΗ3?Η,ocQk+!m<漟zgV,2CMs05,~:ę $%BY`H"Q-VzI5VRJɑ=9$%l!CߩN$%<֖>X E~2 yk,D49X Ã+UWz+7G((7p;Dap;$S2rwdxЖpRE!T4RDZ9,~V!#݀"IHM" !qJPWO9D\EǣďV>[?lߏoWbkb+KȚ¢NYLУrбZˣ.Osģ[rGI' *Zw88;ˣpJt#SA= NaUco"p9jăZ">k̵Ȼiyi2<(BC2 'N @G}M8pPهu]n"/ǢpQn"Z;X z GnX;sgAU5C߉ƽ!,XL|LBHNɾXElr\|Do/|e9>`&^vwMۉ IDAT]IH' ,L7[[zT*F :lڈ E˛rz>IœO8ͅj$b#5*m 0&L(87i |D{I(},zX va ULyт,XlܦSr@t#F|E?psʰl!;Ш9VX(GG8"Oʑ̌?>oy-/Yc>fcdW%ֈĺ14zCim_ůvnKfiD_arEa /Hl5:Jtlz 1QK^\c ^ $' [7{HQU U BQ1.%Kv)V@_/gt?pa;Q()5hO n۰/x+GLLjr6c*BqBh4߿!ND@NBflc^|wRJ9B, EYV+-qPi#&&)PVmDIEGIXgX]u{Tgdge~DI\£h  D޽E J% rvWZ0L*] r[ޭ^l|@J0*D60R2 Wp~vG1)F)r m[˿Q|QHO1"(År^rj/m떶q}cbaqflتtz:ܭa^v~V!8fݠ$X ^ OAJnú6Gsf- } Y! UJÒڥwc`0HB[%D:A[QɢL86лYdGe`߹}-겖 qqZa dM㳯6%1YHt 4 NUL󚐔8,zGGPU-áo&>Cx {$%: ;;vMBܮ m ;>*,2,l0Ps**娮PU-CM RV5Vjqc!<MsxrXZZ]bѤ -e7ab-%qz"27ظM#r{ I[yXX|||Dh4aH\B"w^%p&w1Y"#̈>> `U (W1R-> 5@8xEFfI멱Km%'%IsXp[%^^Lo5E%z!E= 52wgqk:tdWDT+J45rn|,]~]RƮSPRE/X0h7j$I&(THbo( ai,y"$QqH^Cf_Qbɻr|݀D?jˋ:TWY;-=#'%bTydY&c,;שfƘGLA>#GZb .pHH r???DGG K\BBJtN'V昑4(\BV> '( ;_^yQ v"O+(<9uȴ p1MRcb("$clp5!ޭΝD3mY~5Ο1#2Œ??qZD&&G e22LLvy#8L̠r_TI'of7pwJH)%nwgwh;)3(8ISQ[[ J/> A$A\x2(C]'~ν/^ҫ'Km CMaƆUzKcɻ{v&&QV.N*L`~9o/CR",ʭ缨GdYqf~ֆHab7L002? W:$s>#E%<&MAH\T*ݤAh`b?_׉`xwVN8"{ kUb;>D\S w/Fxi9=:?+02bd 'NߝJ8 ;<ΣDq`xlR8a51è%\#- o/x[>ZH:/SعY R-#JnB}%J<:_ӌ+L8w= wycbq嚣WZeG+'s_F.C%&<-Eya:ot+h'$[_aA}f*44á&Ҳr}^**xp L&.TP£NW]:IK}$-LLt!,L!V昑5E'ׇCE` .;_Bs+J<ci5;0m CT"à&7Qw"/2O5wy'ytwwL`DMxyRv bP|دXɜq8V5Iv&ܭ{v!Uydy5.ւ?EFӬTTz3^Q'2YSW&&ɱTU[@X$ 5a;r<1Fv&1Pq$%<IKx B:"Ѿa0pPW@ ]Z=9ˆ*! ,)фryy_n7zFv&48l mҶ=2nj( w0v_J&40mvK%$Q @aT,*oɑ`@? d͑nO3adX[fk;;F3* qi'!nmc&&N>f3f\8nFZMdkIvw ϞrDqf5ȑ8O`2 .od%ȵn9qu۴5;((TVu̝Jal cYirt :S`ɻ X~Z!%:DL_V'hS2;p+`Axf_+HO1Y9oUbti Ț¹6:1E\, oSv\$%l uHck?8Tܔ5F_R` 7Wpv쓁.PUMa #lnVʐt)&SxwGO!3$_R t۱O+#-t#B{l { O4a;F%X@8Q!رb41FF'b=$Ľ;Oج9ߵ6لԡ揕~s5&ͬl5'>Zv Ѓq4Ə5з cXqFLL`> cdFG&(0*aGOGO)ШF=z#~39N)ۀ~\;K ^#e 7e8\ ǎ}gXIpf+.qXF0Y.rMr8sV2̟"9h;W鞻%2ϟ[ܮ_~"A q[An40 [_{;ѕFZް cX;g!, N:J #&FHĩDHXL-NkȰ= .vo1"-6ل:~:O#(E+zK˹A%͠Og[? ֛#L- D S2=E,^akf{ޜi,r^4eRzc%P"^vQ9@U5%GXv?s1 X}.ϽgĴ&GcXoSbH ch%YE9T`d<iJ[șCa^T[(ylk7$+PUM e.p>gco-嚜n˜^{(!G18sVko5\<Þ&?PFt`T7'g52Kx6qqqj"A///Iw  mo 7dYS 8x-FS>7iG~i,JJ#V}ؾHw+bƎ}Dl\.N#g_(E7YSY4\t8xa9s,XFrMHŀVqwP-poQl*o46\T`>{u\@Z23CyFj[xD{p o)e eqE?+q[y !6kjhGl1f%+ ݮݷsilznjoqw9Pqÿw`E?+~+i,VA"5^ڭA&{yٿqFX滍nXi2k*n$}.0 J%4"M8-nӣGC$y#hWF`K`?rL%bv*oqoIPD ~sksu\~$A~hZ)}/0LPۯvaAc(-7j Xd[F y9-<-Flô&=ܙ'=o 52e@E%%ܐ6EG"74wOr"2‚ |#~jѬ!ǘ5=B!)Q[rQQObTU&;rnٟ_^R|uDa /Ln!VbjZ2 (<9qyؾף#MXFf>u"qv;E1O#2\^w4_Kgκ` LijIO/(p>)a,șcg3)SoѪؓׄY󵢉ьL3fd1}(.ī:Vq[An4[߫ h4Жw|V ̱`*Q.#_Uqz 7VqرzCo-ʚF˙?!rK?a@?r>Q(ǰNHkٶt*1^9=؏,-y# _թNl1󞶆YSYD ytuC[JĀiT^k}g׭(G^XĞ8.p?IKO!ʑ5E˄(V Q3r^$M滶.dŋDyKG7a64H \ +MP6nS<"8Rܺ8orM.C:.ׇD`?w!}o>RpnED磭 r( `w);)M&hZww5?D: IA}8- 7TrHy 7߻0(kQ8آpY>^BXL!E/h+?h#1:Ɇm=~8_WO+OwUtaJB9!YYB[g kl%>ʅs(-DxC+HWÑJDq0AIߎ +M \ 4 ٱLX& LKf1Q#&il񳉎p\櫪)7=L7n:B~ҞƌL3IȚAD'XcGc/ (<</NǓbT^$X!uTbJg4MK{dJ%%SS+J5͹2IԸ̰dr2#26Y A Q4 ,kPHG(?Rxr[rU͂C.- DU'x !,șc#ՌOЫF$<.С0kcaH"nCiXpa$Ծ>{ hsppMitqW潩@f 0!RPZ2'ȫK3ǂF|ڥfbr4T4 T۽79U c{aVG8Kng+XK dbՋE zxw#aR ^S2BcJR1oXk}9BE c1,s+i Ht N0ANӴ`*xЖpOkoxC84^=IWI??Nm8@*n<,C8xUh@ECH7 N p%r\;(딘iv9db3e%hBf޴BT`> (%zLT3Xى]g=o?kP*A9!:Y%XbI,ڦgùYInOZ24[]l{HYTRK|`oKKf1mI`GVnV9'4þ/m'2lz ;> }fMeâ]Ǯ>.'))$=)"Xa{ē47&ɱa ;>9-""^)L0ת{"ѱt&A.ERD=- g0uV- ooi+䨮O$6-*THπ1D> wHJ!Cq5,)̾ @J]<%qj5DE8wDd2<<34,/[HoP['7d-g |RJDiu/esx IDATr7kBL_^#f!q=k'NrX0hal9cP bvR -Vx?{LYD\Nr>fդ6$jRS+̶T C`ݚ2)-"aon6#*:dž$Z ȕJ%o <։kﶶGp^Tw(-'|}TH0z[pk$)}gBmۛxIv@SE;ma #Z¹#WرF?_WɝvHjwN W u'J9FH"\|}XNȈǚ3ǂnjθUcH0qSU5E{'N0bGA8h5d!JeKFa7Ȅ&+/tuݜT.$lXiBL By4-ljΠ])Ȼb#l|f#-[@_E?+D!|YW"p)_)~#runq/, x{$ NxӶ$8~7Poƶ[B2R ?5a` mW$vz3qij5 7#Ca%I<\5:$Z c)h*lX<|xlGTHxB_+hq񂝧ԱBIT/2Țbz8#~GGDw?Uclz (m4a*'0Wv/spߝTBA{0{G mPZ~L^BnuhE$j530AjlolAoiAjD(m{*.GZ2K,.ҷ벣}t2 )B( gAFkH\ Fʵ(ĀUejÛURDR8?u6:>iVmU}*ܬrLUw8m/ɗsgλ |}XmΞ^2DgJ44ʐN79 K+򫅴N|*3%r 3Da+ccc0L}Hm4KZ;mK}trǛS2"aYaШ/FH 0g2-oX벷̊ r:~X\M|V$bP|Iad N*"4CM sg@ #sjU RZ"dA9F%Xhd{Rq}C;gTM0V~#gӼ cq* ilXi©z^C?aڅ(`iwCī> ڲșcA3Ҟ:}>-3ć͂M4!.֚}}X%-~OrSZ^9r7A(JFBa ##ãHepe(8\@$j1*Aqqe—q+q7Ov-M%\yc9<kΣټ5MA%+07ALYSb{nYS~(z,L*x 1#?$-(JtFB8466"//Ox_~֭4 8T*^Gcc#~׎: 7,^#{tIITiX[{:[ʱ ʡְEMyC n!MD qcr9q.#Xӌ8xX[0vuGo5bZB`X:Gc;XV[u:{_7^3ooZmsXggȝF:O~,N@εok ZFƛ0k*gR7o T\$/_e "@r*%W| "79?35q~5"S7 I qpA,NQB׻hvT '0P(_~iu> 4h ƍF#d2"7JG"ۺ>َ b#9P9ĀZŮ/-οwiM4awU7vi90h ^PX$G\)d̢s2!E:bjh8ߪ@@xmۣ5sn/!, '=-ɞfD\bf(Ue=Jˁ~nAjk&}u!}< P9lͧq(0bA(Un_/qo!3Qn='onFX(y|km]moЫ\s;ڈ h=}r*VHmnV|@#h|'VC}"d Jm̻_hxf3Y}~7~ Ua#Fm'}<iiDt,,+a 4ۯ1p-4V|I? }C"9'Bx{9>/py|ĸG]w++&D5os"xYy;^(GrQ7w=^+2? :zG I[xXX|||ZNGhO\#7f|w6#^/5rs !jcTDШa| 6nPZȯ.U͘9,]@J~w!}<2_g|/ÌL32̨w{eH KJN)z ~:n0#: Ὢ(J=y:̚uy HOV&LUѩ'E|}X;HL/N: wZcGИ?f?rC?WrȞ3g>9u}-fSf|q]l;ٸʌO6^)~F|Zwwn %5䖐 JKK;zG &(7 No wϟxv}!'҂ u^Dسňp5u*52lz KP8qZ|]BlWaf ^;Äa&9lː>DEolԫkőYX{$ 3'qXB^bi~C+:"}IX=62#kfMc -+lǙ>^R焮%"Yl\eFujdU%T< ?_9N">B@dӑwF7״쓏WQ_z@|oȣE MlWsoB9u[?{oU}3}N&+$,e1TDTG[RAV`K-ՋW{j^6 (ؔm&}93䜙3L2 G9sd|7#gQ i} _YBfAD1t^Haxgsˀok"lF1bӳvlzvy^7[DxgXQHO 3l!Ʀgx.Ŧ!dbxӃT:!BE"o}L#^z~^i8]^Mw[0"lKK˨ڑ@8!zLmϿ!_0ƇQ"a Ry׎=:OV{156\=@ΦrPuN\Mq4B2u6uL <M"T<#FH#M}~,ʽQx᷀VCw2)\wR>$#~L~GC`L).bXH!!!aeh#Th T\.joi>2(9wqwOYRE7wveb QQ34s[,j.E#F4pkbj/'Ya^ZhmZ0Broo($6R8p~-턡7!N_ Wy(1އ.cl1^8Q0vicb2Dj"9F zʽI ОsOfQ8&DaI$(9*~sx~K4!!.V{E㾅&;"g31JvA c|g2NK m[$.Ͼ7-$w8>vBq =KQ)ܙά~1[]:Ĝ;(FNAPG#VhSdVq!JKK A7Ihfz39_E7=#&,xO(t5Wݘxg嶺S)\Qxfzo|b,Xu*FGhQܗ̓zƯ[e=@@k59Sn(vO#'u?}AA\+%ϭY+)5㼘| H &ps#ɈоPVK 6)S_'b&31̔If gvo/O|}zzln^֭hߴt1]A*I` ̐*Hվm P.ܙ}ƽ6r~̚!3~Y;Ol?M r)~4Dz`m^2px4Op]_|nHeVE*Jyꅩ[ĩRdR?JCr p1b6a21ΌU%biBL/Ϗ?l{7U-l؜;X YGhǿtHl:=0I`r}{S7O9j/O` K}c4OsBB+B;d%?}B0MwDѯ?Tl3܉, 'NKf)/P x-Ff%&X̜;7?F̀Y<(OJ@*rMJRoPLz|Å fҤI08LSQ}*6:S(]LA1r+va}Q^ ><}4n]Q4\3>K{lO>ƅh<Φ31fM 1ُ9YL}d?f{فA¾hzbv qC)@D5tߨhr+$b˼&+뼝wۢ\>>ͻ0:gNvT FC8aص'*AX0ƋT}waգ><\b<!w K\o?d ow1Jv4y|>Ύjz.K n< o2Fx<"ν~ʂMҰya<~scQn7wb(ɋL5v&ܼ1N)e* XAM:-]V?qC!T ?La {U]{+&Ʊoİآp8χS^2)̖([]Ǿo]8υ9%2l)>TU |6=M/L6Դ9oA9CXu.OYPkA5l@8a@ _˭ѕmF@Dc_E>rOt4L{:`Ui툂q_oP}W][ؓ1~RŠs!6(P™q!FGޏ;N{^Ijzfl5:gcѨ/C;pI; 6j~ wqݐH"oP34@[Y'avzq~]0[ K6\ T?j4ϏTq?J?R{b4EE,w¢z;G} ZbG,kcBkAmZVhR z^5QxЮZ<<# Gj-7Swz|PnX2qZ' B|/ .և(jt(nq{wxpr PK=8qZm;FO p#8܇1oɐ'묬}34HHxlx 0hsS%XЀVUv",l *`" RTpQ>fkq|V :\fenk6k 7?DF"y[70k] IDATBb1vœ9`7ټZoۼ=@ 77b@8QgEI^ 3VCUSp[ 8O] ۹^>v 109(tZ)ĩŰ˨e()6 g rt}8XWB8ftmfll!.և35f}7+^L'@F>u QDhÈ^'BFrOYa#@U-.aoF&swkxϵ|F<Mn^ݓ B-v>^e*sx`+ꠒסŷiG#;AmA8aJ0q3QHa !KBBY4B{ljd(A6C /.T db[=yZy4tKQ1;#N#&!bp# L$f m ث?7[(Ѷ0T-;\hr#5&ЄWns3BHŔdsS%x%"3(Q>-S/ĺ{xfeauyQCM$b;n6lood"bp60( x<08bulPHD?-N8wpl@ ҏsB[csitQ>޾mu0ۋK1%M.v#Y+e鐨]uls<ƫȰiQM."ONJ9.L||e(ʦ}kpC/܆q@d2"o&lq2d'H=MXY"Naxf`wfq3yZ#RU!<\SLUEf`vrX?h`Ml29 c0 m)GZټ0{Ԧ"tC!b@ #Q){#T,MV";Ai*,݂KىMVor*XcEs1$g{ɅQJ)=g ||%y1l '\E2p! wcMoZZ2ˍ I ,)8\oWZQhxBu}?KŜ, kٰЇ9/'"J]];LLRe J )ҤȌa_ N_4W|~%؃^_h[+ƙnk' 4,"w{XN{ +8RK?6'I=SySD@_Ye3_"8^-ƂsaW0f\wC*atA8@ F& >B)*qxC)᳋ݬPIh6Y?ֆq0RH$Z}ox26EQPT},wcQ p|Xetl/LyĜ$LMSwfT#Q#S쾮t:QE&kw/WT4#UO eH|W;]1=q&(?9gbr/.J$EZqqrLP*cí g.:5B1N ‘F 744 #ZhS\>܇A:!akW$0'K8q±wy ox6Mn@E2ǣbvR3ۭx؄\eH f08fE80zPV[oFx#z8=£{]lFIz6xl"2Ssړ1_ G3 ڄ)z)l4) Rjr1N*Ie@| ÅT:t }8lf ZqQ A&6J߬ec!SVB-&c=@E嵰1wv{LH$/m(ɋf7kRublZ6bWAH'+Ɨ-[p݂q1N 3ꅶ/0v!J1pkA -zIl;ӤXO't;x~#^ FcuyK7V|aY9N/62<JbqURh좿PcbaR]5Xi E<,DLJ36_m'sMnn.~+jb<}ѪFtE@YB`fh ρ"GQFv'cUwBüƞR? _>9DzB4)6ߟlFX萹&pe E/Emqj1:Ԙ_3M d b\*j1N%d=U?0ɱPHDqG5Q /x@3j]Y]>T|:{L,Ÿ:T59,**acQYf@^:$ F R`렕GcV4ߙ&?128<>8<>XҩW9ϱa~,&$ɡFR{v E1`Q^LPbvN/sXn]uWqg)뺀!qƂI8aB*ÈD" ?qx|iu I%tA TӖ;{b*S7_Yi; J?2 mx#W"I#{rŝ!ь[OtA?wMԡ_e_ǟ: SD ENÜ, db _CqЙN?jqF3rDnVucBr=I7 ULbIA,.:pŁ$wOԣn%s#_>9lE7ߠD{5\A`5ԭ?Ve V,矎{_}F !{6wd~6 )@jA+'⿿ǽ1B 5^;=ZXOdžpȈ8ɵP1^<,3sDFm@8aHJp\}ox26aɱ(HQC\6oª1?mGA2k5<ʙy^$irF3FWLd[pT c`'=Վ_\t`#$U\NF5]g:X+ C-!GӫWa~,)= CWlThomzf| #Fjq#\h;N#G%01IV>~8 OI@fA ˀ8ZCF-?0SFv z)rB~qXȈCVea{}^p"5frO\$/sCp5R*YJ swo.f uz M%iQl`EĪY:I Z-T7;˭B_) q]WSuVv"R^;ٍw$b./:|BJgo3(?4 eg(k-ޙ&Ŝ, >X17M]n+̝iR<4=c!T"G7}CƈڄN{s~kITiJvHUS5is`nڇxImxXi`3^$e".npc n(<]onjLE?db.M.ArOH8BR`zg-Vf5y.A&sFV tLu3]8b cQe/> #L3'ㄑ jׄhr#'QV;l՟cl:Hԛ\DTh4bv F2ffj ƱŁ[fĜD$i$3p8pD =9ƮKxhz,2Z$ 5^AK[XyMwOsDz"CI$ jXNң49qtbvgLKt|X8>*90^1@Ȅ #6xGPj.MpȈõV_qv,0 xӉX9 `3M'ٔL+ (,V7 :Έ:XƻLhJq] [3ꐠَ3 Օ]9v<49=c b#E|PmÃy*$i$q*x4mSQg Wڎcf|P}橰 UM6i3oTYf@Z7趬-?IL5 LU b|8#ZŚf"s.Vj(/0;diajz wgQM8"nH`@0b|`kU?~8 3xx+hbζ橰~a .<*JWcp@XCW{}c?t &%+kV6 ~ hAτJYN'stGs6aV6̏ND7 Z)cq F}MmJw5Þ9^orۚV'ceȊlYe$={1+ĆR*b> `Dئ&"NvcSI p2gH 4¦4ʽ8nrd|:xbN"@ I\*c[ >ҩqhxE6T~c 5'EN+JEmɱغ$7aSIV'//BM[+ bn"+/rPE63ѳFVs("İ' HJ`uC 1~cIOWHb 6|Z<[N[r-c . &T|3bdQT۰p4"v@G^6gp3񬜩Cz,hf1 1**խ#33(q;B2Z̞^-=2~SlwmPiB^`6@?w/tbv$h`|z&=XCl# &fdɆ4YOcb7 RTP3x v IDAT335jz0߻1` ny"Z4=Q/f;RXJw54QϮzݙ&Ef'209YEnvtؼ%DL$yƌP*t( ob~W(`@SSS'yMuQ.qz:7ϠaoGI^,gYy6K4cb\2|Xeģ=d/"\n'8 tZ0;cd~,Wa\luݼm>:kD$+Lqrq_bgl0)t(3+{wˢU=b܁5Ǡ, E㗻q?ġBA uFԻ5+Pordy:³p ><$GTÝG1ت#>"Ah_>i&} 9g8~ق5n&\eczo" sd%^rP0)yKs>9swbzȎw(Px<=2mߏKF_p-ˑzG#nԴ98Td1$ljtpFL,-KQ`VbY@_Q|LeX.ىr?F{Rj`Fpކ;- (P>-k {QEKV s4EXd'4s.j7žUEmS~3~ׁn,>aNk`'thTN {n0+:9:Y\lupDyU eSY9 (ɋE ?kX:ՆguYglQ[CH … p})))ʂN^Gtt4 RɄ(tttbK,K;!*hCz<8כ\ ݬ7jx_5a+J @{Sc;F8 )*z(Da:m1;aE׬=pͼ38?Sc U'LB?c9/}z7*td8฿PAD7V5|LjwTpQ-o\3 㭂6swMCP?wO Izhxu$<23H/hf#ϠdTzo,_EzѰ8qJ8a@bfg hjjj=o<@FF &@, NNv!dNވK+[.%ɸ77} P[LRṷ̈̀Z<8~ق%YO7{x+bN **.^CYŃDexZU,{ߤ]?؉;,_xdB?12T5PAAvCŲ|I ZY +?Y)6 VoINZ) .k z>+LbJb0]zt;0o߆0: 1va6#2Tov=&MB||>E7)m,ڷ_C6mL1-7 3ʪY:.J\"‡UFugMםؿ"s1pPgbvC!zr^ZFԻyڑS${W%y6ŸVTG#^hE_bG?lLU`**l.;w܂-к~=Iwظ  tkF4`B+@ .1q2b⑙ L,baQ.]g*S03SEa:m Z<+(ɋld*kP")'#f}l=7b,]+9ae>ECGaWL `/{Շ,$?>'25aL5F3,˧lo;֊M%ظ v0]%hxPQYNJ5Ǡ$/o/'&6} x^^T*ofny)ĭV+\.{r??&n3T$Hude"Tr&!@gכ\8RkF$AIZW@q%$+^f;M8lZK?j?C Gc߷)XY8_F疩o/2^aj d{:KQAmDǩv3h8:t;M%lct8]ofv)&?zMp_޸ǦN#I#,&"<4 ĭ^l+,WaN/[x~N<1' IA6 ]sSOcvP+5Nqj#B`'ZO¦TrCCL$By޼ylrJTT&L\LD˅n8NbOThQ~to[P.EcVyK~Ҁ79xs I .u81>^6rL K {scPdTv 7BT$=jp Z)x ;P1; }M9!=[+a~Ҁl-stns[Wґ͛ ~VT֡([IH"F!tv兾yQ mN("襼iBOA+XvNYm3J. 2pqL̲|Zn$*$s_P0Fp ќf}/Hm7Jb@JR)h6䔴4D""MedI_Zq%|`CAjt9(]I~O kn*INJ.%XUBŷNg6TNBQ&l4Z]Xl^̮20*@ ]i3M*~؂f;NCvr&4Gty|]j2m@Stf / [~ҁfԶ;cX5AJ~E*\?+^3Q|Lz;0TH$" IN05v첅c`-] taX5dl+qzV[aj?!B{0)&4lzzJCgy@p?SlDXGpQC>H3(|8\kCiQEO cLJV{:U<-f+L Z, W hޛx]:eFplj<'Et{qx;Gx` {>$Zy44pOfxUj6b~"ˑz7\:$9:6MEzT:sdMB"nM ڷ#KJJx`ߏz"fj\ǣGgnM fvxd;Dc`\ jrPHPsbLIQ:/?tbSI: ӥg鱲 d$i$wG=0%M!2dgEoʣi^B8HiN5% >-^I';^%wdC,$j$7x|=dbN3_<Z=Ɂ`]ywMt}47 dMXzt:rL>E71)Ğ20nDh8tg6. w]W$NCŃ%Nab..@U :Nl!CgR*b6 fnl.8L㫛(E%t9'm()q2~VJ{RWqLPc`"o}=:E44h4vc5 hxz]!d%/3x뽉L QHErλMt2Hp0>'|KK?>;uɱ0)B>HO]fভO+sA!PJqj8|-Pv :x|}47.0b!V|l\1L.+$QD ۢl5 J^kbh1Ӗ|gm,ɣbo=܁xbN m<,@nL}nt-+?n%=ã{0E 6FDhF)ĭV+, F#*F/ ݮBc#6~2.`dԴ98q$t;K5Vͩ1>ͫEpގr6n(Kluy9đjle!8A(CfZ0gx8-Jʏ*2_$'n8s! }r, L sϐ~F}C_\=j89*fA10;ybB 5zma_!,ި{`4䶶6L&477ahOg^9,qzҁ&,L|w'12O+d{b 'd`2Й"cYC=oqؿ"m DZ;>N]zlKbqQL e,bAgx1$%f07-ҡi(wZJ;agjB{rc]YId&v+;=GBG}HqpՅxvvX􉟕aF#zf̎W^в/|jܾ=Ρ0m#eFA,6{bAB ɵ96l?6݇ xӝӆ2cU_ÏoasegBtV ~:µ "NEĜx M5FaʴC4_=9ZHǢ̠FC"\yA|Uh۽Ηe?pFM>^:1N{_d7Jpui6pV%mp gTOg\҉rA mjNY(m0<\pFvE{zGl0Z7(Hz9(3^fYF9T>OT/f˝' |9vI|6N"aUZkB;-͒x߯-6\TY'tqX@8#G ܹ)h###ԜȔ%H)L]@׷}0"ZCs6o0w습v<e IDATv->?'i] .nJ:KA>!5:Ek,S}*V['<6дM˲_d)AB 6l)v*rKLN(ĕ/ix;Ns'kxGy?6=^I1ycؔ4hGtL(,]ڒ-%q?&E&" ~{G) Rj,8ʴYyh Ď:4cΡ ֚6 :-H1J8̀wtjؽņ[.䡢ß]jCJ.=l]_"6TfªgUO ݫQ=aD~ZmMhO4X{ {Y<͂Rw6 =?9BVg,7Hh J4x<ڰhD[oi>vtt( 0v4rHw_C>pO0ᲩƈRE`PڠZ,f׊y*PjPԠF;WO HFDA{K` ~_&h3*QO@i ʦäa_o3]ca;K@X.5Tcăpj\3}˲$ XY|!r x<>⋔֎bv[$~9 x-I̠ƭ))B_8@;thhZԙ}܄\ 8v';ՍOGu?}8qo ,%~fڤFD=G5M}&X,^gPU>Hvs#$Ӈ2ѧ4d ,"/m\qx<|Aę3gf|kAII L&F#xGCC$ysO OYDlO{0${|Gk,B{G{v?8֚py<~4kżu>|ዊ|Z=yxBSxU'd5 jxBSŸi(two~tx8 _ī'ǰD<(Q\4`>?œ7rԧqmQbB<.wX<,P(4%9A\6rMMM$W|RsJ0D  !H̍ g7>g%!$*qbԜ[tEo@p֌|fI %xVoBjcg}p9̒.1Xg$tzNg7rU0HomQrmhb _Y7-#i"?! A+ǎqZy)B\̉_d[t wTK_lEdE|&IBcr>Yɥ I ?ang\38F;9]IY`YCc!^|z*3GYYVgU8p|Dݷńb ` \r%%%RNG);[5b*3B`1=_|-=\ %͢v&b%zte+w*1&~(Oi/Ǩ>ĵZɹ7*8ܯY&-d3ngAc߱cTBn orV?be%\ΐ&bIq9x0F8Ƈ~8OȅިbTGGw~_a<07.͵C-FP2kp3XgdwV+Ed*LG'o*:G"[pU8ũ *Lj4ךpMi be0 zzz68$ XVVl6TWWK8|>v166ǃ!+!r, C!c)%)}= L>w YBst*协W%~͚+Lw _|5B|Dn1}6ʞ˗$[6ct"$?& c{xDF055=K A( qݎjFL&T*80 Vz|2"?Z[[V8hA2Ds imQ.ܘ4qs(/#ixɓJ& fǙ3gf||B,C0D(B @<G__B E{=Q3.}}˿d>S<8A,^XE(~26A$*9qA$ eɣi&A|5Y1=4ZxIENDB`vedo-2025.5.3/docs/logos/000077500000000000000000000000001474667405700150045ustar00rootroot00000000000000vedo-2025.5.3/docs/logos/embl_logo.py000077500000000000000000000021651474667405700173240ustar00rootroot00000000000000"""Create an animated logo""" from vedo import * from vedo.pyplot import histogram settings.use_parallel_projection = True exa = Polygon().scale(4.1).pos(5.25, 4.8, 0).off() his = histogram([-1, 1], [-1, 1], mode='hex').unpack() exah, cmh = [], [] for h in his: cm = h.center_of_mass() if exa.is_inside(cm): h.c('green').shrink(0.9).add_shadow(plane='z', point=-.4) exah.append(h) cmh.append(cm) v1 = vector(9.4, 5.2, 0) v2 = vector(9.4, 2.7, 0) t1 = Text3D("EMBL", v1, c="k", font="VTK", s=1.5, depth=0) t2 = Text3D("European Molecular\nBiology Laboratory", v2, font="VTK", vspacing=1.75, c="dg", s=0.6) plt = show(exa, exah, t1, t2, axes=0, interactive=0, elevation=-50) for ti in reversed(range(100)): t = ti / 100. for j, h in enumerate(exah): cx, cy, _ = cmh[j] - [4,5,0] x = t*-4+(1-t)*6 g = exp(-(cx-x)**2/.5)*2 h.z(g) t1.pos([sin(t)*-10, 0, -0.41] + v1).alpha((1-t)**2) t2.pos([sin(t)*-15, 0, -0.41] + v2).alpha((1-t)**4) exah[13].c('red') plt.show(exa, exah, t1, t2, resetcam=0, elevation=t, azimuth=-0.02) plt.interactive() vedo-2025.5.3/docs/logos/lab_logo_maker.py000077500000000000000000000011201474667405700203100ustar00rootroot00000000000000from vedo import Volume, Text3D, show, dataurl, settings settings.use_parallel_projection = True vol = Volume(dataurl+"embryo.slc") vol.mode(0).c('b9').alpha_unit(1) t = Text3D("Sharpe\n~~~Lab", s=40, font="Spears", vspacing=1.4) t.c('k9').rotate_x(90).pos(200,150,70) cam = dict( position=(227.421, -911.244, 192.438), focal_point=(217.166, 126.841, 116.242), viewup=(0, 0, 1), parallel_scale=110, clipping_range=(754.990, 1403.38), ) plt = show(vol, t, size=(700,400), camera=cam, bg='bb') settings.screenshot_transparent_background = 1 plt.screenshot("logo.png") vedo-2025.5.3/docs/logos/logo_vedo_simple.py000066400000000000000000000003561474667405700207100ustar00rootroot00000000000000from vedo import VedoLogo, settings settings.use_parallel_projection = 1 settings.screenshot_transparent_background = 0 vl = VedoLogo(frame=False, c='k') vl.show(size=(340*3,115*3), zoom="tight") # vl.screenshot("logo_vedo_simple.png") vedo-2025.5.3/docs/logos/vedo_qr.svg000077500000000000000000001153251474667405700171760ustar00rootroot00000000000000 vedo-2025.5.3/docs/pdoc/000077500000000000000000000000001474667405700146065ustar00rootroot00000000000000vedo-2025.5.3/docs/pdoc/build_html.py000077500000000000000000000014511474667405700173070ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import datetime from vedo import __version__, printc cmd = "pdoc vedo -o html -t . " cmd+= f'--footer-text "version {__version__}, rev {datetime.date.today()}." ' cmd+= '--logo https://vedo.embl.es/images/logos/logo_vedo_simple_transp.png ' cmd+= '--favicon https://vedo.embl.es/images/logos/favicon.svg ' printc("Generating documentation:\n", cmd, "\n..please wait", c='y') os.system(cmd) os.system("chmod 755 html/ -R") printc("Done.", c='y') printc("Move to server manually with commands:") printc(" ls ~/Projects/StagingServer/var/www/html/vtkplotter.embl.es/autodocs/") printc(" rm ~/Projects/StagingServer/var/www/html/vtkplotter.embl.es/autodocs/html") printc(" mv html/ ~/Projects/StagingServer/var/www/html/vtkplotter.embl.es/autodocs/") vedo-2025.5.3/docs/pdoc/custom.css000066400000000000000000000003311474667405700166270ustar00rootroot00000000000000/* You can add additional CSS rules in custom.css. */ /* https://github.com/mitmproxy/pdoc/tree/main/pdoc/templates */ .modulename { color: rgb(41, 27, 0); } html, main { scroll-behavior: auto !important; } vedo-2025.5.3/docs/pdoc/module.html.jinja2000066400000000000000000000314651474667405700201460ustar00rootroot00000000000000{% extends "frame.html.jinja2" %} {% block title %}{{ module.modulename }} API documentation{% endblock %} {% block nav %} {% block module_list_link %} {% set parentmodule = ".".join(module.modulename.split(".")[:-1]) %} {% if parentmodule and parentmodule in all_modules %} {% include "resources/box-arrow-in-left.svg" %}   {{- parentmodule -}} {% elif not root_module_name %} {% include "resources/box-arrow-in-left.svg" %}   Module Index {% endif %} {% endblock %} {% block nav_title %} {% if logo %} {% if logo_link %}{% endif %} {% if logo_link %}{% endif %} {% endif %} {% endblock %} {% if module.members %}

API Documentation

{% endif %} {% block search_box %} {% if search and all_modules|length > 1 %} {# we set a pattern here so that we can use the :valid CSS selector #} {% endif %}
{% endblock %} {% set index = module.docstring | to_markdown | to_html | attr("toc_html") %} {% if index %}

Contents

{{ index | safe }} {% endif %} {% if module.submodules %}

Submodules

    {% for submodule in module.submodules if is_public(submodule) | trim %} {% if "cmaps" not in submodule.name and "vtkclasses" not in submodule.name and "cli" not in submodule.name %} {% if "version" not in submodule.name and "backends" not in submodule.name %}
  • {{ submodule.taken_from | link(text=submodule.name) }}
  • {% endif %} {% endif %} {% endfor %}
{% endif %} {% if module.members %}
{{ nav_members(module.members.values()) }} {% endif %} {% block nav_footer %} {% if footer_text %}
{{ footer_text }}
{% endif %} {% endblock %} {% block attribution %} built with pdocpdoc logo {% endblock %} {% endblock nav %} {% block content %}
{% block module_info %}
{% block edit_button %} {% if edit_url %} {% if "github.com" in edit_url %} {% set edit_text = "Edit on GitHub" %} {% elif "gitlab" in edit_url %} {% set edit_text = "Edit on GitLab" %} {% else %} {% set edit_text = "Edit Source" %} {% endif %} {{ edit_text }} {% endif %} {% endblock %} {{ module_name() }} {{ docstring(module) }} {{ view_source_state(module) }} {{ view_source_button(module) }} {{ view_source_code(module) }}
{% endblock %} {% block module_contents %} {% for m in module.flattened_own_members if is_public(m) | trim %}
{{ member(m) }} {% if m.kind == "class" %} {% for m in m.own_members if m.kind != "class" and is_public(m) | trim %}
{{ member(m) }}
{% endfor %} {% if "shapes" not in module_name() %} {% set inherited_members = inherited(m) | trim %} {% if inherited_members %}
Inherited Members
{{ inherited_members }}
{% endif %} {% endif %} {% endif %}
{% endfor %} {% endblock %}
{% if mtime %} {% include "livereload.html.jinja2" %} {% endif %} {% block search_js %} {% if search and all_modules|length > 1 %} {% include "search.html.jinja2" %} {% endif %} {% endblock %} {% endblock content %} {# End of content, beginning of helper macros. See https://pdoc.dev/docs/pdoc/render_helpers.html#DefaultMacroExtension for an explanation of defaultmacro. #} {% defaultmacro bases(cls) %} {%- if cls.bases -%} ( {%- for base in cls.bases -%} {{ base[:2] | link(text=base[2]) }} {%- if loop.nextitem %}, {% endif %} {%- endfor -%} ) {%- endif -%} {% enddefaultmacro %} {% defaultmacro default_value(var) -%} {%- if var.default_value_str -%} {{ var.default_value_str | escape | linkify }} {%- endif -%} {% enddefaultmacro %} {% defaultmacro annotation(var) %} {%- if var.annotation_str -%} {{ var.annotation_str | escape | linkify }} {%- endif -%} {% enddefaultmacro %} {% defaultmacro decorators(doc) %} {% for d in doc.decorators if not d.startswith("@_") %}
{{ d }}
{% endfor %} {% enddefaultmacro %} {% defaultmacro function(fn) -%} {{ decorators(fn) }} {% if fn.name == "__init__" %} {{ ".".join(fn.qualname.split(".")[:-1]) }} {{- fn.signature_without_self | format_signature(colon=False) | linkify }} {% else %} {{ fn.funcdef }} {{ fn.name }} {{- fn.signature | format_signature(colon=True) | linkify }} {% endif %} {% enddefaultmacro %} {% defaultmacro variable(var) -%} {{ var.name }}{{ annotation(var) }}{{ default_value(var) }} {% enddefaultmacro %} {% defaultmacro submodule(mod) -%} {{ mod.taken_from | link }} {% enddefaultmacro %} {% defaultmacro class(cls) -%} {{ decorators(cls) }} class {{ cls.qualname }} {{- bases(cls) -}}: {% enddefaultmacro %} {% defaultmacro member(doc) %} {{- view_source_state(doc) -}}
{% if doc.kind == "class" %} {{ class(doc) }} {% elif doc.kind == "function" %} {{ function(doc) }} {% elif doc.kind == "module" %} {{ submodule(doc) }} {% else %} {{ variable(doc) }} {% endif %} {{ view_source_button(doc) }}
{{ view_source_code(doc) }} {{ docstring(doc) }} {% enddefaultmacro %} {% defaultmacro docstring(var) %} {% if var.docstring %}
{{ var.docstring | to_markdown | to_html | linkify(namespace=var.qualname) }}
{% endif %} {% enddefaultmacro %} {% defaultmacro nav_members(members) %}
    {#% for m in members if is_public(m) | trim %#} {% for m in members|sort(attribute='qualname') if is_public(m) | trim %}
  • {% if m.kind == "class" %} {% if m.own_members and "shapes" not in module_name() %}
    {% endif %} {{ m.qualname }} {% if m.own_members %} {{ nav_members(m.own_members) | indent(12) }} {% endif %} {% if m.own_members and "shapes" not in module_name() %}
    {% endif %} {% elif m.kind == "module" %} {{ m.name }} {% elif m.name == "__init__" %} {% else %} {% if m.name.lower() == m.name %} {{ m.name }} {% endif %} {% endif %}
  • {% endfor %}
{% enddefaultmacro %} {% defaultmacro is_public(doc) %} {# This macro is a bit unconventional in that its output is not rendered, but treated as a boolean: Returning no text is interpreted as false, returning any other text is iterpreted as true. Implementing this as a macro makes it very easy to override with a custom template, see https://github.com/mitmproxy/pdoc/tree/main/examples/custom-template. #} {% if doc.name == "__init__" %} {# show all constructors #} true {% elif doc.name == "__doc__" %} {# We don't want to document __doc__ itself, https://github.com/mitmproxy/pdoc/issues/235 #} {% elif doc.kind == "module" and doc.fullname not in all_modules %} {# Skip modules that were manually excluded, https://github.com/mitmproxy/pdoc/issues/334 #} {% elif (doc.qualname or doc.name) is in(module.obj.__all__ or []) %} {# members starting with an underscore are still public if mentioned in __all__ #} true {% elif not doc.name.startswith("_") and (doc.kind != "variable" or doc.is_enum_member or doc.docstring) %} {# members not starting with an underscore are considered public by default #} true {% endif %} {% enddefaultmacro %} {# fmt: off #} {% defaultmacro inherited(cls) %} {% for base, members in cls.inherited_members.items() %} {% set m = None %}{# workaround for https://github.com/pallets/jinja/issues/1427 #} {% set member_html %} {% for m in members if is_public(m) | trim %}
{{- m.taken_from | link(text=m.name.replace("__init__",base[1])) -}}
{% endfor %} {% endset %} {# we may not have any public members, in which case we don't want to print anything. #} {% if member_html and "vtkmodules" not in base | link %}
{{ base | link }}
{{ member_html }}
{% endif %} {% endfor %} {% enddefaultmacro %} {# fmt: on #} {% defaultmacro view_source_state(doc) %} {% if show_source and doc.source %} {% endif %} {% enddefaultmacro %} {% defaultmacro view_source_button(doc) %} {% if show_source and doc.source %} {% endif %} {% enddefaultmacro %} {% defaultmacro view_source_code(doc) %} {% if show_source and doc.source %} {{ doc | highlight }} {% endif %} {% enddefaultmacro %} {% defaultmacro module_name() %}

{% set parts = module.modulename.split(".") %} {% for part in parts %} {%- set fullname = ".".join(parts[:loop.index]) -%} {%- if fullname in all_modules and fullname != module.modulename -%} {{ part }} {%- else -%} {{ part }} {%- endif -%} {%- if loop.nextitem -%} . {%- endif -%} {% endfor %}

{% enddefaultmacro %} vedo-2025.5.3/docs/tutorials.md000066400000000000000000000000241474667405700162250ustar00rootroot00000000000000## Tutorials To do vedo-2025.5.3/docs/vtkmodules_9.3.0_hierarchy.txt000066400000000000000000006207321474667405700214160ustar00rootroot00000000000000vtkmodules.generate_pyi.Graph vtkmodules.generate_pyi.Node vtkmodules.generate_pyi.add_indent vtkmodules.generate_pyi.annotation_text vtkmodules.generate_pyi.argparse vtkmodules.generate_pyi.ast vtkmodules.generate_pyi.build_graph vtkmodules.generate_pyi.builtins vtkmodules.generate_pyi.class_pyi vtkmodules.generate_pyi.fix_annotations vtkmodules.generate_pyi.get_constructors vtkmodules.generate_pyi.get_signatures vtkmodules.generate_pyi.handle_static vtkmodules.generate_pyi.has_self vtkmodules.generate_pyi.identifier vtkmodules.generate_pyi.importlib vtkmodules.generate_pyi.indent vtkmodules.generate_pyi.inspect vtkmodules.generate_pyi.isclass vtkmodules.generate_pyi.isenum vtkmodules.generate_pyi.ismethod vtkmodules.generate_pyi.isnamespace vtkmodules.generate_pyi.isvtkmethod vtkmodules.generate_pyi.keychar vtkmodules.generate_pyi.m vtkmodules.generate_pyi.main vtkmodules.generate_pyi.module_pyi vtkmodules.generate_pyi.namespace_pyi vtkmodules.generate_pyi.o vtkmodules.generate_pyi.os vtkmodules.generate_pyi.parse_error vtkmodules.generate_pyi.push_signature vtkmodules.generate_pyi.re vtkmodules.generate_pyi.sorted_graph vtkmodules.generate_pyi.sorted_graph_helper vtkmodules.generate_pyi.string vtkmodules.generate_pyi.sys vtkmodules.generate_pyi.template vtkmodules.generate_pyi.topologically_sorted_items vtkmodules.generate_pyi.typename vtkmodules.generate_pyi.typename_forward vtkmodules.generate_pyi.types vtkmodules.generate_pyi.vtkObject vtkmodules.generate_pyi.vtkSOADataArrayTemplate vtkmodules.generate_pyi.vtkmethod vtkmodules.numpy_interface.algorithms._apply_func2 vtkmodules.numpy_interface.algorithms._array_count vtkmodules.numpy_interface.algorithms._global_func vtkmodules.numpy_interface.algorithms._global_per_block vtkmodules.numpy_interface.algorithms._local_array_count vtkmodules.numpy_interface.algorithms._lookup_mpi_type vtkmodules.numpy_interface.algorithms._make_dfunc vtkmodules.numpy_interface.algorithms._make_dsfunc vtkmodules.numpy_interface.algorithms._make_dsfunc2 vtkmodules.numpy_interface.algorithms._make_ufunc vtkmodules.numpy_interface.algorithms._reduce_dims vtkmodules.numpy_interface.algorithms.abs vtkmodules.numpy_interface.algorithms.absolute_import vtkmodules.numpy_interface.algorithms.add vtkmodules.numpy_interface.algorithms.algs vtkmodules.numpy_interface.algorithms.all vtkmodules.numpy_interface.algorithms.apply_dfunc vtkmodules.numpy_interface.algorithms.apply_ufunc vtkmodules.numpy_interface.algorithms.arccos vtkmodules.numpy_interface.algorithms.arccosh vtkmodules.numpy_interface.algorithms.arcsin vtkmodules.numpy_interface.algorithms.arcsinh vtkmodules.numpy_interface.algorithms.arctan vtkmodules.numpy_interface.algorithms.arctan2 vtkmodules.numpy_interface.algorithms.arctanh vtkmodules.numpy_interface.algorithms.area vtkmodules.numpy_interface.algorithms.aspect vtkmodules.numpy_interface.algorithms.aspect_gamma vtkmodules.numpy_interface.algorithms.bitwise_or vtkmodules.numpy_interface.algorithms.ceil vtkmodules.numpy_interface.algorithms.condition vtkmodules.numpy_interface.algorithms.cos vtkmodules.numpy_interface.algorithms.cosh vtkmodules.numpy_interface.algorithms.count_per_block vtkmodules.numpy_interface.algorithms.cross vtkmodules.numpy_interface.algorithms.curl vtkmodules.numpy_interface.algorithms.det vtkmodules.numpy_interface.algorithms.determinant vtkmodules.numpy_interface.algorithms.diagonal vtkmodules.numpy_interface.algorithms.divergence vtkmodules.numpy_interface.algorithms.divide vtkmodules.numpy_interface.algorithms.dot vtkmodules.numpy_interface.algorithms.dsa vtkmodules.numpy_interface.algorithms.eigenvalue vtkmodules.numpy_interface.algorithms.eigenvector vtkmodules.numpy_interface.algorithms.exp vtkmodules.numpy_interface.algorithms.expand_dims vtkmodules.numpy_interface.algorithms.flatnonzero vtkmodules.numpy_interface.algorithms.floor vtkmodules.numpy_interface.algorithms.gradient vtkmodules.numpy_interface.algorithms.hypot vtkmodules.numpy_interface.algorithms.in1d vtkmodules.numpy_interface.algorithms.inv vtkmodules.numpy_interface.algorithms.inverse vtkmodules.numpy_interface.algorithms.isnan vtkmodules.numpy_interface.algorithms.itertools vtkmodules.numpy_interface.algorithms.jacobian vtkmodules.numpy_interface.algorithms.laplacian vtkmodules.numpy_interface.algorithms.ln vtkmodules.numpy_interface.algorithms.log vtkmodules.numpy_interface.algorithms.log10 vtkmodules.numpy_interface.algorithms.logical_not vtkmodules.numpy_interface.algorithms.mag vtkmodules.numpy_interface.algorithms.make_cell_mask_from_NaNs vtkmodules.numpy_interface.algorithms.make_mask_from_NaNs vtkmodules.numpy_interface.algorithms.make_point_mask_from_NaNs vtkmodules.numpy_interface.algorithms.make_vector vtkmodules.numpy_interface.algorithms.max vtkmodules.numpy_interface.algorithms.max_angle vtkmodules.numpy_interface.algorithms.max_per_block vtkmodules.numpy_interface.algorithms.mean vtkmodules.numpy_interface.algorithms.mean_per_block vtkmodules.numpy_interface.algorithms.min vtkmodules.numpy_interface.algorithms.min_angle vtkmodules.numpy_interface.algorithms.min_per_block vtkmodules.numpy_interface.algorithms.mod vtkmodules.numpy_interface.algorithms.multiply vtkmodules.numpy_interface.algorithms.negative vtkmodules.numpy_interface.algorithms.nonzero vtkmodules.numpy_interface.algorithms.norm vtkmodules.numpy_interface.algorithms.numpy vtkmodules.numpy_interface.algorithms.power vtkmodules.numpy_interface.algorithms.reciprocal vtkmodules.numpy_interface.algorithms.remainder vtkmodules.numpy_interface.algorithms.rint vtkmodules.numpy_interface.algorithms.shape vtkmodules.numpy_interface.algorithms.shear vtkmodules.numpy_interface.algorithms.sin vtkmodules.numpy_interface.algorithms.sinh vtkmodules.numpy_interface.algorithms.skew vtkmodules.numpy_interface.algorithms.sqrt vtkmodules.numpy_interface.algorithms.square vtkmodules.numpy_interface.algorithms.std vtkmodules.numpy_interface.algorithms.strain vtkmodules.numpy_interface.algorithms.subtract vtkmodules.numpy_interface.algorithms.sum vtkmodules.numpy_interface.algorithms.sum_per_block vtkmodules.numpy_interface.algorithms.surface_normal vtkmodules.numpy_interface.algorithms.sys vtkmodules.numpy_interface.algorithms.tan vtkmodules.numpy_interface.algorithms.tanh vtkmodules.numpy_interface.algorithms.trace vtkmodules.numpy_interface.algorithms.unstructured_from_composite_arrays vtkmodules.numpy_interface.algorithms.var vtkmodules.numpy_interface.algorithms.vertex_normal vtkmodules.numpy_interface.algorithms.volume vtkmodules.numpy_interface.algorithms.vorticity vtkmodules.numpy_interface.algorithms.vtkMPI4PyCommunicator vtkmodules.numpy_interface.algorithms.vtkMultiProcessController vtkmodules.numpy_interface.algorithms.where vtkmodules.numpy_interface.dataset_adapter.ArrayAssociation vtkmodules.numpy_interface.dataset_adapter.CompositeDataIterator vtkmodules.numpy_interface.dataset_adapter.CompositeDataSet vtkmodules.numpy_interface.dataset_adapter.CompositeDataSetAttributes vtkmodules.numpy_interface.dataset_adapter.DataObject vtkmodules.numpy_interface.dataset_adapter.DataSet vtkmodules.numpy_interface.dataset_adapter.DataSetAttributes vtkmodules.numpy_interface.dataset_adapter.Graph vtkmodules.numpy_interface.dataset_adapter.HyperTreeGrid vtkmodules.numpy_interface.dataset_adapter.Molecule vtkmodules.numpy_interface.dataset_adapter.MultiCompositeDataIterator vtkmodules.numpy_interface.dataset_adapter.NoneArray vtkmodules.numpy_interface.dataset_adapter.PointSet vtkmodules.numpy_interface.dataset_adapter.PolyData vtkmodules.numpy_interface.dataset_adapter.Table vtkmodules.numpy_interface.dataset_adapter.UnstructuredGrid vtkmodules.numpy_interface.dataset_adapter.VTKArray vtkmodules.numpy_interface.dataset_adapter.VTKArrayMetaClass vtkmodules.numpy_interface.dataset_adapter.VTKCompositeDataArray vtkmodules.numpy_interface.dataset_adapter.VTKCompositeDataArrayMetaClass vtkmodules.numpy_interface.dataset_adapter.VTKNoneArray vtkmodules.numpy_interface.dataset_adapter.VTKNoneArrayMetaClass vtkmodules.numpy_interface.dataset_adapter.VTKObjectWrapper vtkmodules.numpy_interface.dataset_adapter.WrapDataObject vtkmodules.numpy_interface.dataset_adapter._make_tensor_array_contiguous vtkmodules.numpy_interface.dataset_adapter._metaclass vtkmodules.numpy_interface.dataset_adapter.buffer_shared vtkmodules.numpy_interface.dataset_adapter.itertools vtkmodules.numpy_interface.dataset_adapter.numpy vtkmodules.numpy_interface.dataset_adapter.numpyTovtkDataArray vtkmodules.numpy_interface.dataset_adapter.numpy_support vtkmodules.numpy_interface.dataset_adapter.operator vtkmodules.numpy_interface.dataset_adapter.reshape_append_ones vtkmodules.numpy_interface.dataset_adapter.sys vtkmodules.numpy_interface.dataset_adapter.vtkDataArrayToVTKArray vtkmodules.numpy_interface.dataset_adapter.vtkDataObject vtkmodules.numpy_interface.dataset_adapter.vtkWeakReference vtkmodules.numpy_interface.dataset_adapter.weakref vtkmodules.numpy_interface.internal_algorithms._cell_derivatives vtkmodules.numpy_interface.internal_algorithms._cell_quality vtkmodules.numpy_interface.internal_algorithms._matrix_math_filter vtkmodules.numpy_interface.internal_algorithms.abs vtkmodules.numpy_interface.internal_algorithms.absolute_import vtkmodules.numpy_interface.internal_algorithms.all vtkmodules.numpy_interface.internal_algorithms.area vtkmodules.numpy_interface.internal_algorithms.aspect vtkmodules.numpy_interface.internal_algorithms.aspect_gamma vtkmodules.numpy_interface.internal_algorithms.condition vtkmodules.numpy_interface.internal_algorithms.cross vtkmodules.numpy_interface.internal_algorithms.curl vtkmodules.numpy_interface.internal_algorithms.det vtkmodules.numpy_interface.internal_algorithms.determinant vtkmodules.numpy_interface.internal_algorithms.diagonal vtkmodules.numpy_interface.internal_algorithms.divergence vtkmodules.numpy_interface.internal_algorithms.dot vtkmodules.numpy_interface.internal_algorithms.dsa vtkmodules.numpy_interface.internal_algorithms.eigenvalue vtkmodules.numpy_interface.internal_algorithms.eigenvector vtkmodules.numpy_interface.internal_algorithms.gradient vtkmodules.numpy_interface.internal_algorithms.inv vtkmodules.numpy_interface.internal_algorithms.inverse vtkmodules.numpy_interface.internal_algorithms.jacobian vtkmodules.numpy_interface.internal_algorithms.laplacian vtkmodules.numpy_interface.internal_algorithms.ln vtkmodules.numpy_interface.internal_algorithms.log vtkmodules.numpy_interface.internal_algorithms.log10 vtkmodules.numpy_interface.internal_algorithms.mag vtkmodules.numpy_interface.internal_algorithms.make_vector vtkmodules.numpy_interface.internal_algorithms.max vtkmodules.numpy_interface.internal_algorithms.max_angle vtkmodules.numpy_interface.internal_algorithms.mean vtkmodules.numpy_interface.internal_algorithms.min vtkmodules.numpy_interface.internal_algorithms.min_angle vtkmodules.numpy_interface.internal_algorithms.norm vtkmodules.numpy_interface.internal_algorithms.numpy vtkmodules.numpy_interface.internal_algorithms.numpy_support vtkmodules.numpy_interface.internal_algorithms.shear vtkmodules.numpy_interface.internal_algorithms.skew vtkmodules.numpy_interface.internal_algorithms.strain vtkmodules.numpy_interface.internal_algorithms.sum vtkmodules.numpy_interface.internal_algorithms.surface_normal vtkmodules.numpy_interface.internal_algorithms.trace vtkmodules.numpy_interface.internal_algorithms.var vtkmodules.numpy_interface.internal_algorithms.vertex_normal vtkmodules.numpy_interface.internal_algorithms.volume vtkmodules.numpy_interface.internal_algorithms.vorticity vtkmodules.numpy_interface.internal_algorithms.vtkCellDataToPointData vtkmodules.numpy_interface.internal_algorithms.vtkCellDerivatives vtkmodules.numpy_interface.internal_algorithms.vtkCellQuality vtkmodules.numpy_interface.internal_algorithms.vtkCellSizeFilter vtkmodules.numpy_interface.internal_algorithms.vtkImageData vtkmodules.numpy_interface.internal_algorithms.vtkMatrixMathFilter vtkmodules.numpy_interface.internal_algorithms.vtkPolyDataNormals vtkmodules.qt.PyQtImpl vtkmodules.qt.QVTKRWIBase vtkmodules.qt.impl vtkmodules.qt.importlib vtkmodules.qt.sys vtkmodules.qt.QVTKRenderWindowInteractor.ConnectionType vtkmodules.qt.QVTKRenderWindowInteractor.CursorShape vtkmodules.qt.QVTKRenderWindowInteractor.EventType vtkmodules.qt.QVTKRenderWindowInteractor.FocusPolicy vtkmodules.qt.QVTKRenderWindowInteractor.Key vtkmodules.qt.QVTKRenderWindowInteractor.KeyboardModifier vtkmodules.qt.QVTKRenderWindowInteractor.MiddleButton vtkmodules.qt.QVTKRenderWindowInteractor.MouseButton vtkmodules.qt.QVTKRenderWindowInteractor.PyQtImpl vtkmodules.qt.QVTKRenderWindowInteractor.PySide6 vtkmodules.qt.QVTKRenderWindowInteractor.QApplication vtkmodules.qt.QVTKRenderWindowInteractor.QCursor vtkmodules.qt.QVTKRenderWindowInteractor.QEvent vtkmodules.qt.QVTKRenderWindowInteractor.QMainWindow vtkmodules.qt.QVTKRenderWindowInteractor.QObject vtkmodules.qt.QVTKRenderWindowInteractor.QSize vtkmodules.qt.QVTKRenderWindowInteractor.QSizePolicy vtkmodules.qt.QVTKRenderWindowInteractor.QTimer vtkmodules.qt.QVTKRenderWindowInteractor.QVTKRWIBase vtkmodules.qt.QVTKRenderWindowInteractor.QVTKRWIBaseClass vtkmodules.qt.QVTKRenderWindowInteractor.QVTKRenderWidgetConeExample vtkmodules.qt.QVTKRenderWindowInteractor.QVTKRenderWindowInteractor vtkmodules.qt.QVTKRenderWindowInteractor.QWidget vtkmodules.qt.QVTKRenderWindowInteractor.Qt vtkmodules.qt.QVTKRenderWindowInteractor.SizePolicy vtkmodules.qt.QVTKRenderWindowInteractor.WidgetAttribute vtkmodules.qt.QVTKRenderWindowInteractor.WindowType vtkmodules.qt.QVTKRenderWindowInteractor._get_event_pos vtkmodules.qt.QVTKRenderWindowInteractor._keysyms vtkmodules.qt.QVTKRenderWindowInteractor._keysyms_for_ascii vtkmodules.qt.QVTKRenderWindowInteractor.vtkGenericRenderWindowInteractor vtkmodules.qt.QVTKRenderWindowInteractor.vtkRenderWindow vtkmodules.qt.QVTKRenderWindowInteractor.vtkmodules vtkmodules.util.misc vtkmodules.util.numpy_support vtkmodules.util.vtkConstants vtkmodules.util.vtkMethodParser vtkmodules.util.vtkVariant vtkmodules.util.colors.alice_blue vtkmodules.util.colors.alizarin_crimson vtkmodules.util.colors.antique_white vtkmodules.util.colors.aquamarine vtkmodules.util.colors.aquamarine_medium vtkmodules.util.colors.aureoline_yellow vtkmodules.util.colors.azure vtkmodules.util.colors.banana vtkmodules.util.colors.beige vtkmodules.util.colors.bisque vtkmodules.util.colors.black vtkmodules.util.colors.blanched_almond vtkmodules.util.colors.blue vtkmodules.util.colors.blue_light vtkmodules.util.colors.blue_medium vtkmodules.util.colors.blue_violet vtkmodules.util.colors.brick vtkmodules.util.colors.brown vtkmodules.util.colors.brown_madder vtkmodules.util.colors.brown_ochre vtkmodules.util.colors.burlywood vtkmodules.util.colors.burnt_sienna vtkmodules.util.colors.burnt_umber vtkmodules.util.colors.cadet vtkmodules.util.colors.cadmium_lemon vtkmodules.util.colors.cadmium_orange vtkmodules.util.colors.cadmium_red_deep vtkmodules.util.colors.cadmium_red_light vtkmodules.util.colors.cadmium_yellow vtkmodules.util.colors.cadmium_yellow_light vtkmodules.util.colors.carrot vtkmodules.util.colors.cerulean vtkmodules.util.colors.chartreuse vtkmodules.util.colors.chocolate vtkmodules.util.colors.chrome_oxide_green vtkmodules.util.colors.cinnabar_green vtkmodules.util.colors.cobalt vtkmodules.util.colors.cobalt_green vtkmodules.util.colors.cobalt_violet_deep vtkmodules.util.colors.cold_grey vtkmodules.util.colors.coral vtkmodules.util.colors.coral_light vtkmodules.util.colors.cornflower vtkmodules.util.colors.cornsilk vtkmodules.util.colors.cyan vtkmodules.util.colors.cyan_white vtkmodules.util.colors.dark_orange vtkmodules.util.colors.deep_ochre vtkmodules.util.colors.deep_pink vtkmodules.util.colors.dim_grey vtkmodules.util.colors.dodger_blue vtkmodules.util.colors.eggshell vtkmodules.util.colors.emerald_green vtkmodules.util.colors.english_red vtkmodules.util.colors.firebrick vtkmodules.util.colors.flesh vtkmodules.util.colors.flesh_ochre vtkmodules.util.colors.floral_white vtkmodules.util.colors.forest_green vtkmodules.util.colors.gainsboro vtkmodules.util.colors.geranium_lake vtkmodules.util.colors.ghost_white vtkmodules.util.colors.gold vtkmodules.util.colors.gold_ochre vtkmodules.util.colors.goldenrod vtkmodules.util.colors.goldenrod_dark vtkmodules.util.colors.goldenrod_light vtkmodules.util.colors.goldenrod_pale vtkmodules.util.colors.green vtkmodules.util.colors.green_dark vtkmodules.util.colors.green_pale vtkmodules.util.colors.green_yellow vtkmodules.util.colors.greenish_umber vtkmodules.util.colors.grey vtkmodules.util.colors.honeydew vtkmodules.util.colors.hot_pink vtkmodules.util.colors.indian_red vtkmodules.util.colors.indigo vtkmodules.util.colors.ivory vtkmodules.util.colors.ivory_black vtkmodules.util.colors.khaki vtkmodules.util.colors.khaki_dark vtkmodules.util.colors.lamp_black vtkmodules.util.colors.lavender vtkmodules.util.colors.lavender_blush vtkmodules.util.colors.lawn_green vtkmodules.util.colors.lemon_chiffon vtkmodules.util.colors.light_beige vtkmodules.util.colors.light_goldenrod vtkmodules.util.colors.light_grey vtkmodules.util.colors.light_salmon vtkmodules.util.colors.lime_green vtkmodules.util.colors.linen vtkmodules.util.colors.madder_lake_deep vtkmodules.util.colors.magenta vtkmodules.util.colors.manganese_blue vtkmodules.util.colors.maroon vtkmodules.util.colors.mars_orange vtkmodules.util.colors.mars_yellow vtkmodules.util.colors.melon vtkmodules.util.colors.midnight_blue vtkmodules.util.colors.mint vtkmodules.util.colors.mint_cream vtkmodules.util.colors.misty_rose vtkmodules.util.colors.moccasin vtkmodules.util.colors.naples_yellow_deep vtkmodules.util.colors.navajo_white vtkmodules.util.colors.navy vtkmodules.util.colors.old_lace vtkmodules.util.colors.olive vtkmodules.util.colors.olive_drab vtkmodules.util.colors.olive_green_dark vtkmodules.util.colors.orange vtkmodules.util.colors.orange_red vtkmodules.util.colors.orchid vtkmodules.util.colors.orchid_dark vtkmodules.util.colors.orchid_medium vtkmodules.util.colors.papaya_whip vtkmodules.util.colors.peach_puff vtkmodules.util.colors.peacock vtkmodules.util.colors.permanent_green vtkmodules.util.colors.permanent_red_violet vtkmodules.util.colors.peru vtkmodules.util.colors.pink vtkmodules.util.colors.pink_light vtkmodules.util.colors.plum vtkmodules.util.colors.powder_blue vtkmodules.util.colors.purple vtkmodules.util.colors.purple_medium vtkmodules.util.colors.raspberry vtkmodules.util.colors.raw_sienna vtkmodules.util.colors.raw_umber vtkmodules.util.colors.red vtkmodules.util.colors.rose_madder vtkmodules.util.colors.rosy_brown vtkmodules.util.colors.royal_blue vtkmodules.util.colors.saddle_brown vtkmodules.util.colors.salmon vtkmodules.util.colors.sandy_brown vtkmodules.util.colors.sap_green vtkmodules.util.colors.sea_green vtkmodules.util.colors.sea_green_dark vtkmodules.util.colors.sea_green_light vtkmodules.util.colors.sea_green_medium vtkmodules.util.colors.seashell vtkmodules.util.colors.sepia vtkmodules.util.colors.sienna vtkmodules.util.colors.sky_blue vtkmodules.util.colors.sky_blue_deep vtkmodules.util.colors.sky_blue_light vtkmodules.util.colors.slate_blue vtkmodules.util.colors.slate_blue_dark vtkmodules.util.colors.slate_blue_light vtkmodules.util.colors.slate_blue_medium vtkmodules.util.colors.slate_grey vtkmodules.util.colors.slate_grey_dark vtkmodules.util.colors.slate_grey_light vtkmodules.util.colors.snow vtkmodules.util.colors.spring_green vtkmodules.util.colors.spring_green_medium vtkmodules.util.colors.steel_blue vtkmodules.util.colors.steel_blue_light vtkmodules.util.colors.tan vtkmodules.util.colors.terre_verte vtkmodules.util.colors.thistle vtkmodules.util.colors.titanium_white vtkmodules.util.colors.tomato vtkmodules.util.colors.turquoise vtkmodules.util.colors.turquoise_blue vtkmodules.util.colors.turquoise_dark vtkmodules.util.colors.turquoise_medium vtkmodules.util.colors.turquoise_pale vtkmodules.util.colors.ultramarine vtkmodules.util.colors.ultramarine_violet vtkmodules.util.colors.van_dyke_brown vtkmodules.util.colors.venetian_red vtkmodules.util.colors.violet vtkmodules.util.colors.violet_dark vtkmodules.util.colors.violet_red vtkmodules.util.colors.violet_red_medium vtkmodules.util.colors.violet_red_pale vtkmodules.util.colors.viridian_light vtkmodules.util.colors.warm_grey vtkmodules.util.colors.wheat vtkmodules.util.colors.white vtkmodules.util.colors.white_smoke vtkmodules.util.colors.yellow vtkmodules.util.colors.yellow_green vtkmodules.util.colors.yellow_light vtkmodules.util.colors.yellow_ochre vtkmodules.util.colors.zinc_white vtkmodules.util.keys.DataObjectMetaDataKey vtkmodules.util.keys.DataaObjectKey vtkmodules.util.keys.DoubleKey vtkmodules.util.keys.DoubleVectorKey vtkmodules.util.keys.ExecutivePortKey vtkmodules.util.keys.ExecutivePortVectorKey vtkmodules.util.keys.IdTypeKey vtkmodules.util.keys.InformationKey vtkmodules.util.keys.InformationVectorKey vtkmodules.util.keys.IntegerKey vtkmodules.util.keys.IntegerRequestKey vtkmodules.util.keys.IntegerVectorKey vtkmodules.util.keys.KeyVectorKey vtkmodules.util.keys.MakeKey vtkmodules.util.keys.ObjectBaseKey vtkmodules.util.keys.ObjectBaseVectorKey vtkmodules.util.keys.RequestKey vtkmodules.util.keys.StringKey vtkmodules.util.keys.StringVectorKey vtkmodules.util.keys.UnsignedLongKey vtkmodules.util.keys.VariantKey vtkmodules.util.keys.VariantVectorKey vtkmodules.util.misc.calldata_type vtkmodules.util.misc.os vtkmodules.util.misc.sys vtkmodules.util.misc.vtkGetDataRoot vtkmodules.util.misc.vtkGetTempDir vtkmodules.util.misc.vtkRegressionTestImage vtkmodules.util.numpy_support.ID_TYPE_CODE vtkmodules.util.numpy_support.LONG_TYPE_CODE vtkmodules.util.numpy_support.ULONG_TYPE_CODE vtkmodules.util.numpy_support.VTK_ID_TYPE_SIZE vtkmodules.util.numpy_support.VTK_LONG_TYPE_SIZE vtkmodules.util.numpy_support.create_vtk_array vtkmodules.util.numpy_support.get_numpy_array_type vtkmodules.util.numpy_support.get_vtk_array_type vtkmodules.util.numpy_support.get_vtk_to_numpy_typemap vtkmodules.util.numpy_support.numpy vtkmodules.util.numpy_support.numpy_to_vtk vtkmodules.util.numpy_support.numpy_to_vtkIdTypeArray vtkmodules.util.numpy_support.vtkConstants vtkmodules.util.numpy_support.vtkDataArray vtkmodules.util.numpy_support.vtkIdTypeArray vtkmodules.util.numpy_support.vtkLongArray vtkmodules.util.numpy_support.vtk_to_numpy vtkmodules.util.pickle_support.copyreg vtkmodules.util.pickle_support.numpy_support vtkmodules.util.pickle_support.pickle vtkmodules.util.pickle_support.serialize_VTK_data_object vtkmodules.util.pickle_support.unserialize_VTK_data_object vtkmodules.util.pickle_support.vtkCharArray vtkmodules.util.pickle_support.vtkCommonDataModel vtkmodules.util.pickle_support.vtkCommunicator vtkmodules.util.vtkAlgorithm.VTKAlgorithm vtkmodules.util.vtkAlgorithm.VTKPythonAlgorithmBase vtkmodules.util.vtkAlgorithm.vtkAlgorithm vtkmodules.util.vtkAlgorithm.vtkDataObject vtkmodules.util.vtkAlgorithm.vtkDemandDrivenPipeline vtkmodules.util.vtkAlgorithm.vtkInformation vtkmodules.util.vtkAlgorithm.vtkPythonAlgorithm vtkmodules.util.vtkAlgorithm.vtkStreamingDemandDrivenPipeline vtkmodules.util.vtkConstants.VTK_ARIAL vtkmodules.util.vtkConstants.VTK_BIQUADRATIC_QUAD vtkmodules.util.vtkConstants.VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON vtkmodules.util.vtkConstants.VTK_BIQUADRATIC_QUADRATIC_WEDGE vtkmodules.util.vtkConstants.VTK_BIT vtkmodules.util.vtkConstants.VTK_BIT_MAX vtkmodules.util.vtkConstants.VTK_BIT_MIN vtkmodules.util.vtkConstants.VTK_CHAR vtkmodules.util.vtkConstants.VTK_CHAR_MAX vtkmodules.util.vtkConstants.VTK_CHAR_MIN vtkmodules.util.vtkConstants.VTK_COLOR_MODE_DEFAULT vtkmodules.util.vtkConstants.VTK_COLOR_MODE_MAP_SCALARS vtkmodules.util.vtkConstants.VTK_COMPOSITE_DATA_SET vtkmodules.util.vtkConstants.VTK_CONVEX_POINT_SET vtkmodules.util.vtkConstants.VTK_COURIER vtkmodules.util.vtkConstants.VTK_DATA_OBJECT vtkmodules.util.vtkConstants.VTK_DATA_SET vtkmodules.util.vtkConstants.VTK_DOUBLE vtkmodules.util.vtkConstants.VTK_DOUBLE_MAX vtkmodules.util.vtkConstants.VTK_DOUBLE_MIN vtkmodules.util.vtkConstants.VTK_EMPTY_CELL vtkmodules.util.vtkConstants.VTK_ERROR vtkmodules.util.vtkConstants.VTK_FLOAT vtkmodules.util.vtkConstants.VTK_FLOAT_MAX vtkmodules.util.vtkConstants.VTK_FLOAT_MIN vtkmodules.util.vtkConstants.VTK_GENERIC_DATA_SET vtkmodules.util.vtkConstants.VTK_GRAPH vtkmodules.util.vtkConstants.VTK_HEXAGONAL_PRISM vtkmodules.util.vtkConstants.VTK_HEXAHEDRON vtkmodules.util.vtkConstants.VTK_HIERARCHICAL_BOX_DATA_SET vtkmodules.util.vtkConstants.VTK_HIERARCHICAL_DATA_SET vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_EDGE vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_HEXAHEDRON vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_POLYGON vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_PYRAMID vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_QUAD vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_TETRAHEDRON vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_TRIANGLE vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_WEDGE vtkmodules.util.vtkConstants.VTK_HYPER_OCTREE vtkmodules.util.vtkConstants.VTK_ID_TYPE vtkmodules.util.vtkConstants.VTK_IMAGE_DATA vtkmodules.util.vtkConstants.VTK_INT vtkmodules.util.vtkConstants.VTK_INT_MAX vtkmodules.util.vtkConstants.VTK_INT_MIN vtkmodules.util.vtkConstants.VTK_LINE vtkmodules.util.vtkConstants.VTK_LINEAR_INTERPOLATION vtkmodules.util.vtkConstants.VTK_LONG vtkmodules.util.vtkConstants.VTK_LONG_LONG vtkmodules.util.vtkConstants.VTK_LONG_MAX vtkmodules.util.vtkConstants.VTK_LONG_MIN vtkmodules.util.vtkConstants.VTK_LUMINANCE vtkmodules.util.vtkConstants.VTK_LUMINANCE_ALPHA vtkmodules.util.vtkConstants.VTK_MAX_VRCOMP vtkmodules.util.vtkConstants.VTK_MULTIBLOCK_DATA_SET vtkmodules.util.vtkConstants.VTK_MULTIGROUP_DATA_SET vtkmodules.util.vtkConstants.VTK_NEAREST_INTERPOLATION vtkmodules.util.vtkConstants.VTK_OBJECT vtkmodules.util.vtkConstants.VTK_OK vtkmodules.util.vtkConstants.VTK_OPAQUE vtkmodules.util.vtkConstants.VTK_PARAMETRIC_CURVE vtkmodules.util.vtkConstants.VTK_PARAMETRIC_HEX_REGION vtkmodules.util.vtkConstants.VTK_PARAMETRIC_QUAD_SURFACE vtkmodules.util.vtkConstants.VTK_PARAMETRIC_SURFACE vtkmodules.util.vtkConstants.VTK_PARAMETRIC_TETRA_REGION vtkmodules.util.vtkConstants.VTK_PARAMETRIC_TRI_SURFACE vtkmodules.util.vtkConstants.VTK_PENTAGONAL_PRISM vtkmodules.util.vtkConstants.VTK_PIECEWISE_FUNCTION vtkmodules.util.vtkConstants.VTK_PIXEL vtkmodules.util.vtkConstants.VTK_POINT_SET vtkmodules.util.vtkConstants.VTK_POLYGON vtkmodules.util.vtkConstants.VTK_POLY_DATA vtkmodules.util.vtkConstants.VTK_POLY_LINE vtkmodules.util.vtkConstants.VTK_POLY_VERTEX vtkmodules.util.vtkConstants.VTK_PYRAMID vtkmodules.util.vtkConstants.VTK_QUAD vtkmodules.util.vtkConstants.VTK_QUADRATIC_EDGE vtkmodules.util.vtkConstants.VTK_QUADRATIC_HEXAHEDRON vtkmodules.util.vtkConstants.VTK_QUADRATIC_LINEAR_QUAD vtkmodules.util.vtkConstants.VTK_QUADRATIC_LINEAR_WEDGE vtkmodules.util.vtkConstants.VTK_QUADRATIC_PYRAMID vtkmodules.util.vtkConstants.VTK_QUADRATIC_QUAD vtkmodules.util.vtkConstants.VTK_QUADRATIC_TETRA vtkmodules.util.vtkConstants.VTK_QUADRATIC_TRIANGLE vtkmodules.util.vtkConstants.VTK_QUADRATIC_WEDGE vtkmodules.util.vtkConstants.VTK_RECTILINEAR_GRID vtkmodules.util.vtkConstants.VTK_RGB vtkmodules.util.vtkConstants.VTK_RGBA vtkmodules.util.vtkConstants.VTK_SELECTION vtkmodules.util.vtkConstants.VTK_SHORT vtkmodules.util.vtkConstants.VTK_SHORT_MAX vtkmodules.util.vtkConstants.VTK_SHORT_MIN vtkmodules.util.vtkConstants.VTK_SIGNED_CHAR vtkmodules.util.vtkConstants.VTK_STRING vtkmodules.util.vtkConstants.VTK_STRUCTURED_GRID vtkmodules.util.vtkConstants.VTK_STRUCTURED_POINTS vtkmodules.util.vtkConstants.VTK_TABLE vtkmodules.util.vtkConstants.VTK_TEMPORAL_DATA_SET vtkmodules.util.vtkConstants.VTK_TETRA vtkmodules.util.vtkConstants.VTK_TEXT_BOTTOM vtkmodules.util.vtkConstants.VTK_TEXT_CENTERED vtkmodules.util.vtkConstants.VTK_TEXT_GLOBAL_ANTIALIASING_ALL vtkmodules.util.vtkConstants.VTK_TEXT_GLOBAL_ANTIALIASING_NONE vtkmodules.util.vtkConstants.VTK_TEXT_GLOBAL_ANTIALIASING_SOME vtkmodules.util.vtkConstants.VTK_TEXT_LEFT vtkmodules.util.vtkConstants.VTK_TEXT_RIGHT vtkmodules.util.vtkConstants.VTK_TEXT_TOP vtkmodules.util.vtkConstants.VTK_TIMES vtkmodules.util.vtkConstants.VTK_TREE vtkmodules.util.vtkConstants.VTK_TRIANGLE vtkmodules.util.vtkConstants.VTK_TRIANGLE_STRIP vtkmodules.util.vtkConstants.VTK_TRIQUADRATIC_HEXAHEDRON vtkmodules.util.vtkConstants.VTK_UNIFORM_GRID vtkmodules.util.vtkConstants.VTK_UNKNOWN_FONT vtkmodules.util.vtkConstants.VTK_UNSIGNED_CHAR vtkmodules.util.vtkConstants.VTK_UNSIGNED_CHAR_MAX vtkmodules.util.vtkConstants.VTK_UNSIGNED_CHAR_MIN vtkmodules.util.vtkConstants.VTK_UNSIGNED_INT vtkmodules.util.vtkConstants.VTK_UNSIGNED_LONG vtkmodules.util.vtkConstants.VTK_UNSIGNED_LONG_LONG vtkmodules.util.vtkConstants.VTK_UNSIGNED_SHORT vtkmodules.util.vtkConstants.VTK_UNSIGNED_SHORT_MAX vtkmodules.util.vtkConstants.VTK_UNSIGNED_SHORT_MIN vtkmodules.util.vtkConstants.VTK_UNSTRUCTURED_GRID vtkmodules.util.vtkConstants.VTK_VARIANT vtkmodules.util.vtkConstants.VTK_VERTEX vtkmodules.util.vtkConstants.VTK_VOID vtkmodules.util.vtkConstants.VTK_VOXEL vtkmodules.util.vtkConstants.VTK_WEDGE vtkmodules.util.vtkConstants._VTK_FLOAT_MAX vtkmodules.util.vtkConstants._VTK_INT_MAX vtkmodules.util.vtkConstants.vtkImageScalarTypeNameMacro vtkmodules.util.vtkImageExportToArray.VTK_DOUBLE vtkmodules.util.vtkImageExportToArray.VTK_FLOAT vtkmodules.util.vtkImageExportToArray.VTK_INT vtkmodules.util.vtkImageExportToArray.VTK_LONG vtkmodules.util.vtkImageExportToArray.VTK_SHORT vtkmodules.util.vtkImageExportToArray.VTK_SIGNED_CHAR vtkmodules.util.vtkImageExportToArray.VTK_UNSIGNED_CHAR vtkmodules.util.vtkImageExportToArray.VTK_UNSIGNED_INT vtkmodules.util.vtkImageExportToArray.VTK_UNSIGNED_LONG vtkmodules.util.vtkImageExportToArray.VTK_UNSIGNED_SHORT vtkmodules.util.vtkImageExportToArray.numpy vtkmodules.util.vtkImageExportToArray.umath vtkmodules.util.vtkImageExportToArray.vtkImageExport vtkmodules.util.vtkImageExportToArray.vtkImageExportToArray vtkmodules.util.vtkImageExportToArray.vtkStreamingDemandDrivenPipeline vtkmodules.util.vtkImageImportFromArray.VTK_DOUBLE vtkmodules.util.vtkImageImportFromArray.VTK_FLOAT vtkmodules.util.vtkImageImportFromArray.VTK_INT vtkmodules.util.vtkImageImportFromArray.VTK_LONG vtkmodules.util.vtkImageImportFromArray.VTK_SHORT vtkmodules.util.vtkImageImportFromArray.VTK_SIGNED_CHAR vtkmodules.util.vtkImageImportFromArray.VTK_UNSIGNED_CHAR vtkmodules.util.vtkImageImportFromArray.VTK_UNSIGNED_INT vtkmodules.util.vtkImageImportFromArray.VTK_UNSIGNED_LONG vtkmodules.util.vtkImageImportFromArray.VTK_UNSIGNED_SHORT vtkmodules.util.vtkImageImportFromArray.vtkImageImport vtkmodules.util.vtkImageImportFromArray.vtkImageImportFromArray vtkmodules.util.vtkMethodParser.DEBUG vtkmodules.util.vtkMethodParser.VtkDirMethodParser vtkmodules.util.vtkMethodParser.VtkPrintMethodParser vtkmodules.util.vtkMethodParser.debug vtkmodules.util.vtkMethodParser.re vtkmodules.util.vtkMethodParser.string vtkmodules.util.vtkMethodParser.sys vtkmodules.util.vtkMethodParser.types vtkmodules.util.vtkVariant._variant_check_map vtkmodules.util.vtkVariant._variant_method_map vtkmodules.util.vtkVariant._variant_type_map vtkmodules.util.vtkVariant.sys vtkmodules.util.vtkVariant.vtkCommonCore vtkmodules.util.vtkVariant.vtkVariantCast vtkmodules.util.vtkVariant.vtkVariantCreate vtkmodules.util.vtkVariant.vtkVariantEqual vtkmodules.util.vtkVariant.vtkVariantExtract vtkmodules.util.vtkVariant.vtkVariantLessThan vtkmodules.util.vtkVariant.vtkVariantStrictEquality vtkmodules.util.vtkVariant.vtkVariantStrictWeakOrder vtkmodules.util.vtkVariant.vtkVariantStrictWeakOrderKey vtkmodules.vtkAcceleratorsVTKmDataModel.vtkmDataSet vtkmodules.vtkAcceleratorsVTKmFilters.vtkmAverageToCells vtkmodules.vtkAcceleratorsVTKmFilters.vtkmAverageToPoints vtkmodules.vtkAcceleratorsVTKmFilters.vtkmCleanGrid vtkmodules.vtkAcceleratorsVTKmFilters.vtkmClip vtkmodules.vtkAcceleratorsVTKmFilters.vtkmContour vtkmodules.vtkAcceleratorsVTKmFilters.vtkmCoordinateSystemTransform vtkmodules.vtkAcceleratorsVTKmFilters.vtkmExternalFaces vtkmodules.vtkAcceleratorsVTKmFilters.vtkmExtractVOI vtkmodules.vtkAcceleratorsVTKmFilters.vtkmFilterOverrides vtkmodules.vtkAcceleratorsVTKmFilters.vtkmGradient vtkmodules.vtkAcceleratorsVTKmFilters.vtkmHistogram vtkmodules.vtkAcceleratorsVTKmFilters.vtkmImageConnectivity vtkmodules.vtkAcceleratorsVTKmFilters.vtkmLevelOfDetail vtkmodules.vtkAcceleratorsVTKmFilters.vtkmNDHistogram vtkmodules.vtkAcceleratorsVTKmFilters.vtkmPointElevation vtkmodules.vtkAcceleratorsVTKmFilters.vtkmPointTransform vtkmodules.vtkAcceleratorsVTKmFilters.vtkmPolyDataNormals vtkmodules.vtkAcceleratorsVTKmFilters.vtkmProbe vtkmodules.vtkAcceleratorsVTKmFilters.vtkmSlice vtkmodules.vtkAcceleratorsVTKmFilters.vtkmThreshold vtkmodules.vtkAcceleratorsVTKmFilters.vtkmTriangleMeshPointNormals vtkmodules.vtkAcceleratorsVTKmFilters.vtkmWarpScalar vtkmodules.vtkAcceleratorsVTKmFilters.vtkmWarpVector vtkmodules.vtkChartsCore.vtkAxis vtkmodules.vtkChartsCore.vtkAxisExtended vtkmodules.vtkChartsCore.vtkCategoryLegend vtkmodules.vtkChartsCore.vtkChart vtkmodules.vtkChartsCore.vtkChartBox vtkmodules.vtkChartsCore.vtkChartBoxData vtkmodules.vtkChartsCore.vtkChartHistogram2D vtkmodules.vtkChartsCore.vtkChartLegend vtkmodules.vtkChartsCore.vtkChartMatrix vtkmodules.vtkChartsCore.vtkChartParallelCoordinates vtkmodules.vtkChartsCore.vtkChartPie vtkmodules.vtkChartsCore.vtkChartPlotData vtkmodules.vtkChartsCore.vtkChartXY vtkmodules.vtkChartsCore.vtkChartXYZ vtkmodules.vtkChartsCore.vtkColorLegend vtkmodules.vtkChartsCore.vtkColorTransferControlPointsItem vtkmodules.vtkChartsCore.vtkColorTransferFunctionItem vtkmodules.vtkChartsCore.vtkCompositeControlPointsItem vtkmodules.vtkChartsCore.vtkCompositeTransferFunctionItem vtkmodules.vtkChartsCore.vtkContextArea vtkmodules.vtkChartsCore.vtkContextPolygon vtkmodules.vtkChartsCore.vtkControlPointsItem vtkmodules.vtkChartsCore.vtkInteractiveArea vtkmodules.vtkChartsCore.vtkLookupTableItem vtkmodules.vtkChartsCore.vtkPiecewiseControlPointsItem vtkmodules.vtkChartsCore.vtkPiecewiseFunctionItem vtkmodules.vtkChartsCore.vtkPiecewisePointHandleItem vtkmodules.vtkChartsCore.vtkPlot vtkmodules.vtkChartsCore.vtkPlot3D vtkmodules.vtkChartsCore.vtkPlotArea vtkmodules.vtkChartsCore.vtkPlotBag vtkmodules.vtkChartsCore.vtkPlotBar vtkmodules.vtkChartsCore.vtkPlotBarRangeHandlesItem vtkmodules.vtkChartsCore.vtkPlotBox vtkmodules.vtkChartsCore.vtkPlotFunctionalBag vtkmodules.vtkChartsCore.vtkPlotGrid vtkmodules.vtkChartsCore.vtkPlotHistogram2D vtkmodules.vtkChartsCore.vtkPlotLine vtkmodules.vtkChartsCore.vtkPlotLine3D vtkmodules.vtkChartsCore.vtkPlotParallelCoordinates vtkmodules.vtkChartsCore.vtkPlotPie vtkmodules.vtkChartsCore.vtkPlotPoints vtkmodules.vtkChartsCore.vtkPlotPoints3D vtkmodules.vtkChartsCore.vtkPlotRangeHandlesItem vtkmodules.vtkChartsCore.vtkPlotStacked vtkmodules.vtkChartsCore.vtkPlotSurface vtkmodules.vtkChartsCore.vtkRangeHandlesItem vtkmodules.vtkChartsCore.vtkScalarsToColorsItem vtkmodules.vtkChartsCore.vtkScatterPlotMatrix vtkmodules.vtkCommonColor.vtkColorSeries vtkmodules.vtkCommonColor.vtkNamedColors vtkmodules.vtkCommonComputationalGeometry.vtkBilinearQuadIntersection vtkmodules.vtkCommonComputationalGeometry.vtkCardinalSpline vtkmodules.vtkCommonComputationalGeometry.vtkKochanekSpline vtkmodules.vtkCommonComputationalGeometry.vtkParametricBohemianDome vtkmodules.vtkCommonComputationalGeometry.vtkParametricBour vtkmodules.vtkCommonComputationalGeometry.vtkParametricBoy vtkmodules.vtkCommonComputationalGeometry.vtkParametricCatalanMinimal vtkmodules.vtkCommonComputationalGeometry.vtkParametricConicSpiral vtkmodules.vtkCommonComputationalGeometry.vtkParametricCrossCap vtkmodules.vtkCommonComputationalGeometry.vtkParametricDini vtkmodules.vtkCommonComputationalGeometry.vtkParametricEllipsoid vtkmodules.vtkCommonComputationalGeometry.vtkParametricEnneper vtkmodules.vtkCommonComputationalGeometry.vtkParametricFigure8Klein vtkmodules.vtkCommonComputationalGeometry.vtkParametricFunction vtkmodules.vtkCommonComputationalGeometry.vtkParametricHenneberg vtkmodules.vtkCommonComputationalGeometry.vtkParametricKlein vtkmodules.vtkCommonComputationalGeometry.vtkParametricKuen vtkmodules.vtkCommonComputationalGeometry.vtkParametricMobius vtkmodules.vtkCommonComputationalGeometry.vtkParametricPluckerConoid vtkmodules.vtkCommonComputationalGeometry.vtkParametricPseudosphere vtkmodules.vtkCommonComputationalGeometry.vtkParametricRandomHills vtkmodules.vtkCommonComputationalGeometry.vtkParametricRoman vtkmodules.vtkCommonComputationalGeometry.vtkParametricSpline vtkmodules.vtkCommonComputationalGeometry.vtkParametricSuperEllipsoid vtkmodules.vtkCommonComputationalGeometry.vtkParametricSuperToroid vtkmodules.vtkCommonComputationalGeometry.vtkParametricTorus vtkmodules.vtkCommonCore.VTK_ABSTRACT_ELECTRONIC_DATA vtkmodules.vtkCommonCore.VTK_ANNOTATION vtkmodules.vtkCommonCore.VTK_ANNOTATION_LAYERS vtkmodules.vtkCommonCore.VTK_ARIAL vtkmodules.vtkCommonCore.VTK_ARRAY_DATA vtkmodules.vtkCommonCore.VTK_BIT vtkmodules.vtkCommonCore.VTK_BIT_MAX vtkmodules.vtkCommonCore.VTK_BIT_MIN vtkmodules.vtkCommonCore.VTK_BSP_CUTS vtkmodules.vtkCommonCore.VTK_BUILD_VERSION vtkmodules.vtkCommonCore.VTK_CELL_GRID vtkmodules.vtkCommonCore.VTK_CHAR vtkmodules.vtkCommonCore.VTK_CHAR_MAX vtkmodules.vtkCommonCore.VTK_CHAR_MIN vtkmodules.vtkCommonCore.VTK_COLOR_MODE_DEFAULT vtkmodules.vtkCommonCore.VTK_COLOR_MODE_DIRECT_SCALARS vtkmodules.vtkCommonCore.VTK_COLOR_MODE_MAP_SCALARS vtkmodules.vtkCommonCore.VTK_COMPILER_GCC_VERSION vtkmodules.vtkCommonCore.VTK_COMPOSITE_DATA_SET vtkmodules.vtkCommonCore.VTK_COURIER vtkmodules.vtkCommonCore.VTK_CUBIC_INTERPOLATION vtkmodules.vtkCommonCore.VTK_DATA_OBJECT vtkmodules.vtkCommonCore.VTK_DATA_OBJECT_TREE vtkmodules.vtkCommonCore.VTK_DATA_SET vtkmodules.vtkCommonCore.VTK_DBL_EPSILON vtkmodules.vtkCommonCore.VTK_DBL_MIN vtkmodules.vtkCommonCore.VTK_DEPRECATION_LEVEL vtkmodules.vtkCommonCore.VTK_DIRECTED_ACYCLIC_GRAPH vtkmodules.vtkCommonCore.VTK_DIRECTED_GRAPH vtkmodules.vtkCommonCore.VTK_DOUBLE vtkmodules.vtkCommonCore.VTK_DOUBLE_MAX vtkmodules.vtkCommonCore.VTK_DOUBLE_MIN vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_1 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_10 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_11 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_12 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_13 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_14 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_15 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_16 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_2 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_3 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_4 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_5 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_6 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_7 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_8 vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_9 vtkmodules.vtkCommonCore.VTK_ENCODING_NONE vtkmodules.vtkCommonCore.VTK_ENCODING_UNICODE vtkmodules.vtkCommonCore.VTK_ENCODING_UNKNOWN vtkmodules.vtkCommonCore.VTK_ENCODING_US_ASCII vtkmodules.vtkCommonCore.VTK_ENCODING_UTF_8 vtkmodules.vtkCommonCore.VTK_ERROR vtkmodules.vtkCommonCore.VTK_EXPLICIT_STRUCTURED_GRID vtkmodules.vtkCommonCore.VTK_FLOAT vtkmodules.vtkCommonCore.VTK_FLOAT_MAX vtkmodules.vtkCommonCore.VTK_FLOAT_MIN vtkmodules.vtkCommonCore.VTK_FONT_FILE vtkmodules.vtkCommonCore.VTK_GENERIC_DATA_SET vtkmodules.vtkCommonCore.VTK_GEO_JSON_FEATURE vtkmodules.vtkCommonCore.VTK_GRAPH vtkmodules.vtkCommonCore.VTK_HIERARCHICAL_BOX_DATA_SET vtkmodules.vtkCommonCore.VTK_HIERARCHICAL_DATA_SET vtkmodules.vtkCommonCore.VTK_HYPER_OCTREE vtkmodules.vtkCommonCore.VTK_HYPER_TREE_GRID vtkmodules.vtkCommonCore.VTK_ID_MAX vtkmodules.vtkCommonCore.VTK_ID_MIN vtkmodules.vtkCommonCore.VTK_ID_TYPE vtkmodules.vtkCommonCore.VTK_ID_TYPE_IMPL vtkmodules.vtkCommonCore.VTK_ID_TYPE_PRId vtkmodules.vtkCommonCore.VTK_IMAGE_DATA vtkmodules.vtkCommonCore.VTK_IMAGE_SLAB_MAX vtkmodules.vtkCommonCore.VTK_IMAGE_SLAB_MEAN vtkmodules.vtkCommonCore.VTK_IMAGE_SLAB_MIN vtkmodules.vtkCommonCore.VTK_IMAGE_SLAB_SUM vtkmodules.vtkCommonCore.VTK_IMAGE_STENCIL_DATA vtkmodules.vtkCommonCore.VTK_INT vtkmodules.vtkCommonCore.VTK_INT_MAX vtkmodules.vtkCommonCore.VTK_INT_MIN vtkmodules.vtkCommonCore.VTK_LINEAR_INTERPOLATION vtkmodules.vtkCommonCore.VTK_LONG vtkmodules.vtkCommonCore.VTK_LONG_LONG vtkmodules.vtkCommonCore.VTK_LONG_LONG_MAX vtkmodules.vtkCommonCore.VTK_LONG_LONG_MIN vtkmodules.vtkCommonCore.VTK_LONG_MAX vtkmodules.vtkCommonCore.VTK_LONG_MIN vtkmodules.vtkCommonCore.VTK_LUMINANCE vtkmodules.vtkCommonCore.VTK_LUMINANCE_ALPHA vtkmodules.vtkCommonCore.VTK_MAJOR_VERSION vtkmodules.vtkCommonCore.VTK_MAXPATH vtkmodules.vtkCommonCore.VTK_MAX_THREADS vtkmodules.vtkCommonCore.VTK_MAX_VRCOMP vtkmodules.vtkCommonCore.VTK_MINIMUM_DEPRECATION_LEVEL vtkmodules.vtkCommonCore.VTK_MINOR_VERSION vtkmodules.vtkCommonCore.VTK_MOLECULE vtkmodules.vtkCommonCore.VTK_MTIME_MAX vtkmodules.vtkCommonCore.VTK_MTIME_MIN vtkmodules.vtkCommonCore.VTK_MTIME_TYPE_IMPL vtkmodules.vtkCommonCore.VTK_MULTIBLOCK_DATA_SET vtkmodules.vtkCommonCore.VTK_MULTIGROUP_DATA_SET vtkmodules.vtkCommonCore.VTK_MULTIPIECE_DATA_SET vtkmodules.vtkCommonCore.VTK_NEAREST_INTERPOLATION vtkmodules.vtkCommonCore.VTK_NON_OVERLAPPING_AMR vtkmodules.vtkCommonCore.VTK_OBJECT vtkmodules.vtkCommonCore.VTK_OK vtkmodules.vtkCommonCore.VTK_OPAQUE vtkmodules.vtkCommonCore.VTK_OPEN_QUBE_ELECTRONIC_DATA vtkmodules.vtkCommonCore.VTK_OVERLAPPING_AMR vtkmodules.vtkCommonCore.VTK_PARTITIONED_DATA_SET vtkmodules.vtkCommonCore.VTK_PARTITIONED_DATA_SET_COLLECTION vtkmodules.vtkCommonCore.VTK_PATH vtkmodules.vtkCommonCore.VTK_PIECEWISE_FUNCTION vtkmodules.vtkCommonCore.VTK_PISTON_DATA_OBJECT vtkmodules.vtkCommonCore.VTK_POINT_SET vtkmodules.vtkCommonCore.VTK_POLY_DATA vtkmodules.vtkCommonCore.VTK_RAMP_LINEAR vtkmodules.vtkCommonCore.VTK_RAMP_SCURVE vtkmodules.vtkCommonCore.VTK_RAMP_SQRT vtkmodules.vtkCommonCore.VTK_RECTILINEAR_GRID vtkmodules.vtkCommonCore.VTK_REEB_GRAPH vtkmodules.vtkCommonCore.VTK_RGB vtkmodules.vtkCommonCore.VTK_RGBA vtkmodules.vtkCommonCore.VTK_SCALE_LINEAR vtkmodules.vtkCommonCore.VTK_SCALE_LOG10 vtkmodules.vtkCommonCore.VTK_SELECTION vtkmodules.vtkCommonCore.VTK_SHORT vtkmodules.vtkCommonCore.VTK_SHORT_MAX vtkmodules.vtkCommonCore.VTK_SHORT_MIN vtkmodules.vtkCommonCore.VTK_SIGNED_CHAR vtkmodules.vtkCommonCore.VTK_SIGNED_CHAR_MAX vtkmodules.vtkCommonCore.VTK_SIGNED_CHAR_MIN vtkmodules.vtkCommonCore.VTK_SIZEOF_CHAR vtkmodules.vtkCommonCore.VTK_SIZEOF_DOUBLE vtkmodules.vtkCommonCore.VTK_SIZEOF_FLOAT vtkmodules.vtkCommonCore.VTK_SIZEOF_ID_TYPE vtkmodules.vtkCommonCore.VTK_SIZEOF_INT vtkmodules.vtkCommonCore.VTK_SIZEOF_LONG vtkmodules.vtkCommonCore.VTK_SIZEOF_LONG_LONG vtkmodules.vtkCommonCore.VTK_SIZEOF_SHORT vtkmodules.vtkCommonCore.VTK_SIZEOF_VOID_P vtkmodules.vtkCommonCore.VTK_SMP_BACKEND vtkmodules.vtkCommonCore.VTK_SMP_DEFAULT_IMPLEMENTATION_OPENMP vtkmodules.vtkCommonCore.VTK_SMP_DEFAULT_IMPLEMENTATION_SEQUENTIAL vtkmodules.vtkCommonCore.VTK_SMP_DEFAULT_IMPLEMENTATION_STDTHREAD vtkmodules.vtkCommonCore.VTK_SMP_DEFAULT_IMPLEMENTATION_TBB vtkmodules.vtkCommonCore.VTK_SMP_ENABLE_OPENMP vtkmodules.vtkCommonCore.VTK_SMP_ENABLE_SEQUENTIAL vtkmodules.vtkCommonCore.VTK_SMP_ENABLE_STDTHREAD vtkmodules.vtkCommonCore.VTK_SMP_ENABLE_TBB vtkmodules.vtkCommonCore.VTK_SOURCE_VERSION vtkmodules.vtkCommonCore.VTK_STRING vtkmodules.vtkCommonCore.VTK_STRUCTURED_GRID vtkmodules.vtkCommonCore.VTK_STRUCTURED_POINTS vtkmodules.vtkCommonCore.VTK_TABLE vtkmodules.vtkCommonCore.VTK_TEMPORAL_DATA_SET vtkmodules.vtkCommonCore.VTK_TEXT_BOTTOM vtkmodules.vtkCommonCore.VTK_TEXT_CENTERED vtkmodules.vtkCommonCore.VTK_TEXT_GLOBAL_ANTIALIASING_ALL vtkmodules.vtkCommonCore.VTK_TEXT_GLOBAL_ANTIALIASING_NONE vtkmodules.vtkCommonCore.VTK_TEXT_GLOBAL_ANTIALIASING_SOME vtkmodules.vtkCommonCore.VTK_TEXT_LEFT vtkmodules.vtkCommonCore.VTK_TEXT_RIGHT vtkmodules.vtkCommonCore.VTK_TEXT_TOP vtkmodules.vtkCommonCore.VTK_THREAD_RETURN_VALUE vtkmodules.vtkCommonCore.VTK_TIMES vtkmodules.vtkCommonCore.VTK_TREE vtkmodules.vtkCommonCore.VTK_TYPE_CHAR_IS_SIGNED vtkmodules.vtkCommonCore.VTK_TYPE_FLOAT32 vtkmodules.vtkCommonCore.VTK_TYPE_FLOAT64 vtkmodules.vtkCommonCore.VTK_TYPE_INT16 vtkmodules.vtkCommonCore.VTK_TYPE_INT16_MAX vtkmodules.vtkCommonCore.VTK_TYPE_INT16_MIN vtkmodules.vtkCommonCore.VTK_TYPE_INT32 vtkmodules.vtkCommonCore.VTK_TYPE_INT32_MAX vtkmodules.vtkCommonCore.VTK_TYPE_INT32_MIN vtkmodules.vtkCommonCore.VTK_TYPE_INT64 vtkmodules.vtkCommonCore.VTK_TYPE_INT64_MAX vtkmodules.vtkCommonCore.VTK_TYPE_INT64_MIN vtkmodules.vtkCommonCore.VTK_TYPE_INT8 vtkmodules.vtkCommonCore.VTK_TYPE_INT8_MAX vtkmodules.vtkCommonCore.VTK_TYPE_INT8_MIN vtkmodules.vtkCommonCore.VTK_TYPE_LONG_LONG_FORMAT vtkmodules.vtkCommonCore.VTK_TYPE_UINT16 vtkmodules.vtkCommonCore.VTK_TYPE_UINT16_MAX vtkmodules.vtkCommonCore.VTK_TYPE_UINT16_MIN vtkmodules.vtkCommonCore.VTK_TYPE_UINT32 vtkmodules.vtkCommonCore.VTK_TYPE_UINT32_MAX vtkmodules.vtkCommonCore.VTK_TYPE_UINT32_MIN vtkmodules.vtkCommonCore.VTK_TYPE_UINT64 vtkmodules.vtkCommonCore.VTK_TYPE_UINT64_MAX vtkmodules.vtkCommonCore.VTK_TYPE_UINT64_MIN vtkmodules.vtkCommonCore.VTK_TYPE_UINT8 vtkmodules.vtkCommonCore.VTK_TYPE_UINT8_MAX vtkmodules.vtkCommonCore.VTK_TYPE_UINT8_MIN vtkmodules.vtkCommonCore.VTK_UNDIRECTED_GRAPH vtkmodules.vtkCommonCore.VTK_UNIFORM_GRID vtkmodules.vtkCommonCore.VTK_UNIFORM_GRID_AMR vtkmodules.vtkCommonCore.VTK_UNIFORM_HYPER_TREE_GRID vtkmodules.vtkCommonCore.VTK_UNKNOWN_FONT vtkmodules.vtkCommonCore.VTK_UNSIGNED_CHAR vtkmodules.vtkCommonCore.VTK_UNSIGNED_CHAR_MAX vtkmodules.vtkCommonCore.VTK_UNSIGNED_CHAR_MIN vtkmodules.vtkCommonCore.VTK_UNSIGNED_INT vtkmodules.vtkCommonCore.VTK_UNSIGNED_INT_MAX vtkmodules.vtkCommonCore.VTK_UNSIGNED_INT_MIN vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_LONG vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_LONG_MAX vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_LONG_MIN vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_MAX vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_MIN vtkmodules.vtkCommonCore.VTK_UNSIGNED_SHORT vtkmodules.vtkCommonCore.VTK_UNSIGNED_SHORT_MAX vtkmodules.vtkCommonCore.VTK_UNSIGNED_SHORT_MIN vtkmodules.vtkCommonCore.VTK_UNSTRUCTURED_GRID vtkmodules.vtkCommonCore.VTK_UNSTRUCTURED_GRID_BASE vtkmodules.vtkCommonCore.VTK_USE_FLOAT32 vtkmodules.vtkCommonCore.VTK_USE_FLOAT64 vtkmodules.vtkCommonCore.VTK_USE_FUTURE_BOOL vtkmodules.vtkCommonCore.VTK_USE_FUTURE_CONST vtkmodules.vtkCommonCore.VTK_USE_INT16 vtkmodules.vtkCommonCore.VTK_USE_INT32 vtkmodules.vtkCommonCore.VTK_USE_INT64 vtkmodules.vtkCommonCore.VTK_USE_INT8 vtkmodules.vtkCommonCore.VTK_USE_UINT16 vtkmodules.vtkCommonCore.VTK_USE_UINT32 vtkmodules.vtkCommonCore.VTK_USE_UINT64 vtkmodules.vtkCommonCore.VTK_USE_UINT8 vtkmodules.vtkCommonCore.VTK_VARIANT vtkmodules.vtkCommonCore.VTK_VERSION vtkmodules.vtkCommonCore.VTK_VERSION_FULL vtkmodules.vtkCommonCore.VTK_VERSION_NUMBER vtkmodules.vtkCommonCore.VTK_VOID vtkmodules.vtkCommonCore.buffer_shared vtkmodules.vtkCommonCore.mutable vtkmodules.vtkCommonCore.reference vtkmodules.vtkCommonCore.vtkAbstractArray vtkmodules.vtkCommonCore.vtkAnimationCue vtkmodules.vtkCommonCore.vtkArchiver vtkmodules.vtkCommonCore.vtkArray vtkmodules.vtkCommonCore.vtkArrayCoordinates vtkmodules.vtkCommonCore.vtkArrayExtents vtkmodules.vtkCommonCore.vtkArrayExtentsList vtkmodules.vtkCommonCore.vtkArrayIterator vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_I10vtkVariantE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_I12vtkStdStringE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IaE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IcE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IdE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IfE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IhE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IiE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IjE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IlE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_ImE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IsE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_ItE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IxE vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IyE vtkmodules.vtkCommonCore.vtkArrayRange vtkmodules.vtkCommonCore.vtkArraySort vtkmodules.vtkCommonCore.vtkArrayWeights vtkmodules.vtkCommonCore.vtkAtomicMutex vtkmodules.vtkCommonCore.vtkBitArray vtkmodules.vtkCommonCore.vtkBitArrayIterator vtkmodules.vtkCommonCore.vtkBoxMuellerRandomSequence vtkmodules.vtkCommonCore.vtkBreakPoint vtkmodules.vtkCommonCore.vtkByteSwap vtkmodules.vtkCommonCore.vtkCallbackCommand vtkmodules.vtkCommonCore.vtkCharArray vtkmodules.vtkCommonCore.vtkCollection vtkmodules.vtkCommonCore.vtkCollectionElement vtkmodules.vtkCommonCore.vtkCollectionIterator vtkmodules.vtkCommonCore.vtkCommand vtkmodules.vtkCommonCore.vtkCommonInformationKeyManager vtkmodules.vtkCommonCore.vtkCriticalSection vtkmodules.vtkCommonCore.vtkDataArray vtkmodules.vtkCommonCore.vtkDataArrayCollection vtkmodules.vtkCommonCore.vtkDataArrayCollectionIterator vtkmodules.vtkCommonCore.vtkDataArraySelection vtkmodules.vtkCommonCore.vtkDebugLeaks vtkmodules.vtkCommonCore.vtkDebugLeaksManager vtkmodules.vtkCommonCore.vtkDebugLeaksObserver vtkmodules.vtkCommonCore.vtkDenseArray vtkmodules.vtkCommonCore.vtkDenseArray_I10vtkVariantE vtkmodules.vtkCommonCore.vtkDenseArray_I12vtkStdStringE vtkmodules.vtkCommonCore.vtkDenseArray_IaE vtkmodules.vtkCommonCore.vtkDenseArray_IcE vtkmodules.vtkCommonCore.vtkDenseArray_IdE vtkmodules.vtkCommonCore.vtkDenseArray_IfE vtkmodules.vtkCommonCore.vtkDenseArray_IhE vtkmodules.vtkCommonCore.vtkDenseArray_IiE vtkmodules.vtkCommonCore.vtkDenseArray_IjE vtkmodules.vtkCommonCore.vtkDenseArray_IlE vtkmodules.vtkCommonCore.vtkDenseArray_ImE vtkmodules.vtkCommonCore.vtkDenseArray_IsE vtkmodules.vtkCommonCore.vtkDenseArray_ItE vtkmodules.vtkCommonCore.vtkDenseArray_IxE vtkmodules.vtkCommonCore.vtkDenseArray_IyE vtkmodules.vtkCommonCore.vtkDoubleArray vtkmodules.vtkCommonCore.vtkDynamicLoader vtkmodules.vtkCommonCore.vtkEventData vtkmodules.vtkCommonCore.vtkEventDataAction vtkmodules.vtkCommonCore.vtkEventDataDevice vtkmodules.vtkCommonCore.vtkEventDataDevice3D vtkmodules.vtkCommonCore.vtkEventDataDeviceInput vtkmodules.vtkCommonCore.vtkEventDataForDevice vtkmodules.vtkCommonCore.vtkEventDataNumberOfDevices vtkmodules.vtkCommonCore.vtkEventDataNumberOfInputs vtkmodules.vtkCommonCore.vtkEventForwarderCommand vtkmodules.vtkCommonCore.vtkFileOutputWindow vtkmodules.vtkCommonCore.vtkFloatArray vtkmodules.vtkCommonCore.vtkFloatingPointExceptions vtkmodules.vtkCommonCore.vtkGarbageCollector vtkmodules.vtkCommonCore.vtkGarbageCollectorManager vtkmodules.vtkCommonCore.vtkGaussianRandomSequence vtkmodules.vtkCommonCore.vtkGenericDataArray vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIaEaE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIcEcE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIdEdE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIfEfE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIhEhE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIiEiE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIjEjE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIlElE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateImEmE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIsEsE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateItEtE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIxExE vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIyEyE vtkmodules.vtkCommonCore.vtkIdList vtkmodules.vtkCommonCore.vtkIdListCollection vtkmodules.vtkCommonCore.vtkIdTypeArray vtkmodules.vtkCommonCore.vtkIndent vtkmodules.vtkCommonCore.vtkInformation vtkmodules.vtkCommonCore.vtkInformationDataObjectKey vtkmodules.vtkCommonCore.vtkInformationDoubleKey vtkmodules.vtkCommonCore.vtkInformationDoubleVectorKey vtkmodules.vtkCommonCore.vtkInformationIdTypeKey vtkmodules.vtkCommonCore.vtkInformationInformationKey vtkmodules.vtkCommonCore.vtkInformationInformationVectorKey vtkmodules.vtkCommonCore.vtkInformationIntegerKey vtkmodules.vtkCommonCore.vtkInformationIntegerPointerKey vtkmodules.vtkCommonCore.vtkInformationIntegerVectorKey vtkmodules.vtkCommonCore.vtkInformationInternals vtkmodules.vtkCommonCore.vtkInformationIterator vtkmodules.vtkCommonCore.vtkInformationKey vtkmodules.vtkCommonCore.vtkInformationKeyLookup vtkmodules.vtkCommonCore.vtkInformationKeyVectorKey vtkmodules.vtkCommonCore.vtkInformationObjectBaseKey vtkmodules.vtkCommonCore.vtkInformationObjectBaseVectorKey vtkmodules.vtkCommonCore.vtkInformationRequestKey vtkmodules.vtkCommonCore.vtkInformationStringKey vtkmodules.vtkCommonCore.vtkInformationStringVectorKey vtkmodules.vtkCommonCore.vtkInformationUnsignedLongKey vtkmodules.vtkCommonCore.vtkInformationVariantKey vtkmodules.vtkCommonCore.vtkInformationVariantVectorKey vtkmodules.vtkCommonCore.vtkInformationVector vtkmodules.vtkCommonCore.vtkIntArray vtkmodules.vtkCommonCore.vtkLogger vtkmodules.vtkCommonCore.vtkLongArray vtkmodules.vtkCommonCore.vtkLongLongArray vtkmodules.vtkCommonCore.vtkLookupTable vtkmodules.vtkCommonCore.vtkMath vtkmodules.vtkCommonCore.vtkMersenneTwister vtkmodules.vtkCommonCore.vtkMinimalStandardRandomSequence vtkmodules.vtkCommonCore.vtkMultiThreader vtkmodules.vtkCommonCore.vtkOStrStreamWrapper vtkmodules.vtkCommonCore.vtkObject vtkmodules.vtkCommonCore.vtkObjectBase vtkmodules.vtkCommonCore.vtkObjectFactory vtkmodules.vtkCommonCore.vtkObjectFactoryCollection vtkmodules.vtkCommonCore.vtkObjectFactoryRegistryCleanup vtkmodules.vtkCommonCore.vtkOldStyleCallbackCommand vtkmodules.vtkCommonCore.vtkOutputWindow vtkmodules.vtkCommonCore.vtkOutputWindowCleanup vtkmodules.vtkCommonCore.vtkOverrideInformation vtkmodules.vtkCommonCore.vtkOverrideInformationCollection vtkmodules.vtkCommonCore.vtkPoints vtkmodules.vtkCommonCore.vtkPoints2D vtkmodules.vtkCommonCore.vtkPriorityQueue vtkmodules.vtkCommonCore.vtkRandomPool vtkmodules.vtkCommonCore.vtkRandomSequence vtkmodules.vtkCommonCore.vtkReferenceCount vtkmodules.vtkCommonCore.vtkSMPTools vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IaE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IcE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IdE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IfE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IhE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IiE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IjE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IlE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_ImE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IsE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_ItE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IxE vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IyE vtkmodules.vtkCommonCore.vtkScalarsToColors vtkmodules.vtkCommonCore.vtkShortArray vtkmodules.vtkCommonCore.vtkSignedCharArray vtkmodules.vtkCommonCore.vtkSmartPointerBase vtkmodules.vtkCommonCore.vtkSortDataArray vtkmodules.vtkCommonCore.vtkSparseArray vtkmodules.vtkCommonCore.vtkSparseArray_I10vtkVariantE vtkmodules.vtkCommonCore.vtkSparseArray_I12vtkStdStringE vtkmodules.vtkCommonCore.vtkSparseArray_IaE vtkmodules.vtkCommonCore.vtkSparseArray_IcE vtkmodules.vtkCommonCore.vtkSparseArray_IdE vtkmodules.vtkCommonCore.vtkSparseArray_IfE vtkmodules.vtkCommonCore.vtkSparseArray_IhE vtkmodules.vtkCommonCore.vtkSparseArray_IiE vtkmodules.vtkCommonCore.vtkSparseArray_IjE vtkmodules.vtkCommonCore.vtkSparseArray_IlE vtkmodules.vtkCommonCore.vtkSparseArray_ImE vtkmodules.vtkCommonCore.vtkSparseArray_IsE vtkmodules.vtkCommonCore.vtkSparseArray_ItE vtkmodules.vtkCommonCore.vtkSparseArray_IxE vtkmodules.vtkCommonCore.vtkSparseArray_IyE vtkmodules.vtkCommonCore.vtkStdString vtkmodules.vtkCommonCore.vtkStringArray vtkmodules.vtkCommonCore.vtkStringManager vtkmodules.vtkCommonCore.vtkStringOutputWindow vtkmodules.vtkCommonCore.vtkStringToken vtkmodules.vtkCommonCore.vtkTimePointUtility vtkmodules.vtkCommonCore.vtkTimeStamp vtkmodules.vtkCommonCore.vtkTypeFloat32Array vtkmodules.vtkCommonCore.vtkTypeFloat64Array vtkmodules.vtkCommonCore.vtkTypeInt16Array vtkmodules.vtkCommonCore.vtkTypeInt32Array vtkmodules.vtkCommonCore.vtkTypeInt64Array vtkmodules.vtkCommonCore.vtkTypeInt8Array vtkmodules.vtkCommonCore.vtkTypeUInt16Array vtkmodules.vtkCommonCore.vtkTypeUInt32Array vtkmodules.vtkCommonCore.vtkTypeUInt64Array vtkmodules.vtkCommonCore.vtkTypeUInt8Array vtkmodules.vtkCommonCore.vtkTypedArray vtkmodules.vtkCommonCore.vtkTypedArray_I10vtkVariantE vtkmodules.vtkCommonCore.vtkTypedArray_I12vtkStdStringE vtkmodules.vtkCommonCore.vtkTypedArray_IaE vtkmodules.vtkCommonCore.vtkTypedArray_IcE vtkmodules.vtkCommonCore.vtkTypedArray_IdE vtkmodules.vtkCommonCore.vtkTypedArray_IfE vtkmodules.vtkCommonCore.vtkTypedArray_IhE vtkmodules.vtkCommonCore.vtkTypedArray_IiE vtkmodules.vtkCommonCore.vtkTypedArray_IjE vtkmodules.vtkCommonCore.vtkTypedArray_IlE vtkmodules.vtkCommonCore.vtkTypedArray_ImE vtkmodules.vtkCommonCore.vtkTypedArray_IsE vtkmodules.vtkCommonCore.vtkTypedArray_ItE vtkmodules.vtkCommonCore.vtkTypedArray_IxE vtkmodules.vtkCommonCore.vtkTypedArray_IyE vtkmodules.vtkCommonCore.vtkUnsignedCharArray vtkmodules.vtkCommonCore.vtkUnsignedIntArray vtkmodules.vtkCommonCore.vtkUnsignedLongArray vtkmodules.vtkCommonCore.vtkUnsignedLongLongArray vtkmodules.vtkCommonCore.vtkUnsignedShortArray vtkmodules.vtkCommonCore.vtkVariant vtkmodules.vtkCommonCore.vtkVariantArray vtkmodules.vtkCommonCore.vtkVariantEqual vtkmodules.vtkCommonCore.vtkVariantLessThan vtkmodules.vtkCommonCore.vtkVariantStrictEquality vtkmodules.vtkCommonCore.vtkVariantStrictWeakOrder vtkmodules.vtkCommonCore.vtkVersion vtkmodules.vtkCommonCore.vtkVoidArray vtkmodules.vtkCommonCore.vtkWeakPointerBase vtkmodules.vtkCommonCore.vtkWeakReference vtkmodules.vtkCommonCore.vtkWindow vtkmodules.vtkCommonCore.vtkXMLFileOutputWindow vtkmodules.vtkCommonDataModel.VTK_21_POINT_WEDGE vtkmodules.vtkCommonDataModel.VTK_3D_EXTENT vtkmodules.vtkCommonDataModel.VTK_BEZIER_CURVE vtkmodules.vtkCommonDataModel.VTK_BEZIER_HEXAHEDRON vtkmodules.vtkCommonDataModel.VTK_BEZIER_PYRAMID vtkmodules.vtkCommonDataModel.VTK_BEZIER_QUADRILATERAL vtkmodules.vtkCommonDataModel.VTK_BEZIER_TETRAHEDRON vtkmodules.vtkCommonDataModel.VTK_BEZIER_TRIANGLE vtkmodules.vtkCommonDataModel.VTK_BEZIER_WEDGE vtkmodules.vtkCommonDataModel.VTK_BIQUADRATIC_QUAD vtkmodules.vtkCommonDataModel.VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON vtkmodules.vtkCommonDataModel.VTK_BIQUADRATIC_QUADRATIC_WEDGE vtkmodules.vtkCommonDataModel.VTK_BIQUADRATIC_TRIANGLE vtkmodules.vtkCommonDataModel.VTK_CELL_SIZE vtkmodules.vtkCommonDataModel.VTK_CONVEX_POINT_SET vtkmodules.vtkCommonDataModel.VTK_CUBIC_LINE vtkmodules.vtkCommonDataModel.VTK_EMPTY vtkmodules.vtkCommonDataModel.VTK_EMPTY_CELL vtkmodules.vtkCommonDataModel.VTK_HEXAGONAL_PRISM vtkmodules.vtkCommonDataModel.VTK_HEXAHEDRON vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_EDGE vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_HEXAHEDRON vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_POLYGON vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_PYRAMID vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_QUAD vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_TETRAHEDRON vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_TRIANGLE vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_WEDGE vtkmodules.vtkCommonDataModel.VTK_ICP_MODE_AV vtkmodules.vtkCommonDataModel.VTK_ICP_MODE_RMS vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_CURVE vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_HEXAHEDRON vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_PYRAMID vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_QUADRILATERAL vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_TETRAHEDRON vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_TRIANGLE vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_WEDGE vtkmodules.vtkCommonDataModel.VTK_LINE vtkmodules.vtkCommonDataModel.VTK_MIN_SUPERQUADRIC_THICKNESS vtkmodules.vtkCommonDataModel.VTK_NUMBER_OF_CELL_TYPES vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_CURVE vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_HEX_REGION vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_QUAD_SURFACE vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_SURFACE vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_TETRA_REGION vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_TRI_SURFACE vtkmodules.vtkCommonDataModel.VTK_PENTAGONAL_PRISM vtkmodules.vtkCommonDataModel.VTK_PERIODIC_ARRAY_AXIS_X vtkmodules.vtkCommonDataModel.VTK_PERIODIC_ARRAY_AXIS_Y vtkmodules.vtkCommonDataModel.VTK_PERIODIC_ARRAY_AXIS_Z vtkmodules.vtkCommonDataModel.VTK_PIECES_EXTENT vtkmodules.vtkCommonDataModel.VTK_PIXEL vtkmodules.vtkCommonDataModel.VTK_POLYGON vtkmodules.vtkCommonDataModel.VTK_POLYHEDRON vtkmodules.vtkCommonDataModel.VTK_POLY_LINE vtkmodules.vtkCommonDataModel.VTK_POLY_VERTEX vtkmodules.vtkCommonDataModel.VTK_PYRAMID vtkmodules.vtkCommonDataModel.VTK_QUAD vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_EDGE vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_HEXAHEDRON vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_LINEAR_QUAD vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_LINEAR_WEDGE vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_POLYGON vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_PYRAMID vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_QUAD vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_TETRA vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_TRIANGLE vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_WEDGE vtkmodules.vtkCommonDataModel.VTK_SINGLE_POINT vtkmodules.vtkCommonDataModel.VTK_TETRA vtkmodules.vtkCommonDataModel.VTK_TIME_EXTENT vtkmodules.vtkCommonDataModel.VTK_TOL vtkmodules.vtkCommonDataModel.VTK_TRIANGLE vtkmodules.vtkCommonDataModel.VTK_TRIANGLE_STRIP vtkmodules.vtkCommonDataModel.VTK_TRIQUADRATIC_HEXAHEDRON vtkmodules.vtkCommonDataModel.VTK_TRIQUADRATIC_PYRAMID vtkmodules.vtkCommonDataModel.VTK_UNCHANGED vtkmodules.vtkCommonDataModel.VTK_VERTEX vtkmodules.vtkCommonDataModel.VTK_VOXEL vtkmodules.vtkCommonDataModel.VTK_WEDGE vtkmodules.vtkCommonDataModel.VTK_XYZ_GRID vtkmodules.vtkCommonDataModel.VTK_XY_PLANE vtkmodules.vtkCommonDataModel.VTK_XZ_PLANE vtkmodules.vtkCommonDataModel.VTK_X_LINE vtkmodules.vtkCommonDataModel.VTK_YZ_PLANE vtkmodules.vtkCommonDataModel.VTK_Y_LINE vtkmodules.vtkCommonDataModel.VTK_Z_LINE vtkmodules.vtkCommonDataModel.vtkAMRBox vtkmodules.vtkCommonDataModel.vtkAMRDataInternals vtkmodules.vtkCommonDataModel.vtkAMRInformation vtkmodules.vtkCommonDataModel.vtkAMRUtilities vtkmodules.vtkCommonDataModel.vtkAbstractCellLinks vtkmodules.vtkCommonDataModel.vtkAbstractCellLocator vtkmodules.vtkCommonDataModel.vtkAbstractElectronicData vtkmodules.vtkCommonDataModel.vtkAbstractPointLocator vtkmodules.vtkCommonDataModel.vtkAdjacentVertexIterator vtkmodules.vtkCommonDataModel.vtkAnimationScene vtkmodules.vtkCommonDataModel.vtkAnnotation vtkmodules.vtkCommonDataModel.vtkAnnotationLayers vtkmodules.vtkCommonDataModel.vtkArrayData vtkmodules.vtkCommonDataModel.vtkAtom vtkmodules.vtkCommonDataModel.vtkAttributesErrorMetric vtkmodules.vtkCommonDataModel.vtkBSPCuts vtkmodules.vtkCommonDataModel.vtkBSPIntersections vtkmodules.vtkCommonDataModel.vtkBezierCurve vtkmodules.vtkCommonDataModel.vtkBezierHexahedron vtkmodules.vtkCommonDataModel.vtkBezierInterpolation vtkmodules.vtkCommonDataModel.vtkBezierQuadrilateral vtkmodules.vtkCommonDataModel.vtkBezierTetra vtkmodules.vtkCommonDataModel.vtkBezierTriangle vtkmodules.vtkCommonDataModel.vtkBezierWedge vtkmodules.vtkCommonDataModel.vtkBiQuadraticQuad vtkmodules.vtkCommonDataModel.vtkBiQuadraticQuadraticHexahedron vtkmodules.vtkCommonDataModel.vtkBiQuadraticQuadraticWedge vtkmodules.vtkCommonDataModel.vtkBiQuadraticTriangle vtkmodules.vtkCommonDataModel.vtkBond vtkmodules.vtkCommonDataModel.vtkBoundaryCentered vtkmodules.vtkCommonDataModel.vtkBoundingBox vtkmodules.vtkCommonDataModel.vtkBox vtkmodules.vtkCommonDataModel.vtkCell vtkmodules.vtkCommonDataModel.vtkCell3D vtkmodules.vtkCommonDataModel.vtkCellArray vtkmodules.vtkCommonDataModel.vtkCellArrayIterator vtkmodules.vtkCommonDataModel.vtkCellAttribute vtkmodules.vtkCommonDataModel.vtkCellCentered vtkmodules.vtkCommonDataModel.vtkCellData vtkmodules.vtkCommonDataModel.vtkCellGrid vtkmodules.vtkCommonDataModel.vtkCellGridBoundsQuery vtkmodules.vtkCommonDataModel.vtkCellGridQuery vtkmodules.vtkCommonDataModel.vtkCellGridResponderBase vtkmodules.vtkCommonDataModel.vtkCellGridResponders vtkmodules.vtkCommonDataModel.vtkCellGridSidesQuery vtkmodules.vtkCommonDataModel.vtkCellIterator vtkmodules.vtkCommonDataModel.vtkCellLinks vtkmodules.vtkCommonDataModel.vtkCellLocator vtkmodules.vtkCommonDataModel.vtkCellLocatorStrategy vtkmodules.vtkCommonDataModel.vtkCellMetadata vtkmodules.vtkCommonDataModel.vtkCellTreeLocator vtkmodules.vtkCommonDataModel.vtkCellTypes vtkmodules.vtkCommonDataModel.vtkClosestNPointsStrategy vtkmodules.vtkCommonDataModel.vtkClosestPointStrategy vtkmodules.vtkCommonDataModel.vtkColor3 vtkmodules.vtkCommonDataModel.vtkColor3_IdE vtkmodules.vtkCommonDataModel.vtkColor3_IfE vtkmodules.vtkCommonDataModel.vtkColor3_IhE vtkmodules.vtkCommonDataModel.vtkColor3d vtkmodules.vtkCommonDataModel.vtkColor3f vtkmodules.vtkCommonDataModel.vtkColor3ub vtkmodules.vtkCommonDataModel.vtkColor4 vtkmodules.vtkCommonDataModel.vtkColor4_IdE vtkmodules.vtkCommonDataModel.vtkColor4_IfE vtkmodules.vtkCommonDataModel.vtkColor4_IhE vtkmodules.vtkCommonDataModel.vtkColor4d vtkmodules.vtkCommonDataModel.vtkColor4f vtkmodules.vtkCommonDataModel.vtkColor4ub vtkmodules.vtkCommonDataModel.vtkCompositeDataIterator vtkmodules.vtkCommonDataModel.vtkCompositeDataSet vtkmodules.vtkCommonDataModel.vtkCone vtkmodules.vtkCommonDataModel.vtkConvexPointSet vtkmodules.vtkCommonDataModel.vtkCoordinateFrame vtkmodules.vtkCommonDataModel.vtkCubicLine vtkmodules.vtkCommonDataModel.vtkCylinder vtkmodules.vtkCommonDataModel.vtkDataAssembly vtkmodules.vtkCommonDataModel.vtkDataAssemblyUtilities vtkmodules.vtkCommonDataModel.vtkDataAssemblyVisitor vtkmodules.vtkCommonDataModel.vtkDataObject vtkmodules.vtkCommonDataModel.vtkDataObjectCollection vtkmodules.vtkCommonDataModel.vtkDataObjectTree vtkmodules.vtkCommonDataModel.vtkDataObjectTreeIndex vtkmodules.vtkCommonDataModel.vtkDataObjectTreeInternals vtkmodules.vtkCommonDataModel.vtkDataObjectTreeItem vtkmodules.vtkCommonDataModel.vtkDataObjectTreeIterator vtkmodules.vtkCommonDataModel.vtkDataObjectTypes vtkmodules.vtkCommonDataModel.vtkDataSet vtkmodules.vtkCommonDataModel.vtkDataSetAttributes vtkmodules.vtkCommonDataModel.vtkDataSetAttributesFieldList vtkmodules.vtkCommonDataModel.vtkDataSetCellIterator vtkmodules.vtkCommonDataModel.vtkDataSetCollection vtkmodules.vtkCommonDataModel.vtkDirectedAcyclicGraph vtkmodules.vtkCommonDataModel.vtkDirectedGraph vtkmodules.vtkCommonDataModel.vtkDistributedGraphHelper vtkmodules.vtkCommonDataModel.vtkEdgeBase vtkmodules.vtkCommonDataModel.vtkEdgeListIterator vtkmodules.vtkCommonDataModel.vtkEdgeTable vtkmodules.vtkCommonDataModel.vtkEdgeType vtkmodules.vtkCommonDataModel.vtkEmptyCell vtkmodules.vtkCommonDataModel.vtkExplicitStructuredGrid vtkmodules.vtkCommonDataModel.vtkExtractStructuredGridHelper vtkmodules.vtkCommonDataModel.vtkFieldData vtkmodules.vtkCommonDataModel.vtkFindCellStrategy vtkmodules.vtkCommonDataModel.vtkGenericAdaptorCell vtkmodules.vtkCommonDataModel.vtkGenericAttribute vtkmodules.vtkCommonDataModel.vtkGenericAttributeCollection vtkmodules.vtkCommonDataModel.vtkGenericCell vtkmodules.vtkCommonDataModel.vtkGenericCellIterator vtkmodules.vtkCommonDataModel.vtkGenericCellTessellator vtkmodules.vtkCommonDataModel.vtkGenericDataSet vtkmodules.vtkCommonDataModel.vtkGenericEdgeTable vtkmodules.vtkCommonDataModel.vtkGenericInterpolatedVelocityField vtkmodules.vtkCommonDataModel.vtkGenericPointIterator vtkmodules.vtkCommonDataModel.vtkGenericSubdivisionErrorMetric vtkmodules.vtkCommonDataModel.vtkGeometricErrorMetric vtkmodules.vtkCommonDataModel.vtkGraph vtkmodules.vtkCommonDataModel.vtkGraphEdge vtkmodules.vtkCommonDataModel.vtkGraphInternals vtkmodules.vtkCommonDataModel.vtkHexagonalPrism vtkmodules.vtkCommonDataModel.vtkHexahedron vtkmodules.vtkCommonDataModel.vtkHierarchicalBoxDataIterator vtkmodules.vtkCommonDataModel.vtkHierarchicalBoxDataSet vtkmodules.vtkCommonDataModel.vtkHigherOrderCurve vtkmodules.vtkCommonDataModel.vtkHigherOrderHexahedron vtkmodules.vtkCommonDataModel.vtkHigherOrderInterpolation vtkmodules.vtkCommonDataModel.vtkHigherOrderQuadrilateral vtkmodules.vtkCommonDataModel.vtkHigherOrderTetra vtkmodules.vtkCommonDataModel.vtkHigherOrderTriangle vtkmodules.vtkCommonDataModel.vtkHigherOrderWedge vtkmodules.vtkCommonDataModel.vtkHyperTree vtkmodules.vtkCommonDataModel.vtkHyperTreeCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeData vtkmodules.vtkCommonDataModel.vtkHyperTreeGrid vtkmodules.vtkCommonDataModel.vtkHyperTreeGridGeometricLocator vtkmodules.vtkCommonDataModel.vtkHyperTreeGridLocator vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedGeometryCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedMooreSuperCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedMooreSuperCursorLight vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedSuperCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedSuperCursorLight vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedUnlimitedGeometryCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedUnlimitedMooreSuperCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedUnlimitedSuperCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedVonNeumannSuperCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedVonNeumannSuperCursorLight vtkmodules.vtkCommonDataModel.vtkHyperTreeGridOrientedCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridOrientedGeometryCursor vtkmodules.vtkCommonDataModel.vtkHyperTreeGridScales vtkmodules.vtkCommonDataModel.vtkImageData vtkmodules.vtkCommonDataModel.vtkImageTransform vtkmodules.vtkCommonDataModel.vtkImplicitBoolean vtkmodules.vtkCommonDataModel.vtkImplicitDataSet vtkmodules.vtkCommonDataModel.vtkImplicitFunction vtkmodules.vtkCommonDataModel.vtkImplicitFunctionCollection vtkmodules.vtkCommonDataModel.vtkImplicitHalo vtkmodules.vtkCommonDataModel.vtkImplicitSelectionLoop vtkmodules.vtkCommonDataModel.vtkImplicitSum vtkmodules.vtkCommonDataModel.vtkImplicitVolume vtkmodules.vtkCommonDataModel.vtkImplicitWindowFunction vtkmodules.vtkCommonDataModel.vtkInEdgeIterator vtkmodules.vtkCommonDataModel.vtkInEdgeType vtkmodules.vtkCommonDataModel.vtkIncrementalOctreeNode vtkmodules.vtkCommonDataModel.vtkIncrementalOctreePointLocator vtkmodules.vtkCommonDataModel.vtkIncrementalPointLocator vtkmodules.vtkCommonDataModel.vtkInformationQuadratureSchemeDefinitionVectorKey vtkmodules.vtkCommonDataModel.vtkIntersectionCounter vtkmodules.vtkCommonDataModel.vtkIterativeClosestPointTransform vtkmodules.vtkCommonDataModel.vtkKdNode vtkmodules.vtkCommonDataModel.vtkKdTree vtkmodules.vtkCommonDataModel.vtkKdTreePointLocator vtkmodules.vtkCommonDataModel.vtkLagrangeCurve vtkmodules.vtkCommonDataModel.vtkLagrangeHexahedron vtkmodules.vtkCommonDataModel.vtkLagrangeInterpolation vtkmodules.vtkCommonDataModel.vtkLagrangeQuadrilateral vtkmodules.vtkCommonDataModel.vtkLagrangeTetra vtkmodules.vtkCommonDataModel.vtkLagrangeTriangle vtkmodules.vtkCommonDataModel.vtkLagrangeWedge vtkmodules.vtkCommonDataModel.vtkLine vtkmodules.vtkCommonDataModel.vtkLocator vtkmodules.vtkCommonDataModel.vtkMarchingCubesPolygonCases vtkmodules.vtkCommonDataModel.vtkMarchingCubesTriangleCases vtkmodules.vtkCommonDataModel.vtkMarchingSquaresLineCases vtkmodules.vtkCommonDataModel.vtkMeanValueCoordinatesInterpolator vtkmodules.vtkCommonDataModel.vtkMergePoints vtkmodules.vtkCommonDataModel.vtkMolecule vtkmodules.vtkCommonDataModel.vtkMultiBlockDataSet vtkmodules.vtkCommonDataModel.vtkMultiPieceDataSet vtkmodules.vtkCommonDataModel.vtkMutableDirectedGraph vtkmodules.vtkCommonDataModel.vtkMutableUndirectedGraph vtkmodules.vtkCommonDataModel.vtkNonLinearCell vtkmodules.vtkCommonDataModel.vtkNonMergingPointLocator vtkmodules.vtkCommonDataModel.vtkNonOverlappingAMR vtkmodules.vtkCommonDataModel.vtkOctreePointLocator vtkmodules.vtkCommonDataModel.vtkOctreePointLocatorNode vtkmodules.vtkCommonDataModel.vtkOrderedTriangulator vtkmodules.vtkCommonDataModel.vtkOutEdgeIterator vtkmodules.vtkCommonDataModel.vtkOutEdgeType vtkmodules.vtkCommonDataModel.vtkOverlappingAMR vtkmodules.vtkCommonDataModel.vtkPartitionedDataSet vtkmodules.vtkCommonDataModel.vtkPartitionedDataSetCollection vtkmodules.vtkCommonDataModel.vtkPath vtkmodules.vtkCommonDataModel.vtkPentagonalPrism vtkmodules.vtkCommonDataModel.vtkPerlinNoise vtkmodules.vtkCommonDataModel.vtkPiecewiseFunction vtkmodules.vtkCommonDataModel.vtkPixel vtkmodules.vtkCommonDataModel.vtkPixelExtent vtkmodules.vtkCommonDataModel.vtkPixelTransfer vtkmodules.vtkCommonDataModel.vtkPlane vtkmodules.vtkCommonDataModel.vtkPlaneCollection vtkmodules.vtkCommonDataModel.vtkPlanes vtkmodules.vtkCommonDataModel.vtkPlanesIntersection vtkmodules.vtkCommonDataModel.vtkPointCentered vtkmodules.vtkCommonDataModel.vtkPointData vtkmodules.vtkCommonDataModel.vtkPointLocator vtkmodules.vtkCommonDataModel.vtkPointSet vtkmodules.vtkCommonDataModel.vtkPointSetCellIterator vtkmodules.vtkCommonDataModel.vtkPointsProjectedHull vtkmodules.vtkCommonDataModel.vtkPolyData vtkmodules.vtkCommonDataModel.vtkPolyDataCollection vtkmodules.vtkCommonDataModel.vtkPolyLine vtkmodules.vtkCommonDataModel.vtkPolyPlane vtkmodules.vtkCommonDataModel.vtkPolyVertex vtkmodules.vtkCommonDataModel.vtkPolygon vtkmodules.vtkCommonDataModel.vtkPolyhedron vtkmodules.vtkCommonDataModel.vtkPolyhedronUtilities vtkmodules.vtkCommonDataModel.vtkPyramid vtkmodules.vtkCommonDataModel.vtkQuad vtkmodules.vtkCommonDataModel.vtkQuadraticEdge vtkmodules.vtkCommonDataModel.vtkQuadraticHexahedron vtkmodules.vtkCommonDataModel.vtkQuadraticLinearQuad vtkmodules.vtkCommonDataModel.vtkQuadraticLinearWedge vtkmodules.vtkCommonDataModel.vtkQuadraticPolygon vtkmodules.vtkCommonDataModel.vtkQuadraticPyramid vtkmodules.vtkCommonDataModel.vtkQuadraticQuad vtkmodules.vtkCommonDataModel.vtkQuadraticTetra vtkmodules.vtkCommonDataModel.vtkQuadraticTriangle vtkmodules.vtkCommonDataModel.vtkQuadraticWedge vtkmodules.vtkCommonDataModel.vtkQuadratureSchemeDefinition vtkmodules.vtkCommonDataModel.vtkQuadric vtkmodules.vtkCommonDataModel.vtkRect vtkmodules.vtkCommonDataModel.vtkRect_IdE vtkmodules.vtkCommonDataModel.vtkRect_IfE vtkmodules.vtkCommonDataModel.vtkRect_IiE vtkmodules.vtkCommonDataModel.vtkRectd vtkmodules.vtkCommonDataModel.vtkRectf vtkmodules.vtkCommonDataModel.vtkRecti vtkmodules.vtkCommonDataModel.vtkRectilinearGrid vtkmodules.vtkCommonDataModel.vtkReebGraph vtkmodules.vtkCommonDataModel.vtkReebGraphSimplificationMetric vtkmodules.vtkCommonDataModel.vtkSelection vtkmodules.vtkCommonDataModel.vtkSelectionNode vtkmodules.vtkCommonDataModel.vtkSimpleCellTessellator vtkmodules.vtkCommonDataModel.vtkSmoothErrorMetric vtkmodules.vtkCommonDataModel.vtkSortFieldData vtkmodules.vtkCommonDataModel.vtkSphere vtkmodules.vtkCommonDataModel.vtkSpheres vtkmodules.vtkCommonDataModel.vtkSphericalPointIterator vtkmodules.vtkCommonDataModel.vtkSpline vtkmodules.vtkCommonDataModel.vtkStaticCellLinks vtkmodules.vtkCommonDataModel.vtkStaticCellLocator vtkmodules.vtkCommonDataModel.vtkStaticPointLocator vtkmodules.vtkCommonDataModel.vtkStaticPointLocator2D vtkmodules.vtkCommonDataModel.vtkStructuredData vtkmodules.vtkCommonDataModel.vtkStructuredExtent vtkmodules.vtkCommonDataModel.vtkStructuredGrid vtkmodules.vtkCommonDataModel.vtkStructuredPoints vtkmodules.vtkCommonDataModel.vtkStructuredPointsCollection vtkmodules.vtkCommonDataModel.vtkSuperquadric vtkmodules.vtkCommonDataModel.vtkTable vtkmodules.vtkCommonDataModel.vtkTetra vtkmodules.vtkCommonDataModel.vtkTree vtkmodules.vtkCommonDataModel.vtkTreeBFSIterator vtkmodules.vtkCommonDataModel.vtkTreeDFSIterator vtkmodules.vtkCommonDataModel.vtkTreeIterator vtkmodules.vtkCommonDataModel.vtkTriQuadraticHexahedron vtkmodules.vtkCommonDataModel.vtkTriQuadraticPyramid vtkmodules.vtkCommonDataModel.vtkTriangle vtkmodules.vtkCommonDataModel.vtkTriangleStrip vtkmodules.vtkCommonDataModel.vtkUndirectedGraph vtkmodules.vtkCommonDataModel.vtkUniformGrid vtkmodules.vtkCommonDataModel.vtkUniformGridAMR vtkmodules.vtkCommonDataModel.vtkUniformGridAMRDataIterator vtkmodules.vtkCommonDataModel.vtkUniformHyperTreeGrid vtkmodules.vtkCommonDataModel.vtkUnstructuredGrid vtkmodules.vtkCommonDataModel.vtkUnstructuredGridBase vtkmodules.vtkCommonDataModel.vtkUnstructuredGridCellIterator vtkmodules.vtkCommonDataModel.vtkVector vtkmodules.vtkCommonDataModel.vtkVector2 vtkmodules.vtkCommonDataModel.vtkVector2_IdE vtkmodules.vtkCommonDataModel.vtkVector2_IfE vtkmodules.vtkCommonDataModel.vtkVector2_IiE vtkmodules.vtkCommonDataModel.vtkVector2d vtkmodules.vtkCommonDataModel.vtkVector2f vtkmodules.vtkCommonDataModel.vtkVector2i vtkmodules.vtkCommonDataModel.vtkVector3 vtkmodules.vtkCommonDataModel.vtkVector3_IdE vtkmodules.vtkCommonDataModel.vtkVector3_IfE vtkmodules.vtkCommonDataModel.vtkVector3_IiE vtkmodules.vtkCommonDataModel.vtkVector3d vtkmodules.vtkCommonDataModel.vtkVector3f vtkmodules.vtkCommonDataModel.vtkVector3i vtkmodules.vtkCommonDataModel.vtkVector4 vtkmodules.vtkCommonDataModel.vtkVector4_IdE vtkmodules.vtkCommonDataModel.vtkVector4_IiE vtkmodules.vtkCommonDataModel.vtkVector4d vtkmodules.vtkCommonDataModel.vtkVector4i vtkmodules.vtkCommonDataModel.vtkVector_IdLi2EE vtkmodules.vtkCommonDataModel.vtkVector_IdLi3EE vtkmodules.vtkCommonDataModel.vtkVector_IdLi4EE vtkmodules.vtkCommonDataModel.vtkVector_IfLi2EE vtkmodules.vtkCommonDataModel.vtkVector_IfLi3EE vtkmodules.vtkCommonDataModel.vtkVector_IfLi4EE vtkmodules.vtkCommonDataModel.vtkVector_IiLi2EE vtkmodules.vtkCommonDataModel.vtkVector_IiLi3EE vtkmodules.vtkCommonDataModel.vtkVector_IiLi4EE vtkmodules.vtkCommonDataModel.vtkVertex vtkmodules.vtkCommonDataModel.vtkVertexAdjacencyList vtkmodules.vtkCommonDataModel.vtkVertexListIterator vtkmodules.vtkCommonDataModel.vtkVoxel vtkmodules.vtkCommonDataModel.vtkWedge vtkmodules.vtkCommonDataModel.vtkXMLDataElement vtkmodules.vtkCommonExecutionModel.VTK_MAX_SPHERE_TREE_LEVELS vtkmodules.vtkCommonExecutionModel.VTK_MAX_SPHERE_TREE_RESOLUTION vtkmodules.vtkCommonExecutionModel.VTK_UPDATE_EXTENT_COMBINE vtkmodules.vtkCommonExecutionModel.VTK_UPDATE_EXTENT_REPLACE vtkmodules.vtkCommonExecutionModel.vtkAlgorithm vtkmodules.vtkCommonExecutionModel.vtkAlgorithmOutput vtkmodules.vtkCommonExecutionModel.vtkAnnotationLayersAlgorithm vtkmodules.vtkCommonExecutionModel.vtkArrayDataAlgorithm vtkmodules.vtkCommonExecutionModel.vtkCachedStreamingDemandDrivenPipeline vtkmodules.vtkCommonExecutionModel.vtkCastToConcrete vtkmodules.vtkCommonExecutionModel.vtkCellGridAlgorithm vtkmodules.vtkCommonExecutionModel.vtkCompositeDataPipeline vtkmodules.vtkCommonExecutionModel.vtkCompositeDataSetAlgorithm vtkmodules.vtkCommonExecutionModel.vtkDataObjectAlgorithm vtkmodules.vtkCommonExecutionModel.vtkDataSetAlgorithm vtkmodules.vtkCommonExecutionModel.vtkDemandDrivenPipeline vtkmodules.vtkCommonExecutionModel.vtkDirectedGraphAlgorithm vtkmodules.vtkCommonExecutionModel.vtkEnsembleSource vtkmodules.vtkCommonExecutionModel.vtkExecutive vtkmodules.vtkCommonExecutionModel.vtkExplicitStructuredGridAlgorithm vtkmodules.vtkCommonExecutionModel.vtkExtentRCBPartitioner vtkmodules.vtkCommonExecutionModel.vtkExtentSplitter vtkmodules.vtkCommonExecutionModel.vtkExtentTranslator vtkmodules.vtkCommonExecutionModel.vtkFilteringInformationKeyManager vtkmodules.vtkCommonExecutionModel.vtkGraphAlgorithm vtkmodules.vtkCommonExecutionModel.vtkHierarchicalBoxDataSetAlgorithm vtkmodules.vtkCommonExecutionModel.vtkHyperTreeGridAlgorithm vtkmodules.vtkCommonExecutionModel.vtkImageAlgorithm vtkmodules.vtkCommonExecutionModel.vtkImageInPlaceFilter vtkmodules.vtkCommonExecutionModel.vtkImageToStructuredGrid vtkmodules.vtkCommonExecutionModel.vtkImageToStructuredPoints vtkmodules.vtkCommonExecutionModel.vtkInformationDataObjectMetaDataKey vtkmodules.vtkCommonExecutionModel.vtkInformationExecutivePortKey vtkmodules.vtkCommonExecutionModel.vtkInformationExecutivePortVectorKey vtkmodules.vtkCommonExecutionModel.vtkInformationIntegerRequestKey vtkmodules.vtkCommonExecutionModel.vtkMoleculeAlgorithm vtkmodules.vtkCommonExecutionModel.vtkMultiBlockDataSetAlgorithm vtkmodules.vtkCommonExecutionModel.vtkMultiTimeStepAlgorithm vtkmodules.vtkCommonExecutionModel.vtkNonOverlappingAMRAlgorithm vtkmodules.vtkCommonExecutionModel.vtkOverlappingAMRAlgorithm vtkmodules.vtkCommonExecutionModel.vtkParallelReader vtkmodules.vtkCommonExecutionModel.vtkPartitionedDataSetAlgorithm vtkmodules.vtkCommonExecutionModel.vtkPartitionedDataSetCollectionAlgorithm vtkmodules.vtkCommonExecutionModel.vtkPassInputTypeAlgorithm vtkmodules.vtkCommonExecutionModel.vtkPiecewiseFunctionAlgorithm vtkmodules.vtkCommonExecutionModel.vtkPiecewiseFunctionShiftScale vtkmodules.vtkCommonExecutionModel.vtkPointSetAlgorithm vtkmodules.vtkCommonExecutionModel.vtkPolyDataAlgorithm vtkmodules.vtkCommonExecutionModel.vtkProgressObserver vtkmodules.vtkCommonExecutionModel.vtkReaderAlgorithm vtkmodules.vtkCommonExecutionModel.vtkRectilinearGridAlgorithm vtkmodules.vtkCommonExecutionModel.vtkSMPProgressObserver vtkmodules.vtkCommonExecutionModel.vtkScalarTree vtkmodules.vtkCommonExecutionModel.vtkSelectionAlgorithm vtkmodules.vtkCommonExecutionModel.vtkSimpleImageToImageFilter vtkmodules.vtkCommonExecutionModel.vtkSimpleReader vtkmodules.vtkCommonExecutionModel.vtkSimpleScalarTree vtkmodules.vtkCommonExecutionModel.vtkSpanSpace vtkmodules.vtkCommonExecutionModel.vtkSphereTree vtkmodules.vtkCommonExecutionModel.vtkStreamingDemandDrivenPipeline vtkmodules.vtkCommonExecutionModel.vtkStructuredGridAlgorithm vtkmodules.vtkCommonExecutionModel.vtkTableAlgorithm vtkmodules.vtkCommonExecutionModel.vtkThreadedCompositeDataPipeline vtkmodules.vtkCommonExecutionModel.vtkThreadedImageAlgorithm vtkmodules.vtkCommonExecutionModel.vtkTreeAlgorithm vtkmodules.vtkCommonExecutionModel.vtkTrivialConsumer vtkmodules.vtkCommonExecutionModel.vtkTrivialProducer vtkmodules.vtkCommonExecutionModel.vtkUndirectedGraphAlgorithm vtkmodules.vtkCommonExecutionModel.vtkUniformGridAMRAlgorithm vtkmodules.vtkCommonExecutionModel.vtkUniformGridPartitioner vtkmodules.vtkCommonExecutionModel.vtkUnstructuredGridAlgorithm vtkmodules.vtkCommonExecutionModel.vtkUnstructuredGridBaseAlgorithm vtkmodules.vtkCommonMath.vtkAmoebaMinimizer vtkmodules.vtkCommonMath.vtkFFT vtkmodules.vtkCommonMath.vtkFunctionSet vtkmodules.vtkCommonMath.vtkInitialValueProblemSolver vtkmodules.vtkCommonMath.vtkMatrix3x3 vtkmodules.vtkCommonMath.vtkMatrix4x4 vtkmodules.vtkCommonMath.vtkPolynomialSolversUnivariate vtkmodules.vtkCommonMath.vtkQuaternion vtkmodules.vtkCommonMath.vtkQuaternionInterpolator vtkmodules.vtkCommonMath.vtkQuaternion_IdE vtkmodules.vtkCommonMath.vtkQuaternion_IfE vtkmodules.vtkCommonMath.vtkQuaterniond vtkmodules.vtkCommonMath.vtkQuaternionf vtkmodules.vtkCommonMath.vtkRungeKutta2 vtkmodules.vtkCommonMath.vtkRungeKutta4 vtkmodules.vtkCommonMath.vtkRungeKutta45 vtkmodules.vtkCommonMath.vtkTuple vtkmodules.vtkCommonMath.vtkTuple_IdLi2EE vtkmodules.vtkCommonMath.vtkTuple_IdLi3EE vtkmodules.vtkCommonMath.vtkTuple_IdLi4EE vtkmodules.vtkCommonMath.vtkTuple_IfLi2EE vtkmodules.vtkCommonMath.vtkTuple_IfLi3EE vtkmodules.vtkCommonMath.vtkTuple_IfLi4EE vtkmodules.vtkCommonMath.vtkTuple_IhLi2EE vtkmodules.vtkCommonMath.vtkTuple_IhLi3EE vtkmodules.vtkCommonMath.vtkTuple_IhLi4EE vtkmodules.vtkCommonMath.vtkTuple_IiLi2EE vtkmodules.vtkCommonMath.vtkTuple_IiLi3EE vtkmodules.vtkCommonMath.vtkTuple_IiLi4EE vtkmodules.vtkCommonMisc.VTK_PARSER_ABSOLUTE_VALUE vtkmodules.vtkCommonMisc.VTK_PARSER_ADD vtkmodules.vtkCommonMisc.VTK_PARSER_AND vtkmodules.vtkCommonMisc.VTK_PARSER_ARCCOSINE vtkmodules.vtkCommonMisc.VTK_PARSER_ARCSINE vtkmodules.vtkCommonMisc.VTK_PARSER_ARCTANGENT vtkmodules.vtkCommonMisc.VTK_PARSER_BEGIN_VARIABLES vtkmodules.vtkCommonMisc.VTK_PARSER_CEILING vtkmodules.vtkCommonMisc.VTK_PARSER_COSINE vtkmodules.vtkCommonMisc.VTK_PARSER_CROSS vtkmodules.vtkCommonMisc.VTK_PARSER_DIVIDE vtkmodules.vtkCommonMisc.VTK_PARSER_DOT_PRODUCT vtkmodules.vtkCommonMisc.VTK_PARSER_EQUAL_TO vtkmodules.vtkCommonMisc.VTK_PARSER_ERROR_RESULT vtkmodules.vtkCommonMisc.VTK_PARSER_EXPONENT vtkmodules.vtkCommonMisc.VTK_PARSER_FLOOR vtkmodules.vtkCommonMisc.VTK_PARSER_GREATER_THAN vtkmodules.vtkCommonMisc.VTK_PARSER_HYPERBOLIC_COSINE vtkmodules.vtkCommonMisc.VTK_PARSER_HYPERBOLIC_SINE vtkmodules.vtkCommonMisc.VTK_PARSER_HYPERBOLIC_TANGENT vtkmodules.vtkCommonMisc.VTK_PARSER_IF vtkmodules.vtkCommonMisc.VTK_PARSER_IHAT vtkmodules.vtkCommonMisc.VTK_PARSER_IMMEDIATE vtkmodules.vtkCommonMisc.VTK_PARSER_JHAT vtkmodules.vtkCommonMisc.VTK_PARSER_KHAT vtkmodules.vtkCommonMisc.VTK_PARSER_LESS_THAN vtkmodules.vtkCommonMisc.VTK_PARSER_LOGARITHM vtkmodules.vtkCommonMisc.VTK_PARSER_LOGARITHM10 vtkmodules.vtkCommonMisc.VTK_PARSER_LOGARITHME vtkmodules.vtkCommonMisc.VTK_PARSER_MAGNITUDE vtkmodules.vtkCommonMisc.VTK_PARSER_MAX vtkmodules.vtkCommonMisc.VTK_PARSER_MIN vtkmodules.vtkCommonMisc.VTK_PARSER_MULTIPLY vtkmodules.vtkCommonMisc.VTK_PARSER_NORMALIZE vtkmodules.vtkCommonMisc.VTK_PARSER_OR vtkmodules.vtkCommonMisc.VTK_PARSER_POWER vtkmodules.vtkCommonMisc.VTK_PARSER_SCALAR_TIMES_VECTOR vtkmodules.vtkCommonMisc.VTK_PARSER_SIGN vtkmodules.vtkCommonMisc.VTK_PARSER_SINE vtkmodules.vtkCommonMisc.VTK_PARSER_SQUARE_ROOT vtkmodules.vtkCommonMisc.VTK_PARSER_SUBTRACT vtkmodules.vtkCommonMisc.VTK_PARSER_TANGENT vtkmodules.vtkCommonMisc.VTK_PARSER_UNARY_MINUS vtkmodules.vtkCommonMisc.VTK_PARSER_UNARY_PLUS vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_ADD vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_IF vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_OVER_SCALAR vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_SUBTRACT vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_TIMES_SCALAR vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_UNARY_MINUS vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_UNARY_PLUS vtkmodules.vtkCommonMisc.vtkContourValues vtkmodules.vtkCommonMisc.vtkErrorCode vtkmodules.vtkCommonMisc.vtkExprTkFunctionParser vtkmodules.vtkCommonMisc.vtkFunctionParser vtkmodules.vtkCommonMisc.vtkHeap vtkmodules.vtkCommonMisc.vtkPolygonBuilder vtkmodules.vtkCommonMisc.vtkResourceFileLocator vtkmodules.vtkCommonPython.vtkPythonArchiver vtkmodules.vtkCommonSystem.vtkClientSocket vtkmodules.vtkCommonSystem.vtkDirectory vtkmodules.vtkCommonSystem.vtkExecutableRunner vtkmodules.vtkCommonSystem.vtkServerSocket vtkmodules.vtkCommonSystem.vtkSocket vtkmodules.vtkCommonSystem.vtkSocketCollection vtkmodules.vtkCommonSystem.vtkTimerLog vtkmodules.vtkCommonSystem.vtkTimerLogCleanup vtkmodules.vtkCommonSystem.vtkTimerLogEntry vtkmodules.vtkCommonSystem.vtkTimerLogScope vtkmodules.vtkCommonTransforms.VTK_LANDMARK_AFFINE vtkmodules.vtkCommonTransforms.VTK_LANDMARK_RIGIDBODY vtkmodules.vtkCommonTransforms.VTK_LANDMARK_SIMILARITY vtkmodules.vtkCommonTransforms.VTK_RBF_CUSTOM vtkmodules.vtkCommonTransforms.VTK_RBF_R vtkmodules.vtkCommonTransforms.VTK_RBF_R2LOGR vtkmodules.vtkCommonTransforms.vtkAbstractTransform vtkmodules.vtkCommonTransforms.vtkCylindricalTransform vtkmodules.vtkCommonTransforms.vtkGeneralTransform vtkmodules.vtkCommonTransforms.vtkHomogeneousTransform vtkmodules.vtkCommonTransforms.vtkIdentityTransform vtkmodules.vtkCommonTransforms.vtkLandmarkTransform vtkmodules.vtkCommonTransforms.vtkLinearTransform vtkmodules.vtkCommonTransforms.vtkMatrixToHomogeneousTransform vtkmodules.vtkCommonTransforms.vtkMatrixToLinearTransform vtkmodules.vtkCommonTransforms.vtkPerspectiveTransform vtkmodules.vtkCommonTransforms.vtkSphericalTransform vtkmodules.vtkCommonTransforms.vtkThinPlateSplineTransform vtkmodules.vtkCommonTransforms.vtkTransform vtkmodules.vtkCommonTransforms.vtkTransform2D vtkmodules.vtkCommonTransforms.vtkTransformCollection vtkmodules.vtkCommonTransforms.vtkTransformConcatenation vtkmodules.vtkCommonTransforms.vtkTransformConcatenationStack vtkmodules.vtkCommonTransforms.vtkTransformPair vtkmodules.vtkCommonTransforms.vtkWarpTransform vtkmodules.vtkDomainsChemistry.vtkBlueObeliskData vtkmodules.vtkDomainsChemistry.vtkBlueObeliskDataParser vtkmodules.vtkDomainsChemistry.vtkMoleculeMapper vtkmodules.vtkDomainsChemistry.vtkMoleculeToAtomBallFilter vtkmodules.vtkDomainsChemistry.vtkMoleculeToBondStickFilter vtkmodules.vtkDomainsChemistry.vtkMoleculeToLinesFilter vtkmodules.vtkDomainsChemistry.vtkMoleculeToPolyDataFilter vtkmodules.vtkDomainsChemistry.vtkPeriodicTable vtkmodules.vtkDomainsChemistry.vtkPointSetToMoleculeFilter vtkmodules.vtkDomainsChemistry.vtkProgrammableElectronicData vtkmodules.vtkDomainsChemistry.vtkProteinRibbonFilter vtkmodules.vtkDomainsChemistry.vtkSimpleBondPerceiver vtkmodules.vtkDomainsChemistryOpenGL2.vtkOpenGLMoleculeMapper vtkmodules.vtkFiltersAMR.vtkAMRCutPlane vtkmodules.vtkFiltersAMR.vtkAMRGaussianPulseSource vtkmodules.vtkFiltersAMR.vtkAMRResampleFilter vtkmodules.vtkFiltersAMR.vtkAMRSliceFilter vtkmodules.vtkFiltersAMR.vtkAMRToMultiBlockFilter vtkmodules.vtkFiltersAMR.vtkImageToAMR vtkmodules.vtkFiltersAMR.vtkParallelAMRUtilities vtkmodules.vtkFiltersCellGrid.vtkCellGridComputeSurface vtkmodules.vtkFiltersCellGrid.vtkDGBoundsResponder vtkmodules.vtkFiltersCellGrid.vtkDGCell vtkmodules.vtkFiltersCellGrid.vtkDGHex vtkmodules.vtkFiltersCellGrid.vtkDGSidesResponder vtkmodules.vtkFiltersCellGrid.vtkDGTet vtkmodules.vtkFiltersCore.VTK_ATTRIBUTE_MODE_DEFAULT vtkmodules.vtkFiltersCore.VTK_ATTRIBUTE_MODE_USE_CELL_DATA vtkmodules.vtkFiltersCore.VTK_ATTRIBUTE_MODE_USE_POINT_DATA vtkmodules.vtkFiltersCore.VTK_BEST_FITTING_PLANE vtkmodules.vtkFiltersCore.VTK_CELL_DATA vtkmodules.vtkFiltersCore.VTK_CELL_DATA_FIELD vtkmodules.vtkFiltersCore.VTK_COLOR_BY_SCALAR vtkmodules.vtkFiltersCore.VTK_COLOR_BY_SCALE vtkmodules.vtkFiltersCore.VTK_COLOR_BY_VECTOR vtkmodules.vtkFiltersCore.VTK_COMPONENT_MODE_USE_ALL vtkmodules.vtkFiltersCore.VTK_COMPONENT_MODE_USE_ANY vtkmodules.vtkFiltersCore.VTK_COMPONENT_MODE_USE_SELECTED vtkmodules.vtkFiltersCore.VTK_DATA_OBJECT_FIELD vtkmodules.vtkFiltersCore.VTK_DATA_SCALING_OFF vtkmodules.vtkFiltersCore.VTK_DELAUNAY_XY_PLANE vtkmodules.vtkFiltersCore.VTK_EXTRACT_ALL_REGIONS vtkmodules.vtkFiltersCore.VTK_EXTRACT_CELL_SEEDED_REGIONS vtkmodules.vtkFiltersCore.VTK_EXTRACT_CLOSEST_POINT_REGION vtkmodules.vtkFiltersCore.VTK_EXTRACT_LARGEST_REGION vtkmodules.vtkFiltersCore.VTK_EXTRACT_LARGE_REGIONS vtkmodules.vtkFiltersCore.VTK_EXTRACT_POINT_SEEDED_REGIONS vtkmodules.vtkFiltersCore.VTK_EXTRACT_SPECIFIED_REGIONS vtkmodules.vtkFiltersCore.VTK_FOLLOW_CAMERA_DIRECTION vtkmodules.vtkFiltersCore.VTK_INDEXING_BY_SCALAR vtkmodules.vtkFiltersCore.VTK_INDEXING_BY_VECTOR vtkmodules.vtkFiltersCore.VTK_INDEXING_OFF vtkmodules.vtkFiltersCore.VTK_POINT_DATA vtkmodules.vtkFiltersCore.VTK_POINT_DATA_FIELD vtkmodules.vtkFiltersCore.VTK_SCALE_BY_SCALAR vtkmodules.vtkFiltersCore.VTK_SCALE_BY_VECTOR vtkmodules.vtkFiltersCore.VTK_SCALE_BY_VECTORCOMPONENTS vtkmodules.vtkFiltersCore.VTK_SET_TRANSFORM_PLANE vtkmodules.vtkFiltersCore.VTK_SORT_BY_CELL vtkmodules.vtkFiltersCore.VTK_SORT_BY_VALUE vtkmodules.vtkFiltersCore.VTK_SPHERE_TREE_LEVELS vtkmodules.vtkFiltersCore.VTK_SPHERE_TREE_LINE vtkmodules.vtkFiltersCore.VTK_SPHERE_TREE_PLANE vtkmodules.vtkFiltersCore.VTK_SPHERE_TREE_POINT vtkmodules.vtkFiltersCore.VTK_TCOORDS_FROM_LENGTH vtkmodules.vtkFiltersCore.VTK_TCOORDS_FROM_NORMALIZED_LENGTH vtkmodules.vtkFiltersCore.VTK_TCOORDS_FROM_SCALARS vtkmodules.vtkFiltersCore.VTK_TCOORDS_OFF vtkmodules.vtkFiltersCore.VTK_USE_NORMAL vtkmodules.vtkFiltersCore.VTK_USE_VECTOR vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_BY_ABSOLUTE_SCALAR vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_BY_SCALAR vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_BY_VECTOR vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_BY_VECTOR_NORM vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_OFF vtkmodules.vtkFiltersCore.VTK_VECTOR_ROTATION_OFF vtkmodules.vtkFiltersCore.vtk3DLinearGridCrinkleExtractor vtkmodules.vtkFiltersCore.vtk3DLinearGridPlaneCutter vtkmodules.vtkFiltersCore.vtkAppendArcLength vtkmodules.vtkFiltersCore.vtkAppendCompositeDataLeaves vtkmodules.vtkFiltersCore.vtkAppendDataSets vtkmodules.vtkFiltersCore.vtkAppendFilter vtkmodules.vtkFiltersCore.vtkAppendPolyData vtkmodules.vtkFiltersCore.vtkAppendSelection vtkmodules.vtkFiltersCore.vtkArrayCalculator vtkmodules.vtkFiltersCore.vtkArrayRename vtkmodules.vtkFiltersCore.vtkAssignAttribute vtkmodules.vtkFiltersCore.vtkAttributeDataToFieldDataFilter vtkmodules.vtkFiltersCore.vtkAttributeDataToTableFilter vtkmodules.vtkFiltersCore.vtkBinCellDataFilter vtkmodules.vtkFiltersCore.vtkBinnedDecimation vtkmodules.vtkFiltersCore.vtkCellCenters vtkmodules.vtkFiltersCore.vtkCellDataToPointData vtkmodules.vtkFiltersCore.vtkCenterOfMass vtkmodules.vtkFiltersCore.vtkCleanPolyData vtkmodules.vtkFiltersCore.vtkClipPolyData vtkmodules.vtkFiltersCore.vtkCompositeCutter vtkmodules.vtkFiltersCore.vtkCompositeDataProbeFilter vtkmodules.vtkFiltersCore.vtkConnectivityFilter vtkmodules.vtkFiltersCore.vtkConstrainedSmoothingFilter vtkmodules.vtkFiltersCore.vtkContour3DLinearGrid vtkmodules.vtkFiltersCore.vtkContourFilter vtkmodules.vtkFiltersCore.vtkContourGrid vtkmodules.vtkFiltersCore.vtkContourHelper vtkmodules.vtkFiltersCore.vtkConvertToMultiBlockDataSet vtkmodules.vtkFiltersCore.vtkConvertToPartitionedDataSetCollection vtkmodules.vtkFiltersCore.vtkConvertToPolyhedra vtkmodules.vtkFiltersCore.vtkCutter vtkmodules.vtkFiltersCore.vtkDataObjectGenerator vtkmodules.vtkFiltersCore.vtkDataObjectToDataSetFilter vtkmodules.vtkFiltersCore.vtkDataSetEdgeSubdivisionCriterion vtkmodules.vtkFiltersCore.vtkDataSetToDataObjectFilter vtkmodules.vtkFiltersCore.vtkDecimatePolylineFilter vtkmodules.vtkFiltersCore.vtkDecimatePro vtkmodules.vtkFiltersCore.vtkDelaunay2D vtkmodules.vtkFiltersCore.vtkDelaunay3D vtkmodules.vtkFiltersCore.vtkEdgeSubdivisionCriterion vtkmodules.vtkFiltersCore.vtkElevationFilter vtkmodules.vtkFiltersCore.vtkExecutionTimer vtkmodules.vtkFiltersCore.vtkExplicitStructuredGridCrop vtkmodules.vtkFiltersCore.vtkExplicitStructuredGridToUnstructuredGrid vtkmodules.vtkFiltersCore.vtkExtractCells vtkmodules.vtkFiltersCore.vtkExtractCellsAlongPolyLine vtkmodules.vtkFiltersCore.vtkExtractEdges vtkmodules.vtkFiltersCore.vtkFeatureEdges vtkmodules.vtkFiltersCore.vtkFieldDataToAttributeDataFilter vtkmodules.vtkFiltersCore.vtkFieldDataToDataSetAttribute vtkmodules.vtkFiltersCore.vtkFlyingEdges2D vtkmodules.vtkFiltersCore.vtkFlyingEdges3D vtkmodules.vtkFiltersCore.vtkFlyingEdgesPlaneCutter vtkmodules.vtkFiltersCore.vtkGlyph2D vtkmodules.vtkFiltersCore.vtkGlyph3D vtkmodules.vtkFiltersCore.vtkGridSynchronizedTemplates3D vtkmodules.vtkFiltersCore.vtkHedgeHog vtkmodules.vtkFiltersCore.vtkHull vtkmodules.vtkFiltersCore.vtkHyperTreeGridProbeFilter vtkmodules.vtkFiltersCore.vtkIdFilter vtkmodules.vtkFiltersCore.vtkImageAppend vtkmodules.vtkFiltersCore.vtkImageDataToExplicitStructuredGrid vtkmodules.vtkFiltersCore.vtkImplicitPolyDataDistance vtkmodules.vtkFiltersCore.vtkImplicitProjectOnPlaneDistance vtkmodules.vtkFiltersCore.vtkMarchingCubes vtkmodules.vtkFiltersCore.vtkMarchingSquares vtkmodules.vtkFiltersCore.vtkMaskFields vtkmodules.vtkFiltersCore.vtkMaskPoints vtkmodules.vtkFiltersCore.vtkMaskPolyData vtkmodules.vtkFiltersCore.vtkMassProperties vtkmodules.vtkFiltersCore.vtkMergeDataObjectFilter vtkmodules.vtkFiltersCore.vtkMergeFields vtkmodules.vtkFiltersCore.vtkMergeFilter vtkmodules.vtkFiltersCore.vtkMoleculeAppend vtkmodules.vtkFiltersCore.vtkMultiObjectMassProperties vtkmodules.vtkFiltersCore.vtkPackLabels vtkmodules.vtkFiltersCore.vtkPassThrough vtkmodules.vtkFiltersCore.vtkPlaneCutter vtkmodules.vtkFiltersCore.vtkPointDataToCellData vtkmodules.vtkFiltersCore.vtkPolyDataConnectivityFilter vtkmodules.vtkFiltersCore.vtkPolyDataEdgeConnectivityFilter vtkmodules.vtkFiltersCore.vtkPolyDataNormals vtkmodules.vtkFiltersCore.vtkPolyDataPlaneClipper vtkmodules.vtkFiltersCore.vtkPolyDataPlaneCutter vtkmodules.vtkFiltersCore.vtkPolyDataTangents vtkmodules.vtkFiltersCore.vtkPolyDataToUnstructuredGrid vtkmodules.vtkFiltersCore.vtkProbeFilter vtkmodules.vtkFiltersCore.vtkQuadricClustering vtkmodules.vtkFiltersCore.vtkQuadricDecimation vtkmodules.vtkFiltersCore.vtkRearrangeFields vtkmodules.vtkFiltersCore.vtkRectilinearSynchronizedTemplates vtkmodules.vtkFiltersCore.vtkRemoveDuplicatePolys vtkmodules.vtkFiltersCore.vtkRemoveUnusedPoints vtkmodules.vtkFiltersCore.vtkResampleToImage vtkmodules.vtkFiltersCore.vtkResampleWithDataSet vtkmodules.vtkFiltersCore.vtkReverseSense vtkmodules.vtkFiltersCore.vtkSimpleElevationFilter vtkmodules.vtkFiltersCore.vtkSmoothPolyDataFilter vtkmodules.vtkFiltersCore.vtkSphereTreeFilter vtkmodules.vtkFiltersCore.vtkStaticCleanPolyData vtkmodules.vtkFiltersCore.vtkStaticCleanUnstructuredGrid vtkmodules.vtkFiltersCore.vtkStreamerBase vtkmodules.vtkFiltersCore.vtkStreamingTessellator vtkmodules.vtkFiltersCore.vtkStripper vtkmodules.vtkFiltersCore.vtkStructuredDataPlaneCutter vtkmodules.vtkFiltersCore.vtkStructuredGridAppend vtkmodules.vtkFiltersCore.vtkStructuredGridOutlineFilter vtkmodules.vtkFiltersCore.vtkSurfaceNets2D vtkmodules.vtkFiltersCore.vtkSurfaceNets3D vtkmodules.vtkFiltersCore.vtkSynchronizedTemplates2D vtkmodules.vtkFiltersCore.vtkSynchronizedTemplates3D vtkmodules.vtkFiltersCore.vtkSynchronizedTemplatesCutter3D vtkmodules.vtkFiltersCore.vtkTensorGlyph vtkmodules.vtkFiltersCore.vtkThreshold vtkmodules.vtkFiltersCore.vtkThresholdPoints vtkmodules.vtkFiltersCore.vtkTransposeTable vtkmodules.vtkFiltersCore.vtkTriangleFilter vtkmodules.vtkFiltersCore.vtkTriangleMeshPointNormals vtkmodules.vtkFiltersCore.vtkTubeBender vtkmodules.vtkFiltersCore.vtkTubeFilter vtkmodules.vtkFiltersCore.vtkUnstructuredGridQuadricDecimation vtkmodules.vtkFiltersCore.vtkUnstructuredGridToExplicitStructuredGrid vtkmodules.vtkFiltersCore.vtkVectorDot vtkmodules.vtkFiltersCore.vtkVectorNorm vtkmodules.vtkFiltersCore.vtkVoronoi2D vtkmodules.vtkFiltersCore.vtkWindowedSincPolyDataFilter vtkmodules.vtkFiltersDSP.vtkBandFiltering vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_COMPONENT vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_DETERMINANT vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_EFFECTIVE_STRESS vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_NONNEGATIVE_DETERMINANT vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_TRACE vtkmodules.vtkFiltersExtraction.vtkBlockSelector vtkmodules.vtkFiltersExtraction.vtkConvertSelection vtkmodules.vtkFiltersExtraction.vtkExpandMarkedElements vtkmodules.vtkFiltersExtraction.vtkExtractBlock vtkmodules.vtkFiltersExtraction.vtkExtractBlockUsingDataAssembly vtkmodules.vtkFiltersExtraction.vtkExtractCellsByType vtkmodules.vtkFiltersExtraction.vtkExtractDataArraysOverTime vtkmodules.vtkFiltersExtraction.vtkExtractDataOverTime vtkmodules.vtkFiltersExtraction.vtkExtractDataSets vtkmodules.vtkFiltersExtraction.vtkExtractExodusGlobalTemporalVariables vtkmodules.vtkFiltersExtraction.vtkExtractGeometry vtkmodules.vtkFiltersExtraction.vtkExtractGrid vtkmodules.vtkFiltersExtraction.vtkExtractLevel vtkmodules.vtkFiltersExtraction.vtkExtractParticlesOverTime vtkmodules.vtkFiltersExtraction.vtkExtractPolyDataGeometry vtkmodules.vtkFiltersExtraction.vtkExtractRectilinearGrid vtkmodules.vtkFiltersExtraction.vtkExtractSelectedArraysOverTime vtkmodules.vtkFiltersExtraction.vtkExtractSelectedBlock vtkmodules.vtkFiltersExtraction.vtkExtractSelectedIds vtkmodules.vtkFiltersExtraction.vtkExtractSelectedLocations vtkmodules.vtkFiltersExtraction.vtkExtractSelectedPolyDataIds vtkmodules.vtkFiltersExtraction.vtkExtractSelectedRows vtkmodules.vtkFiltersExtraction.vtkExtractSelectedThresholds vtkmodules.vtkFiltersExtraction.vtkExtractSelection vtkmodules.vtkFiltersExtraction.vtkExtractTensorComponents vtkmodules.vtkFiltersExtraction.vtkExtractTimeSteps vtkmodules.vtkFiltersExtraction.vtkExtractUnstructuredGrid vtkmodules.vtkFiltersExtraction.vtkExtractVectorComponents vtkmodules.vtkFiltersExtraction.vtkFrustumSelector vtkmodules.vtkFiltersExtraction.vtkHierarchicalDataExtractDataSets vtkmodules.vtkFiltersExtraction.vtkHierarchicalDataExtractLevel vtkmodules.vtkFiltersExtraction.vtkLocationSelector vtkmodules.vtkFiltersExtraction.vtkProbeSelectedLocations vtkmodules.vtkFiltersExtraction.vtkSelector vtkmodules.vtkFiltersExtraction.vtkValueSelector vtkmodules.vtkFiltersFlowPaths.vtkAMRInterpolatedVelocityField vtkmodules.vtkFiltersFlowPaths.vtkAbstractInterpolatedVelocityField vtkmodules.vtkFiltersFlowPaths.vtkCachingInterpolatedVelocityField vtkmodules.vtkFiltersFlowPaths.vtkCellLocatorInterpolatedVelocityField vtkmodules.vtkFiltersFlowPaths.vtkCompositeInterpolatedVelocityField vtkmodules.vtkFiltersFlowPaths.vtkEvenlySpacedStreamlines2D vtkmodules.vtkFiltersFlowPaths.vtkInterpolatedVelocityField vtkmodules.vtkFiltersFlowPaths.vtkIntervalInformation vtkmodules.vtkFiltersFlowPaths.vtkLagrangianBasicIntegrationModel vtkmodules.vtkFiltersFlowPaths.vtkLagrangianMatidaIntegrationModel vtkmodules.vtkFiltersFlowPaths.vtkLagrangianParticle vtkmodules.vtkFiltersFlowPaths.vtkLagrangianParticleTracker vtkmodules.vtkFiltersFlowPaths.vtkLinearTransformCellLocator vtkmodules.vtkFiltersFlowPaths.vtkModifiedBSPTree vtkmodules.vtkFiltersFlowPaths.vtkParallelVectors vtkmodules.vtkFiltersFlowPaths.vtkParticlePathFilter vtkmodules.vtkFiltersFlowPaths.vtkParticleTracer vtkmodules.vtkFiltersFlowPaths.vtkParticleTracerBase vtkmodules.vtkFiltersFlowPaths.vtkStreaklineFilter vtkmodules.vtkFiltersFlowPaths.vtkStreamSurface vtkmodules.vtkFiltersFlowPaths.vtkStreamTracer vtkmodules.vtkFiltersFlowPaths.vtkTemporalInterpolatedVelocityField vtkmodules.vtkFiltersFlowPaths.vtkVectorFieldTopology vtkmodules.vtkFiltersFlowPaths.vtkVortexCore vtkmodules.vtkFiltersGeneral.VTK_CCS_SCALAR_MODE_COLORS vtkmodules.vtkFiltersGeneral.VTK_CCS_SCALAR_MODE_LABELS vtkmodules.vtkFiltersGeneral.VTK_CCS_SCALAR_MODE_NONE vtkmodules.vtkFiltersGeneral.VTK_CURVATURE_GAUSS vtkmodules.vtkFiltersGeneral.VTK_CURVATURE_MAXIMUM vtkmodules.vtkFiltersGeneral.VTK_CURVATURE_MEAN vtkmodules.vtkFiltersGeneral.VTK_CURVATURE_MINIMUM vtkmodules.vtkFiltersGeneral.VTK_DICE_MODE_MEMORY_LIMIT vtkmodules.vtkFiltersGeneral.VTK_DICE_MODE_NUMBER_OF_POINTS vtkmodules.vtkFiltersGeneral.VTK_DICE_MODE_SPECIFIED_NUMBER vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_BOTTOM_CENTER vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_BOTTOM_LEFT vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_BOTTOM_RIGHT vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_CENTER_CENTER vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_CENTER_LEFT vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_CENTER_RIGHT vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_TOP_CENTER vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_TOP_LEFT vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_TOP_RIGHT vtkmodules.vtkFiltersGeneral.VTK_ICON_SCALING_OFF vtkmodules.vtkFiltersGeneral.VTK_ICON_SCALING_USE_SCALING_ARRAY vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_BACKWARD vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_BOTH_DIRECTIONS vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_FORWARD vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_MAJOR_EIGENVECTOR vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_MEDIUM_EIGENVECTOR vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_MINOR_EIGENVECTOR vtkmodules.vtkFiltersGeneral.VTK_SUBDIVIDE_LENGTH vtkmodules.vtkFiltersGeneral.VTK_SUBDIVIDE_SPECIFIED vtkmodules.vtkFiltersGeneral.VTK_TCOORDS_FROM_LENGTH vtkmodules.vtkFiltersGeneral.VTK_TCOORDS_FROM_NORMALIZED_LENGTH vtkmodules.vtkFiltersGeneral.VTK_TCOORDS_FROM_SCALARS vtkmodules.vtkFiltersGeneral.VTK_TCOORDS_OFF vtkmodules.vtkFiltersGeneral.VTK_TENSOR_MODE_COMPUTE_GRADIENT vtkmodules.vtkFiltersGeneral.VTK_TENSOR_MODE_COMPUTE_GREEN_LAGRANGE_STRAIN vtkmodules.vtkFiltersGeneral.VTK_TENSOR_MODE_COMPUTE_STRAIN vtkmodules.vtkFiltersGeneral.VTK_TENSOR_MODE_PASS_TENSORS vtkmodules.vtkFiltersGeneral.VTK_VECTOR_MODE_COMPUTE_GRADIENT vtkmodules.vtkFiltersGeneral.VTK_VECTOR_MODE_COMPUTE_VORTICITY vtkmodules.vtkFiltersGeneral.VTK_VECTOR_MODE_PASS_VECTORS vtkmodules.vtkFiltersGeneral.VTK_VOXEL_TO_12_TET vtkmodules.vtkFiltersGeneral.VTK_VOXEL_TO_5_AND_12_TET vtkmodules.vtkFiltersGeneral.VTK_VOXEL_TO_5_TET vtkmodules.vtkFiltersGeneral.VTK_VOXEL_TO_6_TET vtkmodules.vtkFiltersGeneral.vtkAnimateModes vtkmodules.vtkFiltersGeneral.vtkAnnotationLink vtkmodules.vtkFiltersGeneral.vtkAppendLocationAttributes vtkmodules.vtkFiltersGeneral.vtkAppendPoints vtkmodules.vtkFiltersGeneral.vtkApproximatingSubdivisionFilter vtkmodules.vtkFiltersGeneral.vtkAreaContourSpectrumFilter vtkmodules.vtkFiltersGeneral.vtkAxes vtkmodules.vtkFiltersGeneral.vtkBlankStructuredGrid vtkmodules.vtkFiltersGeneral.vtkBlankStructuredGridWithImage vtkmodules.vtkFiltersGeneral.vtkBlockIdScalars vtkmodules.vtkFiltersGeneral.vtkBooleanOperationPolyDataFilter vtkmodules.vtkFiltersGeneral.vtkBoxClipDataSet vtkmodules.vtkFiltersGeneral.vtkBrownianPoints vtkmodules.vtkFiltersGeneral.vtkCellDerivatives vtkmodules.vtkFiltersGeneral.vtkCellValidator vtkmodules.vtkFiltersGeneral.vtkCleanUnstructuredGrid vtkmodules.vtkFiltersGeneral.vtkCleanUnstructuredGridCells vtkmodules.vtkFiltersGeneral.vtkClipClosedSurface vtkmodules.vtkFiltersGeneral.vtkClipConvexPolyData vtkmodules.vtkFiltersGeneral.vtkClipDataSet vtkmodules.vtkFiltersGeneral.vtkClipVolume vtkmodules.vtkFiltersGeneral.vtkCoincidentPoints vtkmodules.vtkFiltersGeneral.vtkContourTriangulator vtkmodules.vtkFiltersGeneral.vtkCountFaces vtkmodules.vtkFiltersGeneral.vtkCountVertices vtkmodules.vtkFiltersGeneral.vtkCursor2D vtkmodules.vtkFiltersGeneral.vtkCursor3D vtkmodules.vtkFiltersGeneral.vtkCurvatures vtkmodules.vtkFiltersGeneral.vtkDataSetGradient vtkmodules.vtkFiltersGeneral.vtkDataSetGradientPrecompute vtkmodules.vtkFiltersGeneral.vtkDataSetTriangleFilter vtkmodules.vtkFiltersGeneral.vtkDateToNumeric vtkmodules.vtkFiltersGeneral.vtkDeflectNormals vtkmodules.vtkFiltersGeneral.vtkDeformPointSet vtkmodules.vtkFiltersGeneral.vtkDensifyPolyData vtkmodules.vtkFiltersGeneral.vtkDicer vtkmodules.vtkFiltersGeneral.vtkDiscreteFlyingEdges2D vtkmodules.vtkFiltersGeneral.vtkDiscreteFlyingEdges3D vtkmodules.vtkFiltersGeneral.vtkDiscreteFlyingEdgesClipper2D vtkmodules.vtkFiltersGeneral.vtkDiscreteMarchingCubes vtkmodules.vtkFiltersGeneral.vtkDistancePolyDataFilter vtkmodules.vtkFiltersGeneral.vtkEdgePoints vtkmodules.vtkFiltersGeneral.vtkEqualizerFilter vtkmodules.vtkFiltersGeneral.vtkExtractArray vtkmodules.vtkFiltersGeneral.vtkExtractGhostCells vtkmodules.vtkFiltersGeneral.vtkExtractSelectedFrustum vtkmodules.vtkFiltersGeneral.vtkExtractSelectionBase vtkmodules.vtkFiltersGeneral.vtkFiniteElementFieldDistributor vtkmodules.vtkFiltersGeneral.vtkGradientFilter vtkmodules.vtkFiltersGeneral.vtkGraphLayoutFilter vtkmodules.vtkFiltersGeneral.vtkGraphToPoints vtkmodules.vtkFiltersGeneral.vtkGraphWeightEuclideanDistanceFilter vtkmodules.vtkFiltersGeneral.vtkGraphWeightFilter vtkmodules.vtkFiltersGeneral.vtkGroupDataSetsFilter vtkmodules.vtkFiltersGeneral.vtkGroupTimeStepsFilter vtkmodules.vtkFiltersGeneral.vtkHierarchicalDataLevelFilter vtkmodules.vtkFiltersGeneral.vtkHyperStreamline vtkmodules.vtkFiltersGeneral.vtkIconGlyphFilter vtkmodules.vtkFiltersGeneral.vtkImageDataToPointSet vtkmodules.vtkFiltersGeneral.vtkImageMarchingCubes vtkmodules.vtkFiltersGeneral.vtkInterpolateDataSetAttributes vtkmodules.vtkFiltersGeneral.vtkInterpolatingSubdivisionFilter vtkmodules.vtkFiltersGeneral.vtkIntersectionPolyDataFilter vtkmodules.vtkFiltersGeneral.vtkJoinTables vtkmodules.vtkFiltersGeneral.vtkLevelIdScalars vtkmodules.vtkFiltersGeneral.vtkLinkEdgels vtkmodules.vtkFiltersGeneral.vtkLoopBooleanPolyDataFilter vtkmodules.vtkFiltersGeneral.vtkMarchingContourFilter vtkmodules.vtkFiltersGeneral.vtkMatricizeArray vtkmodules.vtkFiltersGeneral.vtkMergeArrays vtkmodules.vtkFiltersGeneral.vtkMergeCells vtkmodules.vtkFiltersGeneral.vtkMergeTimeFilter vtkmodules.vtkFiltersGeneral.vtkMergeVectorComponents vtkmodules.vtkFiltersGeneral.vtkMultiBlockDataGroupFilter vtkmodules.vtkFiltersGeneral.vtkMultiBlockMergeFilter vtkmodules.vtkFiltersGeneral.vtkMultiThreshold vtkmodules.vtkFiltersGeneral.vtkNormalizeMatrixVectors vtkmodules.vtkFiltersGeneral.vtkOBBDicer vtkmodules.vtkFiltersGeneral.vtkOBBNode vtkmodules.vtkFiltersGeneral.vtkOBBTree vtkmodules.vtkFiltersGeneral.vtkOverlappingAMRLevelIdScalars vtkmodules.vtkFiltersGeneral.vtkPassArrays vtkmodules.vtkFiltersGeneral.vtkPassSelectedArrays vtkmodules.vtkFiltersGeneral.vtkPointConnectivityFilter vtkmodules.vtkFiltersGeneral.vtkPolyDataStreamer vtkmodules.vtkFiltersGeneral.vtkPolyDataToReebGraphFilter vtkmodules.vtkFiltersGeneral.vtkProbePolyhedron vtkmodules.vtkFiltersGeneral.vtkQuadraturePointInterpolator vtkmodules.vtkFiltersGeneral.vtkQuadraturePointsGenerator vtkmodules.vtkFiltersGeneral.vtkQuadratureSchemeDictionaryGenerator vtkmodules.vtkFiltersGeneral.vtkQuantizePolyDataPoints vtkmodules.vtkFiltersGeneral.vtkRandomAttributeGenerator vtkmodules.vtkFiltersGeneral.vtkRectilinearGridClip vtkmodules.vtkFiltersGeneral.vtkRectilinearGridToPointSet vtkmodules.vtkFiltersGeneral.vtkRectilinearGridToTetrahedra vtkmodules.vtkFiltersGeneral.vtkRecursiveDividingCubes vtkmodules.vtkFiltersGeneral.vtkReflectionFilter vtkmodules.vtkFiltersGeneral.vtkRemovePolyData vtkmodules.vtkFiltersGeneral.vtkRotationFilter vtkmodules.vtkFiltersGeneral.vtkSampleImplicitFunctionFilter vtkmodules.vtkFiltersGeneral.vtkShrinkFilter vtkmodules.vtkFiltersGeneral.vtkShrinkPolyData vtkmodules.vtkFiltersGeneral.vtkSpatialRepresentationFilter vtkmodules.vtkFiltersGeneral.vtkSphericalHarmonics vtkmodules.vtkFiltersGeneral.vtkSplineFilter vtkmodules.vtkFiltersGeneral.vtkSplitByCellScalarFilter vtkmodules.vtkFiltersGeneral.vtkSplitColumnComponents vtkmodules.vtkFiltersGeneral.vtkSplitField vtkmodules.vtkFiltersGeneral.vtkStructuredGridClip vtkmodules.vtkFiltersGeneral.vtkSubPixelPositionEdgels vtkmodules.vtkFiltersGeneral.vtkSubdivisionFilter vtkmodules.vtkFiltersGeneral.vtkSynchronizeTimeFilter vtkmodules.vtkFiltersGeneral.vtkTableBasedClipDataSet vtkmodules.vtkFiltersGeneral.vtkTableFFT vtkmodules.vtkFiltersGeneral.vtkTableToPolyData vtkmodules.vtkFiltersGeneral.vtkTableToStructuredGrid vtkmodules.vtkFiltersGeneral.vtkTemporalPathLineFilter vtkmodules.vtkFiltersGeneral.vtkTemporalStatistics vtkmodules.vtkFiltersGeneral.vtkTessellatorFilter vtkmodules.vtkFiltersGeneral.vtkTimeSourceExample vtkmodules.vtkFiltersGeneral.vtkTransformFilter vtkmodules.vtkFiltersGeneral.vtkTransformPolyDataFilter vtkmodules.vtkFiltersGeneral.vtkUncertaintyTubeFilter vtkmodules.vtkFiltersGeneral.vtkVertexGlyphFilter vtkmodules.vtkFiltersGeneral.vtkVolumeContourSpectrumFilter vtkmodules.vtkFiltersGeneral.vtkVoxelContoursToSurfaceFilter vtkmodules.vtkFiltersGeneral.vtkWarpLens vtkmodules.vtkFiltersGeneral.vtkWarpScalar vtkmodules.vtkFiltersGeneral.vtkWarpTo vtkmodules.vtkFiltersGeneral.vtkWarpVector vtkmodules.vtkFiltersGeneral.vtkYoungsMaterialInterface vtkmodules.vtkFiltersGeneric.VTK_COLOR_BY_SCALAR vtkmodules.vtkFiltersGeneric.VTK_COLOR_BY_SCALE vtkmodules.vtkFiltersGeneric.VTK_COLOR_BY_VECTOR vtkmodules.vtkFiltersGeneric.VTK_DATA_SCALING_OFF vtkmodules.vtkFiltersGeneric.VTK_INDEXING_BY_SCALAR vtkmodules.vtkFiltersGeneric.VTK_INDEXING_BY_VECTOR vtkmodules.vtkFiltersGeneric.VTK_INDEXING_OFF vtkmodules.vtkFiltersGeneric.VTK_SCALE_BY_SCALAR vtkmodules.vtkFiltersGeneric.VTK_SCALE_BY_VECTOR vtkmodules.vtkFiltersGeneric.VTK_SCALE_BY_VECTORCOMPONENTS vtkmodules.vtkFiltersGeneric.VTK_USE_NORMAL vtkmodules.vtkFiltersGeneric.VTK_USE_VECTOR vtkmodules.vtkFiltersGeneric.VTK_VECTOR_ROTATION_OFF vtkmodules.vtkFiltersGeneric.vtkGenericClip vtkmodules.vtkFiltersGeneric.vtkGenericContourFilter vtkmodules.vtkFiltersGeneric.vtkGenericCutter vtkmodules.vtkFiltersGeneric.vtkGenericDataSetTessellator vtkmodules.vtkFiltersGeneric.vtkGenericGeometryFilter vtkmodules.vtkFiltersGeneric.vtkGenericGlyph3DFilter vtkmodules.vtkFiltersGeneric.vtkGenericOutlineFilter vtkmodules.vtkFiltersGeneric.vtkGenericProbeFilter vtkmodules.vtkFiltersGeneric.vtkGenericStreamTracer vtkmodules.vtkFiltersGeometry.VTK_EDGE_OVERLAP vtkmodules.vtkFiltersGeometry.VTK_NODE_OVERLAP vtkmodules.vtkFiltersGeometry.VTK_NO_OVERLAP vtkmodules.vtkFiltersGeometry.VTK_PARTIAL_OVERLAP vtkmodules.vtkFiltersGeometry.vtkAbstractGridConnectivity vtkmodules.vtkFiltersGeometry.vtkAttributeSmoothingFilter vtkmodules.vtkFiltersGeometry.vtkCompositeDataGeometryFilter vtkmodules.vtkFiltersGeometry.vtkDataSetRegionSurfaceFilter vtkmodules.vtkFiltersGeometry.vtkDataSetSurfaceFilter vtkmodules.vtkFiltersGeometry.vtkExplicitStructuredGridSurfaceFilter vtkmodules.vtkFiltersGeometry.vtkFastGeomQuadStruct vtkmodules.vtkFiltersGeometry.vtkGeometryFilter vtkmodules.vtkFiltersGeometry.vtkGeometryFilterHelper vtkmodules.vtkFiltersGeometry.vtkHierarchicalDataSetGeometryFilter vtkmodules.vtkFiltersGeometry.vtkImageDataGeometryFilter vtkmodules.vtkFiltersGeometry.vtkImageDataToUniformGrid vtkmodules.vtkFiltersGeometry.vtkLinearToQuadraticCellsFilter vtkmodules.vtkFiltersGeometry.vtkMarkBoundaryFilter vtkmodules.vtkFiltersGeometry.vtkProjectSphereFilter vtkmodules.vtkFiltersGeometry.vtkRecoverGeometryWireframe vtkmodules.vtkFiltersGeometry.vtkRectilinearGridGeometryFilter vtkmodules.vtkFiltersGeometry.vtkRectilinearGridPartitioner vtkmodules.vtkFiltersGeometry.vtkStructuredAMRGridConnectivity vtkmodules.vtkFiltersGeometry.vtkStructuredAMRNeighbor vtkmodules.vtkFiltersGeometry.vtkStructuredGridConnectivity vtkmodules.vtkFiltersGeometry.vtkStructuredGridGeometryFilter vtkmodules.vtkFiltersGeometry.vtkStructuredGridPartitioner vtkmodules.vtkFiltersGeometry.vtkStructuredNeighbor vtkmodules.vtkFiltersGeometry.vtkStructuredPointsGeometryFilter vtkmodules.vtkFiltersGeometry.vtkUnstructuredGridGeometryFilter vtkmodules.vtkFiltersGeometryPreview.vtkOctreeImageToPointSetFilter vtkmodules.vtkFiltersGeometryPreview.vtkPointSetStreamer vtkmodules.vtkFiltersGeometryPreview.vtkPointSetToOctreeImageFilter vtkmodules.vtkFiltersHybrid.VTK_BSPLINE_EDGE vtkmodules.vtkFiltersHybrid.VTK_BSPLINE_ZERO vtkmodules.vtkFiltersHybrid.VTK_BSPLINE_ZERO_AT_BORDER vtkmodules.vtkFiltersHybrid.VTK_CELL_MODE vtkmodules.vtkFiltersHybrid.VTK_COLOR_MODE_LINEAR_256 vtkmodules.vtkFiltersHybrid.VTK_COLOR_MODE_LUT vtkmodules.vtkFiltersHybrid.VTK_ERROR_ABSOLUTE vtkmodules.vtkFiltersHybrid.VTK_ERROR_NUMBER_OF_TRIANGLES vtkmodules.vtkFiltersHybrid.VTK_ERROR_RELATIVE vtkmodules.vtkFiltersHybrid.VTK_ERROR_SPECIFIED_REDUCTION vtkmodules.vtkFiltersHybrid.VTK_GRID_CUBIC vtkmodules.vtkFiltersHybrid.VTK_GRID_LINEAR vtkmodules.vtkFiltersHybrid.VTK_GRID_NEAREST vtkmodules.vtkFiltersHybrid.VTK_STYLE_PIXELIZE vtkmodules.vtkFiltersHybrid.VTK_STYLE_POLYGONALIZE vtkmodules.vtkFiltersHybrid.VTK_STYLE_RUN_LENGTH vtkmodules.vtkFiltersHybrid.VTK_VOXEL_MODE vtkmodules.vtkFiltersHybrid.vtkAdaptiveDataSetSurfaceFilter vtkmodules.vtkFiltersHybrid.vtkBSplineTransform vtkmodules.vtkFiltersHybrid.vtkDSPFilterDefinition vtkmodules.vtkFiltersHybrid.vtkDSPFilterGroup vtkmodules.vtkFiltersHybrid.vtkDepthSortPolyData vtkmodules.vtkFiltersHybrid.vtkEarthSource vtkmodules.vtkFiltersHybrid.vtkFacetReader vtkmodules.vtkFiltersHybrid.vtkForceTime vtkmodules.vtkFiltersHybrid.vtkGenerateTimeSteps vtkmodules.vtkFiltersHybrid.vtkGreedyTerrainDecimation vtkmodules.vtkFiltersHybrid.vtkGridTransform vtkmodules.vtkFiltersHybrid.vtkImageToPolyDataFilter vtkmodules.vtkFiltersHybrid.vtkImplicitModeller vtkmodules.vtkFiltersHybrid.vtkPCAAnalysisFilter vtkmodules.vtkFiltersHybrid.vtkPolyDataSilhouette vtkmodules.vtkFiltersHybrid.vtkProcrustesAlignmentFilter vtkmodules.vtkFiltersHybrid.vtkProjectedTerrainPath vtkmodules.vtkFiltersHybrid.vtkRenderLargeImage vtkmodules.vtkFiltersHybrid.vtkTemporalArrayOperatorFilter vtkmodules.vtkFiltersHybrid.vtkTemporalDataSetCache vtkmodules.vtkFiltersHybrid.vtkTemporalFractal vtkmodules.vtkFiltersHybrid.vtkTemporalInterpolator vtkmodules.vtkFiltersHybrid.vtkTemporalShiftScale vtkmodules.vtkFiltersHybrid.vtkTemporalSnapToTimeStep vtkmodules.vtkFiltersHybrid.vtkTransformToGrid vtkmodules.vtkFiltersHybrid.vtkWeightedTransformFilter vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridAxisClip vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridAxisCut vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridAxisReflection vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridCellCenters vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridContour vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridDepthLimiter vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridEvaluateCoarse vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridGeometry vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridGradient vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridPlaneCutter vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridThreshold vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridToDualGrid vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridToUnstructuredGrid vtkmodules.vtkFiltersHyperTree.vtkImageDataToHyperTreeGrid vtkmodules.vtkFiltersImaging.vtkComputeHistogram2DOutliers vtkmodules.vtkFiltersImaging.vtkExtractHistogram2D vtkmodules.vtkFiltersImaging.vtkPairwiseExtractHistogram2D vtkmodules.vtkFiltersModeling.VTK_DIJKSTRA_EDGE_SEARCH vtkmodules.vtkFiltersModeling.VTK_GREEDY_EDGE_SEARCH vtkmodules.vtkFiltersModeling.VTK_INSIDE_CLOSEST_POINT_REGION vtkmodules.vtkFiltersModeling.VTK_INSIDE_LARGEST_REGION vtkmodules.vtkFiltersModeling.VTK_INSIDE_SMALLEST_REGION vtkmodules.vtkFiltersModeling.VTK_LOOP_CLOSURE_ALL vtkmodules.vtkFiltersModeling.VTK_LOOP_CLOSURE_BOUNDARY vtkmodules.vtkFiltersModeling.VTK_LOOP_CLOSURE_OFF vtkmodules.vtkFiltersModeling.VTK_MAX_SPHERE_RESOLUTION vtkmodules.vtkFiltersModeling.VTK_NORMAL_EXTRUSION vtkmodules.vtkFiltersModeling.VTK_OUTPUT_BOTH vtkmodules.vtkFiltersModeling.VTK_OUTPUT_POLYGONS vtkmodules.vtkFiltersModeling.VTK_OUTPUT_POLYLINES vtkmodules.vtkFiltersModeling.VTK_POINT_EXTRUSION vtkmodules.vtkFiltersModeling.VTK_PROJECTED_TEXTURE_USE_PINHOLE vtkmodules.vtkFiltersModeling.VTK_PROJECTED_TEXTURE_USE_TWO_MIRRORS vtkmodules.vtkFiltersModeling.VTK_RULED_MODE_POINT_WALK vtkmodules.vtkFiltersModeling.VTK_RULED_MODE_RESAMPLE vtkmodules.vtkFiltersModeling.VTK_SCALAR_MODE_INDEX vtkmodules.vtkFiltersModeling.VTK_SCALAR_MODE_VALUE vtkmodules.vtkFiltersModeling.VTK_TCOORDS_FROM_LENGTH vtkmodules.vtkFiltersModeling.VTK_TCOORDS_FROM_NORMALIZED_LENGTH vtkmodules.vtkFiltersModeling.VTK_TCOORDS_FROM_SCALARS vtkmodules.vtkFiltersModeling.VTK_TCOORDS_OFF vtkmodules.vtkFiltersModeling.VTK_VECTOR_EXTRUSION vtkmodules.vtkFiltersModeling.vtkAdaptiveSubdivisionFilter vtkmodules.vtkFiltersModeling.vtkBandedPolyDataContourFilter vtkmodules.vtkFiltersModeling.vtkButterflySubdivisionFilter vtkmodules.vtkFiltersModeling.vtkCollisionDetectionFilter vtkmodules.vtkFiltersModeling.vtkContourLoopExtraction vtkmodules.vtkFiltersModeling.vtkCookieCutter vtkmodules.vtkFiltersModeling.vtkDijkstraGraphGeodesicPath vtkmodules.vtkFiltersModeling.vtkDijkstraImageGeodesicPath vtkmodules.vtkFiltersModeling.vtkFillHolesFilter vtkmodules.vtkFiltersModeling.vtkFitToHeightMapFilter vtkmodules.vtkFiltersModeling.vtkGeodesicPath vtkmodules.vtkFiltersModeling.vtkGraphGeodesicPath vtkmodules.vtkFiltersModeling.vtkHausdorffDistancePointSetFilter vtkmodules.vtkFiltersModeling.vtkHyperTreeGridOutlineFilter vtkmodules.vtkFiltersModeling.vtkImageDataOutlineFilter vtkmodules.vtkFiltersModeling.vtkImprintFilter vtkmodules.vtkFiltersModeling.vtkLinearCellExtrusionFilter vtkmodules.vtkFiltersModeling.vtkLinearExtrusionFilter vtkmodules.vtkFiltersModeling.vtkLinearSubdivisionFilter vtkmodules.vtkFiltersModeling.vtkLoopSubdivisionFilter vtkmodules.vtkFiltersModeling.vtkOutlineFilter vtkmodules.vtkFiltersModeling.vtkPolyDataPointSampler vtkmodules.vtkFiltersModeling.vtkProjectedTexture vtkmodules.vtkFiltersModeling.vtkQuadRotationalExtrusionFilter vtkmodules.vtkFiltersModeling.vtkRibbonFilter vtkmodules.vtkFiltersModeling.vtkRotationalExtrusionFilter vtkmodules.vtkFiltersModeling.vtkRuledSurfaceFilter vtkmodules.vtkFiltersModeling.vtkSectorSource vtkmodules.vtkFiltersModeling.vtkSelectEnclosedPoints vtkmodules.vtkFiltersModeling.vtkSelectPolyData vtkmodules.vtkFiltersModeling.vtkSpherePuzzle vtkmodules.vtkFiltersModeling.vtkSpherePuzzleArrows vtkmodules.vtkFiltersModeling.vtkSubdivideTetra vtkmodules.vtkFiltersModeling.vtkTrimmedExtrusionFilter vtkmodules.vtkFiltersModeling.vtkVolumeOfRevolutionFilter vtkmodules.vtkFiltersPoints.VTK_DENSITY_ESTIMATE_FIXED_RADIUS vtkmodules.vtkFiltersPoints.VTK_DENSITY_ESTIMATE_RELATIVE_RADIUS vtkmodules.vtkFiltersPoints.VTK_DENSITY_FORM_NPTS vtkmodules.vtkFiltersPoints.VTK_DENSITY_FORM_VOLUME_NORM vtkmodules.vtkFiltersPoints.VTK_EXTRACT_ALL_CLUSTERS vtkmodules.vtkFiltersPoints.VTK_EXTRACT_ALL_REGIONS vtkmodules.vtkFiltersPoints.VTK_EXTRACT_CLOSEST_POINT_CLUSTER vtkmodules.vtkFiltersPoints.VTK_EXTRACT_CLOSEST_POINT_REGION vtkmodules.vtkFiltersPoints.VTK_EXTRACT_LARGEST_CLUSTER vtkmodules.vtkFiltersPoints.VTK_EXTRACT_LARGEST_REGION vtkmodules.vtkFiltersPoints.VTK_EXTRACT_POINT_SEEDED_CLUSTERS vtkmodules.vtkFiltersPoints.VTK_EXTRACT_POINT_SEEDED_REGIONS vtkmodules.vtkFiltersPoints.VTK_EXTRACT_SPECIFIED_CLUSTERS vtkmodules.vtkFiltersPoints.VTK_EXTRACT_SPECIFIED_REGIONS vtkmodules.vtkFiltersPoints.VTK_MAX_LEVEL vtkmodules.vtkFiltersPoints.vtkBoundedPointSource vtkmodules.vtkFiltersPoints.vtkConnectedPointsFilter vtkmodules.vtkFiltersPoints.vtkConvertToPointCloud vtkmodules.vtkFiltersPoints.vtkDensifyPointCloudFilter vtkmodules.vtkFiltersPoints.vtkEllipsoidalGaussianKernel vtkmodules.vtkFiltersPoints.vtkEuclideanClusterExtraction vtkmodules.vtkFiltersPoints.vtkExtractEnclosedPoints vtkmodules.vtkFiltersPoints.vtkExtractHierarchicalBins vtkmodules.vtkFiltersPoints.vtkExtractPointCloudPiece vtkmodules.vtkFiltersPoints.vtkExtractPoints vtkmodules.vtkFiltersPoints.vtkExtractSurface vtkmodules.vtkFiltersPoints.vtkFitImplicitFunction vtkmodules.vtkFiltersPoints.vtkGaussianKernel vtkmodules.vtkFiltersPoints.vtkGeneralizedKernel vtkmodules.vtkFiltersPoints.vtkHierarchicalBinningFilter vtkmodules.vtkFiltersPoints.vtkInterpolationKernel vtkmodules.vtkFiltersPoints.vtkLinearKernel vtkmodules.vtkFiltersPoints.vtkMaskPointsFilter vtkmodules.vtkFiltersPoints.vtkPCACurvatureEstimation vtkmodules.vtkFiltersPoints.vtkPCANormalEstimation vtkmodules.vtkFiltersPoints.vtkPointCloudFilter vtkmodules.vtkFiltersPoints.vtkPointDensityFilter vtkmodules.vtkFiltersPoints.vtkPointInterpolator vtkmodules.vtkFiltersPoints.vtkPointInterpolator2D vtkmodules.vtkFiltersPoints.vtkPointOccupancyFilter vtkmodules.vtkFiltersPoints.vtkPointSmoothingFilter vtkmodules.vtkFiltersPoints.vtkPoissonDiskSampler vtkmodules.vtkFiltersPoints.vtkProbabilisticVoronoiKernel vtkmodules.vtkFiltersPoints.vtkProjectPointsToPlane vtkmodules.vtkFiltersPoints.vtkRadiusOutlierRemoval vtkmodules.vtkFiltersPoints.vtkSPHCubicKernel vtkmodules.vtkFiltersPoints.vtkSPHInterpolator vtkmodules.vtkFiltersPoints.vtkSPHKernel vtkmodules.vtkFiltersPoints.vtkSPHQuarticKernel vtkmodules.vtkFiltersPoints.vtkSPHQuinticKernel vtkmodules.vtkFiltersPoints.vtkShepardKernel vtkmodules.vtkFiltersPoints.vtkSignedDistance vtkmodules.vtkFiltersPoints.vtkStatisticalOutlierRemoval vtkmodules.vtkFiltersPoints.vtkUnsignedDistance vtkmodules.vtkFiltersPoints.vtkVoronoiKernel vtkmodules.vtkFiltersPoints.vtkVoxelGrid vtkmodules.vtkFiltersPoints.vtkWendlandQuinticKernel vtkmodules.vtkFiltersProgrammable.VTK_COLOR_BY_INPUT vtkmodules.vtkFiltersProgrammable.VTK_COLOR_BY_SOURCE vtkmodules.vtkFiltersProgrammable.vtkProgrammableAttributeDataFilter vtkmodules.vtkFiltersProgrammable.vtkProgrammableFilter vtkmodules.vtkFiltersProgrammable.vtkProgrammableGlyphFilter vtkmodules.vtkFiltersPython.vtkPythonAlgorithm vtkmodules.vtkFiltersReduction.vtkToAffineArrayStrategy vtkmodules.vtkFiltersReduction.vtkToConstantArrayStrategy vtkmodules.vtkFiltersReduction.vtkToImplicitArrayFilter vtkmodules.vtkFiltersReduction.vtkToImplicitRamerDouglasPeuckerStrategy vtkmodules.vtkFiltersReduction.vtkToImplicitStrategy vtkmodules.vtkFiltersReduction.vtkToImplicitTypeErasureStrategy vtkmodules.vtkFiltersSMP.vtkSMPContourGrid vtkmodules.vtkFiltersSMP.vtkSMPMergePoints vtkmodules.vtkFiltersSMP.vtkSMPMergePolyDataHelper vtkmodules.vtkFiltersSelection.vtkCellDistanceSelector vtkmodules.vtkFiltersSelection.vtkKdTreeSelector vtkmodules.vtkFiltersSelection.vtkLinearSelector vtkmodules.vtkFiltersSources.VTK_ARROW_GLYPH vtkmodules.vtkFiltersSources.VTK_BOX_TYPE_AXIS_ALIGNED vtkmodules.vtkFiltersSources.VTK_BOX_TYPE_ORIENTED vtkmodules.vtkFiltersSources.VTK_CIRCLE_GLYPH vtkmodules.vtkFiltersSources.VTK_CROSS_GLYPH vtkmodules.vtkFiltersSources.VTK_DASH_GLYPH vtkmodules.vtkFiltersSources.VTK_DIAMOND_GLYPH vtkmodules.vtkFiltersSources.VTK_EDGEARROW_GLYPH vtkmodules.vtkFiltersSources.VTK_HOOKEDARROW_GLYPH vtkmodules.vtkFiltersSources.VTK_MAX_CIRCLE_RESOLUTION vtkmodules.vtkFiltersSources.VTK_MAX_SUPERQUADRIC_RESOLUTION vtkmodules.vtkFiltersSources.VTK_MIN_SUPERQUADRIC_ROUNDNESS vtkmodules.vtkFiltersSources.VTK_MIN_SUPERQUADRIC_THICKNESS vtkmodules.vtkFiltersSources.VTK_NO_GLYPH vtkmodules.vtkFiltersSources.VTK_POINT_EXPONENTIAL vtkmodules.vtkFiltersSources.VTK_POINT_SHELL vtkmodules.vtkFiltersSources.VTK_POINT_UNIFORM vtkmodules.vtkFiltersSources.VTK_SOLID_CUBE vtkmodules.vtkFiltersSources.VTK_SOLID_DODECAHEDRON vtkmodules.vtkFiltersSources.VTK_SOLID_ICOSAHEDRON vtkmodules.vtkFiltersSources.VTK_SOLID_OCTAHEDRON vtkmodules.vtkFiltersSources.VTK_SOLID_TETRAHEDRON vtkmodules.vtkFiltersSources.VTK_SQUARE_GLYPH vtkmodules.vtkFiltersSources.VTK_TEXTURE_STYLE_FIT_IMAGE vtkmodules.vtkFiltersSources.VTK_TEXTURE_STYLE_PROPORTIONAL vtkmodules.vtkFiltersSources.VTK_THICKARROW_GLYPH vtkmodules.vtkFiltersSources.VTK_THICKCROSS_GLYPH vtkmodules.vtkFiltersSources.VTK_TRIANGLE_GLYPH vtkmodules.vtkFiltersSources.VTK_VERTEX_GLYPH vtkmodules.vtkFiltersSources.vtkArcSource vtkmodules.vtkFiltersSources.vtkArrowSource vtkmodules.vtkFiltersSources.vtkButtonSource vtkmodules.vtkFiltersSources.vtkCapsuleSource vtkmodules.vtkFiltersSources.vtkCellTypeSource vtkmodules.vtkFiltersSources.vtkConeSource vtkmodules.vtkFiltersSources.vtkCubeSource vtkmodules.vtkFiltersSources.vtkCylinderSource vtkmodules.vtkFiltersSources.vtkDiagonalMatrixSource vtkmodules.vtkFiltersSources.vtkDiskSource vtkmodules.vtkFiltersSources.vtkEllipseArcSource vtkmodules.vtkFiltersSources.vtkEllipticalButtonSource vtkmodules.vtkFiltersSources.vtkFrustumSource vtkmodules.vtkFiltersSources.vtkGlyphSource2D vtkmodules.vtkFiltersSources.vtkGraphToPolyData vtkmodules.vtkFiltersSources.vtkHandleSource vtkmodules.vtkFiltersSources.vtkHyperTreeGridPreConfiguredSource vtkmodules.vtkFiltersSources.vtkHyperTreeGridSource vtkmodules.vtkFiltersSources.vtkLineSource vtkmodules.vtkFiltersSources.vtkOutlineCornerFilter vtkmodules.vtkFiltersSources.vtkOutlineCornerSource vtkmodules.vtkFiltersSources.vtkOutlineSource vtkmodules.vtkFiltersSources.vtkParametricFunctionSource vtkmodules.vtkFiltersSources.vtkPartitionedDataSetCollectionSource vtkmodules.vtkFiltersSources.vtkPartitionedDataSetSource vtkmodules.vtkFiltersSources.vtkPlaneSource vtkmodules.vtkFiltersSources.vtkPlatonicSolidSource vtkmodules.vtkFiltersSources.vtkPointHandleSource vtkmodules.vtkFiltersSources.vtkPointSource vtkmodules.vtkFiltersSources.vtkPolyLineSource vtkmodules.vtkFiltersSources.vtkPolyPointSource vtkmodules.vtkFiltersSources.vtkProgrammableDataObjectSource vtkmodules.vtkFiltersSources.vtkProgrammableSource vtkmodules.vtkFiltersSources.vtkRandomHyperTreeGridSource vtkmodules.vtkFiltersSources.vtkRectangularButtonSource vtkmodules.vtkFiltersSources.vtkRegularPolygonSource vtkmodules.vtkFiltersSources.vtkSelectionSource vtkmodules.vtkFiltersSources.vtkSphereSource vtkmodules.vtkFiltersSources.vtkSuperquadricSource vtkmodules.vtkFiltersSources.vtkTessellatedBoxSource vtkmodules.vtkFiltersSources.vtkTextSource vtkmodules.vtkFiltersSources.vtkTexturedSphereSource vtkmodules.vtkFiltersSources.vtkUniformHyperTreeGridSource vtkmodules.vtkFiltersStatistics.vtkAutoCorrelativeStatistics vtkmodules.vtkFiltersStatistics.vtkBivariateLinearTableThreshold vtkmodules.vtkFiltersStatistics.vtkComputeQuantiles vtkmodules.vtkFiltersStatistics.vtkComputeQuartiles vtkmodules.vtkFiltersStatistics.vtkContingencyStatistics vtkmodules.vtkFiltersStatistics.vtkCorrelativeStatistics vtkmodules.vtkFiltersStatistics.vtkDescriptiveStatistics vtkmodules.vtkFiltersStatistics.vtkExtractFunctionalBagPlot vtkmodules.vtkFiltersStatistics.vtkExtractHistogram vtkmodules.vtkFiltersStatistics.vtkHighestDensityRegionsStatistics vtkmodules.vtkFiltersStatistics.vtkKMeansDistanceFunctor vtkmodules.vtkFiltersStatistics.vtkKMeansDistanceFunctorCalculator vtkmodules.vtkFiltersStatistics.vtkKMeansStatistics vtkmodules.vtkFiltersStatistics.vtkLengthDistribution vtkmodules.vtkFiltersStatistics.vtkMultiCorrelativeStatistics vtkmodules.vtkFiltersStatistics.vtkOrderStatistics vtkmodules.vtkFiltersStatistics.vtkPCAStatistics vtkmodules.vtkFiltersStatistics.vtkStatisticsAlgorithm vtkmodules.vtkFiltersStatistics.vtkStrahlerMetric vtkmodules.vtkFiltersStatistics.vtkStreamingStatistics vtkmodules.vtkFiltersTensor.vtkTensorPrincipalInvariants vtkmodules.vtkFiltersTensor.vtkYieldCriteria vtkmodules.vtkFiltersTexture.vtkImplicitTextureCoords vtkmodules.vtkFiltersTexture.vtkScalarsToTextureFilter vtkmodules.vtkFiltersTexture.vtkTextureMapToCylinder vtkmodules.vtkFiltersTexture.vtkTextureMapToPlane vtkmodules.vtkFiltersTexture.vtkTextureMapToSphere vtkmodules.vtkFiltersTexture.vtkThresholdTextureCoords vtkmodules.vtkFiltersTexture.vtkTransformTextureCoords vtkmodules.vtkFiltersTexture.vtkTriangularTCoords vtkmodules.vtkFiltersTopology.vtkFiberSurface vtkmodules.vtkFiltersVerdict.vtkBoundaryMeshQuality vtkmodules.vtkFiltersVerdict.vtkCellQuality vtkmodules.vtkFiltersVerdict.vtkCellSizeFilter vtkmodules.vtkFiltersVerdict.vtkMatrixMathFilter vtkmodules.vtkFiltersVerdict.vtkMeshQuality vtkmodules.vtkGeovisCore.vtkGeoProjection vtkmodules.vtkGeovisCore.vtkGeoTransform vtkmodules.vtkIOAMR.vtkAMRBaseParticlesReader vtkmodules.vtkIOAMR.vtkAMRBaseReader vtkmodules.vtkIOAMR.vtkAMRDataSetCache vtkmodules.vtkIOAMR.vtkAMREnzoParticlesReader vtkmodules.vtkIOAMR.vtkAMREnzoReader vtkmodules.vtkIOAMR.vtkAMRFlashParticlesReader vtkmodules.vtkIOAMR.vtkAMRFlashReader vtkmodules.vtkIOAMR.vtkAMRVelodyneReader vtkmodules.vtkIOAMR.vtkAMReXGridReader vtkmodules.vtkIOAMR.vtkAMReXParticlesReader vtkmodules.vtkIOAsynchronous.vtkThreadedImageWriter vtkmodules.vtkIOCGNSReader.vtkCGNSFileSeriesReader vtkmodules.vtkIOCGNSReader.vtkCGNSReader vtkmodules.vtkIOCONVERGECFD.vtkCONVERGECFDReader vtkmodules.vtkIOCellGrid.vtkCellGridReader vtkmodules.vtkIOCesium3DTiles.vtkCesium3DTilesWriter vtkmodules.vtkIOCesium3DTiles.vtkCesiumPointCloudWriter vtkmodules.vtkIOChemistry.vtkCMLMoleculeReader vtkmodules.vtkIOChemistry.vtkGaussianCubeReader vtkmodules.vtkIOChemistry.vtkGaussianCubeReader2 vtkmodules.vtkIOChemistry.vtkMoleculeReaderBase vtkmodules.vtkIOChemistry.vtkPDBReader vtkmodules.vtkIOChemistry.vtkVASPAnimationReader vtkmodules.vtkIOChemistry.vtkVASPTessellationReader vtkmodules.vtkIOChemistry.vtkXYZMolReader vtkmodules.vtkIOChemistry.vtkXYZMolReader2 vtkmodules.vtkIOCityGML.vtkCityGMLReader vtkmodules.vtkIOCore.VTK_ASCII vtkmodules.vtkIOCore.VTK_BINARY vtkmodules.vtkIOCore.vtkASCIITextCodec vtkmodules.vtkIOCore.vtkAbstractParticleWriter vtkmodules.vtkIOCore.vtkAbstractPolyDataReader vtkmodules.vtkIOCore.vtkArrayDataReader vtkmodules.vtkIOCore.vtkArrayDataWriter vtkmodules.vtkIOCore.vtkArrayReader vtkmodules.vtkIOCore.vtkArrayWriter vtkmodules.vtkIOCore.vtkBase64InputStream vtkmodules.vtkIOCore.vtkBase64OutputStream vtkmodules.vtkIOCore.vtkBase64Utilities vtkmodules.vtkIOCore.vtkDataCompressor vtkmodules.vtkIOCore.vtkDelimitedTextWriter vtkmodules.vtkIOCore.vtkFileResourceStream vtkmodules.vtkIOCore.vtkGlobFileNames vtkmodules.vtkIOCore.vtkInputStream vtkmodules.vtkIOCore.vtkJavaScriptDataWriter vtkmodules.vtkIOCore.vtkLZ4DataCompressor vtkmodules.vtkIOCore.vtkLZMADataCompressor vtkmodules.vtkIOCore.vtkMemoryResourceStream vtkmodules.vtkIOCore.vtkNumberToString vtkmodules.vtkIOCore.vtkOutputStream vtkmodules.vtkIOCore.vtkResourceStream vtkmodules.vtkIOCore.vtkSortFileNames vtkmodules.vtkIOCore.vtkTextCodec vtkmodules.vtkIOCore.vtkTextCodecFactory vtkmodules.vtkIOCore.vtkURI vtkmodules.vtkIOCore.vtkURIComponent vtkmodules.vtkIOCore.vtkURILoader vtkmodules.vtkIOCore.vtkUTF16TextCodec vtkmodules.vtkIOCore.vtkUTF8TextCodec vtkmodules.vtkIOCore.vtkWriter vtkmodules.vtkIOCore.vtkZLibDataCompressor vtkmodules.vtkIOEnSight.EnsightReaderCellIdMode vtkmodules.vtkIOEnSight.IMPLICIT_STRUCTURED_MODE vtkmodules.vtkIOEnSight.NON_SPARSE_MODE vtkmodules.vtkIOEnSight.SINGLE_PROCESS_MODE vtkmodules.vtkIOEnSight.SPARSE_MODE vtkmodules.vtkIOEnSight.vtkEnSight6BinaryReader vtkmodules.vtkIOEnSight.vtkEnSight6Reader vtkmodules.vtkIOEnSight.vtkEnSightGoldBinaryReader vtkmodules.vtkIOEnSight.vtkEnSightGoldReader vtkmodules.vtkIOEnSight.vtkEnSightMasterServerReader vtkmodules.vtkIOEnSight.vtkEnSightReader vtkmodules.vtkIOEnSight.vtkGenericEnSightReader vtkmodules.vtkIOExodus.vtkCPExodusIIElementBlock vtkmodules.vtkIOExodus.vtkCPExodusIIElementBlockImpl vtkmodules.vtkIOExodus.vtkCPExodusIIInSituReader vtkmodules.vtkIOExodus.vtkExodusIICache vtkmodules.vtkIOExodus.vtkExodusIICacheEntry vtkmodules.vtkIOExodus.vtkExodusIICacheKey vtkmodules.vtkIOExodus.vtkExodusIIReader vtkmodules.vtkIOExodus.vtkExodusIIReaderParser vtkmodules.vtkIOExodus.vtkExodusIIWriter vtkmodules.vtkIOExodus.vtkModelMetadata vtkmodules.vtkIOExport.vtkExporter vtkmodules.vtkIOExport.vtkGLTFExporter vtkmodules.vtkIOExport.vtkIVExporter vtkmodules.vtkIOExport.vtkJSONDataSetWriter vtkmodules.vtkIOExport.vtkJSONRenderWindowExporter vtkmodules.vtkIOExport.vtkJSONSceneExporter vtkmodules.vtkIOExport.vtkOBJExporter vtkmodules.vtkIOExport.vtkOOGLExporter vtkmodules.vtkIOExport.vtkPOVExporter vtkmodules.vtkIOExport.vtkRIBExporter vtkmodules.vtkIOExport.vtkRIBLight vtkmodules.vtkIOExport.vtkRIBProperty vtkmodules.vtkIOExport.vtkSVGContextDevice2D vtkmodules.vtkIOExport.vtkSVGExporter vtkmodules.vtkIOExport.vtkSingleVTPExporter vtkmodules.vtkIOExport.vtkVRMLExporter vtkmodules.vtkIOExport.vtkX3D vtkmodules.vtkIOExport.vtkX3DExporter vtkmodules.vtkIOExport.vtkX3DExporterFIWriter vtkmodules.vtkIOExport.vtkX3DExporterWriter vtkmodules.vtkIOExport.vtkX3DExporterXMLWriter vtkmodules.vtkIOExportGL2PS.vtkGL2PSExporter vtkmodules.vtkIOExportGL2PS.vtkOpenGLGL2PSExporter vtkmodules.vtkIOExportPDF.vtkPDFContextDevice2D vtkmodules.vtkIOExportPDF.vtkPDFExporter vtkmodules.vtkIOFLUENTCFF.vtkFLUENTCFFReader vtkmodules.vtkIOGeoJSON.vtkGeoJSONFeature vtkmodules.vtkIOGeoJSON.vtkGeoJSONReader vtkmodules.vtkIOGeoJSON.vtkGeoJSONWriter vtkmodules.vtkIOGeometry.VTK_FILE_BYTE_ORDER_BIG_ENDIAN vtkmodules.vtkIOGeometry.VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN vtkmodules.vtkIOGeometry.vtkAVSucdReader vtkmodules.vtkIOGeometry.vtkBYUReader vtkmodules.vtkIOGeometry.vtkBYUWriter vtkmodules.vtkIOGeometry.vtkChacoReader vtkmodules.vtkIOGeometry.vtkFLUENTReader vtkmodules.vtkIOGeometry.vtkFacetWriter vtkmodules.vtkIOGeometry.vtkGAMBITReader vtkmodules.vtkIOGeometry.vtkGLTFDocumentLoader vtkmodules.vtkIOGeometry.vtkGLTFReader vtkmodules.vtkIOGeometry.vtkGLTFWriter vtkmodules.vtkIOGeometry.vtkHoudiniPolyDataWriter vtkmodules.vtkIOGeometry.vtkIVWriter vtkmodules.vtkIOGeometry.vtkMCubesReader vtkmodules.vtkIOGeometry.vtkMCubesWriter vtkmodules.vtkIOGeometry.vtkMFIXReader vtkmodules.vtkIOGeometry.vtkOBJReader vtkmodules.vtkIOGeometry.vtkOBJWriter vtkmodules.vtkIOGeometry.vtkOpenFOAMReader vtkmodules.vtkIOGeometry.vtkPTSReader vtkmodules.vtkIOGeometry.vtkParticleReader vtkmodules.vtkIOGeometry.vtkProStarReader vtkmodules.vtkIOGeometry.vtkSTLReader vtkmodules.vtkIOGeometry.vtkSTLWriter vtkmodules.vtkIOGeometry.vtkTecplotReader vtkmodules.vtkIOGeometry.vtkWindBladeReader vtkmodules.vtkIOH5Rage.vtkH5RageReader vtkmodules.vtkIOH5part.vtkH5PartReader vtkmodules.vtkIOHDF.vtkHDFReader vtkmodules.vtkIOIOSS.vtkIOSSReader vtkmodules.vtkIOIOSS.vtkIOSSWriter vtkmodules.vtkIOImage.VTK_FILE_BYTE_ORDER_BIG_ENDIAN vtkmodules.vtkIOImage.VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN vtkmodules.vtkIOImage.vtkBMPReader vtkmodules.vtkIOImage.vtkBMPWriter vtkmodules.vtkIOImage.vtkDEMReader vtkmodules.vtkIOImage.vtkDICOMImageReader vtkmodules.vtkIOImage.vtkGESignaReader vtkmodules.vtkIOImage.vtkHDRReader vtkmodules.vtkIOImage.vtkImageExport vtkmodules.vtkIOImage.vtkImageImport vtkmodules.vtkIOImage.vtkImageImportExecutive vtkmodules.vtkIOImage.vtkImageReader vtkmodules.vtkIOImage.vtkImageReader2 vtkmodules.vtkIOImage.vtkImageReader2Collection vtkmodules.vtkIOImage.vtkImageReader2Factory vtkmodules.vtkIOImage.vtkImageWriter vtkmodules.vtkIOImage.vtkJPEGReader vtkmodules.vtkIOImage.vtkJPEGWriter vtkmodules.vtkIOImage.vtkJSONImageWriter vtkmodules.vtkIOImage.vtkMRCReader vtkmodules.vtkIOImage.vtkMedicalImageProperties vtkmodules.vtkIOImage.vtkMedicalImageReader2 vtkmodules.vtkIOImage.vtkMetaImageReader vtkmodules.vtkIOImage.vtkMetaImageWriter vtkmodules.vtkIOImage.vtkNIFTIImageHeader vtkmodules.vtkIOImage.vtkNIFTIImageReader vtkmodules.vtkIOImage.vtkNIFTIImageWriter vtkmodules.vtkIOImage.vtkNrrdReader vtkmodules.vtkIOImage.vtkOMETIFFReader vtkmodules.vtkIOImage.vtkPNGReader vtkmodules.vtkIOImage.vtkPNGWriter vtkmodules.vtkIOImage.vtkPNMReader vtkmodules.vtkIOImage.vtkPNMWriter vtkmodules.vtkIOImage.vtkPostScriptWriter vtkmodules.vtkIOImage.vtkSEPReader vtkmodules.vtkIOImage.vtkSLCReader vtkmodules.vtkIOImage.vtkTGAReader vtkmodules.vtkIOImage.vtkTIFFReader vtkmodules.vtkIOImage.vtkTIFFWriter vtkmodules.vtkIOImage.vtkVolume16Reader vtkmodules.vtkIOImage.vtkVolumeReader vtkmodules.vtkIOImport.vtk3DSCamera_t vtkmodules.vtkIOImport.vtk3DSChunk_t vtkmodules.vtkIOImport.vtk3DSColour_t vtkmodules.vtkIOImport.vtk3DSColour_t_24 vtkmodules.vtkIOImport.vtk3DSFace_t vtkmodules.vtkIOImport.vtk3DSImporter vtkmodules.vtkIOImport.vtk3DSList_t vtkmodules.vtkIOImport.vtk3DSMatProp_t vtkmodules.vtkIOImport.vtk3DSMaterial_t vtkmodules.vtkIOImport.vtk3DSMesh_t vtkmodules.vtkIOImport.vtk3DSOmniLight_t vtkmodules.vtkIOImport.vtk3DSSpotLight_t vtkmodules.vtkIOImport.vtk3DSSummary_t vtkmodules.vtkIOImport.vtkGLTFImporter vtkmodules.vtkIOImport.vtkImporter vtkmodules.vtkIOImport.vtkOBJImporter vtkmodules.vtkIOImport.vtkVRMLImporter vtkmodules.vtkIOInfovis.vtkBiomTableReader vtkmodules.vtkIOInfovis.vtkChacoGraphReader vtkmodules.vtkIOInfovis.vtkDIMACSGraphReader vtkmodules.vtkIOInfovis.vtkDIMACSGraphWriter vtkmodules.vtkIOInfovis.vtkDelimitedTextReader vtkmodules.vtkIOInfovis.vtkFixedWidthTextReader vtkmodules.vtkIOInfovis.vtkISIReader vtkmodules.vtkIOInfovis.vtkMultiNewickTreeReader vtkmodules.vtkIOInfovis.vtkNewickTreeReader vtkmodules.vtkIOInfovis.vtkNewickTreeWriter vtkmodules.vtkIOInfovis.vtkPhyloXMLTreeReader vtkmodules.vtkIOInfovis.vtkPhyloXMLTreeWriter vtkmodules.vtkIOInfovis.vtkRISReader vtkmodules.vtkIOInfovis.vtkTemporalDelimitedTextReader vtkmodules.vtkIOInfovis.vtkTulipReader vtkmodules.vtkIOInfovis.vtkXGMLReader vtkmodules.vtkIOInfovis.vtkXMLTreeReader vtkmodules.vtkIOLSDyna.VTK_LSDYNA_BADFILE vtkmodules.vtkIOLSDyna.vtkLSDynaReader vtkmodules.vtkIOLSDyna.vtkLSDynaSummaryParser vtkmodules.vtkIOLegacy.VTK_ASCII vtkmodules.vtkIOLegacy.VTK_BINARY vtkmodules.vtkIOLegacy.vtkCompositeDataReader vtkmodules.vtkIOLegacy.vtkCompositeDataWriter vtkmodules.vtkIOLegacy.vtkDataObjectReader vtkmodules.vtkIOLegacy.vtkDataObjectWriter vtkmodules.vtkIOLegacy.vtkDataReader vtkmodules.vtkIOLegacy.vtkDataSetReader vtkmodules.vtkIOLegacy.vtkDataSetWriter vtkmodules.vtkIOLegacy.vtkDataWriter vtkmodules.vtkIOLegacy.vtkGenericDataObjectReader vtkmodules.vtkIOLegacy.vtkGenericDataObjectWriter vtkmodules.vtkIOLegacy.vtkGraphReader vtkmodules.vtkIOLegacy.vtkGraphWriter vtkmodules.vtkIOLegacy.vtkPixelExtentIO vtkmodules.vtkIOLegacy.vtkPolyDataReader vtkmodules.vtkIOLegacy.vtkPolyDataWriter vtkmodules.vtkIOLegacy.vtkRectilinearGridReader vtkmodules.vtkIOLegacy.vtkRectilinearGridWriter vtkmodules.vtkIOLegacy.vtkSimplePointsReader vtkmodules.vtkIOLegacy.vtkSimplePointsWriter vtkmodules.vtkIOLegacy.vtkStructuredGridReader vtkmodules.vtkIOLegacy.vtkStructuredGridWriter vtkmodules.vtkIOLegacy.vtkStructuredPointsReader vtkmodules.vtkIOLegacy.vtkStructuredPointsWriter vtkmodules.vtkIOLegacy.vtkTableReader vtkmodules.vtkIOLegacy.vtkTableWriter vtkmodules.vtkIOLegacy.vtkTreeReader vtkmodules.vtkIOLegacy.vtkTreeWriter vtkmodules.vtkIOLegacy.vtkUnstructuredGridReader vtkmodules.vtkIOLegacy.vtkUnstructuredGridWriter vtkmodules.vtkIOMINC.vtkMINCImageAttributes vtkmodules.vtkIOMINC.vtkMINCImageReader vtkmodules.vtkIOMINC.vtkMINCImageWriter vtkmodules.vtkIOMINC.vtkMNIObjectReader vtkmodules.vtkIOMINC.vtkMNIObjectWriter vtkmodules.vtkIOMINC.vtkMNITagPointReader vtkmodules.vtkIOMINC.vtkMNITagPointWriter vtkmodules.vtkIOMINC.vtkMNITransformReader vtkmodules.vtkIOMINC.vtkMNITransformWriter vtkmodules.vtkIOMotionFX.vtkMotionFXCFGReader vtkmodules.vtkIOMovie.vtkGenericMovieWriter vtkmodules.vtkIONetCDF.vtkMPASReader vtkmodules.vtkIONetCDF.vtkNetCDFCAMReader vtkmodules.vtkIONetCDF.vtkNetCDFCFReader vtkmodules.vtkIONetCDF.vtkNetCDFCFWriter vtkmodules.vtkIONetCDF.vtkNetCDFPOPReader vtkmodules.vtkIONetCDF.vtkNetCDFReader vtkmodules.vtkIONetCDF.vtkNetCDFUGRIDReader vtkmodules.vtkIONetCDF.vtkSLACParticleReader vtkmodules.vtkIONetCDF.vtkSLACReader vtkmodules.vtkIOOMF.vtkOMFReader vtkmodules.vtkIOOggTheora.vtkOggTheoraWriter vtkmodules.vtkIOPIO.MAX_CHILD vtkmodules.vtkIOPIO.MAX_DIM vtkmodules.vtkIOPIO.NZero0 vtkmodules.vtkIOPIO.NZero1 vtkmodules.vtkIOPIO.NZero2 vtkmodules.vtkIOPIO.Ncylin vtkmodules.vtkIOPIO.Nd0 vtkmodules.vtkIOPIO.Nd1 vtkmodules.vtkIOPIO.Nd2 vtkmodules.vtkIOPIO.Nmesh0 vtkmodules.vtkIOPIO.Nmesh1 vtkmodules.vtkIOPIO.Nmesh2 vtkmodules.vtkIOPIO.Nnumdim vtkmodules.vtkIOPIO.Nsphere vtkmodules.vtkIOPIO.Ntime vtkmodules.vtkIOPIO.vtkPIOReader vtkmodules.vtkIOPLY.VTK_BIG_ENDIAN vtkmodules.vtkIOPLY.VTK_COLOR_MODE_DEFAULT vtkmodules.vtkIOPLY.VTK_COLOR_MODE_OFF vtkmodules.vtkIOPLY.VTK_COLOR_MODE_UNIFORM_CELL_COLOR vtkmodules.vtkIOPLY.VTK_COLOR_MODE_UNIFORM_COLOR vtkmodules.vtkIOPLY.VTK_COLOR_MODE_UNIFORM_POINT_COLOR vtkmodules.vtkIOPLY.VTK_LITTLE_ENDIAN vtkmodules.vtkIOPLY.VTK_TEXTURECOORDS_TEXTUREUV vtkmodules.vtkIOPLY.VTK_TEXTURECOORDS_UV vtkmodules.vtkIOPLY.vtkPLY vtkmodules.vtkIOPLY.vtkPLYReader vtkmodules.vtkIOPLY.vtkPLYWriter vtkmodules.vtkIOSQL.VTK_SQL_ALLBACKENDS vtkmodules.vtkIOSQL.VTK_SQL_DEFAULT_COLUMN_SIZE vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_BATCH_OPERATIONS vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_BLOB vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_LAST_INSERT_ID vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_NAMED_PLACEHOLDERS vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_POSITIONAL_PLACEHOLDERS vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_PREPARED_QUERIES vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_QUERY_SIZE vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_TRANSACTIONS vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_TRIGGERS vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_UNICODE vtkmodules.vtkIOSQL.VTK_SQL_MYSQL vtkmodules.vtkIOSQL.VTK_SQL_POSTGRESQL vtkmodules.vtkIOSQL.VTK_SQL_SQLITE vtkmodules.vtkIOSQL.vtkDatabaseToTableReader vtkmodules.vtkIOSQL.vtkRowQuery vtkmodules.vtkIOSQL.vtkRowQueryToTable vtkmodules.vtkIOSQL.vtkSQLDatabase vtkmodules.vtkIOSQL.vtkSQLDatabaseSchema vtkmodules.vtkIOSQL.vtkSQLDatabaseTableSource vtkmodules.vtkIOSQL.vtkSQLQuery vtkmodules.vtkIOSQL.vtkSQLiteDatabase vtkmodules.vtkIOSQL.vtkSQLiteQuery vtkmodules.vtkIOSQL.vtkSQLiteToTableReader vtkmodules.vtkIOSQL.vtkTableToDatabaseWriter vtkmodules.vtkIOSQL.vtkTableToSQLiteWriter vtkmodules.vtkIOSegY.vtkSegYReader vtkmodules.vtkIOTRUCHAS.vtkTRUCHASReader vtkmodules.vtkIOTecplotTable.vtkTecplotTableReader vtkmodules.vtkIOVPIC.vtkVPICReader vtkmodules.vtkIOVeraOut.vtkVeraOutReader vtkmodules.vtkIOVideo.vtkVideoSource vtkmodules.vtkIOXML.vtkRTXMLPolyDataReader vtkmodules.vtkIOXML.vtkXMLCompositeDataReader vtkmodules.vtkIOXML.vtkXMLCompositeDataWriter vtkmodules.vtkIOXML.vtkXMLDataObjectWriter vtkmodules.vtkIOXML.vtkXMLDataReader vtkmodules.vtkIOXML.vtkXMLDataSetWriter vtkmodules.vtkIOXML.vtkXMLFileReadTester vtkmodules.vtkIOXML.vtkXMLGenericDataObjectReader vtkmodules.vtkIOXML.vtkXMLHierarchicalBoxDataFileConverter vtkmodules.vtkIOXML.vtkXMLHierarchicalBoxDataReader vtkmodules.vtkIOXML.vtkXMLHierarchicalBoxDataWriter vtkmodules.vtkIOXML.vtkXMLHierarchicalDataReader vtkmodules.vtkIOXML.vtkXMLHyperTreeGridReader vtkmodules.vtkIOXML.vtkXMLHyperTreeGridWriter vtkmodules.vtkIOXML.vtkXMLImageDataReader vtkmodules.vtkIOXML.vtkXMLImageDataWriter vtkmodules.vtkIOXML.vtkXMLMultiBlockDataReader vtkmodules.vtkIOXML.vtkXMLMultiBlockDataWriter vtkmodules.vtkIOXML.vtkXMLMultiGroupDataReader vtkmodules.vtkIOXML.vtkXMLPDataObjectReader vtkmodules.vtkIOXML.vtkXMLPDataReader vtkmodules.vtkIOXML.vtkXMLPHyperTreeGridReader vtkmodules.vtkIOXML.vtkXMLPImageDataReader vtkmodules.vtkIOXML.vtkXMLPPolyDataReader vtkmodules.vtkIOXML.vtkXMLPRectilinearGridReader vtkmodules.vtkIOXML.vtkXMLPStructuredDataReader vtkmodules.vtkIOXML.vtkXMLPStructuredGridReader vtkmodules.vtkIOXML.vtkXMLPTableReader vtkmodules.vtkIOXML.vtkXMLPUnstructuredDataReader vtkmodules.vtkIOXML.vtkXMLPUnstructuredGridReader vtkmodules.vtkIOXML.vtkXMLPartitionedDataSetCollectionReader vtkmodules.vtkIOXML.vtkXMLPartitionedDataSetReader vtkmodules.vtkIOXML.vtkXMLPolyDataReader vtkmodules.vtkIOXML.vtkXMLPolyDataWriter vtkmodules.vtkIOXML.vtkXMLReader vtkmodules.vtkIOXML.vtkXMLRectilinearGridReader vtkmodules.vtkIOXML.vtkXMLRectilinearGridWriter vtkmodules.vtkIOXML.vtkXMLStructuredDataReader vtkmodules.vtkIOXML.vtkXMLStructuredDataWriter vtkmodules.vtkIOXML.vtkXMLStructuredGridReader vtkmodules.vtkIOXML.vtkXMLStructuredGridWriter vtkmodules.vtkIOXML.vtkXMLTableReader vtkmodules.vtkIOXML.vtkXMLTableWriter vtkmodules.vtkIOXML.vtkXMLUniformGridAMRReader vtkmodules.vtkIOXML.vtkXMLUniformGridAMRWriter vtkmodules.vtkIOXML.vtkXMLUnstructuredDataReader vtkmodules.vtkIOXML.vtkXMLUnstructuredDataWriter vtkmodules.vtkIOXML.vtkXMLUnstructuredGridReader vtkmodules.vtkIOXML.vtkXMLUnstructuredGridWriter vtkmodules.vtkIOXML.vtkXMLWriter vtkmodules.vtkIOXML.vtkXMLWriterBase vtkmodules.vtkIOXMLParser.vtkXMLDataParser vtkmodules.vtkIOXMLParser.vtkXMLParser vtkmodules.vtkIOXMLParser.vtkXMLUtilities vtkmodules.vtkIOXdmf2.vtkSILBuilder vtkmodules.vtkIOXdmf2.vtkXdmfDataArray vtkmodules.vtkIOXdmf2.vtkXdmfReader vtkmodules.vtkIOXdmf2.vtkXdmfWriter vtkmodules.vtkImagingColor.vtkImageHSIToRGB vtkmodules.vtkImagingColor.vtkImageHSVToRGB vtkmodules.vtkImagingColor.vtkImageLuminance vtkmodules.vtkImagingColor.vtkImageMapToRGBA vtkmodules.vtkImagingColor.vtkImageMapToWindowLevelColors vtkmodules.vtkImagingColor.vtkImageQuantizeRGBToIndex vtkmodules.vtkImagingColor.vtkImageRGBToHSI vtkmodules.vtkImagingColor.vtkImageRGBToHSV vtkmodules.vtkImagingColor.vtkImageRGBToYIQ vtkmodules.vtkImagingColor.vtkImageYIQToRGB vtkmodules.vtkImagingCore.VTK_BLACKMAN_HARRIS3 vtkmodules.vtkImagingCore.VTK_BLACKMAN_HARRIS4 vtkmodules.vtkImagingCore.VTK_BLACKMAN_NUTTALL3 vtkmodules.vtkImagingCore.VTK_BLACKMAN_NUTTALL4 vtkmodules.vtkImagingCore.VTK_BLACKMAN_WINDOW vtkmodules.vtkImagingCore.VTK_COSINE_WINDOW vtkmodules.vtkImagingCore.VTK_HAMMING_WINDOW vtkmodules.vtkImagingCore.VTK_HANN_WINDOW vtkmodules.vtkImagingCore.VTK_IMAGE_BLEND_MODE_COMPOUND vtkmodules.vtkImagingCore.VTK_IMAGE_BLEND_MODE_NORMAL vtkmodules.vtkImagingCore.VTK_IMAGE_BORDER_CLAMP vtkmodules.vtkImagingCore.VTK_IMAGE_BORDER_MIRROR vtkmodules.vtkImagingCore.VTK_IMAGE_BORDER_REPEAT vtkmodules.vtkImagingCore.VTK_IMAGE_BSPLINE_DEGREE_MAX vtkmodules.vtkImagingCore.VTK_KAISER_WINDOW vtkmodules.vtkImagingCore.VTK_LANCZOS_WINDOW vtkmodules.vtkImagingCore.VTK_NUTTALL_WINDOW vtkmodules.vtkImagingCore.VTK_RESLICE_CUBIC vtkmodules.vtkImagingCore.VTK_RESLICE_LINEAR vtkmodules.vtkImagingCore.VTK_RESLICE_NEAREST vtkmodules.vtkImagingCore.VTK_SINC_KERNEL_SIZE_MAX vtkmodules.vtkImagingCore.vtkAbstractImageInterpolator vtkmodules.vtkImagingCore.vtkExtractVOI vtkmodules.vtkImagingCore.vtkGenericImageInterpolator vtkmodules.vtkImagingCore.vtkImageAppendComponents vtkmodules.vtkImagingCore.vtkImageBSplineCoefficients vtkmodules.vtkImagingCore.vtkImageBSplineInternals vtkmodules.vtkImagingCore.vtkImageBSplineInterpolator vtkmodules.vtkImagingCore.vtkImageBlend vtkmodules.vtkImagingCore.vtkImageBorderMode vtkmodules.vtkImagingCore.vtkImageCacheFilter vtkmodules.vtkImagingCore.vtkImageCast vtkmodules.vtkImagingCore.vtkImageChangeInformation vtkmodules.vtkImagingCore.vtkImageClip vtkmodules.vtkImagingCore.vtkImageConstantPad vtkmodules.vtkImagingCore.vtkImageDataStreamer vtkmodules.vtkImagingCore.vtkImageDecomposeFilter vtkmodules.vtkImagingCore.vtkImageDifference vtkmodules.vtkImagingCore.vtkImageExtractComponents vtkmodules.vtkImagingCore.vtkImageFlip vtkmodules.vtkImagingCore.vtkImageInterpolator vtkmodules.vtkImagingCore.vtkImageIterateFilter vtkmodules.vtkImagingCore.vtkImageMagnify vtkmodules.vtkImagingCore.vtkImageMapToColors vtkmodules.vtkImagingCore.vtkImageMask vtkmodules.vtkImagingCore.vtkImageMirrorPad vtkmodules.vtkImagingCore.vtkImagePadFilter vtkmodules.vtkImagingCore.vtkImagePermute vtkmodules.vtkImagingCore.vtkImagePointDataIterator vtkmodules.vtkImagingCore.vtkImagePointIterator vtkmodules.vtkImagingCore.vtkImageProbeFilter vtkmodules.vtkImagingCore.vtkImageResample vtkmodules.vtkImagingCore.vtkImageResize vtkmodules.vtkImagingCore.vtkImageReslice vtkmodules.vtkImagingCore.vtkImageResliceToColors vtkmodules.vtkImagingCore.vtkImageShiftScale vtkmodules.vtkImagingCore.vtkImageShrink3D vtkmodules.vtkImagingCore.vtkImageSincInterpolator vtkmodules.vtkImagingCore.vtkImageStencilAlgorithm vtkmodules.vtkImagingCore.vtkImageStencilData vtkmodules.vtkImagingCore.vtkImageStencilRaster vtkmodules.vtkImagingCore.vtkImageStencilSource vtkmodules.vtkImagingCore.vtkImageThreshold vtkmodules.vtkImagingCore.vtkImageTranslateExtent vtkmodules.vtkImagingCore.vtkImageWrapPad vtkmodules.vtkImagingCore.vtkRTAnalyticSource vtkmodules.vtkImagingFourier.vtkImageButterworthHighPass vtkmodules.vtkImagingFourier.vtkImageButterworthLowPass vtkmodules.vtkImagingFourier.vtkImageComplex_t vtkmodules.vtkImagingFourier.vtkImageFFT vtkmodules.vtkImagingFourier.vtkImageFourierCenter vtkmodules.vtkImagingFourier.vtkImageFourierFilter vtkmodules.vtkImagingFourier.vtkImageIdealHighPass vtkmodules.vtkImagingFourier.vtkImageIdealLowPass vtkmodules.vtkImagingFourier.vtkImageRFFT vtkmodules.vtkImagingGeneral.VTK_EDT_SAITO vtkmodules.vtkImagingGeneral.VTK_EDT_SAITO_CACHED vtkmodules.vtkImagingGeneral.vtkImageAnisotropicDiffusion2D vtkmodules.vtkImagingGeneral.vtkImageAnisotropicDiffusion3D vtkmodules.vtkImagingGeneral.vtkImageCheckerboard vtkmodules.vtkImagingGeneral.vtkImageCityBlockDistance vtkmodules.vtkImagingGeneral.vtkImageConvolve vtkmodules.vtkImagingGeneral.vtkImageCorrelation vtkmodules.vtkImagingGeneral.vtkImageEuclideanDistance vtkmodules.vtkImagingGeneral.vtkImageEuclideanToPolar vtkmodules.vtkImagingGeneral.vtkImageGaussianSmooth vtkmodules.vtkImagingGeneral.vtkImageGradient vtkmodules.vtkImagingGeneral.vtkImageGradientMagnitude vtkmodules.vtkImagingGeneral.vtkImageHybridMedian2D vtkmodules.vtkImagingGeneral.vtkImageLaplacian vtkmodules.vtkImagingGeneral.vtkImageMedian3D vtkmodules.vtkImagingGeneral.vtkImageNormalize vtkmodules.vtkImagingGeneral.vtkImageRange3D vtkmodules.vtkImagingGeneral.vtkImageSeparableConvolution vtkmodules.vtkImagingGeneral.vtkImageSlab vtkmodules.vtkImagingGeneral.vtkImageSlabReslice vtkmodules.vtkImagingGeneral.vtkImageSobel2D vtkmodules.vtkImagingGeneral.vtkImageSobel3D vtkmodules.vtkImagingGeneral.vtkImageSpatialAlgorithm vtkmodules.vtkImagingGeneral.vtkImageVariance3D vtkmodules.vtkImagingHybrid.VTK_ACCUMULATION_MODE_MAX vtkmodules.vtkImagingHybrid.VTK_ACCUMULATION_MODE_MIN vtkmodules.vtkImagingHybrid.VTK_ACCUMULATION_MODE_SUM vtkmodules.vtkImagingHybrid.VTK_WIPE_HORIZONTAL vtkmodules.vtkImagingHybrid.VTK_WIPE_LOWER_LEFT vtkmodules.vtkImagingHybrid.VTK_WIPE_LOWER_RIGHT vtkmodules.vtkImagingHybrid.VTK_WIPE_QUAD vtkmodules.vtkImagingHybrid.VTK_WIPE_UPPER_LEFT vtkmodules.vtkImagingHybrid.VTK_WIPE_UPPER_RIGHT vtkmodules.vtkImagingHybrid.VTK_WIPE_VERTICAL vtkmodules.vtkImagingHybrid.vtkBooleanTexture vtkmodules.vtkImagingHybrid.vtkCheckerboardSplatter vtkmodules.vtkImagingHybrid.vtkFastSplatter vtkmodules.vtkImagingHybrid.vtkGaussianSplatter vtkmodules.vtkImagingHybrid.vtkImageCursor3D vtkmodules.vtkImagingHybrid.vtkImageRectilinearWipe vtkmodules.vtkImagingHybrid.vtkImageToPoints vtkmodules.vtkImagingHybrid.vtkPointLoad vtkmodules.vtkImagingHybrid.vtkSampleFunction vtkmodules.vtkImagingHybrid.vtkShepardMethod vtkmodules.vtkImagingHybrid.vtkSliceCubes vtkmodules.vtkImagingHybrid.vtkSurfaceReconstructionFilter vtkmodules.vtkImagingHybrid.vtkTriangularTexture vtkmodules.vtkImagingHybrid.vtkVoxelModeller vtkmodules.vtkImagingMath.VTK_ABS vtkmodules.vtkImagingMath.VTK_ADD vtkmodules.vtkImagingMath.VTK_ADDC vtkmodules.vtkImagingMath.VTK_AND vtkmodules.vtkImagingMath.VTK_ATAN vtkmodules.vtkImagingMath.VTK_ATAN2 vtkmodules.vtkImagingMath.VTK_COMPLEX_MULTIPLY vtkmodules.vtkImagingMath.VTK_CONJUGATE vtkmodules.vtkImagingMath.VTK_COS vtkmodules.vtkImagingMath.VTK_DIVIDE vtkmodules.vtkImagingMath.VTK_EXP vtkmodules.vtkImagingMath.VTK_INVERT vtkmodules.vtkImagingMath.VTK_LOG vtkmodules.vtkImagingMath.VTK_MAX vtkmodules.vtkImagingMath.VTK_MIN vtkmodules.vtkImagingMath.VTK_MULTIPLY vtkmodules.vtkImagingMath.VTK_MULTIPLYBYK vtkmodules.vtkImagingMath.VTK_NAND vtkmodules.vtkImagingMath.VTK_NOP vtkmodules.vtkImagingMath.VTK_NOR vtkmodules.vtkImagingMath.VTK_NOT vtkmodules.vtkImagingMath.VTK_OR vtkmodules.vtkImagingMath.VTK_REPLACECBYK vtkmodules.vtkImagingMath.VTK_SIN vtkmodules.vtkImagingMath.VTK_SQR vtkmodules.vtkImagingMath.VTK_SQRT vtkmodules.vtkImagingMath.VTK_SUBTRACT vtkmodules.vtkImagingMath.VTK_XOR vtkmodules.vtkImagingMath.vtkImageDivergence vtkmodules.vtkImagingMath.vtkImageDotProduct vtkmodules.vtkImagingMath.vtkImageLogarithmicScale vtkmodules.vtkImagingMath.vtkImageLogic vtkmodules.vtkImagingMath.vtkImageMagnitude vtkmodules.vtkImagingMath.vtkImageMaskBits vtkmodules.vtkImagingMath.vtkImageMathematics vtkmodules.vtkImagingMath.vtkImageWeightedSum vtkmodules.vtkImagingMorphological.VTK_IMAGE_NON_MAXIMUM_SUPPRESSION_MAGNITUDE_INPUT vtkmodules.vtkImagingMorphological.VTK_IMAGE_NON_MAXIMUM_SUPPRESSION_VECTOR_INPUT vtkmodules.vtkImagingMorphological.vtkImage2DIslandPixel_t vtkmodules.vtkImagingMorphological.vtkImageConnectivityFilter vtkmodules.vtkImagingMorphological.vtkImageConnector vtkmodules.vtkImagingMorphological.vtkImageConnectorSeed vtkmodules.vtkImagingMorphological.vtkImageContinuousDilate3D vtkmodules.vtkImagingMorphological.vtkImageContinuousErode3D vtkmodules.vtkImagingMorphological.vtkImageDilateErode3D vtkmodules.vtkImagingMorphological.vtkImageIslandRemoval2D vtkmodules.vtkImagingMorphological.vtkImageNonMaximumSuppression vtkmodules.vtkImagingMorphological.vtkImageOpenClose3D vtkmodules.vtkImagingMorphological.vtkImageSeedConnectivity vtkmodules.vtkImagingMorphological.vtkImageSkeleton2D vtkmodules.vtkImagingMorphological.vtkImageThresholdConnectivity vtkmodules.vtkImagingOpenGL2.vtkOpenGLImageGradient vtkmodules.vtkImagingSources.vtkImageCanvasSource2D vtkmodules.vtkImagingSources.vtkImageEllipsoidSource vtkmodules.vtkImagingSources.vtkImageGaussianSource vtkmodules.vtkImagingSources.vtkImageGridSource vtkmodules.vtkImagingSources.vtkImageMandelbrotSource vtkmodules.vtkImagingSources.vtkImageNoiseSource vtkmodules.vtkImagingSources.vtkImageSinusoidSource vtkmodules.vtkImagingStatistics.vtkImageAccumulate vtkmodules.vtkImagingStatistics.vtkImageHistogram vtkmodules.vtkImagingStatistics.vtkImageHistogramStatistics vtkmodules.vtkImagingStencil.vtkImageStencil vtkmodules.vtkImagingStencil.vtkImageStencilToImage vtkmodules.vtkImagingStencil.vtkImageToImageStencil vtkmodules.vtkImagingStencil.vtkImplicitFunctionToImageStencil vtkmodules.vtkImagingStencil.vtkLassoStencilSource vtkmodules.vtkImagingStencil.vtkPolyDataToImageStencil vtkmodules.vtkImagingStencil.vtkROIStencilSource vtkmodules.vtkInfovisCore.vtkAddMembershipArray vtkmodules.vtkInfovisCore.vtkAdjacencyMatrixToEdgeTable vtkmodules.vtkInfovisCore.vtkArrayNorm vtkmodules.vtkInfovisCore.vtkArrayToTable vtkmodules.vtkInfovisCore.vtkCollapseGraph vtkmodules.vtkInfovisCore.vtkCollapseVerticesByArray vtkmodules.vtkInfovisCore.vtkContinuousScatterplot vtkmodules.vtkInfovisCore.vtkDataObjectToTable vtkmodules.vtkInfovisCore.vtkDotProductSimilarity vtkmodules.vtkInfovisCore.vtkEdgeCenters vtkmodules.vtkInfovisCore.vtkExpandSelectedGraph vtkmodules.vtkInfovisCore.vtkExtractSelectedGraph vtkmodules.vtkInfovisCore.vtkExtractSelectedTree vtkmodules.vtkInfovisCore.vtkGenerateIndexArray vtkmodules.vtkInfovisCore.vtkGraphHierarchicalBundleEdges vtkmodules.vtkInfovisCore.vtkGroupLeafVertices vtkmodules.vtkInfovisCore.vtkKCoreDecomposition vtkmodules.vtkInfovisCore.vtkMergeColumns vtkmodules.vtkInfovisCore.vtkMergeGraphs vtkmodules.vtkInfovisCore.vtkMergeTables vtkmodules.vtkInfovisCore.vtkMutableGraphHelper vtkmodules.vtkInfovisCore.vtkNetworkHierarchy vtkmodules.vtkInfovisCore.vtkPipelineGraphSource vtkmodules.vtkInfovisCore.vtkPruneTreeFilter vtkmodules.vtkInfovisCore.vtkRandomGraphSource vtkmodules.vtkInfovisCore.vtkReduceTable vtkmodules.vtkInfovisCore.vtkRemoveHiddenData vtkmodules.vtkInfovisCore.vtkRemoveIsolatedVertices vtkmodules.vtkInfovisCore.vtkSparseArrayToTable vtkmodules.vtkInfovisCore.vtkStreamGraph vtkmodules.vtkInfovisCore.vtkStringToCategory vtkmodules.vtkInfovisCore.vtkStringToNumeric vtkmodules.vtkInfovisCore.vtkTableToArray vtkmodules.vtkInfovisCore.vtkTableToGraph vtkmodules.vtkInfovisCore.vtkTableToSparseArray vtkmodules.vtkInfovisCore.vtkTableToTreeFilter vtkmodules.vtkInfovisCore.vtkThresholdGraph vtkmodules.vtkInfovisCore.vtkThresholdTable vtkmodules.vtkInfovisCore.vtkTransferAttributes vtkmodules.vtkInfovisCore.vtkTransposeMatrix vtkmodules.vtkInfovisCore.vtkTreeDifferenceFilter vtkmodules.vtkInfovisCore.vtkTreeFieldAggregator vtkmodules.vtkInfovisCore.vtkTreeLevelsFilter vtkmodules.vtkInfovisCore.vtkVertexDegree vtkmodules.vtkInfovisCore.vtkWordCloud vtkmodules.vtkInfovisLayout.vtkArcParallelEdgeStrategy vtkmodules.vtkInfovisLayout.vtkAreaLayout vtkmodules.vtkInfovisLayout.vtkAreaLayoutStrategy vtkmodules.vtkInfovisLayout.vtkAssignCoordinates vtkmodules.vtkInfovisLayout.vtkAssignCoordinatesLayoutStrategy vtkmodules.vtkInfovisLayout.vtkAttributeClustering2DLayoutStrategy vtkmodules.vtkInfovisLayout.vtkBoxLayoutStrategy vtkmodules.vtkInfovisLayout.vtkCirclePackFrontChainLayoutStrategy vtkmodules.vtkInfovisLayout.vtkCirclePackLayout vtkmodules.vtkInfovisLayout.vtkCirclePackLayoutStrategy vtkmodules.vtkInfovisLayout.vtkCirclePackToPolyData vtkmodules.vtkInfovisLayout.vtkCircularLayoutStrategy vtkmodules.vtkInfovisLayout.vtkClustering2DLayoutStrategy vtkmodules.vtkInfovisLayout.vtkCommunity2DLayoutStrategy vtkmodules.vtkInfovisLayout.vtkConeLayoutStrategy vtkmodules.vtkInfovisLayout.vtkConstrained2DLayoutStrategy vtkmodules.vtkInfovisLayout.vtkCosmicTreeLayoutStrategy vtkmodules.vtkInfovisLayout.vtkEdgeLayout vtkmodules.vtkInfovisLayout.vtkEdgeLayoutStrategy vtkmodules.vtkInfovisLayout.vtkFast2DLayoutStrategy vtkmodules.vtkInfovisLayout.vtkForceDirectedLayoutStrategy vtkmodules.vtkInfovisLayout.vtkGeoEdgeStrategy vtkmodules.vtkInfovisLayout.vtkGeoMath vtkmodules.vtkInfovisLayout.vtkGraphLayout vtkmodules.vtkInfovisLayout.vtkGraphLayoutStrategy vtkmodules.vtkInfovisLayout.vtkIncrementalForceLayout vtkmodules.vtkInfovisLayout.vtkKCoreLayout vtkmodules.vtkInfovisLayout.vtkPassThroughEdgeStrategy vtkmodules.vtkInfovisLayout.vtkPassThroughLayoutStrategy vtkmodules.vtkInfovisLayout.vtkPerturbCoincidentVertices vtkmodules.vtkInfovisLayout.vtkRandomLayoutStrategy vtkmodules.vtkInfovisLayout.vtkSimple2DLayoutStrategy vtkmodules.vtkInfovisLayout.vtkSimple3DCirclesStrategy vtkmodules.vtkInfovisLayout.vtkSliceAndDiceLayoutStrategy vtkmodules.vtkInfovisLayout.vtkSpanTreeLayoutStrategy vtkmodules.vtkInfovisLayout.vtkSplineGraphEdges vtkmodules.vtkInfovisLayout.vtkSquarifyLayoutStrategy vtkmodules.vtkInfovisLayout.vtkStackedTreeLayoutStrategy vtkmodules.vtkInfovisLayout.vtkTreeLayoutStrategy vtkmodules.vtkInfovisLayout.vtkTreeMapLayout vtkmodules.vtkInfovisLayout.vtkTreeMapLayoutStrategy vtkmodules.vtkInfovisLayout.vtkTreeMapToPolyData vtkmodules.vtkInfovisLayout.vtkTreeOrbitLayoutStrategy vtkmodules.vtkInfovisLayout.vtkTreeRingToPolyData vtkmodules.vtkInteractionImage.vtkImageViewer vtkmodules.vtkInteractionImage.vtkImageViewer2 vtkmodules.vtkInteractionImage.vtkResliceImageViewer vtkmodules.vtkInteractionImage.vtkResliceImageViewerMeasurements vtkmodules.vtkInteractionStyle.VTKIS_ACTOR vtkmodules.vtkInteractionStyle.VTKIS_CAMERA vtkmodules.vtkInteractionStyle.VTKIS_IMAGE2D vtkmodules.vtkInteractionStyle.VTKIS_IMAGE3D vtkmodules.vtkInteractionStyle.VTKIS_IMAGE_SLICING vtkmodules.vtkInteractionStyle.VTKIS_JOYSTICK vtkmodules.vtkInteractionStyle.VTKIS_SLICE vtkmodules.vtkInteractionStyle.VTKIS_TRACKBALL vtkmodules.vtkInteractionStyle.VTKIS_USERINTERACTION vtkmodules.vtkInteractionStyle.VTKIS_WINDOW_LEVEL vtkmodules.vtkInteractionStyle.vtkInteractorStyleDrawPolygon vtkmodules.vtkInteractionStyle.vtkInteractorStyleFlight vtkmodules.vtkInteractionStyle.vtkInteractorStyleImage vtkmodules.vtkInteractionStyle.vtkInteractorStyleJoystickActor vtkmodules.vtkInteractionStyle.vtkInteractorStyleJoystickCamera vtkmodules.vtkInteractionStyle.vtkInteractorStyleMultiTouchCamera vtkmodules.vtkInteractionStyle.vtkInteractorStyleRubberBand2D vtkmodules.vtkInteractionStyle.vtkInteractorStyleRubberBand3D vtkmodules.vtkInteractionStyle.vtkInteractorStyleRubberBandPick vtkmodules.vtkInteractionStyle.vtkInteractorStyleRubberBandZoom vtkmodules.vtkInteractionStyle.vtkInteractorStyleSwitch vtkmodules.vtkInteractionStyle.vtkInteractorStyleTerrain vtkmodules.vtkInteractionStyle.vtkInteractorStyleTrackball vtkmodules.vtkInteractionStyle.vtkInteractorStyleTrackballActor vtkmodules.vtkInteractionStyle.vtkInteractorStyleTrackballCamera vtkmodules.vtkInteractionStyle.vtkInteractorStyleUnicam vtkmodules.vtkInteractionStyle.vtkInteractorStyleUser vtkmodules.vtkInteractionStyle.vtkParallelCoordinatesInteractorStyle vtkmodules.vtkInteractionWidgets.VTK_CUBIC_RESLICE vtkmodules.vtkInteractionWidgets.VTK_IMAGE_PLANE_WIDGET_MAX_TEXTBUFF vtkmodules.vtkInteractionWidgets.VTK_ITW_PROJECTION_XY vtkmodules.vtkInteractionWidgets.VTK_ITW_PROJECTION_XZ vtkmodules.vtkInteractionWidgets.VTK_ITW_PROJECTION_YZ vtkmodules.vtkInteractionWidgets.VTK_ITW_SNAP_CELLS vtkmodules.vtkInteractionWidgets.VTK_ITW_SNAP_POINTS vtkmodules.vtkInteractionWidgets.VTK_LINEAR_RESLICE vtkmodules.vtkInteractionWidgets.VTK_MAX_CYL_RESOLUTION vtkmodules.vtkInteractionWidgets.VTK_NEAREST_RESLICE vtkmodules.vtkInteractionWidgets.VTK_PLANE_OFF vtkmodules.vtkInteractionWidgets.VTK_PLANE_OUTLINE vtkmodules.vtkInteractionWidgets.VTK_PLANE_SURFACE vtkmodules.vtkInteractionWidgets.VTK_PLANE_WIREFRAME vtkmodules.vtkInteractionWidgets.VTK_PROJECTION_OBLIQUE vtkmodules.vtkInteractionWidgets.VTK_PROJECTION_XY vtkmodules.vtkInteractionWidgets.VTK_PROJECTION_XZ vtkmodules.vtkInteractionWidgets.VTK_PROJECTION_YZ vtkmodules.vtkInteractionWidgets.VTK_RESLICE_CURSOR_REPRESENTATION_MAX_TEXTBUFF vtkmodules.vtkInteractionWidgets.VTK_SPHERE_OFF vtkmodules.vtkInteractionWidgets.VTK_SPHERE_SURFACE vtkmodules.vtkInteractionWidgets.VTK_SPHERE_WIREFRAME vtkmodules.vtkInteractionWidgets.vtk3DCursorRepresentation vtkmodules.vtkInteractionWidgets.vtk3DCursorWidget vtkmodules.vtkInteractionWidgets.vtk3DWidget vtkmodules.vtkInteractionWidgets.vtkAbstractPolygonalHandleRepresentation3D vtkmodules.vtkInteractionWidgets.vtkAbstractSplineRepresentation vtkmodules.vtkInteractionWidgets.vtkAbstractWidget vtkmodules.vtkInteractionWidgets.vtkAffineRepresentation vtkmodules.vtkInteractionWidgets.vtkAffineRepresentation2D vtkmodules.vtkInteractionWidgets.vtkAffineWidget vtkmodules.vtkInteractionWidgets.vtkAngleRepresentation vtkmodules.vtkInteractionWidgets.vtkAngleRepresentation2D vtkmodules.vtkInteractionWidgets.vtkAngleRepresentation3D vtkmodules.vtkInteractionWidgets.vtkAngleWidget vtkmodules.vtkInteractionWidgets.vtkAxesTransformRepresentation vtkmodules.vtkInteractionWidgets.vtkAxesTransformWidget vtkmodules.vtkInteractionWidgets.vtkBalloonRepresentation vtkmodules.vtkInteractionWidgets.vtkBalloonWidget vtkmodules.vtkInteractionWidgets.vtkBezierContourLineInterpolator vtkmodules.vtkInteractionWidgets.vtkBiDimensionalRepresentation vtkmodules.vtkInteractionWidgets.vtkBiDimensionalRepresentation2D vtkmodules.vtkInteractionWidgets.vtkBiDimensionalWidget vtkmodules.vtkInteractionWidgets.vtkBorderRepresentation vtkmodules.vtkInteractionWidgets.vtkBorderWidget vtkmodules.vtkInteractionWidgets.vtkBoundedPlanePointPlacer vtkmodules.vtkInteractionWidgets.vtkBoxRepresentation vtkmodules.vtkInteractionWidgets.vtkBoxWidget vtkmodules.vtkInteractionWidgets.vtkBoxWidget2 vtkmodules.vtkInteractionWidgets.vtkBrokenLineWidget vtkmodules.vtkInteractionWidgets.vtkButtonRepresentation vtkmodules.vtkInteractionWidgets.vtkButtonWidget vtkmodules.vtkInteractionWidgets.vtkCamera3DRepresentation vtkmodules.vtkInteractionWidgets.vtkCamera3DWidget vtkmodules.vtkInteractionWidgets.vtkCameraHandleSource vtkmodules.vtkInteractionWidgets.vtkCameraOrientationRepresentation vtkmodules.vtkInteractionWidgets.vtkCameraOrientationWidget vtkmodules.vtkInteractionWidgets.vtkCameraPathRepresentation vtkmodules.vtkInteractionWidgets.vtkCameraPathWidget vtkmodules.vtkInteractionWidgets.vtkCameraRepresentation vtkmodules.vtkInteractionWidgets.vtkCameraWidget vtkmodules.vtkInteractionWidgets.vtkCaptionRepresentation vtkmodules.vtkInteractionWidgets.vtkCaptionWidget vtkmodules.vtkInteractionWidgets.vtkCellCentersPointPlacer vtkmodules.vtkInteractionWidgets.vtkCenteredSliderRepresentation vtkmodules.vtkInteractionWidgets.vtkCenteredSliderWidget vtkmodules.vtkInteractionWidgets.vtkCheckerboardRepresentation vtkmodules.vtkInteractionWidgets.vtkCheckerboardWidget vtkmodules.vtkInteractionWidgets.vtkClosedSurfacePointPlacer vtkmodules.vtkInteractionWidgets.vtkCompassRepresentation vtkmodules.vtkInteractionWidgets.vtkCompassWidget vtkmodules.vtkInteractionWidgets.vtkConstrainedPointHandleRepresentation vtkmodules.vtkInteractionWidgets.vtkContinuousValueWidget vtkmodules.vtkInteractionWidgets.vtkContinuousValueWidgetRepresentation vtkmodules.vtkInteractionWidgets.vtkContourLineInterpolator vtkmodules.vtkInteractionWidgets.vtkContourRepresentation vtkmodules.vtkInteractionWidgets.vtkContourRepresentationInternals vtkmodules.vtkInteractionWidgets.vtkContourRepresentationNode vtkmodules.vtkInteractionWidgets.vtkContourRepresentationPoint vtkmodules.vtkInteractionWidgets.vtkContourWidget vtkmodules.vtkInteractionWidgets.vtkCoordinateFrameRepresentation vtkmodules.vtkInteractionWidgets.vtkCoordinateFrameWidget vtkmodules.vtkInteractionWidgets.vtkCurveRepresentation vtkmodules.vtkInteractionWidgets.vtkDijkstraImageContourLineInterpolator vtkmodules.vtkInteractionWidgets.vtkDisplaySizedImplicitPlaneRepresentation vtkmodules.vtkInteractionWidgets.vtkDisplaySizedImplicitPlaneWidget vtkmodules.vtkInteractionWidgets.vtkDistanceRepresentation vtkmodules.vtkInteractionWidgets.vtkDistanceRepresentation2D vtkmodules.vtkInteractionWidgets.vtkDistanceRepresentation3D vtkmodules.vtkInteractionWidgets.vtkDistanceWidget vtkmodules.vtkInteractionWidgets.vtkEllipsoidTensorProbeRepresentation vtkmodules.vtkInteractionWidgets.vtkEqualizerContextItem vtkmodules.vtkInteractionWidgets.vtkEvent vtkmodules.vtkInteractionWidgets.vtkFinitePlaneRepresentation vtkmodules.vtkInteractionWidgets.vtkFinitePlaneWidget vtkmodules.vtkInteractionWidgets.vtkFixedSizeHandleRepresentation3D vtkmodules.vtkInteractionWidgets.vtkFocalPlaneContourRepresentation vtkmodules.vtkInteractionWidgets.vtkFocalPlanePointPlacer vtkmodules.vtkInteractionWidgets.vtkHandleRepresentation vtkmodules.vtkInteractionWidgets.vtkHandleWidget vtkmodules.vtkInteractionWidgets.vtkHoverWidget vtkmodules.vtkInteractionWidgets.vtkImageActorPointPlacer vtkmodules.vtkInteractionWidgets.vtkImageCroppingRegionsWidget vtkmodules.vtkInteractionWidgets.vtkImageOrthoPlanes vtkmodules.vtkInteractionWidgets.vtkImagePlaneWidget vtkmodules.vtkInteractionWidgets.vtkImageTracerWidget vtkmodules.vtkInteractionWidgets.vtkImplicitCylinderRepresentation vtkmodules.vtkInteractionWidgets.vtkImplicitCylinderWidget vtkmodules.vtkInteractionWidgets.vtkImplicitImageRepresentation vtkmodules.vtkInteractionWidgets.vtkImplicitPlaneRepresentation vtkmodules.vtkInteractionWidgets.vtkImplicitPlaneWidget vtkmodules.vtkInteractionWidgets.vtkImplicitPlaneWidget2 vtkmodules.vtkInteractionWidgets.vtkLightRepresentation vtkmodules.vtkInteractionWidgets.vtkLightWidget vtkmodules.vtkInteractionWidgets.vtkLineRepresentation vtkmodules.vtkInteractionWidgets.vtkLineWidget vtkmodules.vtkInteractionWidgets.vtkLineWidget2 vtkmodules.vtkInteractionWidgets.vtkLinearContourLineInterpolator vtkmodules.vtkInteractionWidgets.vtkLogoRepresentation vtkmodules.vtkInteractionWidgets.vtkLogoWidget vtkmodules.vtkInteractionWidgets.vtkMagnifierRepresentation vtkmodules.vtkInteractionWidgets.vtkMagnifierWidget vtkmodules.vtkInteractionWidgets.vtkMeasurementCubeHandleRepresentation3D vtkmodules.vtkInteractionWidgets.vtkOrientationMarkerWidget vtkmodules.vtkInteractionWidgets.vtkOrientationRepresentation vtkmodules.vtkInteractionWidgets.vtkOrientationWidget vtkmodules.vtkInteractionWidgets.vtkOrientedGlyphContourRepresentation vtkmodules.vtkInteractionWidgets.vtkOrientedGlyphFocalPlaneContourRepresentation vtkmodules.vtkInteractionWidgets.vtkOrientedPolygonalHandleRepresentation3D vtkmodules.vtkInteractionWidgets.vtkParallelopipedRepresentation vtkmodules.vtkInteractionWidgets.vtkParallelopipedWidget vtkmodules.vtkInteractionWidgets.vtkPlaneWidget vtkmodules.vtkInteractionWidgets.vtkPlaybackRepresentation vtkmodules.vtkInteractionWidgets.vtkPlaybackWidget vtkmodules.vtkInteractionWidgets.vtkPointCloudRepresentation vtkmodules.vtkInteractionWidgets.vtkPointCloudWidget vtkmodules.vtkInteractionWidgets.vtkPointHandleRepresentation2D vtkmodules.vtkInteractionWidgets.vtkPointHandleRepresentation3D vtkmodules.vtkInteractionWidgets.vtkPointPlacer vtkmodules.vtkInteractionWidgets.vtkPointWidget vtkmodules.vtkInteractionWidgets.vtkPolyDataContourLineInterpolator vtkmodules.vtkInteractionWidgets.vtkPolyDataPointPlacer vtkmodules.vtkInteractionWidgets.vtkPolyDataSourceWidget vtkmodules.vtkInteractionWidgets.vtkPolyLineRepresentation vtkmodules.vtkInteractionWidgets.vtkPolyLineWidget vtkmodules.vtkInteractionWidgets.vtkPolygonalHandleRepresentation3D vtkmodules.vtkInteractionWidgets.vtkPolygonalSurfaceContourLineInterpolator vtkmodules.vtkInteractionWidgets.vtkPolygonalSurfacePointPlacer vtkmodules.vtkInteractionWidgets.vtkPolygonalSurfacePointPlacerNode vtkmodules.vtkInteractionWidgets.vtkProgressBarRepresentation vtkmodules.vtkInteractionWidgets.vtkProgressBarWidget vtkmodules.vtkInteractionWidgets.vtkProp3DButtonRepresentation vtkmodules.vtkInteractionWidgets.vtkRectilinearWipeRepresentation vtkmodules.vtkInteractionWidgets.vtkRectilinearWipeWidget vtkmodules.vtkInteractionWidgets.vtkResliceCursor vtkmodules.vtkInteractionWidgets.vtkResliceCursorActor vtkmodules.vtkInteractionWidgets.vtkResliceCursorLineRepresentation vtkmodules.vtkInteractionWidgets.vtkResliceCursorPicker vtkmodules.vtkInteractionWidgets.vtkResliceCursorPolyDataAlgorithm vtkmodules.vtkInteractionWidgets.vtkResliceCursorRepresentation vtkmodules.vtkInteractionWidgets.vtkResliceCursorThickLineRepresentation vtkmodules.vtkInteractionWidgets.vtkResliceCursorWidget vtkmodules.vtkInteractionWidgets.vtkScalarBarRepresentation vtkmodules.vtkInteractionWidgets.vtkScalarBarWidget vtkmodules.vtkInteractionWidgets.vtkSeedRepresentation vtkmodules.vtkInteractionWidgets.vtkSeedWidget vtkmodules.vtkInteractionWidgets.vtkSliderRepresentation vtkmodules.vtkInteractionWidgets.vtkSliderRepresentation2D vtkmodules.vtkInteractionWidgets.vtkSliderRepresentation3D vtkmodules.vtkInteractionWidgets.vtkSliderWidget vtkmodules.vtkInteractionWidgets.vtkSphereHandleRepresentation vtkmodules.vtkInteractionWidgets.vtkSphereRepresentation vtkmodules.vtkInteractionWidgets.vtkSphereWidget vtkmodules.vtkInteractionWidgets.vtkSphereWidget2 vtkmodules.vtkInteractionWidgets.vtkSplineRepresentation vtkmodules.vtkInteractionWidgets.vtkSplineWidget vtkmodules.vtkInteractionWidgets.vtkSplineWidget2 vtkmodules.vtkInteractionWidgets.vtkTensorProbeRepresentation vtkmodules.vtkInteractionWidgets.vtkTensorProbeWidget vtkmodules.vtkInteractionWidgets.vtkTensorRepresentation vtkmodules.vtkInteractionWidgets.vtkTensorWidget vtkmodules.vtkInteractionWidgets.vtkTerrainContourLineInterpolator vtkmodules.vtkInteractionWidgets.vtkTerrainDataPointPlacer vtkmodules.vtkInteractionWidgets.vtkTextRepresentation vtkmodules.vtkInteractionWidgets.vtkTextWidget vtkmodules.vtkInteractionWidgets.vtkTexturedButtonRepresentation vtkmodules.vtkInteractionWidgets.vtkTexturedButtonRepresentation2D vtkmodules.vtkInteractionWidgets.vtkWidgetCallbackMapper vtkmodules.vtkInteractionWidgets.vtkWidgetEvent vtkmodules.vtkInteractionWidgets.vtkWidgetEventTranslator vtkmodules.vtkInteractionWidgets.vtkWidgetRepresentation vtkmodules.vtkInteractionWidgets.vtkWidgetSet vtkmodules.vtkInteractionWidgets.vtkXYPlotWidget vtkmodules.vtkPythonContext2D.vtkPythonItem vtkmodules.vtkRenderingAnnotation.VTK_IV_COLUMN vtkmodules.vtkRenderingAnnotation.VTK_IV_ROW vtkmodules.vtkRenderingAnnotation.VTK_ORIENT_HORIZONTAL vtkmodules.vtkRenderingAnnotation.VTK_ORIENT_VERTICAL vtkmodules.vtkRenderingAnnotation.VTK_PLOT_FIELD_DATA vtkmodules.vtkRenderingAnnotation.VTK_PLOT_NORMALS vtkmodules.vtkRenderingAnnotation.VTK_PLOT_SCALARS vtkmodules.vtkRenderingAnnotation.VTK_PLOT_TCOORDS vtkmodules.vtkRenderingAnnotation.VTK_PLOT_TENSORS vtkmodules.vtkRenderingAnnotation.VTK_PLOT_VECTORS vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_ARC_LENGTH vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_COLUMN vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_INDEX vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_NORMALIZED_ARC_LENGTH vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_ROW vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_VALUE vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_Y_AXIS_HCENTER vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_Y_AXIS_TOP vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_Y_AXIS_VCENTER vtkmodules.vtkRenderingAnnotation.vtkAnnotatedCubeActor vtkmodules.vtkRenderingAnnotation.vtkArcPlotter vtkmodules.vtkRenderingAnnotation.vtkAxesActor vtkmodules.vtkRenderingAnnotation.vtkAxisActor vtkmodules.vtkRenderingAnnotation.vtkAxisActor2D vtkmodules.vtkRenderingAnnotation.vtkAxisFollower vtkmodules.vtkRenderingAnnotation.vtkBarChartActor vtkmodules.vtkRenderingAnnotation.vtkCaptionActor2D vtkmodules.vtkRenderingAnnotation.vtkConvexHull2D vtkmodules.vtkRenderingAnnotation.vtkCornerAnnotation vtkmodules.vtkRenderingAnnotation.vtkCubeAxesActor vtkmodules.vtkRenderingAnnotation.vtkCubeAxesActor2D vtkmodules.vtkRenderingAnnotation.vtkGraphAnnotationLayersFilter vtkmodules.vtkRenderingAnnotation.vtkLeaderActor2D vtkmodules.vtkRenderingAnnotation.vtkLegendBoxActor vtkmodules.vtkRenderingAnnotation.vtkLegendScaleActor vtkmodules.vtkRenderingAnnotation.vtkParallelCoordinatesActor vtkmodules.vtkRenderingAnnotation.vtkPieChartActor vtkmodules.vtkRenderingAnnotation.vtkPolarAxesActor vtkmodules.vtkRenderingAnnotation.vtkProp3DAxisFollower vtkmodules.vtkRenderingAnnotation.vtkScalarBarActor vtkmodules.vtkRenderingAnnotation.vtkSpiderPlotActor vtkmodules.vtkRenderingAnnotation.vtkXYPlotActor vtkmodules.vtkRenderingCellGrid.vtkDGOpenGLRenderer vtkmodules.vtkRenderingCellGrid.vtkOpenGLCellGridMapper vtkmodules.vtkRenderingCellGrid.vtkOpenGLCellGridRenderRequest vtkmodules.vtkRenderingContext2D.vtkAbstractContextBufferId vtkmodules.vtkRenderingContext2D.vtkAbstractContextItem vtkmodules.vtkRenderingContext2D.vtkBlockItem vtkmodules.vtkRenderingContext2D.vtkBrush vtkmodules.vtkRenderingContext2D.vtkContext2D vtkmodules.vtkRenderingContext2D.vtkContext3D vtkmodules.vtkRenderingContext2D.vtkContextActor vtkmodules.vtkRenderingContext2D.vtkContextClip vtkmodules.vtkRenderingContext2D.vtkContextDevice2D vtkmodules.vtkRenderingContext2D.vtkContextDevice3D vtkmodules.vtkRenderingContext2D.vtkContextItem vtkmodules.vtkRenderingContext2D.vtkContextKeyEvent vtkmodules.vtkRenderingContext2D.vtkContextMapper2D vtkmodules.vtkRenderingContext2D.vtkContextMouseEvent vtkmodules.vtkRenderingContext2D.vtkContextScene vtkmodules.vtkRenderingContext2D.vtkContextTransform vtkmodules.vtkRenderingContext2D.vtkImageItem vtkmodules.vtkRenderingContext2D.vtkLabeledContourPolyDataItem vtkmodules.vtkRenderingContext2D.vtkMarkerUtilities vtkmodules.vtkRenderingContext2D.vtkPen vtkmodules.vtkRenderingContext2D.vtkPolyDataItem vtkmodules.vtkRenderingContext2D.vtkPropItem vtkmodules.vtkRenderingContext2D.vtkTooltipItem vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLContextActor vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLContextBufferId vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLContextDevice2D vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLContextDevice3D vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLPropItem vtkmodules.vtkRenderingCore.VTKIS_ANIM_OFF vtkmodules.vtkRenderingCore.VTKIS_ANIM_ON vtkmodules.vtkRenderingCore.VTKIS_CLIP vtkmodules.vtkRenderingCore.VTKIS_DOLLY vtkmodules.vtkRenderingCore.VTKIS_ELEVATION vtkmodules.vtkRenderingCore.VTKIS_ENV_ROTATE vtkmodules.vtkRenderingCore.VTKIS_EXIT vtkmodules.vtkRenderingCore.VTKIS_FORWARDFLY vtkmodules.vtkRenderingCore.VTKIS_GESTURE vtkmodules.vtkRenderingCore.VTKIS_GROUNDMOVEMENT vtkmodules.vtkRenderingCore.VTKIS_LOAD_CAMERA_POSE vtkmodules.vtkRenderingCore.VTKIS_MENU vtkmodules.vtkRenderingCore.VTKIS_NONE vtkmodules.vtkRenderingCore.VTKIS_PAN vtkmodules.vtkRenderingCore.VTKIS_PICK vtkmodules.vtkRenderingCore.VTKIS_POSITION_PROP vtkmodules.vtkRenderingCore.VTKIS_REVERSEFLY vtkmodules.vtkRenderingCore.VTKIS_ROTATE vtkmodules.vtkRenderingCore.VTKIS_SPIN vtkmodules.vtkRenderingCore.VTKIS_START vtkmodules.vtkRenderingCore.VTKIS_TIMER vtkmodules.vtkRenderingCore.VTKIS_TOGGLE_DRAW_CONTROLS vtkmodules.vtkRenderingCore.VTKIS_TWO_POINTER vtkmodules.vtkRenderingCore.VTKIS_USCALE vtkmodules.vtkRenderingCore.VTKIS_ZOOM vtkmodules.vtkRenderingCore.VTKI_MAX_POINTERS vtkmodules.vtkRenderingCore.VTKI_TIMER_FIRST vtkmodules.vtkRenderingCore.VTKI_TIMER_UPDATE vtkmodules.vtkRenderingCore.VTK_BACKGROUND_LOCATION vtkmodules.vtkRenderingCore.VTK_CTF_DIVERGING vtkmodules.vtkRenderingCore.VTK_CTF_HSV vtkmodules.vtkRenderingCore.VTK_CTF_LAB vtkmodules.vtkRenderingCore.VTK_CTF_LAB_CIEDE2000 vtkmodules.vtkRenderingCore.VTK_CTF_LINEAR vtkmodules.vtkRenderingCore.VTK_CTF_LOG10 vtkmodules.vtkRenderingCore.VTK_CTF_RGB vtkmodules.vtkRenderingCore.VTK_CTF_STEP vtkmodules.vtkRenderingCore.VTK_CULLER_SORT_BACK_TO_FRONT vtkmodules.vtkRenderingCore.VTK_CULLER_SORT_FRONT_TO_BACK vtkmodules.vtkRenderingCore.VTK_CULLER_SORT_NONE vtkmodules.vtkRenderingCore.VTK_CURSOR_ARROW vtkmodules.vtkRenderingCore.VTK_CURSOR_CROSSHAIR vtkmodules.vtkRenderingCore.VTK_CURSOR_CUSTOM vtkmodules.vtkRenderingCore.VTK_CURSOR_DEFAULT vtkmodules.vtkRenderingCore.VTK_CURSOR_HAND vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZEALL vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZENE vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZENS vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZENW vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZESE vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZESW vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZEWE vtkmodules.vtkRenderingCore.VTK_DISPLAY vtkmodules.vtkRenderingCore.VTK_FLAT vtkmodules.vtkRenderingCore.VTK_FOREGROUND_LOCATION vtkmodules.vtkRenderingCore.VTK_GET_ARRAY_BY_ID vtkmodules.vtkRenderingCore.VTK_GET_ARRAY_BY_NAME vtkmodules.vtkRenderingCore.VTK_GOURAUD vtkmodules.vtkRenderingCore.VTK_LIGHT_TYPE_CAMERA_LIGHT vtkmodules.vtkRenderingCore.VTK_LIGHT_TYPE_HEADLIGHT vtkmodules.vtkRenderingCore.VTK_LIGHT_TYPE_SCENE_LIGHT vtkmodules.vtkRenderingCore.VTK_MARKER_CIRCLE vtkmodules.vtkRenderingCore.VTK_MARKER_CROSS vtkmodules.vtkRenderingCore.VTK_MARKER_DIAMOND vtkmodules.vtkRenderingCore.VTK_MARKER_NONE vtkmodules.vtkRenderingCore.VTK_MARKER_PLUS vtkmodules.vtkRenderingCore.VTK_MARKER_SQUARE vtkmodules.vtkRenderingCore.VTK_MARKER_UNKNOWN vtkmodules.vtkRenderingCore.VTK_MATERIALMODE_AMBIENT vtkmodules.vtkRenderingCore.VTK_MATERIALMODE_AMBIENT_AND_DIFFUSE vtkmodules.vtkRenderingCore.VTK_MATERIALMODE_DEFAULT vtkmodules.vtkRenderingCore.VTK_MATERIALMODE_DIFFUSE vtkmodules.vtkRenderingCore.VTK_NORMALIZED_DISPLAY vtkmodules.vtkRenderingCore.VTK_NORMALIZED_VIEWPORT vtkmodules.vtkRenderingCore.VTK_PBR vtkmodules.vtkRenderingCore.VTK_PHONG vtkmodules.vtkRenderingCore.VTK_POINTS vtkmodules.vtkRenderingCore.VTK_POSE vtkmodules.vtkRenderingCore.VTK_RESOLVE_OFF vtkmodules.vtkRenderingCore.VTK_RESOLVE_POLYGON_OFFSET vtkmodules.vtkRenderingCore.VTK_RESOLVE_SHIFT_ZBUFFER vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_DEFAULT vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_CELL_DATA vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_CELL_FIELD_DATA vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_FIELD_DATA vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_POINT_DATA vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_POINT_FIELD_DATA vtkmodules.vtkRenderingCore.VTK_STEREO_ANAGLYPH vtkmodules.vtkRenderingCore.VTK_STEREO_CHECKERBOARD vtkmodules.vtkRenderingCore.VTK_STEREO_CRYSTAL_EYES vtkmodules.vtkRenderingCore.VTK_STEREO_DRESDEN vtkmodules.vtkRenderingCore.VTK_STEREO_EMULATE vtkmodules.vtkRenderingCore.VTK_STEREO_FAKE vtkmodules.vtkRenderingCore.VTK_STEREO_INTERLACED vtkmodules.vtkRenderingCore.VTK_STEREO_LEFT vtkmodules.vtkRenderingCore.VTK_STEREO_RED_BLUE vtkmodules.vtkRenderingCore.VTK_STEREO_RIGHT vtkmodules.vtkRenderingCore.VTK_STEREO_SPLITVIEWPORT_HORIZONTAL vtkmodules.vtkRenderingCore.VTK_SURFACE vtkmodules.vtkRenderingCore.VTK_TEXTURE_QUALITY_16BIT vtkmodules.vtkRenderingCore.VTK_TEXTURE_QUALITY_32BIT vtkmodules.vtkRenderingCore.VTK_TEXTURE_QUALITY_DEFAULT vtkmodules.vtkRenderingCore.VTK_USERDEFINED vtkmodules.vtkRenderingCore.VTK_VIEW vtkmodules.vtkRenderingCore.VTK_VIEWPORT vtkmodules.vtkRenderingCore.VTK_WIREFRAME vtkmodules.vtkRenderingCore.VTK_WORLD vtkmodules.vtkRenderingCore.VTK_ZBUFFER vtkmodules.vtkRenderingCore.vtkAbstractHyperTreeGridMapper vtkmodules.vtkRenderingCore.vtkAbstractInteractionDevice vtkmodules.vtkRenderingCore.vtkAbstractMapper vtkmodules.vtkRenderingCore.vtkAbstractMapper3D vtkmodules.vtkRenderingCore.vtkAbstractPicker vtkmodules.vtkRenderingCore.vtkAbstractPropPicker vtkmodules.vtkRenderingCore.vtkAbstractRenderDevice vtkmodules.vtkRenderingCore.vtkAbstractVolumeMapper vtkmodules.vtkRenderingCore.vtkActor vtkmodules.vtkRenderingCore.vtkActor2D vtkmodules.vtkRenderingCore.vtkActor2DCollection vtkmodules.vtkRenderingCore.vtkActorCollection vtkmodules.vtkRenderingCore.vtkAreaPicker vtkmodules.vtkRenderingCore.vtkAssembly vtkmodules.vtkRenderingCore.vtkAssemblyNode vtkmodules.vtkRenderingCore.vtkAssemblyPath vtkmodules.vtkRenderingCore.vtkAssemblyPaths vtkmodules.vtkRenderingCore.vtkAvatar vtkmodules.vtkRenderingCore.vtkBackgroundColorMonitor vtkmodules.vtkRenderingCore.vtkBillboardTextActor3D vtkmodules.vtkRenderingCore.vtkCamera vtkmodules.vtkRenderingCore.vtkCameraActor vtkmodules.vtkRenderingCore.vtkCameraInterpolator vtkmodules.vtkRenderingCore.vtkCellCenterDepthSort vtkmodules.vtkRenderingCore.vtkCellGridMapper vtkmodules.vtkRenderingCore.vtkCellPicker vtkmodules.vtkRenderingCore.vtkColorTransferFunction vtkmodules.vtkRenderingCore.vtkCompositeDataDisplayAttributes vtkmodules.vtkRenderingCore.vtkCompositeDataDisplayAttributesLegacy vtkmodules.vtkRenderingCore.vtkCompositePolyDataMapper vtkmodules.vtkRenderingCore.vtkCompositePolyDataMapperDelegator vtkmodules.vtkRenderingCore.vtkCoordinate vtkmodules.vtkRenderingCore.vtkCuller vtkmodules.vtkRenderingCore.vtkCullerCollection vtkmodules.vtkRenderingCore.vtkDataSetMapper vtkmodules.vtkRenderingCore.vtkDiscretizableColorTransferFunction vtkmodules.vtkRenderingCore.vtkDistanceToCamera vtkmodules.vtkRenderingCore.vtkFXAAOptions vtkmodules.vtkRenderingCore.vtkFlagpoleLabel vtkmodules.vtkRenderingCore.vtkFollower vtkmodules.vtkRenderingCore.vtkFrameBufferObjectBase vtkmodules.vtkRenderingCore.vtkFrustumCoverageCuller vtkmodules.vtkRenderingCore.vtkGPUInfo vtkmodules.vtkRenderingCore.vtkGPUInfoList vtkmodules.vtkRenderingCore.vtkGPUInfoListArray vtkmodules.vtkRenderingCore.vtkGenericVertexAttributeMapping vtkmodules.vtkRenderingCore.vtkGlyph3DMapper vtkmodules.vtkRenderingCore.vtkGraphMapper vtkmodules.vtkRenderingCore.vtkGraphToGlyphs vtkmodules.vtkRenderingCore.vtkGraphicsFactory vtkmodules.vtkRenderingCore.vtkHardwarePicker vtkmodules.vtkRenderingCore.vtkHardwareSelector vtkmodules.vtkRenderingCore.vtkHardwareWindow vtkmodules.vtkRenderingCore.vtkHierarchicalPolyDataMapper vtkmodules.vtkRenderingCore.vtkImageActor vtkmodules.vtkRenderingCore.vtkImageMapper vtkmodules.vtkRenderingCore.vtkImageMapper3D vtkmodules.vtkRenderingCore.vtkImageProperty vtkmodules.vtkRenderingCore.vtkImageSlice vtkmodules.vtkRenderingCore.vtkImageSliceMapper vtkmodules.vtkRenderingCore.vtkInteractorEventRecorder vtkmodules.vtkRenderingCore.vtkInteractorObserver vtkmodules.vtkRenderingCore.vtkInteractorStyle vtkmodules.vtkRenderingCore.vtkInteractorStyle3D vtkmodules.vtkRenderingCore.vtkInteractorStyleSwitchBase vtkmodules.vtkRenderingCore.vtkLODProp3D vtkmodules.vtkRenderingCore.vtkLODProp3DEntry_t vtkmodules.vtkRenderingCore.vtkLabeledContourMapper vtkmodules.vtkRenderingCore.vtkLight vtkmodules.vtkRenderingCore.vtkLightActor vtkmodules.vtkRenderingCore.vtkLightCollection vtkmodules.vtkRenderingCore.vtkLightKit vtkmodules.vtkRenderingCore.vtkLogLookupTable vtkmodules.vtkRenderingCore.vtkLookupTableWithEnabling vtkmodules.vtkRenderingCore.vtkMapArrayValues vtkmodules.vtkRenderingCore.vtkMapper vtkmodules.vtkRenderingCore.vtkMapper2D vtkmodules.vtkRenderingCore.vtkMapperCollection vtkmodules.vtkRenderingCore.vtkMaxPythagoreanQuadrupleId vtkmodules.vtkRenderingCore.vtkObserverMediator vtkmodules.vtkRenderingCore.vtkPicker vtkmodules.vtkRenderingCore.vtkPickingManager vtkmodules.vtkRenderingCore.vtkPointGaussianMapper vtkmodules.vtkRenderingCore.vtkPointPicker vtkmodules.vtkRenderingCore.vtkPolyDataMapper vtkmodules.vtkRenderingCore.vtkPolyDataMapper2D vtkmodules.vtkRenderingCore.vtkProp vtkmodules.vtkRenderingCore.vtkProp3D vtkmodules.vtkRenderingCore.vtkProp3DCollection vtkmodules.vtkRenderingCore.vtkProp3DFollower vtkmodules.vtkRenderingCore.vtkPropAssembly vtkmodules.vtkRenderingCore.vtkPropCollection vtkmodules.vtkRenderingCore.vtkPropPicker vtkmodules.vtkRenderingCore.vtkProperty vtkmodules.vtkRenderingCore.vtkProperty2D vtkmodules.vtkRenderingCore.vtkRayCastRayInfo_t vtkmodules.vtkRenderingCore.vtkRenderPass vtkmodules.vtkRenderingCore.vtkRenderState vtkmodules.vtkRenderingCore.vtkRenderTimerLog vtkmodules.vtkRenderingCore.vtkRenderWidget vtkmodules.vtkRenderingCore.vtkRenderWindow vtkmodules.vtkRenderingCore.vtkRenderWindowCollection vtkmodules.vtkRenderingCore.vtkRenderWindowInteractor vtkmodules.vtkRenderingCore.vtkRenderWindowInteractor3D vtkmodules.vtkRenderingCore.vtkRenderedAreaPicker vtkmodules.vtkRenderingCore.vtkRenderer vtkmodules.vtkRenderingCore.vtkRendererCollection vtkmodules.vtkRenderingCore.vtkRendererDelegate vtkmodules.vtkRenderingCore.vtkRendererSource vtkmodules.vtkRenderingCore.vtkResizingWindowToImageFilter vtkmodules.vtkRenderingCore.vtkScenePicker vtkmodules.vtkRenderingCore.vtkSelectVisiblePoints vtkmodules.vtkRenderingCore.vtkShaderProperty vtkmodules.vtkRenderingCore.vtkSkybox vtkmodules.vtkRenderingCore.vtkStateStorage vtkmodules.vtkRenderingCore.vtkStereoCompositor vtkmodules.vtkRenderingCore.vtkStringToImage vtkmodules.vtkRenderingCore.vtkTDxInteractorStyle vtkmodules.vtkRenderingCore.vtkTDxInteractorStyleCamera vtkmodules.vtkRenderingCore.vtkTDxInteractorStyleSettings vtkmodules.vtkRenderingCore.vtkTDxMotionEventInfo vtkmodules.vtkRenderingCore.vtkTextActor vtkmodules.vtkRenderingCore.vtkTextActor3D vtkmodules.vtkRenderingCore.vtkTextMapper vtkmodules.vtkRenderingCore.vtkTextProperty vtkmodules.vtkRenderingCore.vtkTextPropertyCollection vtkmodules.vtkRenderingCore.vtkTextRenderer vtkmodules.vtkRenderingCore.vtkTextRendererCleanup vtkmodules.vtkRenderingCore.vtkTexture vtkmodules.vtkRenderingCore.vtkTexturedActor2D vtkmodules.vtkRenderingCore.vtkTransformCoordinateSystems vtkmodules.vtkRenderingCore.vtkTransformInterpolator vtkmodules.vtkRenderingCore.vtkTupleInterpolator vtkmodules.vtkRenderingCore.vtkUniforms vtkmodules.vtkRenderingCore.vtkViewDependentErrorMetric vtkmodules.vtkRenderingCore.vtkViewport vtkmodules.vtkRenderingCore.vtkVisibilitySort vtkmodules.vtkRenderingCore.vtkVolume vtkmodules.vtkRenderingCore.vtkVolumeCollection vtkmodules.vtkRenderingCore.vtkVolumeProperty vtkmodules.vtkRenderingCore.vtkWindowLevelLookupTable vtkmodules.vtkRenderingCore.vtkWindowToImageFilter vtkmodules.vtkRenderingCore.vtkWorldPointPicker vtkmodules.vtkRenderingExternal.ExternalVTKWidget vtkmodules.vtkRenderingExternal.vtkExternalLight vtkmodules.vtkRenderingExternal.vtkExternalOpenGLCamera vtkmodules.vtkRenderingExternal.vtkExternalOpenGLRenderWindow vtkmodules.vtkRenderingExternal.vtkExternalOpenGLRenderer vtkmodules.vtkRenderingFreeType.vtkFreeTypeStringToImage vtkmodules.vtkRenderingFreeType.vtkFreeTypeTools vtkmodules.vtkRenderingFreeType.vtkFreeTypeToolsCleanup vtkmodules.vtkRenderingFreeType.vtkMathTextFreeTypeTextRenderer vtkmodules.vtkRenderingFreeType.vtkMathTextUtilities vtkmodules.vtkRenderingFreeType.vtkMathTextUtilitiesCleanup vtkmodules.vtkRenderingFreeType.vtkScaledTextActor vtkmodules.vtkRenderingFreeType.vtkTextRendererStringToImage vtkmodules.vtkRenderingFreeType.vtkVectorText vtkmodules.vtkRenderingGL2PSOpenGL2.vtkOpenGLGL2PSHelperImpl vtkmodules.vtkRenderingHyperTreeGrid.vtkHyperTreeGridMapper vtkmodules.vtkRenderingImage.vtkDepthImageToPointCloud vtkmodules.vtkRenderingImage.vtkImageResliceMapper vtkmodules.vtkRenderingImage.vtkImageSliceCollection vtkmodules.vtkRenderingImage.vtkImageStack vtkmodules.vtkRenderingLICOpenGL2.vtkBatchedSurfaceLICMapper vtkmodules.vtkRenderingLICOpenGL2.vtkCompositeSurfaceLICMapper vtkmodules.vtkRenderingLICOpenGL2.vtkCompositeSurfaceLICMapperDelegator vtkmodules.vtkRenderingLICOpenGL2.vtkImageDataLIC2D vtkmodules.vtkRenderingLICOpenGL2.vtkLineIntegralConvolution2D vtkmodules.vtkRenderingLICOpenGL2.vtkPainterCommunicator vtkmodules.vtkRenderingLICOpenGL2.vtkStructuredGridLIC2D vtkmodules.vtkRenderingLICOpenGL2.vtkSurfaceLICComposite vtkmodules.vtkRenderingLICOpenGL2.vtkSurfaceLICInterface vtkmodules.vtkRenderingLICOpenGL2.vtkSurfaceLICMapper vtkmodules.vtkRenderingLICOpenGL2.vtkTextureIO vtkmodules.vtkRenderingLOD.vtkLODActor vtkmodules.vtkRenderingLOD.vtkQuadricLODActor vtkmodules.vtkRenderingLabel.VTK_LABEL_FIELD_DATA vtkmodules.vtkRenderingLabel.VTK_LABEL_IDS vtkmodules.vtkRenderingLabel.VTK_LABEL_NORMALS vtkmodules.vtkRenderingLabel.VTK_LABEL_SCALARS vtkmodules.vtkRenderingLabel.VTK_LABEL_TCOORDS vtkmodules.vtkRenderingLabel.VTK_LABEL_TENSORS vtkmodules.vtkRenderingLabel.VTK_LABEL_VECTORS vtkmodules.vtkRenderingLabel.vtkDynamic2DLabelMapper vtkmodules.vtkRenderingLabel.vtkFreeTypeLabelRenderStrategy vtkmodules.vtkRenderingLabel.vtkLabelHierarchy vtkmodules.vtkRenderingLabel.vtkLabelHierarchyAlgorithm vtkmodules.vtkRenderingLabel.vtkLabelHierarchyCompositeIterator vtkmodules.vtkRenderingLabel.vtkLabelHierarchyIterator vtkmodules.vtkRenderingLabel.vtkLabelPlacementMapper vtkmodules.vtkRenderingLabel.vtkLabelPlacer vtkmodules.vtkRenderingLabel.vtkLabelRenderStrategy vtkmodules.vtkRenderingLabel.vtkLabelSizeCalculator vtkmodules.vtkRenderingLabel.vtkLabeledDataMapper vtkmodules.vtkRenderingLabel.vtkLabeledTreeMapDataMapper vtkmodules.vtkRenderingLabel.vtkPointSetToLabelHierarchy vtkmodules.vtkRenderingMatplotlib.vtkMatplotlibMathTextUtilities vtkmodules.vtkRenderingOpenGL2.vtkCameraPass vtkmodules.vtkRenderingOpenGL2.vtkClearRGBPass vtkmodules.vtkRenderingOpenGL2.vtkClearZPass vtkmodules.vtkRenderingOpenGL2.vtkCompositePolyDataMapper2 vtkmodules.vtkRenderingOpenGL2.vtkDataTransferHelper vtkmodules.vtkRenderingOpenGL2.vtkDefaultPass vtkmodules.vtkRenderingOpenGL2.vtkDepthImageProcessingPass vtkmodules.vtkRenderingOpenGL2.vtkDepthOfFieldPass vtkmodules.vtkRenderingOpenGL2.vtkDepthPeelingPass vtkmodules.vtkRenderingOpenGL2.vtkDualDepthPeelingPass vtkmodules.vtkRenderingOpenGL2.vtkDummyGPUInfoList vtkmodules.vtkRenderingOpenGL2.vtkEDLShading vtkmodules.vtkRenderingOpenGL2.vtkEquirectangularToCubeMapTexture vtkmodules.vtkRenderingOpenGL2.vtkFourByteUnion vtkmodules.vtkRenderingOpenGL2.vtkFramebufferPass vtkmodules.vtkRenderingOpenGL2.vtkGaussianBlurPass vtkmodules.vtkRenderingOpenGL2.vtkGenericOpenGLRenderWindow vtkmodules.vtkRenderingOpenGL2.vtkHiddenLineRemovalPass vtkmodules.vtkRenderingOpenGL2.vtkImageProcessingPass vtkmodules.vtkRenderingOpenGL2.vtkLightingMapPass vtkmodules.vtkRenderingOpenGL2.vtkLightsPass vtkmodules.vtkRenderingOpenGL2.vtkOpaquePass vtkmodules.vtkRenderingOpenGL2.vtkOpenGLActor vtkmodules.vtkRenderingOpenGL2.vtkOpenGLBatchedPolyDataMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLBillboardTextActor3D vtkmodules.vtkRenderingOpenGL2.vtkOpenGLBufferObject vtkmodules.vtkRenderingOpenGL2.vtkOpenGLCamera vtkmodules.vtkRenderingOpenGL2.vtkOpenGLCellToVTKCellMap vtkmodules.vtkRenderingOpenGL2.vtkOpenGLCompositePolyDataMapperDelegator vtkmodules.vtkRenderingOpenGL2.vtkOpenGLFXAAFilter vtkmodules.vtkRenderingOpenGL2.vtkOpenGLFXAAPass vtkmodules.vtkRenderingOpenGL2.vtkOpenGLFluidMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLFramebufferObject vtkmodules.vtkRenderingOpenGL2.vtkOpenGLGL2PSHelper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLGlyph3DHelper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLGlyph3DMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLHardwareSelector vtkmodules.vtkRenderingOpenGL2.vtkOpenGLHelper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLHyperTreeGridMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLImageAlgorithmCallback vtkmodules.vtkRenderingOpenGL2.vtkOpenGLImageAlgorithmHelper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLImageMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLImageSliceMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLIndexBufferObject vtkmodules.vtkRenderingOpenGL2.vtkOpenGLInstanceCulling vtkmodules.vtkRenderingOpenGL2.vtkOpenGLLabeledContourMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLLight vtkmodules.vtkRenderingOpenGL2.vtkOpenGLPointGaussianMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLPolyDataMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLPolyDataMapper2D vtkmodules.vtkRenderingOpenGL2.vtkOpenGLProperty vtkmodules.vtkRenderingOpenGL2.vtkOpenGLQuadHelper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderPass vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderTimer vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderTimerLog vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderUtilities vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderWindow vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderer vtkmodules.vtkRenderingOpenGL2.vtkOpenGLShaderCache vtkmodules.vtkRenderingOpenGL2.vtkOpenGLShaderProperty vtkmodules.vtkRenderingOpenGL2.vtkOpenGLSkybox vtkmodules.vtkRenderingOpenGL2.vtkOpenGLSphereMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLState vtkmodules.vtkRenderingOpenGL2.vtkOpenGLStickMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLTextActor vtkmodules.vtkRenderingOpenGL2.vtkOpenGLTextActor3D vtkmodules.vtkRenderingOpenGL2.vtkOpenGLTextMapper vtkmodules.vtkRenderingOpenGL2.vtkOpenGLTexture vtkmodules.vtkRenderingOpenGL2.vtkOpenGLUniforms vtkmodules.vtkRenderingOpenGL2.vtkOpenGLVertexArrayObject vtkmodules.vtkRenderingOpenGL2.vtkOpenGLVertexBufferObject vtkmodules.vtkRenderingOpenGL2.vtkOpenGLVertexBufferObjectCache vtkmodules.vtkRenderingOpenGL2.vtkOpenGLVertexBufferObjectGroup vtkmodules.vtkRenderingOpenGL2.vtkOrderIndependentTranslucentPass vtkmodules.vtkRenderingOpenGL2.vtkOutlineGlowPass vtkmodules.vtkRenderingOpenGL2.vtkOverlayPass vtkmodules.vtkRenderingOpenGL2.vtkPBRIrradianceTexture vtkmodules.vtkRenderingOpenGL2.vtkPBRLUTTexture vtkmodules.vtkRenderingOpenGL2.vtkPBRPrefilterTexture vtkmodules.vtkRenderingOpenGL2.vtkPanoramicProjectionPass vtkmodules.vtkRenderingOpenGL2.vtkPixelBufferObject vtkmodules.vtkRenderingOpenGL2.vtkPointFillPass vtkmodules.vtkRenderingOpenGL2.vtkRenderPassCollection vtkmodules.vtkRenderingOpenGL2.vtkRenderStepsPass vtkmodules.vtkRenderingOpenGL2.vtkRenderbuffer vtkmodules.vtkRenderingOpenGL2.vtkSSAAPass vtkmodules.vtkRenderingOpenGL2.vtkSSAOPass vtkmodules.vtkRenderingOpenGL2.vtkSequencePass vtkmodules.vtkRenderingOpenGL2.vtkShader vtkmodules.vtkRenderingOpenGL2.vtkShaderProgram vtkmodules.vtkRenderingOpenGL2.vtkShadowMapBakerPass vtkmodules.vtkRenderingOpenGL2.vtkShadowMapPass vtkmodules.vtkRenderingOpenGL2.vtkSimpleMotionBlurPass vtkmodules.vtkRenderingOpenGL2.vtkSobelGradientMagnitudePass vtkmodules.vtkRenderingOpenGL2.vtkTextureObject vtkmodules.vtkRenderingOpenGL2.vtkTextureUnitManager vtkmodules.vtkRenderingOpenGL2.vtkToneMappingPass vtkmodules.vtkRenderingOpenGL2.vtkTransformFeedback vtkmodules.vtkRenderingOpenGL2.vtkTranslucentPass vtkmodules.vtkRenderingOpenGL2.vtkValuePass vtkmodules.vtkRenderingOpenGL2.vtkVolumetricPass vtkmodules.vtkRenderingOpenGL2.vtkXOpenGLRenderWindow vtkmodules.vtkRenderingSceneGraph.vtkActorNode vtkmodules.vtkRenderingSceneGraph.vtkCameraNode vtkmodules.vtkRenderingSceneGraph.vtkLightNode vtkmodules.vtkRenderingSceneGraph.vtkMapperNode vtkmodules.vtkRenderingSceneGraph.vtkPolyDataMapperNode vtkmodules.vtkRenderingSceneGraph.vtkRendererNode vtkmodules.vtkRenderingSceneGraph.vtkViewNode vtkmodules.vtkRenderingSceneGraph.vtkViewNodeFactory vtkmodules.vtkRenderingSceneGraph.vtkVolumeMapperNode vtkmodules.vtkRenderingSceneGraph.vtkVolumeNode vtkmodules.vtkRenderingSceneGraph.vtkWindowNode vtkmodules.vtkRenderingUI.vtkGenericRenderWindowInteractor vtkmodules.vtkRenderingUI.vtkXRenderWindowInteractor vtkmodules.vtkRenderingVR.vtkOpenGLAvatar vtkmodules.vtkRenderingVR.vtkVRCamera vtkmodules.vtkRenderingVR.vtkVRControlsHelper vtkmodules.vtkRenderingVR.vtkVRFollower vtkmodules.vtkRenderingVR.vtkVRHMDCamera vtkmodules.vtkRenderingVR.vtkVRHardwarePicker vtkmodules.vtkRenderingVR.vtkVRInteractorStyle vtkmodules.vtkRenderingVR.vtkVRMenuRepresentation vtkmodules.vtkRenderingVR.vtkVRMenuWidget vtkmodules.vtkRenderingVR.vtkVRModel vtkmodules.vtkRenderingVR.vtkVRPanelRepresentation vtkmodules.vtkRenderingVR.vtkVRPanelWidget vtkmodules.vtkRenderingVR.vtkVRRay vtkmodules.vtkRenderingVR.vtkVRRenderWindow vtkmodules.vtkRenderingVR.vtkVRRenderWindowInteractor vtkmodules.vtkRenderingVR.vtkVRRenderer vtkmodules.vtkRenderingVolume.VTKKW_FPMM_SHIFT vtkmodules.vtkRenderingVolume.VTKKW_FP_MASK vtkmodules.vtkRenderingVolume.VTKKW_FP_SCALE vtkmodules.vtkRenderingVolume.VTKKW_FP_SHIFT vtkmodules.vtkRenderingVolume.VTK_BUNYKRCF_ARRAY_SIZE vtkmodules.vtkRenderingVolume.VTK_BUNYKRCF_MAX_ARRAYS vtkmodules.vtkRenderingVolume.VTK_CROP_CROSS vtkmodules.vtkRenderingVolume.VTK_CROP_FENCE vtkmodules.vtkRenderingVolume.VTK_CROP_INVERTED_CROSS vtkmodules.vtkRenderingVolume.VTK_CROP_INVERTED_FENCE vtkmodules.vtkRenderingVolume.VTK_CROP_SUBVOLUME vtkmodules.vtkRenderingVolume.VTK_MAX_SHADING_TABLES vtkmodules.vtkRenderingVolume.vtkDirectionEncoder vtkmodules.vtkRenderingVolume.vtkEncodedGradientEstimator vtkmodules.vtkRenderingVolume.vtkEncodedGradientShader vtkmodules.vtkRenderingVolume.vtkFiniteDifferenceGradientEstimator vtkmodules.vtkRenderingVolume.vtkFixedPointRayCastImage vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastCompositeGOHelper vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastCompositeGOShadeHelper vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastCompositeHelper vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastCompositeShadeHelper vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastHelper vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastMIPHelper vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastMapper vtkmodules.vtkRenderingVolume.vtkGPUVolumeRayCastMapper vtkmodules.vtkRenderingVolume.vtkMultiVolume vtkmodules.vtkRenderingVolume.vtkOSPRayVolumeInterface vtkmodules.vtkRenderingVolume.vtkProjectedTetrahedraMapper vtkmodules.vtkRenderingVolume.vtkRayCastImageDisplayHelper vtkmodules.vtkRenderingVolume.vtkRecursiveSphereDirectionEncoder vtkmodules.vtkRenderingVolume.vtkSphericalDirectionEncoder vtkmodules.vtkRenderingVolume.vtkUnstructuredGridBunykRayCastFunction vtkmodules.vtkRenderingVolume.vtkUnstructuredGridHomogeneousRayIntegrator vtkmodules.vtkRenderingVolume.vtkUnstructuredGridLinearRayIntegrator vtkmodules.vtkRenderingVolume.vtkUnstructuredGridPartialPreIntegration vtkmodules.vtkRenderingVolume.vtkUnstructuredGridPreIntegration vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeMapper vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeRayCastFunction vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeRayCastIterator vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeRayCastMapper vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeRayIntegrator vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeZSweepMapper vtkmodules.vtkRenderingVolume.vtkVolumeMapper vtkmodules.vtkRenderingVolume.vtkVolumeOutlineSource vtkmodules.vtkRenderingVolume.vtkVolumePicker vtkmodules.vtkRenderingVolume.vtkVolumeRayCastSpaceLeapingImageFilter vtkmodules.vtkRenderingVolumeAMR.vtkAMRVolumeMapper vtkmodules.vtkRenderingVolumeOpenGL2.vtkMultiBlockUnstructuredGridVolumeMapper vtkmodules.vtkRenderingVolumeOpenGL2.vtkMultiBlockVolumeMapper vtkmodules.vtkRenderingVolumeOpenGL2.vtkOpenGLGPUVolumeRayCastMapper vtkmodules.vtkRenderingVolumeOpenGL2.vtkOpenGLProjectedTetrahedraMapper vtkmodules.vtkRenderingVolumeOpenGL2.vtkOpenGLRayCastImageDisplayHelper vtkmodules.vtkRenderingVolumeOpenGL2.vtkSmartVolumeMapper vtkmodules.vtkRenderingVolumeOpenGL2.vtkVolumeTexture vtkmodules.vtkRenderingVtkJS.vtkVtkJSSceneGraphSerializer vtkmodules.vtkRenderingVtkJS.vtkVtkJSViewNodeFactory vtkmodules.vtkTestingRendering.VTK_SKIP_RETURN_CODE vtkmodules.vtkTestingRendering.vtkTesting vtkmodules.vtkTestingRendering.vtkTestingInteractor vtkmodules.vtkTestingRendering.vtkTestingObjectFactory vtkmodules.vtkViewsContext2D.vtkContextInteractorStyle vtkmodules.vtkViewsContext2D.vtkContextView vtkmodules.vtkViewsCore.vtkConvertSelectionDomain vtkmodules.vtkViewsCore.vtkDataRepresentation vtkmodules.vtkViewsCore.vtkEmptyRepresentation vtkmodules.vtkViewsCore.vtkRenderViewBase vtkmodules.vtkViewsCore.vtkView vtkmodules.vtkViewsCore.vtkViewTheme vtkmodules.vtkViewsInfovis.vtkApplyColors vtkmodules.vtkViewsInfovis.vtkApplyIcons vtkmodules.vtkViewsInfovis.vtkDendrogramItem vtkmodules.vtkViewsInfovis.vtkGraphItem vtkmodules.vtkViewsInfovis.vtkGraphLayoutView vtkmodules.vtkViewsInfovis.vtkHeatmapItem vtkmodules.vtkViewsInfovis.vtkHierarchicalGraphPipeline vtkmodules.vtkViewsInfovis.vtkHierarchicalGraphView vtkmodules.vtkViewsInfovis.vtkIcicleView vtkmodules.vtkViewsInfovis.vtkInteractorStyleAreaSelectHover vtkmodules.vtkViewsInfovis.vtkInteractorStyleTreeMapHover vtkmodules.vtkViewsInfovis.vtkParallelCoordinatesHistogramRepresentation vtkmodules.vtkViewsInfovis.vtkParallelCoordinatesRepresentation vtkmodules.vtkViewsInfovis.vtkParallelCoordinatesView vtkmodules.vtkViewsInfovis.vtkRenderView vtkmodules.vtkViewsInfovis.vtkRenderedGraphRepresentation vtkmodules.vtkViewsInfovis.vtkRenderedHierarchyRepresentation vtkmodules.vtkViewsInfovis.vtkRenderedRepresentation vtkmodules.vtkViewsInfovis.vtkRenderedSurfaceRepresentation vtkmodules.vtkViewsInfovis.vtkRenderedTreeAreaRepresentation vtkmodules.vtkViewsInfovis.vtkSCurveSpline vtkmodules.vtkViewsInfovis.vtkTanglegramItem vtkmodules.vtkViewsInfovis.vtkTreeAreaView vtkmodules.vtkViewsInfovis.vtkTreeHeatmapItem vtkmodules.vtkViewsInfovis.vtkTreeMapView vtkmodules.vtkViewsInfovis.vtkTreeRingView vtkmodules.vtkViewsInfovis.vtkViewUpdater vtkmodules.vtkWebCore.vtkDataEncoder vtkmodules.vtkWebCore.vtkObjectIdMap vtkmodules.vtkWebCore.vtkWebApplication vtkmodules.vtkWebCore.vtkWebInteractionEvent vtkmodules.vtkWebCore.vtkWebUtilities vtkmodules.vtkWebGLExporter.VTK_ONLYCAMERA vtkmodules.vtkWebGLExporter.VTK_ONLYWIDGET vtkmodules.vtkWebGLExporter.VTK_PARSEALL vtkmodules.vtkWebGLExporter.WebGLObjectTypes vtkmodules.vtkWebGLExporter.vtkPVWebGLExporter vtkmodules.vtkWebGLExporter.vtkWebGLDataSet vtkmodules.vtkWebGLExporter.vtkWebGLExporter vtkmodules.vtkWebGLExporter.vtkWebGLObject vtkmodules.vtkWebGLExporter.vtkWebGLPolyData vtkmodules.vtkWebGLExporter.vtkWebGLWidget vtkmodules.vtkWebGLExporter.wLINES vtkmodules.vtkWebGLExporter.wPOINTS vtkmodules.vtkWebGLExporter.wTRIANGLES vtkmodules.web.arrayTypesMapping vtkmodules.web.base64 vtkmodules.web.base64Encode vtkmodules.web.getJSArrayType vtkmodules.web.getReferenceId vtkmodules.web.hashDataArray vtkmodules.web.hashlib vtkmodules.web.iteritems vtkmodules.web.javascriptMapping vedo-2025.5.3/examples/000077500000000000000000000000001474667405700145475ustar00rootroot00000000000000vedo-2025.5.3/examples/README.md000066400000000000000000000004511474667405700160260ustar00rootroot00000000000000# Example directories Check out more examples in the above directories. ## Get Started ```bash git clone https://github.com/marcomusy/vedo.git cd vedo/examples/basic python align1.py ``` ## Search and Run any of the built-in examples with commands: `vedo --search align` and `vedo -r align1` vedo-2025.5.3/examples/advanced/000077500000000000000000000000001474667405700163145ustar00rootroot00000000000000vedo-2025.5.3/examples/advanced/capping_mesh.py000066400000000000000000000026651474667405700213340ustar00rootroot00000000000000"""Manual capping of a mesh""" from vedo import * def capping(amsh, bias=0, invert=False, res=50): bn = amsh.boundaries().join(reset=True) pln = fit_plane(bn) cp = [pln.closest_point(p) for p in bn.coordinates] pts = Points(cp) if invert is None: cutm = amsh.clone().cut_with_plane(origin=pln.center, normal=pln.normal) invert = cutm.npoints > amsh.npoints pts2 = pts.clone().reorient(pln.normal, [0,0,1]).project_on_plane('z') msh2 = pts2.generate_mesh(invert=invert, mesh_resolution=res) source = pts2.coordinates.tolist() target = bn.coordinates.tolist() printc(f"..warping {len(source)} points") msh3 = msh2.clone().warp(source, target, mode='3d') if not invert: bias *= -1 msh3.reverse() if bias: newpts = [] for p in msh3.coordinates: q = bn.closest_point(p) d = mag(p-q) newpt = p + d * pln.normal * bias newpts.append(newpt) msh3.points(newpts) return msh3 msh = Mesh(dataurl+"260_flank.vtp").c('orange5').bc('purple7').lw(1) # mcap = msh.cap() # automatic mcap = capping(msh, invert=True) merged_msh = merge(msh, mcap).clean().smooth() merged_msh.subsample(0.0001).wireframe(False) # merge duplicate points printc("merged_msh is closed:", merged_msh.is_closed()) show([[msh, __doc__], [merged_msh, merged_msh.boundaries()]], N=2, axes=1, elevation=-40, ).close() vedo-2025.5.3/examples/advanced/contours2mesh.py000066400000000000000000000010571474667405700215040ustar00rootroot00000000000000"""Form a surface mesh by joining contour lines""" from vedo import Circle, Ribbon, merge, show cs = [] for i in range(-10, 10): r = 10 / (i * i + 10) c = Circle(r=r).rotate_y(i*2).z(i/10).x(i/20) c.linewidth(3).linecolor('blue5') cs.append(c) # create the mesh by merging the ribbon strips rbs = [] for i in range(len(cs) - 1): rb = Ribbon(cs[i], cs[i+1], closed=True, res=(150,5)) rbs.append(rb) mesh = merge(rbs).clean().cap().color('limegreen') cs.append(__doc__) show([cs, mesh], N=2, axes=1, elevation=-40, bg2='lb').close() vedo-2025.5.3/examples/advanced/convex_hull.py000066400000000000000000000004201474667405700212100ustar00rootroot00000000000000"""Create the Convex Hull of a Mesh or a set of input points""" from vedo import * settings.default_font = 'Bongas' settings.use_depth_peeling = True spid = Mesh(dataurl+"spider.ply").c("brown") ch = ConvexHull(spid).alpha(0.2) show(spid, ch, __doc__, axes=1).close() vedo-2025.5.3/examples/advanced/cut_and_cap.py000066400000000000000000000006461474667405700211340ustar00rootroot00000000000000"""Cut a mesh with an other mesh and cap the holes""" from vedo import dataurl, Plotter, Mesh, Sphere msh1 = Mesh(dataurl+'motor.byu') cutmesh = Sphere().y(-0.4).scale(0.4).wireframe().alpha(0.1) msh2 = msh1.clone().cut_with_mesh(cutmesh) redcap = msh2.cap(return_cap=True).color("r4") plt = Plotter(N=2, axes=1) plt.at(0).show(msh1, cutmesh, __doc__) plt.at(1).show(msh2, redcap, viewup="z") plt.interactive().close() vedo-2025.5.3/examples/advanced/cut_with_mesh1.py000066400000000000000000000010711474667405700216100ustar00rootroot00000000000000"""Cut a mesh with another mesh""" from vedo import dataurl, settings, Plotter, Volume, Ellipsoid settings.tiff_orientation_type = 4 # data origin is bottom-left vol = Volume(dataurl + "embryo.tif") iso = vol.isosurface(30, flying_edges=False).normalize().pos(0,0,0) emsh = Ellipsoid().scale(0.4).pos(2.8, 1.5, 1.5).wireframe() # make a working copy and cut it with the ellipsoid cut_iso = iso.clone().cut_with_mesh(emsh).c("gold").bc("t") plt = Plotter(N=2, axes=1) plt.at(0).show(iso, emsh, __doc__) plt.at(1).show(cut_iso, viewup="z") plt.interactive().close() vedo-2025.5.3/examples/advanced/cut_with_points1.py000066400000000000000000000012071474667405700221710ustar00rootroot00000000000000"""Set a loop of random points on a sphere to cut a region of the mesh""" from vedo import * # This affects how colors are interpolated between points settings.interpolate_scalars_before_mapping = True s = Sphere() s.color("white").alpha(0.25).backface_culling() s.pointdata['myscalars'] = s.coordinates[:,1] print(s) # Pick a few points on the sphere sv = s.points[[10, 15, 129, 165]] pts = Points(sv).ps(12) # Cut the loop region identified by the points scut = s.clone().cut_with_point_loop(sv, invert=False).scale(1.01) scut.cmap("Paired", "myscalars").alpha(1).add_scalarbar() print(scut) show(s, pts, scut, __doc__, axes=1, viewup="z") vedo-2025.5.3/examples/advanced/cut_with_points2.py000066400000000000000000000007561474667405700222020ustar00rootroot00000000000000"""Select cells inside a point loop""" from vedo import * mesh = Mesh(dataurl + "dolfin_fine.vtk").lw(1) pts = [ [0.85382618, 0.1909104], [0.85585967, 0.8721275], [0.07500188, 0.8680605], [0.10143717, 0.0607675], ] # Make a copy and cut it cmesh = mesh.clone().cut_with_point_loop( pts, on="cells", include_boundary=False, invert=False, ) cmesh.lw(1).c("tomato") line = Line(pts, closed=True).lw(5).c("green3") show([(mesh, line), (cmesh, line, __doc__)], N=2).close() vedo-2025.5.3/examples/advanced/diffuse_data.py000066400000000000000000000015401474667405700213040ustar00rootroot00000000000000import numpy as np from vedo import Grid, settings, show from vedo.pyplot import histogram settings.default_font = "FiraMonoMedium" grid = Grid(res=[50,50]) grid.wireframe(False).lw(0) values = np.zeros(grid.npoints) values[int(grid.npoints/2)] = 1 values[int(grid.npoints/5)] = 1 grid.pointdata["scalars"] = values grid.cmap("Set1_r").add_scalarbar() grid2 = grid.clone() grid2.smooth_data(niter=750, relaxation_factor=0.1, strategy=1) grid2.cmap("Set1_r").add_scalarbar() his = histogram( grid2.pointdata["scalars"], c='k4', xtitle="Concentration", ytitle="Frequency", axes=dict(htitle="", axes_linewidth=2, xyframe_line=0), ) his = his.clone2d() # anchor it to screen coords print("integrated over domain:", grid2.integrate_data()) show([ ["Initial state", grid], ["After diffusion", grid2, his]], N=2, axes=1, ).close() vedo-2025.5.3/examples/advanced/fitline.py000066400000000000000000000015161474667405700203230ustar00rootroot00000000000000"""Draw a line in 3D that fits a cloud of 20 Points, Show the first set of 20 points and fit a plane to them.""" from vedo import * # declare the class instance plt = Plotter(axes=1) # draw 500 fit lines superimposed and very transparent for i in range(500): x = np.linspace(-2, 5, 20) # generate every time 20 points y = np.linspace(1, 9, 20) z = np.linspace(-5, 3, 20) data = np.stack((x,y,z), axis=1) data+= np.random.normal(size=data.shape) * 0.8 # add gauss noise plt += fit_line(data).lw(4).alpha(0.04).c("violet") # fit a line # 'data' still contains the last iteration points plt += Points(data).color("yellow").ps(10) print("Line 0 Fit slope = ", plt.objects[0].slope) plane = fit_plane(data).c("green4") # fit a plane print("Plane Fit normal =", plane.normal) plt += plane, __doc__ plt.show().close() vedo-2025.5.3/examples/advanced/fitplanes.py000066400000000000000000000012511474667405700206520ustar00rootroot00000000000000"""Fit a plane to regions of a surface defined by N points that are closest to a given point of the surface.""" from vedo import * apple = Mesh(dataurl+"apple.ply").subdivide().add_gaussian_noise(0.5) plt = Plotter() plt += apple.alpha(0.1) variances = [] for i, p in enumerate(apple.points): pts = apple.closest_point(p, n=12) # find the N closest points to p plane = fit_plane(pts) # find the fitting plane variances.append(plane.variance) if i % 200: continue plt += plane plt += Points(pts) plt += Arrow(plane.center, plane.center+plane.normal/5) plt += __doc__ + "\nNr. of fits performed: "+str(len(variances)) plt.show().close() vedo-2025.5.3/examples/advanced/fitspheres1.py000066400000000000000000000016631474667405700211310ustar00rootroot00000000000000"""Fit spheres to a region of a surface defined by N points that are closest to a given point of the surface. For some of these point we show the fitting sphere. Red lines join the center of the sphere to the surface point. Blue points are the N points used for fitting""" from vedo import * settings.default_font = 'Kanopus' settings.use_depth_peeling = True plt = Plotter() # load mesh and increase by a lot subdivide(2) the nr of surface vertices cow = Mesh(dataurl+"cow.vtk").alpha(0.3).subdivide(2) for i, p in enumerate(cow.points): if i % 1000: continue # skip most points pts = cow.closest_point(p, n=16) # find the n-closest points to p sph = fit_sphere(pts).alpha(0.05) # find the fitting sphere if sph is None: continue # may fail if all points sit on a plane plt += sph plt += Points(pts) plt += Line(sph.center, p, lw=2) plt += [cow, __doc__] plt.show(viewup="z", axes=1).close() vedo-2025.5.3/examples/advanced/fitspheres2.py000066400000000000000000000015151474667405700211260ustar00rootroot00000000000000"""For each point finds the 12 closest ones and fit a sphere. Color points from the size of the sphere radius.""" from vedo import * from vedo.pyplot import histogram plt = Plotter() msh = Mesh(dataurl+"cow.vtk").c("cyan7") pts1, pts2, vals = [], [], [] msh_points = msh.points for i in range(0, msh.npoints, 10): p = msh_points[i] pts = msh.closest_point(p, n=12) # find the n-closest points to p sph = fit_sphere(pts) # find the fitting sphere if sph is None: continue value = sph.radius * 10 n = versor(p - sph.center) # unit vector from sphere center to p vals.append(value) pts1.append(p) pts2.append(p + n / 8) plt += msh, Points(pts1), Lines(pts1, pts2).c("black") plt += histogram(vals, xtitle='radius', xlim=[0,2]).clone2d("bottom-left") plt += __doc__ plt.show().close() vedo-2025.5.3/examples/advanced/geodesic_curve.py000066400000000000000000000007511474667405700216570ustar00rootroot00000000000000"""Dijkstra algorithm to compute the graph geodesic. Take as input a polygonal mesh and perform a shortest path calculation between two vertices.""" from vedo import IcoSphere, Earth, show msh = IcoSphere(r=1.02, subdivisions=4) msh.wireframe().alpha(0.2) path = msh.geodesic([0.349,-0.440,0.852], [-0.176,-0.962,0.302]) # path = msh.geodesic(36, 442) # use vertex indices # printc(geo.pointdata["VertexIDs"]) show(Earth(), msh, path, __doc__, bg2='lb', viewup="z", zoom=1.3).close() vedo-2025.5.3/examples/advanced/geological_model.py000066400000000000000000000130211474667405700221500ustar00rootroot00000000000000"""Recreate a model of a geothermal reservoir in Utah. Click on an object and press "i" to get info about it. (Credits: A. Pollack, SCRF)""" from vedo import printc, dataurl, settings from vedo import Line, Lines, Points, Plotter import pandas as pd settings.use_depth_peeling = True # Load surfaces, import the file from github printc("...loading data...", invert=1, end='') url = "https://raw.githubusercontent.com/ahinoamp/Example3DGeologicModelUsingVTKPlotter/master/" landSurfacePD = pd.read_csv(url+"land_surface_vertices.csv") vertices_175CPD = pd.read_csv(url+"175C_vertices.csv") vertices_225CPD = pd.read_csv(url+"225C_vertices.csv") microseismic = pd.read_csv(url+"Microseismic.csv") Negro_Mag_Fault_verticesPD = pd.read_csv(url+"Negro_Mag_Fault_vertices.csv") Opal_Mound_Fault_verticesPD= pd.read_csv(url+"Opal_Mound_Fault_vertices.csv") top_granitoid_verticesPD = pd.read_csv(url+"top_granitoid_vertices.csv") # The well path and different logs for the well paths well_5832_path= pd.read_csv(url+"path5832.csv") pressure_well = pd.read_csv(url+"pressure5832.csv") temp_well = pd.read_csv(url+"temperature5832.csv") nphi_well = pd.read_csv(url+"nphi5832.csv") # Since most of the wells in the area were just vertical, I split them into two files: # One file with the top of the wells and the other with the bottom point of the wellbore wellsmin = pd.read_csv(url+"MinPointsWells.csv") wellsmax = pd.read_csv(url+"MaxPointsWells.csv") # Project boundary area on the surface border = pd.read_csv(url+"FORGE_Border.csv") ############################################# ## land surface: a mesh with varying color printc("analyzing...", invert=1, end='') # create a mesh object from the 2D Delaunay triangulation of the point cloud landSurface = Points(landSurfacePD.values).generate_delaunay2d() # in order to color it by the elevation, we use the z values of the mesh zvals = landSurface.vertices[:, 2] landSurface.cmap("terrain", zvals, vmin=1100) landSurface.name = "Land Surface" # give the object a name # Create a plotter and add landSurface to it plt = Plotter(axes=dict(xtitle='km', ytitle=' ', ztitle='km*1.5', yzgrid=False), bg2='lb', size=(1200,900)) # screen size plt += landSurface plt += landSurface.isolines(5).lw(1).c('k') ############################################# ## Different meshes with constant colors # Mesh of 175 C isotherm vertices_175C = Points(vertices_175CPD.values).generate_delaunay2d() vertices_175C.name = "175C temperature isosurface" plt += vertices_175C.c("orange").opacity(0.3) # Mesh of 225 C isotherm vertices_225CT = Points(vertices_225CPD.values).generate_delaunay2d() vertices_225CT.name = "225C temperature isosurface" plt += vertices_225CT.c("red").opacity(0.4) # Negro fault, mode=fit is used because point cloud is not in xy plane Negro_Mag_Fault_vertices = Points(Negro_Mag_Fault_verticesPD.values).generate_delaunay2d(mode='fit') Negro_Mag_Fault_vertices.name = "Negro Fault" plt += Negro_Mag_Fault_vertices.c("f").opacity(0.6) # Opal fault Opal_Mound_Fault_vertices = Points(Opal_Mound_Fault_verticesPD.values).generate_delaunay2d(mode='fit') Opal_Mound_Fault_vertices.name = "Opal Mound Fault" plt += Opal_Mound_Fault_vertices.c("g").opacity(0.6) # Top Granite, (shift it a bit to avoid overlapping) xyz = top_granitoid_verticesPD.values - [0,0,20] top_granitoid_vertices = Points(xyz).generate_delaunay2d().texture(dataurl+'textures/paper2.jpg') top_granitoid_vertices.name = "Top of granite surface" plt += top_granitoid_vertices ################################################### printc("plotting...", invert=1) # Microseismic microseismicxyz = microseismic[["xloc", "yloc", "zloc"]].values scals = microseismic[["mw"]] microseismic_pts = Points(microseismicxyz).cmap("jet", scals).ps(5) microseismic_pts.name = "Microseismic events" plt += microseismic_pts # FORGE Boundary. Since the boundary area did not have a Z column, # I assigned a Z value for where I wanted it to appear border["zcoord"] = 1650 borderxyz = border[["xcoord", "ycoord", "zcoord"]] boundary = Line(borderxyz.values).extrude(zshift=120, cap=False) boundary.lw(0).texture(dataurl+'textures/wood1.jpg') boundary.name = "FORGE area boundary" plt += boundary # The path of well 58_32 Well1 = Line(well_5832_path[["X", "Y", "Z"]].values).color("k").lw(2) Well1.name = "Well 58-32" plt += Well1 # A porosity log in the well xyz = nphi_well[["X", "Y", "Z"]].values porosity = nphi_well["Nphi"].values Well2 = Line(xyz).cmap("hot", porosity).lw(3) Well2.name = "Porosity log well 58-32" plt += Well2 # This well data is actually represented by points since as of right now, xyz = pressure_well[["X", "Y", "Z"]].values pressure = pressure_well["Pressure"].values Well3 = Line(xyz).cmap("cool", pressure).lw(3) Well3.name = "Pressure log well 58-32" plt += Well3 # Temperature log xyz = temp_well[["X", "Y", "Z"]].values temp = temp_well["Temperature"].values Well4 = Line(xyz).cmap("seismic", temp).lw(3) Well4.name = "Temperature log well 58-32" plt += Well4 # defining the start and end of the lines that will be representing the wellbores Wells = Lines( wellsmin[["x", "y", "z"]].values, # start points wellsmax[["x", "y", "z"]].values, # end points ) Wells.color("gray").lw(3) Wells.name = "Pre-existing wellbores" plt += Wells for a in plt.objects: # change scale to kilometers in x and y, but expand z scale by 1.5! a.scale([0.001, 0.001, 0.001*1.5]) ########################################################################### ## show the plot plt += __doc__ plt.show(viewup="z", zoom=1.2) #plt.export("page.html") # k3d is the default plt.close() vedo-2025.5.3/examples/advanced/gyroid.py000066400000000000000000000014701474667405700201650ustar00rootroot00000000000000"""A textured gyroid shape cut by a sphere""" from vedo import * # Equation of a "gyroid" (https://en.wikipedia.org/wiki/Gyroid) x, y, z = np.mgrid[:30,:30,:30] * 0.4 U = sin(x)*cos(y) + sin(y)*cos(z) + sin(z)*cos(x) # Create a Volume, take the isosurface at 0, smooth and subdivide it gyr = Volume(U).isosurface(0).smooth().subdivide() # Intersect it with a sphere made of quads sph = Sphere(pos=(15,15,15), r=14, quads=True, res=30).triangulate() printc("Please wait a few secs while I'm cutting your gyroid", c='y') gxs = gyr.boolean('intersect', sph) gxs.texture('https://vedo.embl.es/examples/data/images/marblings.jpg') plt = Plotter(bg='wheat', bg2='lightblue', axes=5) plt.add_ambient_occlusion(10) plt.show(gxs, __doc__, zoom=1.4) # Video('gyroid.mp4').action().close().interactive() # shoot video plt.close() vedo-2025.5.3/examples/advanced/interpolate_field.py000066400000000000000000000042001474667405700223530ustar00rootroot00000000000000"""Interpolate a vectorial field using Thin Plate Spline or Radial Basis Function""" from scipy.interpolate import Rbf from vedo import Plotter, Points, Arrows, show import numpy as np ls = np.linspace(0, 10, 8) X, Y, Z = np.meshgrid(ls, ls, ls) xr, yr, zr = X.ravel(), Y.ravel(), Z.ravel() positions = np.vstack([xr, yr, zr]).T sources = [(5, 8, 5), (8, 5, 5), (5, 2, 5)] deltas = [(1, 1, 0.2), (1, 0, -0.8), (1, -1, 0.2)] apos = Points(positions, r=2) # for p in apos.vertices: ####### Uncomment to fix some points. # if abs(p[2]-5) > 4.999: # differences btw RBF and thinplate # sources.append(p) # will become much smaller. # deltas.append(np.zeros(3)) sources = np.array(sources) deltas = np.array(deltas) src = Points(sources).color("r").ps(12) trs = Points(sources + deltas).color("v").ps(12) arr = Arrows(sources, sources + deltas).color("k8") ################################################# warp using Thin Plate Splines warped = apos.clone().warp(sources, sources+deltas) warped.alpha(0.4).color("lg").point_size(10) allarr = Arrows(apos.vertices, warped.vertices).color("k8") set1 = [apos, warped, src, trs, arr, __doc__] plt1 = Plotter(N=2, bg='bb') plt1.at(0).show(apos, warped, src, trs, arr, __doc__) plt1.at(1).show(allarr) ################################################# RBF x, y, z = sources[:, 0], sources[:, 1], sources[:, 2] dx, dy, dz = deltas[:, 0], deltas[:, 1], deltas[:, 2] itrx = Rbf(x, y, z, dx) # Radial Basis Function interpolator: itry = Rbf(x, y, z, dy) # interoplate the deltas in each separate itrz = Rbf(x, y, z, dz) # cartesian dimension positions_x = itrx(xr, yr, zr) + xr positions_y = itry(xr, yr, zr) + yr positions_z = itrz(xr, yr, zr) + zr positions_rbf = np.vstack([positions_x, positions_y, positions_z]).T warped_rbf = Points(positions_rbf).color("lg",0.4).point_size(10) allarr_rbf = Arrows(apos.vertices, warped_rbf.vertices).color("k8") arr = Arrows(sources, sources + deltas).color("k8") plt2 = Plotter(N=2, pos=(200, 300), bg='bb') plt2.at(0).show("Radial Basis Function", apos, warped_rbf, src, trs, arr) plt2.at(1).show(allarr_rbf) plt2.interactive() plt2.close() plt1.close() vedo-2025.5.3/examples/advanced/interpolate_scalar1.py000066400000000000000000000012361474667405700226240ustar00rootroot00000000000000"""Interpolate the scalar values from one Mesh or Points object onto another one""" from vedo import * import numpy as np mesh = Mesh(dataurl+"bunny.obj") # pick 100 points where we assume that some scalar value is known # (can be ANY points, not necessarily taken from the mesh) pts2 = mesh.points[:100] # assume the value is random scalars = np.random.randint(45,123, 100) # create a set of points with this scalar values points = Points(pts2, r=10).cmap('rainbow', scalars) # interpolate from points onto the mesh, by averaging the 5 closest ones mesh.interpolate_data_from(points, n=5).cmap('rainbow').add_scalarbar() show(mesh, points, __doc__, axes=9).close() vedo-2025.5.3/examples/advanced/interpolate_scalar2.py000066400000000000000000000021621474667405700226240ustar00rootroot00000000000000"""Use scipy to interpolate the value of a scalar known on a set of points on a new set of points where the scalar is not defined. Two interpolation methods are possible: Radial Basis Function (used here), and Nearest Point.""" import numpy as np from vedo import * from scipy.interpolate import Rbf, NearestNDInterpolator as Near mesh = Mesh(dataurl+"bunny.obj").normalize() pts = mesh.vertices # pick a subset of 100 points where a scalar descriptor is known ptsubset = pts[:100] # assume the descriptor value is some function of the point coord y x, y, z = np.split(ptsubset, 3, axis=1) desc = 3*sin(4*y) # build the interpolator to determine the scalar value # for the rest of mesh vertices: itr = Rbf(x, y, z, desc) # Radial Basis Function interpolator #itr = Near(ptsubset, desc) # Nearest-neighbour interpolator # interpolate descriptor on the full set of mesh vertices xi, yi, zi = np.split(pts, 3, axis=1) interpolated_desc = itr(xi, yi, zi) mesh.cmap('rainbow', interpolated_desc).add_scalarbar(title='3sin(4y)') rpts = Points(ptsubset).point_size(8).c('white') show(mesh, rpts, __doc__, axes=1).close() vedo-2025.5.3/examples/advanced/interpolate_scalar3.py000066400000000000000000000012461474667405700226270ustar00rootroot00000000000000"""Interpolate the arrays of a source Mesh (RandomHills) onto another (ellipsoid) by averaging closest point values""" from vedo import ParametricShape, Sphere, show # RandomHills already contains the height as a scalar defined on vertices h = ParametricShape('RandomHills') h.cmap('hsv', vmin=0, vmax=6) h.add_scalarbar3d(title='RandomHills height scalar value') # interpolate such values on a completely different Mesh. # pick n=4 closest points and assign an ave value based on shepard kernel. s = Sphere().scale([1,1,0.5]).pos(-.1,1.5,0.3).alpha(1).lw(1) s.interpolate_data_from(h, n=4, kernel='gaussian') s.cmap('hsv', vmin=0, vmax=6) show(h,s, __doc__, axes=1).close() vedo-2025.5.3/examples/advanced/interpolate_scalar4.py000066400000000000000000000017471474667405700226360ustar00rootroot00000000000000"""Interpolate cell values from a quad-mesh to a tri-mesh""" from vedo import Grid, show # Make up some quad mesh with associated scalars g1 = Grid(res=(25,25)).wireframe(0).lw(1) scalars = g1.coordinates[:,1] g1.cmap("viridis", scalars, vmin=-1, vmax=1, name='gene') g1.map_points_to_cells() # move the array to cells (faces) g1.add_scalarbar(horizontal=1, pos=(0.7,0.04)) g1.rotate_z(20) # let's rotate it a bit so it's visible # Interpolate first mesh onto a new triangular mesh eps = 0.01 g2 = Grid(res=(50,50)).pos(0.2, 0.2, 0.1).wireframe(0).lw(0) g2.triangulate() # Interpolate by averaging the closest 3 points: #g2.interpolate_data_from(g1, on='cells', n=3) # Interpolate by picking points in a specified radius, # if there are no points in that radius set null value -1 g2.interpolate_data_from( g1, on='cells', radius=0.1+eps, null_strategy=1, null_value=-1, ) g2.cmap('hot', 'gene', on='cells', vmin=-1, vmax=1).add_scalarbar() show(g1, g2, __doc__, axes=1) vedo-2025.5.3/examples/advanced/interpolate_scalar5.py000066400000000000000000000024771474667405700226400ustar00rootroot00000000000000"""Interpolate a 2D surface through a set of points""" import numpy as np from scipy.spatial import distance_matrix from vedo import Grid, Points, Lines, show np.random.seed(1) def harmonic_shepard(pts, vals, radius): dists = distance_matrix(pts, pts) + radius rdists = 1.0 / dists sum_vals = np.sum(rdists * vals, axis=1) return sum_vals / np.sum(rdists, axis=1) # Create a grid of points surf = Grid(res=[25,25]) # Pick n random points on the surface ids = np.random.randint(0, surf.npoints, 10) pts = surf.coordinates[ids] # Create a set of random scalars scals1 = np.random.randn(10) * 0.1 ptss1 = pts.copy() ptss1[:,2] = scals1 # assign scalars as z-coords pts1 = Points(ptss1).color("red5").point_size(15) # Compute an interpolated (smoothed) set of scalars scals2 = harmonic_shepard(pts, scals1, radius=0.1) ptss2 = pts.copy() ptss2[:,2] = scals2 pts2 = Points(ptss2).color("purple5").point_size(15) # Warp the surface to match the interpolated points ptsource, pttarget = [], [] for pt in pts2.coordinates: pt_surf = surf.closest_point(pt) ptsource.append(pt_surf) pttarget.append(pt) warped = surf.warp(ptsource, pttarget, mode='2d') warped.color("b4").lc('lightblue').wireframe(False).lw(1) lines = Lines(pts1, pts2, lw=2) show(pts1, pts2, lines, warped, __doc__, axes=1, viewup="z").close() vedo-2025.5.3/examples/advanced/line2mesh_quads.py000066400000000000000000000012501474667405700217470ustar00rootroot00000000000000"""Mesh a line contour with quads of variable resolution""" from vedo import Spline, Grid, show import numpy as np pts = [ [0.0, 0.0], [1.0, 0.0], [1.1, 4.0], [1.0, 1.5], [0.2, 5.0], [-1., 3.0], [0.4, 2.7], [-1., 2.4], ] shape = Spline(pts, closed=True).color('red4').linewidth(5) xcoords = np.arange(-2.0, 2.5, 0.075) ycoords = np.arange(-0.5, 5.5, 0.075) xcoords += np.cos(xcoords+0.6)*0.75 # make quads shrink and stretch ycoords += np.sin(ycoords+0.5)*0.75 # to refine mesh resolution grd = Grid(s=[xcoords, ycoords]) # create a gridded plane msh = shape.generate_mesh(grid=grd, quads=True) show(shape, msh, __doc__, axes=1).close() vedo-2025.5.3/examples/advanced/line2mesh_tri.py000066400000000000000000000013111474667405700214260ustar00rootroot00000000000000"""Generate a polygonal Mesh from a contour line""" from vedo import dataurl, Assembly, Line, show from vedo.pyplot import histogram shapes = Assembly(dataurl + "timecourse1d.npy") # group of lines shape = shapes[56] # pick one cmap = "RdYlBu" # Generate the Mesh from the line msh = shape.generate_mesh(invert=True) msh.smooth() # make the triangles more uniform msh.compute_quality() # add a measure of triangle quality msh.cmap(cmap) contour = Line(shape).c("red4").lw(5) labels = contour.labels("id") histo = histogram( msh.celldata["Quality"], xtitle="triangle mesh quality", aspect=25/9, c=cmap, ).clone2d("bottom-right") show(contour, labels, msh, histo, __doc__).close() vedo-2025.5.3/examples/advanced/measure_curvature.py000066400000000000000000000024021474667405700224250ustar00rootroot00000000000000"""Calculate the surface curvature of an object by fitting a sphere to each vertex.""" from vedo import printc, Ellipsoid, Plotter,fit_sphere import numpy as np msh = Ellipsoid() printc(__doc__, invert=1) plt = Plotter(N=4, axes=1) plt.at(0).show(msh, "Original shape") # Use built-in curvature method msh1 = msh.clone().compute_curvature(method=0) msh1.cmap('viridis').add_scalarbar() plt.at(1).show(msh1, "Gaussian curvature", azimuth=30, elevation=30) # Use sphere-fit curvature msh2 = msh.clone() # Set parameters and allocate arrays radius = 1.5 curvature = np.zeros(msh2.npoints) residues = np.zeros(msh2.npoints) # iterate over surface points and fit sphere for idx in range(msh2.npoints): patch = msh2.closest_point(msh2.coordinates[idx], radius=radius) s = fit_sphere(patch) curvature[idx] = 1/(s.radius)**2 residues[idx] = s.residue msh2.pointdata['Spherefit_Curvature'] = curvature msh2.pointdata['Spherefit_Curvature_Residue'] = residues msh2.cmap('viridis', 'Spherefit_Curvature') msh2.add_scalarbar() plt.at(2).show(msh2, "Sphere-fitted curvature") # Show fit residues msh3 = msh2.clone() msh3.cmap('jet', 'Spherefit_Curvature_Residue').add_scalarbar() plt.at(3).show(msh3, 'Sphere-fitted curvature\nFit residues') plt.interactive().close() vedo-2025.5.3/examples/advanced/mesh_smoother1.py000066400000000000000000000007201474667405700216220ustar00rootroot00000000000000from vedo import dataurl, Plotter, Volume # Load a mesh and show it vol = Volume(dataurl + "embryo.tif") m0 = vol.isosurface(flying_edges=False).normalize() m0.lw(1).c("violet") # Smooth the mesh m1 = m0.clone().smooth(niter=20) m1.color("lg") plt = Plotter(N=2) plt.at(0).background("light blue") # set first renderer color plt.show(m0, "Original Mesh:") plt.at(1) plt.show("Mesh polygons are smoothed:", m1, viewup="z", zoom=1.5) plt.interactive().close() vedo-2025.5.3/examples/advanced/mesh_smoother2.py000066400000000000000000000010261474667405700216230ustar00rootroot00000000000000"""Smoothing a mesh""" from vedo import dataurl, Mesh, show s1 = Mesh(dataurl+'panther.stl').lw(1) s2 = s1.clone().x(50) # place at x=50 s2.subdivide(3).smooth().compute_normals() s2.c('light blue').lw(0).lighting('glossy').phong() # other useful filters to combine are # mesh.decimate(), clean(), smooth() cam = dict( position=(113, -189, 62.1), focal_point=(18.3, 4.39, 2.41), viewup=(-0.0708, 0.263, 0.962), distance=223, ) show(s1, s2, __doc__, bg='black', bg2='lightgreen', axes=11, camera=cam).close() vedo-2025.5.3/examples/advanced/meshquality.py000066400000000000000000000020461474667405700212350ustar00rootroot00000000000000"""Metrics of quality for the cells of a triangular mesh (zoom to see cell label values)""" from vedo import dataurl, Mesh, show from vedo.pyplot import histogram mesh = Mesh(dataurl + "panther.stl").compute_normals().linewidth(0.1).flat() # generate a numpy array for mesh quality mesh.compute_quality(metric=6) mesh.cmap("RdYlBu") hist = histogram(mesh.celldata["Quality"], xtitle="mesh quality", ac="w") # make it smaller and position it, use_bounds makes the cam # ignore the object when resetting the 3d qscene hist.scale(0.6).pos(40, -53, 0).use_bounds(False) # add a scalar bar for the active scalars mesh.add_scalarbar3d(c="w", title="triangle quality by min(:alpha_i )") # create numeric labels of active scalar on top of cells labs = mesh.labels(on="cells", precision=3, scale=0.4, font="Quikhand", c="black") cam = dict( pos=(59.8, -191, 78.9), focal_point=(27.9, -2.94, 3.33), viewup=(-0.0170, 0.370, 0.929), distance=205, clipping_range=(87.8, 355), ) show(mesh, labs, hist, __doc__, bg="bb", camera=cam, axes=11).close() vedo-2025.5.3/examples/advanced/moving_least_squares1D.py000066400000000000000000000021071474667405700233050ustar00rootroot00000000000000"""1D Moving Least Squares (MLS) to project a cloud of unordered points to become a smooth, ordered line""" from vedo import * settings.default_font = "Antares" N = 3 # nr. of iterations # build some initial cloud of noisy points along a line pts = [(sin(6*x), cos(2*x)*x, cos(9*x)) for x in np.arange(0,2, 0.001)] # pts = [(0, sin(x), cos(x)) for x in np.arange(0,6, .002)] # pts = [(sqrt(x), sin(x), x/5) for x in np.arange(0, 16, 0.01)] pts += np.random.randn(len(pts), 3) / 15 # add noise np.random.shuffle(pts) # make sure points are not ordered pts = Points(pts, r=5) plt = Plotter(N=N, axes=1) plt.at(0).show(pts, __doc__, viewup='z') for i in range(1, N): pts = pts.clone().smooth_mls_1d(n=50).color(i) if i == N-1: # at the last iteration make sure points # are separated by tol (in % of the bounding box) pts.subsample(0.025) plt.at(i).show(pts, f"Iteration {i}, #points: {pts.npoints}") line = pts.generate_segments().clean().join() # printc("lines:", line.lines) plt += [line, line.labels("id").bc("blue5")] plt.interactive().close() vedo-2025.5.3/examples/advanced/moving_least_squares2D.py000066400000000000000000000032451474667405700233120ustar00rootroot00000000000000"""Use a variant of the Moving Least Squares (MLS) algorithm to project a cloud of points to become a smooth surface. In the second window we show the error estimated for each point in color scale (left) or in size scale (right).""" from vedo import * printc(__doc__, invert=1) plt1 = Plotter(N=3, axes=1) mesh = Mesh(dataurl+"bunny.obj").normalize().subdivide() pts = mesh.coordinates pts += np.random.randn(len(pts), 3)/20 # add noise, will not mess up the original points #################################### smooth cloud with MLS # build the mesh points s0 = Points(pts, r=3).color("blue") plt1.at(0).show(s0, "original point cloud + noise") # project s1 points into a smooth surface of points # The parameter f controls the size of the local regression. mls1 = s0.clone().smooth_mls_2d(f=0.5) plt1.at(1).show(mls1, "MLS first pass, f=0.5") # mls1 is an Assembly so unpack it to get the first object it contains mls2 = mls1.clone().smooth_mls_2d(radius=0.1) plt1.at(2).show(mls2, "MLS second pass, radius=0.1") #################################### draw errors plt2 = Plotter(pos=(300, 400), N=2, axes=1) variances = mls2.pointdata["MLSVariance"] vmin, vmax = np.min(variances), np.max(variances) print("min and max of variances:", vmin, vmax) vcols = [color_map(v, "jet", vmin, vmax) for v in variances] # scalars->colors sp0 = Spheres(mls2.coordinates, c=vcols, r=0.02) # error as color sp1 = Spheres(mls2.coordinates, c="red5", r=variances/4) # error as point size mesh.color("k").alpha(0.05).wireframe() plt2.at(0).show(sp0, "Use color to represent variance") plt2.at(1).show(sp1, "point size to represent variance", zoom=1.3, interactive=True) plt2.close() plt1.close() vedo-2025.5.3/examples/advanced/multi_viewer2.py000066400000000000000000000041621474667405700214660ustar00rootroot00000000000000from vedo import settings, Plotter, ParametricShape, VedoLogo, Text2D settings.renderer_frame_width = 1 ############################################################################## def on_left_click(evt): if not evt.object: return shapename.text(f'This is called: {evt.object.name}, on renderer nr.{evt.at}') plt.at(1).remove(objs).add(evt.object).reset_camera() objs.clear() objs.append(evt.object) ############################################################################## sy, sx, dx = 0.12, 0.12, 0.01 # Define the renderers rectangle areas # to help finding bottomleft&topright corners check out utils.grid_corners() shape = [ dict(bottomleft=(0,0), topright=(1,1), bg='k7'), # the full empty window dict(bottomleft=(dx*2+sx,0.01), topright=(1-dx,1-dx), bg='w'), # the display window dict(bottomleft=(dx,sy*1), topright=(dx+sx,sy*2), bg='k8', bg2='lb'), # CrossCap dict(bottomleft=(dx,sy*2), topright=(dx+sx,sy*3), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*3), topright=(dx+sx,sy*4), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*4), topright=(dx+sx,sy*5), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*5), topright=(dx+sx,sy*6), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*6), topright=(dx+sx,sy*7), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*7), topright=(dx+sx,sy*8), bg='k8', bg2='lb'), # RandomHills ] plt = Plotter(shape=shape, sharecam=False, size=(1050, 980)) plt.add_callback("when i click my mouse button please call", on_left_click) for i in range(2,9): ps = ParametricShape(i).color(i) pname = Text2D(ps.name, c='k', bg='blue', s=0.7, font='Calco') plt.at(i).show(ps, pname) shapename = Text2D(pos='top-center', c='r', bg='y', font='Calco') # empty text vlogo = VedoLogo(distance=5) objs = [vlogo] title = "My Multi Viewer 1.0" instr = "Click on the left panel to select a shape\n" instr+= "Press h to print the full list of options" plt.at(1).show( vlogo, shapename, Text2D(title, pos=(0.5,0.85), s=2.5, c='dg', font='Kanopus', justify='center'), Text2D(instr, bg='g', pos=(0.5,0.05), s=1.2, font='Quikhand', justify='center'), ) plt.interactive().close() vedo-2025.5.3/examples/advanced/recosurface.py000066400000000000000000000021421474667405700211660ustar00rootroot00000000000000"""Reconstruct a polygonal surface from a point cloud: 1. An object is loaded and noise is added to its vertices. 2. The point cloud is smoothened with MLS (Moving Least Squares) 3. Impose a minimum distance among points 4. A triangular mesh is extracted from this set of sparse Points. """ from vedo import dataurl, printc, Plotter, Points, Mesh, Text2D plt = Plotter(shape=(1,5)) plt.at(0).show(Text2D(__doc__, s=0.75, font='Theemim', bg='green5')) # 1. load a mesh mesh = Mesh(dataurl+"apple.ply").subdivide() plt.at(1).show(mesh) # Add noise pts0 = Points(mesh, r=3).add_gaussian_noise(1) plt.at(2).show(pts0) # 2. Smooth the point cloud with MLS pts1 = pts0.clone().smooth_mls_2d(f=0.8) printc("Nr of points before cleaning nr. points:", pts1.npoints) # 3. Impose a min distance among mesh points pts1.subsample(0.005) printc(" after cleaning nr. points:", pts1.npoints) plt.at(3).show(pts1) # 4. Reconstruct a polygonal surface from the point cloud reco = pts1.reconstruct_surface(dims=100, radius=0.2).c("gold") plt.at(4).show(reco, axes=7, zoom=1.2) plt.interactive().close() vedo-2025.5.3/examples/advanced/run_all.sh000077500000000000000000000005331474667405700203100ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo for f in *.py do if [[ "$f" == *"geological_model"* ]]; then continue; fi echo "Processing $f script.." python3 "$f" done vedo-2025.5.3/examples/advanced/skeletonize.py000066400000000000000000000006131474667405700212220ustar00rootroot00000000000000"""Using 1D Moving Least Squares to skeletonize a surface""" from vedo import dataurl, Points, Plotter N = 9 # nr of iterations f = 0.2 # fraction of neighbours pcl = Points(dataurl+"man.vtk").subsample(0.02) plt = Plotter(N=N, axes=1) for i in range(N): pcl = pcl.clone().smooth_mls_1d(f=f).color(i) plt.at(i).show(f"iteration {i}", pcl, elevation=-8) plt.interactive().close() vedo-2025.5.3/examples/advanced/spline_draw1.py000066400000000000000000000006651474667405700212650ustar00rootroot00000000000000from vedo import dataurl, Image, Mesh from vedo.applications import SplinePlotter # ready to use class! pic = Image(dataurl + "images/embryo.jpg") # Works with surfaces too # pic = Mesh(dataurl + "bunny.obj").scale(80).shift(dz=-1) # pic.color("blue9").alpha(0.75).backface_culling() plt = SplinePlotter(pic) plt.show(mode="image", zoom='tightest') if plt.line: print("Npts =", len(plt.points()), "NSpline =", plt.line.npoints) vedo-2025.5.3/examples/advanced/spline_draw2.py000066400000000000000000000005501474667405700212570ustar00rootroot00000000000000"""Draw a continuous line on an image with the DrawingWidget.""" from vedo import DrawingWidget, Plotter, Image, dataurl img = Image(dataurl + "embryo.jpg").resize(0.5) plt = Plotter(axes=1) drw = DrawingWidget(img) drw.on() cid = drw.add_observer("end interaction", lambda w, e: print(drw.line)) plt.show(img, __doc__, zoom=1.2) drw.remove() plt.close() vedo-2025.5.3/examples/advanced/splitmesh.py000066400000000000000000000004741474667405700207030ustar00rootroot00000000000000"""Split a mesh by connectivity and order the pieces by increasing surface area""" from vedo import dataurl, Volume, show em = Volume(dataurl+"embryo.tif").isosurface(80) # return the list of the largest 10 connected meshes: splitem = em.split(maxdepth=40)[0:9] show(splitem, __doc__, axes=1, viewup='z').close() vedo-2025.5.3/examples/advanced/timer_callback0.py000066400000000000000000000006071474667405700217050ustar00rootroot00000000000000from vedo import * from time import time def loop_func(event): msh.rotate_z(0.1) txt.text(f"time: {event.time - t0} sec") plt.render() t0 = time() msh = Cube() txt = Text2D(bg='yellow', font="Calco") plt = Plotter(axes=1) # plt.initialize_interactor() # on windows this is needed plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show(msh, txt) plt.close() vedo-2025.5.3/examples/advanced/timer_callback1.py000066400000000000000000000024541474667405700217100ustar00rootroot00000000000000"""Create a simple Play/Pause app with a timer event You can interact with the scene during the loop! ..press q to quit""" import time import numpy as np from vedo import Plotter from vedo.pyplot import plot def bfunc(obj, ename): global timer_id plotter.timer_callback("destroy", timer_id) if "Play" in button.status(): # instruct to call handle_timer() every 10 msec: timer_id = plotter.timer_callback("create", dt=10) button.switch() def handle_timer(event): t = time.time() - t0 x = np.linspace(t, t + 4*np.pi, 50) y = np.sin(x) * np.sin(x/12) fig = plot( x, y, '-o', ylim=(-1.2, 1.2), aspect=3/1, xtitle="time window [s]", ytitle="intensity [a.u.]", ) fig.shift(-x[0]) # put the whole plot object back at (0,0) # Pop (remove) the old plot and add the new one plotter.pop().add(fig).render() timer_id = -1 t0 = time.time() plotter= Plotter(size=(1200,600)) # plt.initialize_interactor() # on windows this is needed button = plotter.add_button(bfunc, states=[" Play ","Pause"], size=40) evntid = plotter.add_callback("timer", handle_timer, enable_picking=False) x = np.linspace(0, 4*np.pi, 50) y = np.sin(x) * np.sin(x/12) fig = plot(x, y, ylim=(-1.2, 1.2), xtitle="time", aspect=3/1, lc='grey5') plotter.show(__doc__, fig, zoom=2) vedo-2025.5.3/examples/advanced/timer_callback2.py000066400000000000000000000044351474667405700217120ustar00rootroot00000000000000# Create a class which wraps the vedo.Plotter class and adds a timer callback # Credits: Nicolas Antille, https://github.com/nantille # Check out the simpler example: timer_callback1.py import vedo class Viewer: def __init__(self, *args, **kwargs): self.dt = kwargs.pop("dt", 100) # update every dt milliseconds self.timer_id = None self.isplaying = False self.counter = 0 # frame counter self.button = None self.plotter = vedo.Plotter(*args, **kwargs) # setup the Plotter object self.timerevt = self.plotter.add_callback('timer', self.handle_timer, enable_picking=False) def initialize(self): # initialize here extra elements like buttons etc.. self.button = self.plotter.add_button( self._buttonfunc, states=["\u23F5 Play ","\u23F8 Pause"], font="Kanopus", size=32, ) return self def show(self, *args, **kwargs): plt = self.plotter.show(*args, **kwargs) return plt def _buttonfunc(self, obj, ename): if self.timer_id is not None: self.plotter.timer_callback("destroy", self.timer_id) if not self.isplaying: self.timer_id = self.plotter.timer_callback("create", dt=100) self.button.switch() self.isplaying = not self.isplaying def handle_timer(self, event): ##################################################################### ### Animate your stuff here ### ##################################################################### #print(event) # info about what was clicked and more moon.color(self.counter) # change color to the Moon earth.rotate_z(2) # rotate the Earth moon.rotate_z(1) txt2d.text("Moon color is:").color(self.counter).background(self.counter,0.1) txt2d.text(vedo.get_color_name(self.counter), "top-center") txt2d.text("..press q to quit", "bottom-right") self.plotter.render() self.counter += 1 viewer = Viewer(axes=1, dt=150).initialize() earth = vedo.Earth() moon = vedo.Sphere(r=0.1).x(1.5).color('k7') txt2d = vedo.CornerAnnotation().font("Kanopus") viewer.show(earth, moon, txt2d, viewup='z').close() vedo-2025.5.3/examples/advanced/timer_callback3.py000066400000000000000000000033461474667405700217130ustar00rootroot00000000000000"""Create 2 independent timer callbacks:""" from vedo import * # Defining a function to be called by a timer event def func1(event): # Check if this function was called by the right timer if event.timerid != ida: return # Rotate a cube mesh and set its color to green5 msh.rotate_z(1.0).c("green5") # Update text and print a message with the event and timer ids txt.text("func1() called").background('green5') printc(f"func1() id={event.id}, timerid={event.timerid}", c='g') plt.render() # Defining another function to be called by a different timer event def func2(event): # Check if this function was called by the right timer if event.timerid != idb: return # Rotate the same cube mesh in a different direction msh.rotate_x(5.0).c("red5") # Update text and print a message with the event and timer ids txt.text("func2() called").background('red5') printc(f"func2() id={event.id}, timerid={event.timerid}", c='r') plt.render() # Create a cube mesh and a text object msh = Cube() txt = Text2D(font="Calco", pos='top-right') # Create a plotter object with axes plt = Plotter(axes=1) # plt.initialize_interactor() # on windows this is needed # Add the two callback functions to the plotter's timer events id1 = plt.add_callback("timer", func1) id2 = plt.add_callback("timer", func2) printc("Creating Timer Callbacks with IDs:", id1, id2) # Start two timers, one with a delay of 1s and the other with a delay of 2.3s ida = plt.timer_callback("start", dt=1000) idb = plt.timer_callback("start", dt=2300) printc("Starting timers with IDs :", ida, idb) # Stop the first timer using its ID # plt.timer_callback("stop", ida) plt.show(msh, txt, __doc__, viewup='z') plt.close() vedo-2025.5.3/examples/advanced/voronoi2.py000066400000000000000000000010211474667405700204350ustar00rootroot00000000000000"""Voronoi tessellation of a pointcloud on a grid""" from vedo import dataurl, Points, Grid, show pts0 = Points(dataurl+'rios.xyz').color('k') pts1 = pts0.clone().smooth_lloyd_2d() grid = Grid([14500,61700], s=[22000,24000], res=[30,30]).ps(1) allpts = pts1.vertices.tolist() + grid.vertices.tolist() msh = Points(allpts).generate_voronoi(method='scipy') msh.lw(1).wireframe(False).cmap('terrain_r', 'VoronoiID', on='cells') # centers = msh.cell_centers().color("k") show(msh, pts0, __doc__, axes=dict(digits=3), zoom=1.3) vedo-2025.5.3/examples/advanced/warp1.py000066400000000000000000000017471474667405700177310ustar00rootroot00000000000000"""Fit a surface to a set of points""" # Thin Plate Spline transformations describe a nonlinear warp # transform defined by a set of source and target landmarks. # Any point on the mesh close to a source landmark will # be moved to a place close to the corresponding target landmark. # The points in between are interpolated using Bookstein's algorithm. from vedo import Grid, Points, Arrows, show import numpy as np np.random.seed(1) surf = Grid([0,0,0], res=[25,25]) ids = np.random.randint(0, surf.npoints, 10) # pick 10 indices pts = surf.points[ids] ptsource, pttarget = [], [] for pt in pts: pt1 = pt + [0, 0, np.random.randn() * 0.1] pt2 = surf.closest_point(pt1) ptsource.append(pt2) pttarget.append(pt1) warped = surf.warp(ptsource, pttarget, mode='2d') warped.color("b4").lc('lightblue').lw(1).wireframe(False) apts = Points(pttarget).point_size(15).c("red5") arrs = Arrows(ptsource, pttarget).c("black") show(warped, apts, arrs, __doc__, axes=1, viewup="z").close() vedo-2025.5.3/examples/advanced/warp2.py000066400000000000000000000015671474667405700177320ustar00rootroot00000000000000"""Warp a region of a mesh using Thin Plate Splines. Red points stay fixed while a single point in space moves as the arrow indicates.""" from vedo import * settings.use_depth_peeling = True mesh = Mesh(dataurl+"man.vtk").color('w') # a heavily decimated copy with about 200 points meshdec = mesh.clone().triangulate().decimate(n=200) sources = [[0.9, 0.0, 0.2]] # this point moves targets = [[1.2, 0.0, 0.4]] # ...to this. for pt in meshdec.vertices: if pt[0] < 0.3: # these pts don't move sources.append(pt) # (e.i. source = target) targets.append(pt) arrow = Arrows(sources, targets) apts = Points(sources).c("red") warp = mesh.clone().warp(sources, targets) warp.c("blue", 0.3).wireframe() sphere = Sphere(r=0.3).pos(1,0,-.50) sphere.apply_transform(warp.transform) # print(warp.transform) show(mesh, arrow, warp, apts, sphere, axes=1).close() vedo-2025.5.3/examples/advanced/warp3.py000066400000000000000000000071131474667405700177240ustar00rootroot00000000000000"""Take 2 clouds of points, source and target, and morph the plane using thin plate splines as a model. The fitting minimizes the distance to a subset of the target cloud""" from vedo import printc, Points, Grid, Arrows, Lines, Plotter import scipy.optimize as opt import numpy as np np.random.seed(2) class Morpher(Plotter): def __init__(self, **kwargs): super().__init__(**kwargs) self.source = None self.morphed_source = None self.target = None self.bound = 1 self.sigma = 1 # stiffness of the mesh self.method = "SLSQP" # 'SLSQP', 'L-BFGS-B', 'TNC' ... self.fitTolerance = 1e-6 self.fitResult = None self.chi2 = 1.0e30 self.npts = None self.ptsource = [] self.pttarget = [] def _func(self, pars): shift = np.array(np.split(pars, 2)).T # recreate the shift vectors z = np.zeros((self.npts, 1)) shift = np.append(shift, z, axis=1) # make them 3d self.morphed_source = self.source.clone().warp( self.ptsource, self.ptsource + shift, sigma=self.sigma, mode="2d" ) d = self.morphed_source.vertices - self.target.vertices chi2 = np.sum(np.multiply(d, d)) # /len(d) if chi2 < self.chi2: printc("new minimum ->", chi2) self.chi2 = chi2 return chi2 # ------------------------------------------------------- Fit def morph(self): print("\n..minimizing with " + self.method) self.morphed_source = self.source.clone() self.ptsource = self.source.vertices[: self.npts] # pick the first npts points self.pttarget = self.target.vertices[: self.npts] delta = self.pttarget - self.ptsource x0 = delta[:, (0, 1)].T.ravel() # initial guess, a flat list of x and y shifts bnds = [(-self.bound, self.bound)] * (2 * self.npts) res = opt.minimize( self._func, x0, bounds=bnds, method=self.method, tol=self.fitTolerance ) self.fitResult = res # recalculate the last step: self._func(res["x"]) # ------------------------------------------------------- Visualization def draw_shapes(self): sb = self.source.bounds() x1, x2, y1, y2, _, _ = sb maxb = max(x2 - x1, y2 - y1) grid0 = Grid(self.source.center_of_mass(), s=[maxb, maxb], res=[40, 40]) T = self.morphed_source.transform grid1 = grid0.clone().apply_transform(T) # warp the grid arrows = Arrows(self.ptsource, self.pttarget, alpha=0.5, s=3).c("k") lines = Lines(self.source, self.target).c("db") mlines = Lines(self.morphed_source, self.target).c("db") self.at(0).show(grid0, self.source, self.target, lines, arrows, __doc__) self.at(1).show( grid1, self.morphed_source, self.target, mlines, f"morphed source (green) vs target (red)\nNDF = {2*self.npts}", ) ################################# if __name__ == "__main__": # make up a source random cloud pts_s = np.random.randn(25, 2) pts_t = pts_s + np.sin(2 * pts_s) / 5 # and distort it mr = Morpher(N=2) mr.source = Points(pts_s).color("g",0.5).ps(20) mr.target = Points(pts_t).color("r",1.0).ps(10) mr.bound = 2 # limits the x and y shift # allow move only a subset of points (implicitly sets the NDF of the fit) mr.npts = 6 mr.sigma = 1.0 # stiffness of the mesh (1=max stiffness) mr.morph() # now mr.msource contains the modified/morphed source. mr.draw_shapes() mr.interactive().close() vedo-2025.5.3/examples/advanced/warp4a.py000066400000000000000000000152421474667405700200700ustar00rootroot00000000000000# Morph one shape into another interactively # (can work in 3d too! see example warp4b.py) # from vedo import Plotter, Axes, dataurl, Assembly, printc, merge from vedo.shapes import Text2D, Points, Lines, Arrows2D, Grid class Morpher: def __init__(self, mesh1, mesh2, n): ############################### init self.n = n # desired nr. of intermediate shapes self.mode = '2d' self.mesh1 = mesh1 self.mesh2 = mesh2 self.merged_meshes = merge(mesh1, mesh2) self.mesh1.lw(4).c('grey2').pickable(False) self.mesh2.lw(4).c('grey1').pickable(False) self.arrow_starts = [] self.arrow_stops = [] self.dottedln = None self.toggle = False self.instructions = ("Click to add arrows interactively on the left panel\n" "right-click to remove last arrow. Then press:\n" "- m to morph the plane\n" "- c to clear\n" "- g to generate interpolation") self.msg1 = Text2D(self.instructions, pos='top-left', font="VictorMono", bg='g2', alpha=0.6) self.msg2 = Text2D('[output will show here]', pos='top-left', font="VictorMono") sz = self.merged_meshes.diagonal_size() self.plane1 = Grid(s=[sz,sz], res=[50,50]).pos(self.merged_meshes.center_of_mass()) self.plane1.wireframe(False).alpha(1).linewidth(0.1).c('white').lc('grey5') self.plane2 = self.plane1.clone().pickable(False) self.plotter = Plotter(N=2, bg='light blue', size=(2000,1000), sharecam=0) self.plotter.add_callback('left click', self.onleftclick) self.plotter.add_callback('right click', self.onrightclick) self.plotter.add_callback('key press', self.onkeypress) def start(self): ################################################ show stuff paxes = Axes(self.plane1, xygrid=0, text_scale=0.6) self.plotter.at(0).show(self.plane1, paxes, self.msg1, self.mesh1, self.mesh2) self.plotter.at(1).show(self.plane2, self.msg2, mode='image') if len(self.arrow_starts)>0: self.draw(True) self.draw(False) self.msg1.text(self.instructions) self.plotter.show(interactive=True, zoom=1.3).close() def draw(self, toggle=None): #################################### update scene if toggle is None: toggle = self.toggle if toggle: self.msg1.text("Choose start point or press:\nm to morph the shapes\ng to interpolate") self.plotter.at(0).remove("displacementArrows") if len(self.arrow_starts)==0: return arrows = Arrows2D(self.arrow_starts, self.arrow_stops).c('red4') arrows.name = "displacementArrows" self.plotter.add(arrows) else: self.msg1.text("Click to choose an end point") self.plotter.at(0).remove("displacementPoints") points = Points(self.arrow_starts).ps(15).c('green3',0.5) points.name = "displacementPoints" self.plotter.add(points) def onleftclick(self, evt): ############################################ add points msh = evt.object if not msh or msh.name!="Grid": return pt = self.merged_meshes.closest_point(evt.picked3d) # get the closest pt on the line self.arrow_stops.append(pt) if self.toggle else self.arrow_starts.append(pt) self.draw() self.toggle = not self.toggle def onrightclick(self, evt): ######################################## remove points if not self.arrow_starts: return self.arrow_starts.pop() if not self.toggle: self.arrow_stops.pop() self.plotter.at(0).clear().add_renderer_frame() self.plotter.add([self.plane1, self.msg1, self.mesh1, self.mesh2]) self.draw(False) self.draw(True) def onkeypress(self, evt): ###################################### MORPH & GENERATE if evt.keypress == 'm': ##--------- morph mesh1 based on the existing arrows if len(self.arrow_starts) != len(self.arrow_stops): printc("You must select your end point first!", c='y') return warped_plane = self.plane1.clone().pickable(False) warped_plane.warp(self.arrow_starts, self.arrow_stops, mode=self.mode) T = warped_plane.transform mw = self.mesh1.clone().apply_transform(T).c('red4') a = Points(self.arrow_starts, r=10).apply_transform(T) b = Points(self.arrow_stops, r=10).apply_transform(T) T_inv = T.compute_inverse() self.dottedln = Lines(a,b, res=self.n).apply_transform(T_inv).point_size(5) self.msg1.text(self.instructions) self.msg2.text("Morphed output:") axes = Axes(warped_plane, xygrid=0, text_scale=0.6) self.plotter.at(1).clear() self.plotter.add_renderer_frame() self.plotter.add(self.mesh1.clone().c('grey4'), self.mesh2, self.msg2) self.plotter.add(warped_plane, axes, mw, self.dottedln) self.plotter.reset_camera().render() elif evt.keypress == 'g': ##------- generate intermediate shapes if not self.dottedln: return intermediates = [] allpts = self.dottedln.vertices allpts = allpts.reshape(len(self.arrow_starts), self.n+1, 3) for i in range(self.n + 1): pi = allpts[:,i,:] m_nterp = self.mesh1.clone().warp(self.arrow_starts, pi, mode=self.mode) m_nterp.c('blue3').lw(1) intermediates.append(m_nterp) self.msg2.text("Morphed output + Interpolation:") self.plotter.at(1).add(intermediates).render() self.dottedln = None elif evt.keypress == 'c': ##------- clear all self.arrow_starts = [] self.arrow_stops = [] self.toggle = False self.dottedln = None self.msg1.text(self.instructions) self.msg2.text("[output will show here]") self.plotter.at(0).clear() self.plotter.add(self.plane1, self.msg1, self.mesh1, self.mesh2) self.plotter.at(1).clear().add_renderer_frame() self.plotter.add(self.plane2, self.msg2).render() ######################################################################################## MAIN if __name__ == "__main__": outlines = Assembly(dataurl + "timecourse1d.npy") # load a set of 2d shapes mesh1 = outlines[25] mesh2 = outlines[35].scale(1.3).shift(-2,0,0) morpher = Morpher(mesh1, mesh2, 10) # generate 10 intermediate outlines morpher.start() vedo-2025.5.3/examples/advanced/warp4b.py000066400000000000000000000112771474667405700200750ustar00rootroot00000000000000# Same as warp4b.py but using the applications.MorphPlotter class from vedo import Mesh, settings, dataurl from vedo.applications import MorphPlotter #################################################################################### # THIS IS IMPLEMENTED IN vedo.applications.MorphPlotter, shown here for reference #################################################################################### # from vedo import Plotter, Points, Text2D, Axes # class MorphPlotter(Plotter): # # def __init__(self, source, target, **kwargs): # kwargs.update(dict(N=3, sharecam=0)) # super().__init__(**kwargs) # # self.source = source.pickable(True) # self.target = target.pickable(False) # self.clicked = [] # self.sources = [] # self.targets = [] # self.msg0 = Text2D("Pick a point on the surface", # pos="bottom-center", c='white', bg="blue4", alpha=1) # self.msg1 = Text2D(pos="bottom-center", c='white', bg="blue4", alpha=1) # instructions = ( # "Morphological alignment of 3D surfaces.\n" # "Pick a point on the source surface, then\n" # "pick the corresponding point on the target surface\n" # "Pick at least 4 point pairs. Press:\n" # "- c to clear the selection.\n" # "- d to delete the last selection.\n" # "- q to quit." # ) # self.instructions = Text2D(instructions, s=0.7, bg="blue4", alpha=0.1) # self.at(0).add(source, self.msg0, self.instructions).reset_camera() # self.at(1).add(f"Reference {target.filename}", self.msg1, target) # cam1 = self.camera # save camera at 1 # self.at(2).add("Morphing Output", target).background("k9") # self.camera = cam1 # use the same camera of renderer1 # # self.callid1 = self.add_callback("on key press", self.on_keypress) # self.callid2 = self.add_callback("on click", self.on_click) # self._interactive = True # # def update(self): # source_pts = Points(self.sources).color("purple5").ps(12) # target_pts = Points(self.targets).color("purple5").ps(12) # source_pts.name = "source_pts" # target_pts.name = "target_pts" # slabels = self.source_pts.labels2d("id", c="purple3") # tlabels = self.target_pts.labels2d("id", c="purple3") # slabels.name = "source_pts" # tlabels.name = "target_pts" # self.at(0).remove("source_pts").add(source_pts, slabels) # self.at(1).remove("target_pts").add(target_pts, tlabels) # self.render() # # if len(self.sources) == len(self.targets) and len(self.sources) > 3: # warped = self.source.clone().warp(self.sources, self.targets) # warped.name = "warped" # self.at(2).remove("warped").add(warped) # self.render() # # def on_click(self, evt): # if evt.object == source: # self.sources.append(evt.picked3d) # self.source.pickable(False) # self.target.pickable(True) # self.msg0.text("--->") # self.msg1.text("now pick a target point") # elif evt.object == self.target: # self.targets.append(evt.picked3d) # self.source.pickable(True) # self.target.pickable(False) # self.msg0.text("now pick a source point") # self.msg1.text("<---") # self.update() # # def on_keypress(self, evt): # if evt.keypress == "c": # self.sources.clear() # self.targets.clear() # self.at(0).remove("source_pts") # self.at(1).remove("target_pts") # self.at(2).remove("warped") # self.msg0.text("CLEARED! Pick a point here") # self.msg1.text("") # self.source.pickable(True) # self.target.pickable(False) # self.update() # elif evt.keypress == "d": # n = min(len(self.sources), len(self.targets)) # self.sources = self.sources[:n-1] # self.targets = self.targets[:n-1] # self.msg0.text("Last point deleted! Pick a point here") # self.msg1.text("") # self.source.pickable(True) # self.target.pickable(False) # self.update() ################################################################################ settings.default_font = "Calco" source = Mesh(dataurl+"limb_surface.vtk").color("k5") source.rotate_y(90).rotate_z(-60).rotate_x(40) target = Mesh(dataurl+"290.vtk").color("yellow5") target.rotate_y(-40) plt = MorphPlotter(source, target, size=(2400, 850), axes=14) plt.cmap_name = "RdYlBu_r" plt.show() plt.close() vedo-2025.5.3/examples/advanced/warp5.py000066400000000000000000000116611474667405700177310ustar00rootroot00000000000000""" Takes 2 shapes, source and target, and morphs source on target this is obtained by fitting 18 parameters of a non linear, quadratic, transformation defined in transform() The fitting minimizes the distance to the target surface using algorithms available in the scipy.optimize package. """ from vedo import dataurl, vector, mag2, mag from vedo import Plotter, Sphere, Point, Text3D, Arrows, Mesh import scipy.optimize as opt print(__doc__) class Morpher: def __init__(self): self.source = None self.target = None self.bound = 0.1 self.method = "SLSQP" # 'SLSQP', 'L-BFGS-B', 'TNC' ... self.tolerance = 0.0001 self.subsample = 200 # pick only subsample pts self.allow_scaling = False self.params = [] self.msource = None self.s_size = ([0, 0, 0], 1) # ave position and ave size self.fitResult = None self.chi2 = 1.0e10 self.plt = None # -------------------------------------------------------- fit function def transform(self, p): a1, a2, a3, a4, a5, a6, b1, b2, b3, b4, b5, b6, c1, c2, c3, c4, c5, c6, s = self.params pos, sz = self.s_size[0], self.s_size[1] x, y, z = (p - pos) / sz * s # bring to origin, norm and scale xx, yy, zz, xy, yz, xz = x * x, y * y, z * z, x * y, y * z, x * z xp = x + 2 * a1 * xy + a4 * xx + 2 * a2 * yz + a5 * yy + 2 * a3 * xz + a6 * zz yp = +2 * b1 * xy + b4 * xx + y + 2 * b2 * yz + b5 * yy + 2 * b3 * xz + b6 * zz zp = +2 * c1 * xy + c4 * xx + 2 * c2 * yz + c5 * yy + z + 2 * c3 * xz + c6 * zz p2 = vector(xp, yp, zp) p2 = (p2 * sz) + pos # take back to original size and position return p2 def _func(self, pars): self.params = pars #calculate chi2 d2sum, n = 0.0, self.source.npoints srcpts = self.source.vertices rng = range(0, n, int(n / self.subsample)) for i in rng: p1 = srcpts[i] p2 = self.transform(p1) tp = self.target.closest_point(p2) d2sum += mag2(p2 - tp) d2sum /= len(rng) if d2sum < self.chi2: if d2sum < self.chi2 * 0.99: print("Emin ->", d2sum) self.chi2 = d2sum return d2sum # ------------------------------------------------------- Fit def morph(self): def avesize(pts): # helper fnc s, amean = 0, vector(0, 0, 0) for p in pts: amean = amean + p amean /= len(pts) for p in pts: s += mag(p - amean) return amean, s / len(pts) print("\n..minimizing with " + self.method) self.msource = self.source.clone() self.s_size = avesize(self.source.vertices) bnds = [(-self.bound, self.bound)] * 18 x0 = [0.0] * 18 # initial guess x0 += [1.0] # the optional scale if self.allow_scaling: bnds += [(1.0 - self.bound, 1.0 + self.bound)] else: bnds += [(1.0, 1.0)] # fix scale to 1 res = opt.minimize(self._func, x0, bounds=bnds, method=self.method, tol=self.tolerance) # recalc for all pts: self.subsample = self.source.npoints self._func(res["x"]) print("\nFinal fit score", res["fun"]) self.fitResult = res # ------------------------------------------------------- Visualization def draw_shapes(self): newpts = [] for p in self.msource.vertices: newp = self.transform(p) newpts.append(newp) self.msource.vertices = newpts arrs = [] pos, sz = self.s_size[0], self.s_size[1] sphere0 = Sphere(pos, r=sz, res=10, quads=True).wireframe().c("gray") for p in sphere0.vertices: newp = self.transform(p) arrs.append([p, newp]) hair = Arrows(arrs, s=0.3, c='jet').add_scalarbar() zero = Point(pos).c("black") x1, x2, y1, y2, z1, z2 = self.target.bounds() tpos = [x1, y2, z1] text1 = Text3D("source vs target", tpos, s=sz/10).color("dg") text2 = Text3D("morphed vs target", tpos, s=sz/10).color("db") text3 = Text3D("deformation", tpos, s=sz/10).color("dr") self.plt = Plotter(shape=[1, 3], axes=1) self.plt.at(2).show(sphere0, zero, text3, hair) self.plt.at(1).show(self.msource, self.target, text2) self.plt.at(0).show(self.source, self.target, text1, zoom=1.2) self.plt.interactive().close() ################################# if __name__ == "__main__": mr = Morpher() mr.source = Mesh(dataurl+"270.vtk").color("g",0.4) mr.target = Mesh(dataurl+"290.vtk").color("b",0.3) mr.target.wireframe() mr.allow_scaling = True mr.bound = 0.4 # limits the parameter value mr.morph() print("Result of parameter fit:\n", mr.params) # now mr.msource contains the modified/morphed source. mr.draw_shapes() vedo-2025.5.3/examples/advanced/warp6.py000066400000000000000000000017761474667405700177400ustar00rootroot00000000000000"""Press c while hovering to warp a Mesh onto another Mesh""" from vedo import * def on_keypress(event): if event.object and event.keypress == "c": picked = event.picked3d idx = mesh.closest_point(picked, return_point_id=True) n = normals[idx] p = verts[idx] + n / 5 txt = Text3D("Text3D\nABCDEF", s=0.1, justify="centered").c("red5") txt.reorient([0,0,1], n).pos(p) tpts = txt.clone().subsample(0.05).vertices kpts = [mesh.closest_point(tp) for tp in tpts] warped = txt.clone().warp(tpts, kpts, sigma=0.01, mode="2d") warped.c("purple5") lines = Lines(tpts, kpts).alpha(0.2) plt.remove("Text3D", "Lines").add(txt, warped, lines).render() mesh = ParametricShape("RandomHills").scale([1,1,0.5]) mesh.c("gray5").alpha(0.25) verts = mesh.vertices normals = mesh.vertex_normals plt = Plotter() plt.add_callback("key press", on_keypress) plt.show(mesh, __doc__, axes=9, viewup="z").close() vedo-2025.5.3/examples/basic/000077500000000000000000000000001474667405700156305ustar00rootroot00000000000000vedo-2025.5.3/examples/basic/align1.py000066400000000000000000000015141474667405700173560ustar00rootroot00000000000000"""Align 2 shapes: the red line to the yellow surface""" from vedo import * # Load two mesh objects, a limb and a rim, and color them gold and red limb = Mesh(dataurl + "270.vtk").c("gold") rim1 = Mesh(dataurl + "270_rim.vtk").c("red5").lw(4) # Make a clone copy of the rim and align it to the limb # Using rigid=True does not allow scaling rim2 = rim1.clone().align_to(limb, rigid=True).c("green5").lw(5) # Calculate the average squared distance between the aligned rim and the limb d = 0 for p in rim2.coordinates: cpt = limb.closest_point(p) d += mag2(p - cpt) # square of residual distance average_squared_distance = d / rim2.npoints # Print the average squared distance between the aligned rim and the limb printc("Average squared distance =", average_squared_distance, c="g") show(limb, rim1, rim2, __doc__, axes=1).close() vedo-2025.5.3/examples/basic/align2.py000066400000000000000000000021271474667405700173600ustar00rootroot00000000000000"""Generate two random sets of points and align them using the Iterative Closest Point algorithm""" from random import uniform as u from vedo import settings, Points, Arrows, Plotter settings.default_font = "Calco" N1 = 25 # number of points of first set N2 = 35 # number of points of second set x = 1.0 # add some randomness # Create two sets of random points with different colors pts1 = [(u(0, x), u(0, x), u(0, x) + i) for i in range(N1)] pts2 = [(u(0, x)+3, u(0, x)+i/3+2, u(0, x)+i+1) for i in range(N2)] vpts1 = Points(pts1).ps(10).c("blue5") vpts2 = Points(pts2).ps(10).c("red5") # Find best alignment between the 2 sets of Points, # e.i. find how to move vpts1 to best match vpts2 aligned_pts1 = vpts1.clone().align_to(vpts2, invert=False) txt = aligned_pts1.transform.__str__() # Create arrows to visualize how the points move during alignment arrows = Arrows(pts1, aligned_pts1, s=0.7).c("black") # Create a plotter with two subplots plt = Plotter(N=2, axes=1) plt.at(0).show(__doc__, vpts1, vpts2) plt.at(1).show(txt, aligned_pts1, arrows, vpts2, viewup="z") plt.interactive() plt.close() vedo-2025.5.3/examples/basic/align3.py000066400000000000000000000022171474667405700173610ustar00rootroot00000000000000"""Generate 3 random sets of points and align them using Procrustes method""" from random import uniform as u from vedo import Plotter, procrustes_alignment, Points # Define number of points and a randomness factor N = 15 # number of points x = 1.0 # add some randomness # Generate 3 sets of random points pts1 = [(u(0, x), u(0, x), u(0, x) + i) for i in range(N)] pts2 = [(u(0, x) + 3, u(0, x) + i / 2 + 2, u(0, x) + i + 1) for i in range(N)] pts3 = [(u(0, x) + 4, u(0, x) + i / 4 - 3, u(0, x) + i - 2) for i in range(N)] # Convert the sets of points into Points objects with different colors and sizes vpts1 = Points(pts1).c("r").ps(8) vpts2 = Points(pts2).c("g").ps(8) vpts3 = Points(pts3).c("b").ps(8) # Perform Procrustes alignment on the sets of points # and obtain the aligned sets # return an Assembly object formed by the aligned sets aligned = procrustes_alignment([vpts1, vpts2, vpts3]) #print([aligned.transform]) # Create a Plotter object with a 1x2 grid, 2D axes, # and independent camera control plt = Plotter(shape=[1,2], axes=2, sharecam=False) plt.at(0).show(vpts1, vpts2, vpts3, __doc__) plt.at(1).show(aligned) plt.interactive().close() vedo-2025.5.3/examples/basic/align4.py000066400000000000000000000021361474667405700173620ustar00rootroot00000000000000"""Align a set of curves in space with Procrustes method""" from vedo import * # Load splines from a file (returns a group of vedo.Lines, like a list) splines = Assembly(dataurl+'splines.npy') # Perform Procrustes alignment on the splines, allowing for non-rigid transformations procus = procrustes_alignment(splines, rigid=False) # Unpack the aligned splines from the Assembly object into a Python list alignedsplines = procus.unpack() # Obtain the mean spline and create a Line object with thicker width and blue color mean = procus.info['mean'] lmean = Line(mean).z(0.001) # z-shift it to make it visible lmean.linewidth(4).c('blue') # Color the aligned splines based on their distance from the mean spline for s in alignedsplines: darr = mag(s.coordinates - mean) # distance array s.cmap('hot_r', darr, vmin=0, vmax=0.007) # Add the mean spline and script description to the list of aligned splines alignedsplines += [lmean, __doc__] # Show the original and aligned splines in two side-by-side views # with independent cameras show([splines, alignedsplines], N=2, sharecam=False, axes=1).close() vedo-2025.5.3/examples/basic/align5.py000066400000000000000000000021701474667405700173610ustar00rootroot00000000000000"""Linearly transform a Mesh by defining how a specific set of points (landmarks) must move""" from vedo import dataurl, Mesh, Arrows, show # Define the original set of landmark points # note that landmark points do not need to belong to any mesh landmarks1 = [ [-0.067332, 0.177376, -0.05199058], [-0.004541, 0.085447, 0.05713107], [-0.011799, 0.175825, -0.02279279], [-0.081910, 0.117902, 0.04889364], ] # Define the target set of landmark points landmarks2 = [ [0.1287002, 0.2651531, -0.0469673], [0.3338593, 0.0941488, 0.1243552], [0.1860555, 0.2626522, -0.0202493], [0.1149052, 0.1731894, 0.0474256], ] s1 = Mesh(dataurl + "bunny.obj").c("gold") # Clone the mesh and color the clone orange s2 = s1.clone().c('orange4') # Transform the cloned mesh by moving the landmarks from landmarks1 to landmarks2 s2.align_with_landmarks(landmarks1, landmarks2) # Create arrows to visualize the movement of the landmark points arrows = Arrows(landmarks1, landmarks2, s=0.5).c('black') # Show the original mesh, transformed mesh, arrows, and script description show(s1, s2, arrows, __doc__, axes=True).close() vedo-2025.5.3/examples/basic/align6.py000066400000000000000000000015761474667405700173730ustar00rootroot00000000000000 """Align to bounding boxes. Force the Mesh into the empty box.""" from vedo import * # Load a mesh and color it silver msh1 = Mesh(dataurl + "cessna.vtk").color("silver") # Create axes for the original mesh axes1 = Axes(msh1) # Create a wireframe cube at a specified position cube = Cube().pos(2, 1, 0).wireframe() # Clone the mesh and align it to the bounding box of the cube msh2 = msh1.clone().align_to_bounding_box(cube) # Create axes for the aligned mesh axes2 = Axes(msh2) # Set up a Plotter object with 2 subrenderers plt = Plotter(N=2) # Add the original mesh, axes, and cube in the left renderer with the script description plt.at(0).add(msh1, axes1, cube, __doc__) # Add the aligned mesh and axes in the right renderer, viewing from the top plt.at(1).add(msh2, axes2, cube) # Show all and close the plotter when done plt.show(viewup='z', zoom=0.6) plt.interactive().close() vedo-2025.5.3/examples/basic/background_image.py000066400000000000000000000014721474667405700214670ustar00rootroot00000000000000""" Set a jpeg background image on a separate rendering layer """ from vedo import * # Create a plotter object with 4 subrenderers # and individual camera for each one plt = Plotter( N=4, sharecam=False, # each subrenderer has its own camera bg=dataurl+"images/tropical.jpg", # set the background image ) # Load a 3D model of a flamingo and rotate it so it is upright a1 = Cube().rotate_z(20) # Display a docstring on the second subrenderer plt.at(2).show(__doc__) # Zoom in on the background image to fill the window plt.background_renderer.GetActiveCamera().Zoom(1.8) # Display a logo on the first subrenderer plt.at(0).show(VedoLogo(distance=2)) # Display the flamingo model on the fourth subrenderer plt.at(3).show(a1) # Allow the plot to be interacted with and then close it plt.interactive().close() vedo-2025.5.3/examples/basic/boolean.py000066400000000000000000000025231474667405700176230ustar00rootroot00000000000000from vedo import * # Enable depth peeling for rendering transparency settings.use_depth_peeling = True # Declare an instance of the Plotter class with 2 rows and 2 columns of renderers, # and disable interactive mode, so that the program can continue running plt = Plotter(shape=(2, 2), interactive=False, axes=3) # Create two sphere meshes s1 = Sphere(pos=[-0.7, 0, 0]).c("red5",0.5) s2 = Sphere(pos=[0.7, 0, 0]).c("green5",0.5) # Show the spheres on the first renderer, and display the docstring as the title plt.at(0).show(s1, s2, __doc__) # Perform a boolean intersection operation between the two spheres, # set the color to magenta, and show the result on the second renderer b1 = s1.boolean("intersect", s2).c('magenta') plt.at(1).show(b1, "intersect", resetcam=False) # Perform a boolean union operation between the two spheres, # set the color to blue, add a wireframe, and show the result on the third renderer b2 = s1.boolean("plus", s2).c("blue").wireframe(True) plt.at(2).show(b2, "plus", resetcam=False) # Perform a boolean difference operation between the two spheres, # compute the normals, add a scalarbar, and show the result on the fourth renderer b3 = s1.boolean("minus", s2).compute_normals().add_scalarbar(c='white') plt.at(3).show(b3, "minus", resetcam=False) # Enable interactive mode, and close the plot plt.interactive().close() vedo-2025.5.3/examples/basic/boundaries.py000066400000000000000000000012201474667405700203300ustar00rootroot00000000000000"""Extract points on the boundary of a mesh. Add an ID label to all vertices.""" from vedo import * # Load a mesh from a URL, compute normals, and clean duplicate points b = Mesh(dataurl+'290.vtk') b.compute_normals().clean().linewidth(0.1) # Get the point IDs on the boundary of the mesh pids = b.boundaries(return_point_ids=True) # Create a Points object to represent the boundary points pts = Points(b.vertices[pids]).c('red5').ps(10) # Create a Label object for all the vertices in the mesh labels = b.labels('id', scale=10).c('green2') # Show the mesh, boundary points, vertex labels, and docstring show(b, pts, labels, __doc__, zoom=2).close() vedo-2025.5.3/examples/basic/buildmesh.py000066400000000000000000000015101474667405700201530ustar00rootroot00000000000000"""Manually build a mesh from points and faces""" from vedo import Mesh, show # Define the vertices and faces that make up the mesh verts = [(50,50,50), (70,40,50), (50,40,80), (80,70,50)] cells = [(0,1,2), (2,1,3), (1,0,3)] # cells same as faces # Build the polygonal Mesh object from the vertices and faces mesh = Mesh([verts, cells]) # Set the backcolor of the mesh to violet # and show edges with a linewidth of 2 mesh.backcolor('violet').linecolor('tomato').linewidth(2) # Create labels for all vertices in the mesh showing their ID labs = mesh.labels2d('pointid') # Print the points and faces of the mesh as numpy arrays print('vertices:', mesh.vertices) # same as mesh.points or mesh.coordinates print('faces :', mesh.cells) # Show the mesh, vertex labels, and docstring show(mesh, labs, __doc__, viewup='z', axes=1).close() vedo-2025.5.3/examples/basic/buttons1.py000066400000000000000000000022761474667405700177700ustar00rootroot00000000000000"""Add a square button with N possible internal states to a rendering window that calls an external function""" from vedo import Plotter, Mesh, dataurl, printc # Define a function that toggles the transparency of a mesh # and changes the button state def buttonfunc(obj, ename): mesh.alpha(1 - mesh.alpha()) # toggle mesh transparency bu.switch() # change to next status printc(bu.status(), box="_", dim=True) # Load a mesh and set its color to violet mesh = Mesh(dataurl+"magnolia.vtk").c("violet").flat() # Create an instance of the Plotter class with axes style-11 enabled plt = Plotter(axes=11) # Add a button to the plotter with buttonfunc as the callback function bu = plt.add_button( buttonfunc, pos=(0.7, 0.1), # x,y fraction from bottom left corner states=["click to hide", "click to show"], # text for each state c=["w", "w"], # font color for each state bc=["dg", "dv"], # background color for each state font="courier", # font type size=30, # font size bold=True, # bold font italic=False, # non-italic font style ) # Show the mesh, docstring, and button in the plot plt.show(mesh, __doc__).close() vedo-2025.5.3/examples/basic/buttons2.py000066400000000000000000000022521474667405700177630ustar00rootroot00000000000000"""Create three checkbox buttons to toggle objects on/off.""" from vedo import Mesh, Plotter, dataurl s1 = Mesh(dataurl+"bunny.obj").normalize().x(0).color("p5") s2 = Mesh(dataurl+"teapot.vtk").normalize().x(3).rotate_x(-90).color("y5") s3 = Mesh(dataurl+"mug.ply").normalize().x(6).color("r5") def func1(b, evt): s1.toggle() # toggle visibility b.switch() def func2(b, evt): s2.toggle() b.switch() def func3(b, evt): s3.toggle() b.switch() def func4(_, evt): [s.toggle() for s in (s1,s2,s3)] [b.switch() for b in plt.buttons] plt = Plotter(axes=1, size=(1000,500)) plt.add_hint(s1, "A Bunny", size=42) # shows a label when hovering on the object plt.add_hint(s2, "A Teapot", size=42) plt.add_hint(s3, "A Mug", size=42) plt.add_button(func1, pos=(0.4,0.15), size=42, states=["", ""], bc=["p5", "k7"]) plt.add_button(func2, pos=(0.5,0.15), size=42, states=["", ""], bc=["y5", "k7"]) plt.add_button(func3, pos=(0.6,0.15), size=42, states=["", ""], bc=["r5", "k7"]) plt.add_button(func4, pos=(0.9,0.15), size=42, states=["flip","flip"], bc=["k4","k5"], c=["k5","k4"], font="Cartoons123") plt.show(s1, s2, s3, __doc__, zoom=1.8).close() vedo-2025.5.3/examples/basic/buttons3.py000066400000000000000000000016121474667405700177630ustar00rootroot00000000000000"""Create a button using an Image icon to show its state""" from vedo import * def button_func(widget, evtname): print("button_func called") cone.color(button.state) if button.state: plt.background("black") else: plt.background("white") def on_mouse_click(event): if event.object: print("on_mouse_click", event) cone.color(button.state) # Create a cone cone = Cone().color(0) # Create a plotter plt = Plotter(bg='w', axes=1) plt.add_callback('mouse click', on_mouse_click) plt.add(cone, __doc__) # Create a button widget img0 = Image(dataurl+"images/play-button.png") img1 = Image(dataurl+"images/power-on.png") button = ButtonWidget( button_func, # states=["State 0", "State 1"], states=[img0, img1], c=["red4", "blue4"], bc=("k9", "k5"), size=100, plotter=plt, ) button.pos([0,0]).enable() plt.show(elevation=-40) vedo-2025.5.3/examples/basic/cartoony.py000066400000000000000000000025641474667405700200470ustar00rootroot00000000000000"""Give a cartoony appearance to a 3D mesh""" from vedo import dataurl, settings, Plotter, Mesh, Text2D settings.background_gradient_orientation = 3 # radial gradient # Create an instance of the Plotter class, # which creates a default camera needed for silhouette() plt = Plotter() # Create a Text2D object to display the docstring at the bottom-center of the plot, # using the Bongas font with a size of 2 and a dark green background txt = Text2D(__doc__, pos="bottom-center", font="Bongas", s=2, bg="dg") # Load a mesh of a human figure, disable lighting (reflections), # set the color to pink, and set the transparency to 0.5 man = Mesh(dataurl + "man.vtk").lighting("off").c("pink").alpha(0.5) # Load a mesh of a teddy bear, scale and rotate it around the z-axis, ted = Mesh(dataurl + "teddy.vtk").scale(0.4).rotate_z(-45).pos(-1, -1, -1) ted.lighting("off").c("sienna").alpha(0.1) # Show the meshes, the default silhouette of the teddy bear mesh plt.show( txt, ted, man, ted.silhouette(), # default silhouette of the teddy bear mesh man.silhouette(feature_angle=40).linewidth(3).color("dr"), bg="white", # set the background color to wheat bg2="blue8", # set the color of the gradient to light blue elevation=-80, # set the elevation angle of the camera zoom=1.2, # zoom in on the plot ) # Close the plot plt.close() vedo-2025.5.3/examples/basic/cells_within_bounds.py000066400000000000000000000016251474667405700222440ustar00rootroot00000000000000"""Find cells within specified bounds in x, y and/or z.""" from vedo import * # Load a mesh of a shark and normalize it mesh = Mesh(dataurl+'shark.ply').normalize().compute_normals() # Set the color of the mesh and the line width to 1 mesh.color('aqua').linewidth(1) # Define the lower and upper bounds for the z-axis z1, z2 = -1.5, -0.5 # Find the cell IDs of cells within the z-axis bounds ids = mesh.find_cells_in_bounds(zbounds=(z1,z2)) # Print the cell IDs in green to the console printc('IDs of cells within bounds:\n', ids, c='g') # Create two Plane objects at the specified z-positions p1 = Plane(normal=(0,0,1), s=[2,2]).z(z1).alpha(0.5) p2 = p1.clone().z(z2) # Set the color of cells within the bounds to red mesh.cellcolors[ids] = [200,10,10, 255] #RGBA labels = mesh.labels("cellid", scale=0.01) # Show the mesh, the two planes, the docstring show(mesh, p1, p2, labels, __doc__, axes=1).close() vedo-2025.5.3/examples/basic/clustering.py000066400000000000000000000016461474667405700203700ustar00rootroot00000000000000"""Example usage of remove_outliers() and compute_clustering()""" # Import the vedo library and numpy from vedo import np, Points, show # Generate 4 random sets of N points in 3D space N = 2000 f = 0.6 noise1 = np.random.rand(N, 3) * f + np.array([1, 1, 0]) noise2 = np.random.rand(N, 3) * f + np.array([1, 0, 1.2]) noise3 = np.random.rand(N, 3) * f + np.array([0, 1, 1]) noise4 = np.random.randn(N, 3) * f / 8 + np.array([1, 1, 1]) # Create a Points object from the noisy point sets noise4 = Points(noise4).remove_outliers(radius=0.05).coordinates pts = noise1.tolist() + noise2.tolist() + noise3.tolist() + noise4.tolist() pts = Points(pts) # Cluster the points to find back their original identity clpts = pts.compute_clustering(radius=0.1).print() # Set the color of the points based on their cluster ID using the 'jet' colormap clpts.cmap("jet", "ClusterId") show(clpts, __doc__, axes=1, viewup='z', bg='blackboard').close() vedo-2025.5.3/examples/basic/color_mesh_cells1.py000066400000000000000000000012601474667405700215760ustar00rootroot00000000000000"""Colorize faces of a Mesh by passing a 1-to-1 list of colors and transparencies""" from vedo import * # Enable depth peeling for better rendering of transparent objects settings.use_depth_peeling = True # Generate a torus and assign a linewidth of 1 tor = Torus(res=9).linewidth(1) # Generate an array of random RGBA color values for each cell of the mesh rgba = np.random.rand(tor.ncells, 4)*255 tor.cellcolors = rgba # Print information about the cell arrays of the mesh and their shape printc( 'Mesh cell arrays:', tor.celldata.keys(), 'shape:', tor.celldata['CellsRGBA'].shape, ) # Display the mesh with the assigned colors and the docstring show(tor, __doc__).close() vedo-2025.5.3/examples/basic/color_mesh_cells2.py000066400000000000000000000014011474667405700215740ustar00rootroot00000000000000"""Colorize a mesh cell by clicking on it""" from vedo import Mesh, Plotter, dataurl # Define the callback function to change the color of the clicked cell to red def func(evt): msh = evt.object if not msh: return pt = evt.picked3d idcell = msh.closest_point(pt, return_cell_id=True) m.cellcolors[idcell] = [255,0,0,200] #RGBA # Load a 3D mesh of a panther from a file and set its color to blue m = Mesh(dataurl + "panther.stl").c("blue7") # Make the mesh opaque and set its line width to 1 m.force_opaque().linewidth(1) # Create a Plotter object and add the callback function to it plt = Plotter() plt.add_callback("mouse click", func) # Display the mesh with the Plotter object and the docstring plt.show(m, __doc__, axes=1).close() vedo-2025.5.3/examples/basic/colorcubes.py000066400000000000000000000032201474667405700203370ustar00rootroot00000000000000"""Show a cube for each available color name""" from operator import itemgetter from vedo import Cube, Text2D, show, settings from vedo.colors import colors # Print the docstring print(__doc__) # Set immediate rendering to False for faster rendering with multi-renderers settings.immediate_rendering = False # Sort the colors by hex color code (matplotlib colors) sorted_colors1 = sorted(colors.items(), key=itemgetter(1)) # Create a list of cubes for each color name cbs=[] for sc in sorted_colors1: # Get the color name cname = sc[0] # Skip the color if it ends in a number if cname[-1] in "123456789": continue # Create a cube and text object for the color name cb = Cube().lw(1).color(cname) tname = Text2D(cname, s=0.9) # Add the cube and text object to the list cbs.append([tname, cb]) # Display the cubes and text objects in a grid plt1= show(cbs, N=len(cbs), azimuth=.2, size=(2100,1300), title="matplotlib colors", interactive=False) plt1.render() # Sort the colors by name (bootstrap5 colors) sorted_colors2 = sorted(colors.items(), key=itemgetter(0)) # Create a list of cubes for each color name cbs = [] for sc in sorted_colors2: # Get the color name cname = sc[0] # Skip the color if it doesn't end in a number if cname[-1] not in "123456789": continue # Create a cube for the color cb = Cube().lw(1).lighting('off').color(cname) # Add the cube to the list cbs.append([cname, cb]) # Display the cubes in a grid plt2= show(cbs, shape=(11,9), azimuth=0.2, size=(800,1000), title="bootstrap5 colors", new=True) # Close the plots plt2.close() plt1.close() vedo-2025.5.3/examples/basic/colorlines.py000066400000000000000000000024671474667405700203640ustar00rootroot00000000000000"""Color lines by a scalar Click the lines to get their lengths""" from vedo import * # Define the points for the first line pts1 = [(sin(x/8), cos(x/8), x/5) for x in range(25)] # Create the first line and color it black l1 = Line(pts1).c('black') # Create the second line by cloning the first and rotating it l2 = l1.clone().rotate_z(180).shift(1,0,0) # Calculate a scalar value for each line segment as # the distance between the corresponding points on the two lines dist = mag(l1.vertices - l2.vertices) # Color the lines based on the scalar value using the 'Accent' colormap, # and add a scalar bar to the plot lines = Lines(l1, l2, lw=8) lines.celldata["distance"] = dist lines.cmap('Accent').add_scalarbar('length') # Define a callback function to print the length of the clicked line segment def clickfunc(evt): if evt.object: # Get the ID of the closest point on the clicked line segment idl = evt.object.closest_point(evt.picked3d, return_cell_id=True) # Print the length of the line segment with 3 decimal places print('clicked line', idl, 'length =', dist[idl]) # Create a plotter with the mouse click callback function and show the lines plt = Plotter(axes=1, bg2='lightblue') plt.add_callback('mouse click', clickfunc) plt.show(l1,l2, lines, __doc__, viewup='z') plt.close() vedo-2025.5.3/examples/basic/colormap_list.py000066400000000000000000000022751474667405700210570ustar00rootroot00000000000000from vedo import * # Set the number of colors to generate n = 256 # Initialize some variables i, grids, vnames1, vnames2 = 0, [], [], [] # Loop over all available colormap names for name in colors.cmaps_names: # Skip reversed maps if '_r' in name: continue # Generate a list of n RGB color values for the colormap cols = color_map(range(n), name) gr = Grid(s=[50,1], res=[n,1]) gr.cellcolors = cols*255 gr.linewidth(0).wireframe(False).y(-i*1.2) grids.append([gr, gr.box().c('grey')]) # Add a text label with the colormap name to the left of the strip tx1 = Text3D(':rightarrow '+name, justify='left-center', s=0.75, font=2) tx1.pos(gr.xbounds(1), gr.y()).c('w') tx2 = tx1.clone(deep=False).c('k') vnames1.append(tx1) vnames2.append(tx2) i += 1 printc("Try picking a color by pressing Shift-i", invert=True) # Create a plotter with two renderers plt = Plotter(N=2, size=(1300,1000)) # Show the grids with the white text labels plt.at(0).show(grids, vnames1, bg='blackboard') plt.at(1).show(grids, vnames2, bg='white', mode='image', zoom='tight') # Enable interactivity and display the plot, then close it plt.interactive().close() vedo-2025.5.3/examples/basic/colormaps.py000066400000000000000000000013021474667405700201750ustar00rootroot00000000000000""" Example usage of cmap() to assign a color to each mesh vertex by looking it up in matplotlib database of colormaps """ from vedo import Plotter, Mesh, dataurl print(__doc__) # these are the some matplotlib color maps maps = [ "afmhot", "binary", "bone", "cool", "coolwarm", "copper", "gist_earth", "gray", "hot", "jet", "rainbow", "winter", ] mug = Mesh(dataurl+"mug.ply") scalars = mug.coordinates[:, 1] # let y-coord be the scalar plt = Plotter(N=len(maps)) for i, key in enumerate(maps): # for each available color map name imug = mug.clone(deep=False).cmap(key, scalars, n_colors=5) plt.at(i).show(imug, key) plt.interactive().close() vedo-2025.5.3/examples/basic/connected_vtx.py000066400000000000000000000013201474667405700210410ustar00rootroot00000000000000"""Find the vertices that are connected to a specific vertex in a mesh""" from vedo import * # create a wireframe sphere and color it yellow s = Sphere(res=12).wireframe().c("yellow") # select one point on the sphere using its index index = 12 pt = s.vertices[index] # find all the vertices that are connected to the selected point ids = s.connected_vertices(index) vtxs = s.vertices[ids] # create a red point at the selected point's location apt = Point(pt).c("red5").ps(15) # create blue points at the locations of the vertices # connected to the selected point cpts = Points(vtxs).c("blue5").ps(20) # show the sphere, the selected point, and the connected vertices show(s, apt, cpts, __doc__, bg='bb').close() vedo-2025.5.3/examples/basic/cut_freehand.py000066400000000000000000000054441474667405700206400ustar00rootroot00000000000000"""Interactively cut a mesh by drawing free-hand a spline in space""" # The tool can also be invoked from command line e.g.: > vedo --edit mesh.ply import vedo from vedo.applications import FreeHandCutPlotter #### This class is a simplified version of the above, shown here as an example: ####### # # class FreeHandCutPlotter(vedo.Plotter): # def __init__(self, mesh): # vedo.Plotter.__init__(self) # self.mesh = mesh # self.drawmode = False # self.cpoints = [] # self.points = None # self.spline = None # self.msg = "Right-click and move to draw line\n" # self.msg += "Second right-click to stop drawing\n" # self.msg += "Press z to cut mesh" # self.txt2d = vedo.Text2D(self.msg, pos='top-left', font="Bongas") # self.txt2d.c("white").background("green4", alpha=1) # self.add_callback('KeyPress', self.onKeyPress) # self.add_callback('RightButton', self.onRightClick) # self.add_callback('MouseMove', self.onMouseMove) # def onRightClick(self, evt): # self.drawmode = not self.drawmode # toggle mode # def onMouseMove(self, evt): # if self.drawmode: # self.remove([self.points, self.spline]) # # make this 2d-screen point 3d: # cpt = self.compute_world_coordinate(evt.picked2d) # self.cpoints.append(cpt) # self.points = vedo.Points(self.cpoints, r=8).c('black') # if len(self.cpoints) > 2: # self.spline = vedo.Line(self.cpoints, closed=True).lw(5).c('red5') # self.add([self.points, self.spline]).render() # def onKeyPress(self, evt): # if evt.keypress == 'z' and self.spline: # cut mesh with a ribbon-like surf. # vedo.printc("Cutting the mesh please wait..", invert=True) # tol = self.mesh.diagonal_size()/2 # size of ribbon # pts = self.spline.points() # n = vedo.fit_plane(pts, signed=True).normal # compute normal vector # rib = vedo.Ribbon(pts - tol*n, pts + tol*n, closed=True) # self.mesh.cut_with_mesh(rib) # self.remove([self.spline, self.points]).render() # self.cpoints, self.points, self.spline = [], None, None # def start(self, **kwargs): # return self.show(self.txt2d, self.mesh, **kwargs) # ###################################################################################### vedo.settings.use_parallel_projection = True # to avoid perspective artifacts msh = vedo.Volume(vedo.dataurl+'embryo.tif').isosurface().color('gold', 0.25) # Mesh plt = FreeHandCutPlotter(msh) plt.add_hover_legend() #plt.init(some_list_of_initial_pts) #optional! plt.start(axes=1, bg2='lightblue').close() vedo-2025.5.3/examples/basic/cut_interactive.py000066400000000000000000000015151474667405700213740ustar00rootroot00000000000000"""Manipulate a box to cut a mesh interactively. Use mouse buttons to zoom and pan. Press r to reset the cutting box Press i to toggle the cutting box on/off Press u to invert the selection""" from vedo import * # settings.enable_default_keyboard_callbacks = False # settings.enable_default_mouse_callbacks = False msh = Mesh(dataurl+'mouse_brain.stl').subdivide() msh.backcolor("purple8").print() # Create the plotter with the mesh, do not block the execution plt = Plotter(bg='blackboard', interactive=False) plt.show(msh, __doc__, viewup='z') # Create the cutter object cutter = PlaneCutter(msh) # cutter = BoxCutter(msh) # cutter = SphereCutter(msh) # Add the cutter to the renderer and show plt.add(cutter).interactive() # Remove the cutter from the renderer and show plt.remove(cutter).interactive() # close the plotter plt.close() vedo-2025.5.3/examples/basic/delaunay2d.py000066400000000000000000000013141474667405700202310ustar00rootroot00000000000000"""Delaunay 2D meshing with point loops defining holes""" from vedo import * # Generate a grid and add gaussian noise to it # then extract the points from the grid and store them in the variable gp gp = Grid().add_gaussian_noise([0.5,0.5,0]).point_size(8) # Define two internal holes using point ids ids = [[24,35,36,37,26,15,14,25], [84,95,96,85]] # Use the Delaunay triangulation algorithm to create a 2D mesh # from the points in gp, with the given boundary ids dly = gp.generate_delaunay2d(mode='xy', boundaries=ids) dly.c('white').lc('orange').lw(1) # Create labels for the point ids and set their z to 0.01 labels = gp.labels('id').z(0.01) show(gp, labels, dly, __doc__, bg="Mint", zoom='tight').close() vedo-2025.5.3/examples/basic/delete_mesh_pts.py000066400000000000000000000017511474667405700213520ustar00rootroot00000000000000"""Remove points and cells from a mesh which are closest to a specified point.""" from vedo import * # Enable depth peeling for the scene settings.use_depth_peeling = True # Load the apple mesh from a url, set the colors and line width msh = Mesh(dataurl+'apple.ply') msh.c('lightgreen').bc('tomato').lw(1) # Set a point and a radius to find the closest points in the mesh to it pt = [1, 0.5, 1] R = 1.2 ids = msh.closest_point(pt, radius=R, return_point_id=True) # Remove the cells from the mesh by their ids # and clean the mesh by removing orphaned vertices not associated to any cell printc('#points before:', msh.npoints, c='g') msh.delete_cells_by_point_index(ids) msh.clean() printc('#points after :', msh.npoints, c='g') # Create a sphere object with the given point and radius, and set transparency sph = Sphere(pt, r=R, alpha=0.1) # Show the point, the sphere, the modified mesh, the script docstring and axes # then close the window show(Point(pt), sph, msh, __doc__, axes=1).close() vedo-2025.5.3/examples/basic/distance2mesh.py000066400000000000000000000012461474667405700207360ustar00rootroot00000000000000"""Compute the (signed) distance of one mesh to another""" from vedo import Sphere, Cube, show # Create a sphere object and position it at (10,20,30) s1 = Sphere().pos(10,20,30) # Create a cube object with color grey and scaled # along the x-axis by 2, and positioned at (14,20,30) s2 = Cube(c='grey4').scale([2,1,1]).pos(14,20,30) # Compute the Euclidean distance between the 2 surfaces # and set the color of the sphere based on the distance s1.distance_to(s2, signed=False) s1.cmap('hot').add_scalarbar('Signed\nDistance') # Show the sphere, the cube, the script docstring, axes, # then close the window show(s1, s2, __doc__ , axes=1, size=(1000,500), zoom=1.5).close() vedo-2025.5.3/examples/basic/extrude.py000066400000000000000000000010611474667405700176600ustar00rootroot00000000000000"""Extruding a polygon along the z-axis""" from vedo import Star, show # Create a yellow star and rotate it around the x-axis star = Star().color('y') # Extrude the star along the z-axis, with a shift of 1, # a rotation of 10 degrees, a decrease in radius of 0.2, epol = star.extrude(zshift=1, rotation=10, dr=-0.2, cap=False, res=1) # Set the back color of the extruded polygon to violet epol.bc('violet').lighting("default") # Show the extruded polygon, the script docstring, axes, # then close the window show(epol, __doc__, axes=1, viewup='z').close() vedo-2025.5.3/examples/basic/fillholes.py000066400000000000000000000005711474667405700201660ustar00rootroot00000000000000"""Identify and fill holes of an input mesh. Holes are identified by locating boundary edges, linking them together into loops, and then triangulating the resulting loops.""" from vedo import Mesh, show, dataurl a = Mesh(dataurl+"bunny.obj").lw(1).bc('red') b = a.clone() # make a copy b.fill_holes(size=0.1).color("lb").bc('red5') show(a, b, __doc__, elevation=-40).close() vedo-2025.5.3/examples/basic/flatarrow.py000066400000000000000000000006421474667405700202050ustar00rootroot00000000000000"""Use 2 lines to define a flat arrow""" from vedo import * from numpy import arange arrs = [] for i in range(10): s, c = sin(i), cos(i) l1 = [[sin(x)+c, -cos(x)+s, x] for x in arange(0,3, 0.1)] l2 = [[sin(x)+c+0.1, -cos(x)+s + x/15, x] for x in arange(0,3, 0.1)] farr = FlatArrow(l1, l2, tip_size=1, tip_width=1).c(i) arrs.append(farr) show(arrs, __doc__, viewup="z", axes=1).close() vedo-2025.5.3/examples/basic/glyphs1.py000066400000000000000000000021231474667405700175670ustar00rootroot00000000000000"""Glyphs: at each vertex of a mesh, another mesh is shown with various orientation options""" from vedo import * # Create a sphere with resolution 12, set its color and show as wireframe sph = Sphere(res=12).c("white", 0.1).wireframe() randvs = np.random.rand(sph.npoints, 3) # random orientation vectors ####################################### # Create an ellipsoid glyph and scale it down gly1 = Ellipsoid().scale(0.04) # create a Glyph object that will show an ellipsoid at each vertex gsphere1 = Glyph( sph, gly1, orientation_array=randvs, scale_by_vector_size=True, color_by_vector_size=True, c="jet", ) ####################################### # Create a mesh glyph and scale it down gly2 = Mesh(dataurl + "shuttle.obj").rotate_y(180).scale(0.02) # Create a Glyph object that will show a shuttle at each vertex gsphere2 = Glyph( sph, gly2, orientation_array="normals", c="lightblue", ) # Show two groups of objects on N=2 renderers: show([ (sph, gsphere1, __doc__), (sph, gsphere2) ], N=2, bg="bb", zoom=1.4, ).close() vedo-2025.5.3/examples/basic/glyphs2.py000066400000000000000000000026001474667405700175700ustar00rootroot00000000000000"""Draw color arrow glyphs""" from vedo import * # Create two spheres with different radii, wireframes, # and colors, and set the position of one of them s1 = Sphere(r=10, res=8).wireframe().c('white') s2 = Sphere(r=20, res=8).wireframe().c('white',0.1).pos(0,4,0) # Get the coordinates of the coordinates of each sphere coords1 = s1.coordinates coords2 = s2.coordinates # --- color can be a colormap which maps arrow sizes # Define a title for the first set of arrows, # and create an Arrows object with coordinates and a colormap for color t1 = 'Color arrows by size\nusing a color map' a1 = Arrows(coords1, coords2, c='coolwarm', alpha=0.4) a1.add_scalarbar(c='w') # --- get a list of random rgb colors # Generate a list of random RGB colors for each arrow # based on an array of integers, and define a title for the second set of arrows nrs = np.random.randint(0, 10, len(coords1)) cols = get_color(nrs) t2 = 'Color arrows by an array\nand scale them by half' a2 = Arrows(coords1, coords2, c=cols) # Display two groups of objects on two renderers: the two spheres, # the Arrows object with a colormap for color and a scalar bar, # and the title for the first set of arrows on one renderer; # the two spheres, the Arrows object with random RGB colors, # and the title for the second set of arrows on another renderer show([(s1, s2, a1, t1), (s1, s2, a2, t2)], N=2, bg='bb', bg2='lb').close() vedo-2025.5.3/examples/basic/glyphs3.py000066400000000000000000000014411474667405700175730ustar00rootroot00000000000000"""Orient and scale 'glyphs' (use a Mesh like a symbol)""" # Credits: original example and data from https://plotly.com/python/cone-plot # Adapted for vedo by M. Musy, 2020. from vedo import Cone, Glyph, show import numpy as np import pandas as pd # Read cvs data df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/vortex.csv") pts = np.c_[df['x'], df['y'],df['z']] vecs= np.c_[df['u'], df['v'],df['w']] # Create a mesh to be used like a symbol (a "glyph") to be attached to each point cone = Cone().scale(0.3).rotate_y(90) # make it smaller and orient tip to positive x glyph = Glyph(pts, cone, vecs, scale_by_vector_size=True, color_by_vector_size=True) glyph.lighting('ambient').cmap('Blues').add_scalarbar(title='wind speed') show(glyph, __doc__, axes=True).close() vedo-2025.5.3/examples/basic/hover_legend.py000066400000000000000000000014421474667405700206440ustar00rootroot00000000000000"""Hover mouse on mesh to visualize object details""" from vedo import * mesh = Mesh(dataurl+"bunny.obj").color('k7') # Create multiple arrays associated to mesh vertices or cells mesh.pointdata['MYPOINTARRAY'] = mesh.coordinates[:,0] mesh.celldata['MYCELLARRAY'] = mesh.cell_centers().coordinates[:,1] # Create more objects sph = Sphere(pos=(-0.1,0.05,0.05), r=0.02) cub = Cube().alpha(0.5).linewidth(2) pts = Points(cub).c("violet").point_size(50) pts.name = 'The cube vertices' # can give a name to any objects # Create an instance of the plotter window plt = Plotter(N=2, sharecam=False) # Add a 2D hover legend to both renderers and show: cid0 = plt.at(0).add_hover_legend() plt.show(mesh, sph, __doc__) cid1 = plt.at(1).add_hover_legend() plt.show(cub, pts) plt.interactive().close() vedo-2025.5.3/examples/basic/input_box.py000066400000000000000000000020201474667405700202030ustar00rootroot00000000000000"""Start typing a color name for the mesh. E.g.: pink4 (Press 'Esc' to exit)""" from vedo import settings, dataurl, get_color_name from vedo import Plotter, Mesh, Text2D def kfunc(evt): key = evt.keypress.lower() field_txt = field.text().strip() # strip leading/trailing spaces if key == "backspace" and field_txt: key = "" field_txt = field_txt[:-1] elif key == "escape": plt.close() return elif len(key) > 1: return color_name = field_txt + key field.text(f"{color_name:^12}").frame(color_name, lw=8) mesh.color(color_name) msg.text(get_color_name(color_name)) plt.render() settings["enable_default_keyboard_callbacks"] = False mesh = Mesh(dataurl+"magnolia.vtk").color("black").flat() field = Text2D("black", pos="bottom-center",s=3, font="Meson", bg="k2", c="w", alpha=1) msg = Text2D(pos="top-right", s=2, font="Quikhand", c="k1", bg="k7", alpha=1) plt = Plotter() plt.add_callback("key press", kfunc) plt.show(mesh, field, msg, __doc__).close() vedo-2025.5.3/examples/basic/interaction_modes1.py000066400000000000000000000010131474667405700217640ustar00rootroot00000000000000"""Scene interaction styles""" from vedo import * msg = Text2D( """TrackballCamera is the default mode\n(press q to proceed)""", c="k", bg="yellow7", s=1.2, ) plt = Plotter(shape=(1,2)) plt.at(0).show(Cube(), msg).interactive() msg.text("..lets change it to JoystickCamera").background("indigo7") plt.at(1).show(Paraboloid(), mode="JoystickCamera").interactive() msg.text("..lets change it again to MousePan").background("red6") mode = interactor_modes.MousePan() plt.user_mode(mode).interactive() plt.close() vedo-2025.5.3/examples/basic/interaction_modes2.py000066400000000000000000000013001474667405700217640ustar00rootroot00000000000000"""Use the mouse to select objects and vertices in a mesh. Middle-click and drag to interact with the scene.""" from vedo import * settings.enable_default_mouse_callbacks = False def mode_select(objs): print("Selected objects:", objs) d0 = mode.start_x, mode.start_y # display coords d1 = mode.end_x, mode.end_y frustum = plt.pick_area(d0, d1) infru = frustum.inside_points(mesh, return_ids=False) color = np.random.randint(0, 10) infru.ps(10).c(color) plt.add(frustum, infru).render() mesh = Mesh(dataurl+"cow.vtk").c("k5").lw(1) mode = interactor_modes.BlenderStyle() mode.callback_select = mode_select plt = Plotter() plt.show(mesh, __doc__, axes=1, mode=mode)vedo-2025.5.3/examples/basic/interaction_modes3.py000066400000000000000000000015241474667405700217750ustar00rootroot00000000000000"""Interaction mode to fly over a surface. - Press arrows to move the camera in the plane of the surface. - "t" and "g" will move the camera up and down along z. - "x" and "X" will reset the camera to the default position towards +/-x. - "y" and "Y" will reset the camera to the default position towards +/-y. - "." and "," will rotate azimuth to the right or left. - "r" will reset the camera to the default position.""" from vedo import * from vedo.interactor_modes import FlyOverSurface settings.enable_default_keyboard_callbacks = False settings.enable_default_mouse_callbacks = False surf = ParametricShape("RandomHills").cmap("Spectral") mode = FlyOverSurface() txt = Text2D(__doc__, c="k", font="Antares", s=0.8) plt = Plotter(size=(1200, 600)) plt.user_mode(mode) plt.show(surf, Axes(surf), txt, elevation=-90, zoom=2, axes=14) plt.close() vedo-2025.5.3/examples/basic/interaction_modes4.py000066400000000000000000000020641474667405700217760ustar00rootroot00000000000000"""Press TAB to toggle active panel and freeze the other""" from vedo import * from vedo.interactor_modes import MousePan settings.enable_default_keyboard_callbacks = False settings.default_font = "Roboto" active = 0 inactive = 1 cube = Cube().rotate_x(10) img = Image(dataurl+"images/dog.jpg") def toggle_active(event): global active, inactive if event.keypress == "Tab": # toggle active renderer active, inactive = inactive, active plt.at(active).user_mode(modes[active]) plt.at(inactive).remove(frames[inactive]).freeze(True) plt.at(active).add(frames[active]).freeze(False) plt.render() elif event.keypress == "q": plt.close() frame0 = RendererFrame(lw=10, c="red5", alpha=1) frame1 = RendererFrame(lw=10, c="red5", alpha=1) plt = Plotter(shape=(1,2), sharecam=False, axes=1) modes = [0, MousePan()] frames = [frame0, frame1] plt.at(0).add(cube, frame0, __doc__).reset_camera() plt.at(1).add(img) plt.add_callback('key press', toggle_active) plt.at(inactive).freeze() plt.show(interactive=True).close()vedo-2025.5.3/examples/basic/keypress.py000066400000000000000000000015141474667405700200500ustar00rootroot00000000000000"""Implement a custom function that is triggered by pressing a keyboard button when the rendering window is in interactive mode. Place the pointer anywhere on the mesh and press c""" from vedo import dataurl, printc, Plotter, Point, Mesh ############################################################# def myfnc(evt): mesh = evt.object # printc('dump event info', evt) if not mesh or evt.keypress != "c": printc("click mesh and press c", c="r", invert=True) return printc("point:", mesh.picked3d, c="v") cpt = Point(mesh.picked3d) cpt.color("violet").ps(20).pickable(False) plt.add(cpt).render() ############################################################## plt = Plotter(axes=1) plt+= Mesh(dataurl+"bunny.obj").color("gold") plt+= __doc__ plt.add_callback('on key press', myfnc) plt.show().close() vedo-2025.5.3/examples/basic/largestregion.py000066400000000000000000000006631474667405700210540ustar00rootroot00000000000000"""Extract the mesh region that has the largest connected surface""" from vedo import dataurl, Volume, printc, Plotter mesh1 = Volume(dataurl+"embryo.tif").isosurface(80).c("yellow") printc("area1 =", mesh1.area(), c="yellow") mesh2 = mesh1.extract_largest_region().color("lb") printc("area2 =", mesh2.area(), c="lb") plt = Plotter(shape=(2,1), axes=7) plt.at(0).show(mesh1, __doc__) plt.at(1).show(mesh2) plt.interactive().close() vedo-2025.5.3/examples/basic/legendbox.py000066400000000000000000000005771474667405700201620ustar00rootroot00000000000000"""Customizing a legend box""" from vedo import * s = Sphere() c = Cube().x(2) e = Ellipsoid().x(4) h = Hyperboloid().x(6) h.legend('The description for\nthis one is quite long') lbox = LegendBox([s,c,e,h], width=0.3, height=0.4, markers='s') lbox.font("Kanopus") show(s, c, e, h, lbox, __doc__, axes=1, bg='lightyellow', bg2='white', size=(1200,800), viewup='z' ).close() vedo-2025.5.3/examples/basic/light_sources.py000066400000000000000000000007671474667405700210660ustar00rootroot00000000000000"""Set custom lights to a 3D scene""" from vedo import * man = Mesh(dataurl + 'man.vtk') man.c('white').lighting('glossy') p1 = Point([1,0,1], c='y') p2 = Point([0,0,2], c='r') p3 = Point([-1,-0.5,-1], c='b') p4 = Point([0,1,0], c='g') # Add light sources at the given positions l1 = Light(p1, c='y') # p1 can simply be [1,0,1] l2 = Light(p2, c='r') l3 = Light(p3, c='b') l4 = Light(p4, c='g', intensity=0.5) show( man, l1, l2, l3, l4, p1, p2, p3, p4, __doc__, axes=1, viewup='z', ).close() vedo-2025.5.3/examples/basic/lightings.py000066400000000000000000000005471474667405700202000ustar00rootroot00000000000000from vedo import dataurl, Mesh, Plotter styles = ['default', 'metallic', 'plastic', 'shiny', 'glossy', 'ambient', 'off'] msh = Mesh(dataurl+"beethoven.ply").c('gold').subdivide() plt = Plotter(N=len(styles), bg='bb') for i,s in enumerate(styles): msh_copy = msh.clone(deep=False).lighting(s) plt.at(i).show(msh_copy, s) plt.interactive().close() vedo-2025.5.3/examples/basic/lin_interpolate.py000066400000000000000000000012131474667405700213670ustar00rootroot00000000000000"""Interpolate linearly [(0, 0, 0), (2, 2, 0)] # at these positions, [(0.2,0,0), (0,0,0.2)] # these are the specified vectors """ from vedo import * positions = [(0, 0, 0), (2, 2, 0)] # at these positions, directions = [(0.2,0,0), (0,0,0.2)] # these are the specified vectors # now use lin_interpolate to interpolate linearly any other point in space # (points far from both positions will get close to the directions average) arrs = [] for x in range(0,10): for y in range(0,10): p = [x/5, y/5, 0] v = lin_interpolate(p, positions, directions) arrs.append(Arrow(p, p+v, s=0.001)) show(arrs, __doc__, axes=1).close() vedo-2025.5.3/examples/basic/manyspheres.py000066400000000000000000000012541474667405700205420ustar00rootroot00000000000000"""Example that shows how to draw very large number of spheres (same for Points, Lines) with different colors or different radii, N=""" from random import gauss from vedo import show, Spheres N = 50000 cols = range(N) # color numbers pts = [(gauss(0, 1), gauss(0, 2), gauss(0, 1)) for i in cols] rads = [abs(pts[i][1]) / 10 for i in cols] # radius=0 for y=0 # all have same radius but different colors: s0 = Spheres(pts, c=cols, r=0.1, res=5) # res= theta-phi resolution show(s0, __doc__+str(N), at=0, N=2, axes=1, viewup=(-0.7, 0.7, 0)) # all have same color but different radius along y: s1 = Spheres(pts, r=rads, c="lb", res=8) show(s1, at=1, axes=2).interactive().close() vedo-2025.5.3/examples/basic/mesh_alphas.py000066400000000000000000000010271474667405700204660ustar00rootroot00000000000000"""Create a set of transparencies which can be passed to method cmap()""" from vedo import Mesh, show, dataurl mesh = Mesh(dataurl+"beethoven.ply") # pick y coordinates of vertices and use them as scalars scalars = mesh.vertices[:, 1] # define opacities in the range of the scalar, # at min(scals) alpha is 0.1, # at max(scals) alpha is 0.9: alphas = [0.1, 0.1, 0.3, 0.4, 0.9] mesh.cmap("copper", scalars, alpha=alphas) # mesh.print() # print(mesh.pointdata['PointScalars']) # retrieve scalars show(mesh, __doc__, axes=9).close() vedo-2025.5.3/examples/basic/mesh_coloring.py000066400000000000000000000022311474667405700210300ustar00rootroot00000000000000"""Specify color mapping for cells and points of a Mesh""" from vedo import dataurl, Plotter, Mesh plt = Plotter(N=3, axes=11) ##################################### add a cell array man1 = Mesh(dataurl+"man_low.vtk").linewidth(0.1) nv = man1.ncells # nr. of cells scals = range(nv) # coloring by the index of cell man1.cmap("Paired", scals, on='cells').add_scalarbar("cell nr") plt.at(0).show(man1, __doc__, elevation=-60) ##################################### Point coloring man2 = Mesh(dataurl+"man_low.vtk") scals = man2.vertices[:, 0] + 37 # pick x coordinates of vertices man2.cmap("hot", scals) man2.add_scalarbar(horizontal=True) plt.at(1).show(man2, "mesh.cmap()") ##################################### Cell coloring man3 = Mesh(dataurl+"man_low.vtk") cell_centers = man3.cell_centers().coordinates scals = cell_centers[:, 2] + 37 # pick z coordinates of cells man3.cmap("afmhot", scals, on='cells') # Add a fancier 3D scalar bar embedded in the 3d scene man3.add_scalarbar3d(size=[0.2,3]) man3.scalarbar.scale(1.1).rotate_x(90).shift([0,2,0]) plt.at(2).show(man3, "mesh.cmap(on='cells')") plt.interactive() plt.close() vedo-2025.5.3/examples/basic/mesh_custom.py000066400000000000000000000013511474667405700205300ustar00rootroot00000000000000"""Controlling the color and transparency of a Mesh with various color map definitions""" from vedo import * man = Mesh(dataurl + "man.vtk") # let the scalar be the z coordinate of the mesh vertices scals = man.vertices[:, 2] # assign color map with specified opacities try: import colorcet # https://colorcet.holoviz.org mycmap = colorcet.bmy alphas = np.linspace(0.8, 0.2, num=len(mycmap)) except ModuleNotFoundError: printc("colorcet is not available, use custom cmap", c='y') printc("pip install colorcet", c='y') mycmap = ["darkblue", "magenta", (1, 1, 0)] alphas = [0.8, 0.6, 0.2] man.cmap(mycmap, scals, alpha=alphas).add_scalarbar() show(man, __doc__, viewup="z", axes=7).close() vedo-2025.5.3/examples/basic/mesh_lut.py000066400000000000000000000026401474667405700200240ustar00rootroot00000000000000"""Build a custom colormap, including out-of-range and NaN colors and labels""" from vedo import build_lut, Sphere, show # Generate a sphere and stretch it, so it sits between z=-2 and z=+2 mesh = Sphere(quads=True).scale([1,1,1.8]).linewidth(1) # Create some dummy data array to be associated to points data = mesh.coordinates[:,2].copy() # pick z-coords, use them as scalar data data[10:70] = float('nan') # make some values invalid by setting to NaN data[300:600] = 100 # send some values very far above-scale # Build a custom Look-Up-Table of colors: # value, color, alpha lut = build_lut( [ #(-2, 'pink' ), # up to -2 is pink (0.0, 'pink' ), # up to 0 is pink (0.4, 'green', 0.5), # up to 0.4 is green with alpha=0.5 (0.7, 'darkblue' ), #( 2, 'darkblue' ), ], vmin=-1.2, vmax= 0.7, below_color='lightblue', above_color='grey', nan_color='red', interpolate=False, ) # 3D scalarbar: mesh.cmap(lut, data).add_scalarbar3d(title='My Scalarbar', c='white') # mesh.scalarbar.scale(1.5).rotate_x(90).shift(0,2) # make it bigger and place it2) # OR 2D scalarbar: # mesh.cmap(lut, data).add_scalarbar() # OR 2D scalarbar derived from the 3D one: mesh.scalarbar = mesh.scalarbar.clone2d(pos=[0.7, -0.95], size=0.2) show(mesh, __doc__, axes=dict(zlabel_size=.04, number_of_divisions=10), elevation=-80, bg='blackboard', ).close() vedo-2025.5.3/examples/basic/mesh_map2cell.py000066400000000000000000000012531474667405700207160ustar00rootroot00000000000000"""Map an array which is defined on the vertices of a mesh to its cells""" from vedo import * doc = Text2D(__doc__, pos="top-center") mesh1 = Mesh(dataurl+'icosahedron.vtk').linewidth(0.1).flat() # let the scalar be the z coordinate of the mesh vertices msg1 = Text2D("Scalars originally defined on points..", pos="bottom-center") mesh1.pointdata["myzscalars"] = mesh1.vertices[:, 2] mesh1.cmap("jet", "myzscalars", on="points") msg2 = Text2D("..are interpolated to cells.", pos="bottom-center") mesh2 = mesh1.clone(deep=False).map_points_to_cells() plt = Plotter(N=2, axes=11) plt.at(0).show(mesh1, msg1, doc, viewup="z") plt.at(1).show(mesh2, msg2) plt.interactive().close() vedo-2025.5.3/examples/basic/mesh_modify.py000066400000000000000000000005061474667405700205060ustar00rootroot00000000000000"""Modify mesh vertex positions""" from vedo import * disc = Disc(res=(8,120)).linewidth(1) plt = Plotter(interactive=False, axes=1) plt.show(disc, Point(), __doc__) for i in range(100): # Modify vertex positions disc.vertices += [0.01, 0.01*sin(i/20), 0] plt.reset_camera().render() plt.interactive().close() vedo-2025.5.3/examples/basic/mesh_sharemap.py000066400000000000000000000010511474667405700210130ustar00rootroot00000000000000"""Share the same color map across different meshes""" from vedo import Mesh, show, dataurl ##################################### man1 = Mesh(dataurl+"man.vtk") scals = man1.vertices[:, 2] * 5 + 27 # pick z coordinates [18->34] man1.cmap("rainbow", scals, vmin=18, vmax=44) ##################################### man2 = Mesh(dataurl+"man.vtk") scals = man2.vertices[:, 2] * 5 + 37 # pick z coordinates [28->44] man2.cmap("rainbow", scals, vmin=18, vmax=44).add_scalarbar() show([(man2, __doc__), man1], shape=(2,1), elevation=-40, axes=11).close() vedo-2025.5.3/examples/basic/mesh_threshold.py000066400000000000000000000010441474667405700212110ustar00rootroot00000000000000"""Extracts cells of a Mesh which satisfy the threshold criterion: 37 < scalar < 37.5""" from vedo import * man = Mesh(dataurl+"man.vtk") scals = man.vertices[:, 0] + 37 # pick y coords of vertices # scals data is added to mesh points with automatic name PointScalars man.cmap("cool", scals).add_scalarbar(title="threshold", horizontal=True) # make a copy and threshold the mesh cutman = man.clone().threshold("Scalars", 37, 37.5) # distribute the meshes on the 2 renderers show([(man, __doc__), cutman], N=2, elevation=-30, axes=11).close() vedo-2025.5.3/examples/basic/mirror.py000066400000000000000000000004601474667405700175140ustar00rootroot00000000000000"""Mirror a mesh along one of the Cartesian axes""" from vedo import dataurl, Mesh, show myted1 = Mesh(dataurl+"teddy.vtk") myted2 = myted1.clone().c("green") myted2.pos([0,3,0]).mirror("y") fp = myted2.flagpole("mirrored\nmesh").follow_camera() show(myted1, myted2, fp, __doc__, bg2='ly', axes=1) vedo-2025.5.3/examples/basic/mouseclick1.py000066400000000000000000000014631474667405700204250ustar00rootroot00000000000000"""Mouse click and other type of events will trigger a call to a custom function""" from vedo import printc, Plotter, Mesh, dataurl printc("Click object to trigger a function call", invert=1) # callback functions def on_left_click(event): if not event.object: return printc("Left button pressed on", [event.object], c=event.object.color()) printc(event) # dump the full event info def on_drag(event): printc(event.name, 'happened at mouse position', event.picked2d) ###################### tea = Mesh(dataurl+"teapot.vtk").c("gold") mug = Mesh(dataurl+"mug.ply").rotate_x(90).scale(8).pos(2,0,-.7).c("red3") plt = Plotter(axes=11) plt.add_callback('LeftButtonPress', on_left_click) plt.add_callback('Interaction', on_drag) # mouse dragging triggers this plt.show(tea, mug, __doc__).close() vedo-2025.5.3/examples/basic/mouseclick2.py000066400000000000000000000014731474667405700204270ustar00rootroot00000000000000"""Add an observer to specific objects in a scene""" from vedo import * # ----------------------- def func(obj, name=None): printc("Plotter callback", c="m") # ----------------------- def ftxt(obj, ename): printc("Text2D callback", obj.__class__.__name__, ename, c="y") obj.color(np.random.rand() * 10) # ----------------------- def fmsh(obj, ename): printc("Mesh callback", obj.__class__.__name__, ename, c="b") msh.color(np.random.rand() * 10) msh = Mesh(dataurl + "spider.ply") cid2 = msh.add_observer("pick", fmsh) txt = Text2D("CLICK ME", pos="bottom-center", s=3, bg="yellow5").pickable() cid1 = txt.add_observer("pick", ftxt) plt = Plotter() # plt.add_observer("mouse click", func) ### SAME AS: # plt.add_callback("mouse click", func, enable_picking=False) plt.show(txt, msh, __doc__).close()vedo-2025.5.3/examples/basic/mousehighlight.py000066400000000000000000000013061474667405700212220ustar00rootroot00000000000000"""Click a sphere to highlight it""" from vedo import Text2D, Sphere, Plotter import numpy as np spheres = [] for i in range(25): p = np.random.rand(2) s = Sphere(r=0.05).pos(p).color('k5') s.name = f"sphere nr.{i} at {p}" spheres.append(s) def func(evt): if not evt.object: return sil = evt.object.silhouette().linewidth(6).c('red5') sil.name = "silu" # give it a name so we can remove the old one msg.text("You clicked: " + evt.object.name) plt.remove('silu').add(sil) msg = Text2D("", pos="bottom-center", c='k', bg='r9', alpha=0.8) plt = Plotter(axes=1, bg='black') plt.add_callback('mouse click', func) plt.show(spheres, msg, __doc__, zoom=1.2) plt.close() vedo-2025.5.3/examples/basic/mousehover0.py000066400000000000000000000013771474667405700204660ustar00rootroot00000000000000"""Use a flagpost object to visualize some property interactively""" from vedo import ParametricShape, Plotter, precision def func(evt): ### called every time mouse moves! if not evt.object: return # mouse hits nothing, return. pt = evt.picked3d # 3d coords of point under mouse txt = f"Position: {precision(pt[:2],2)}\n" \ f"Speed : {precision(evt.speed3d*100,2)} km/h" flagpost.text(txt).pos(pt) # update text and position plt.render() hil = ParametricShape('RandomHills').cmap('terrain') flagpost = hil.flagpost(offset=(0,0,0.25)) plt = Plotter(axes=1, bg2='yellow9', size=(1150, 750)) plt.add_callback('mouse move', func) # add the callback function plt.show(hil, flagpost, __doc__, viewup='z', zoom=2) plt.close() vedo-2025.5.3/examples/basic/mousehover1.py000066400000000000000000000026401474667405700204610ustar00rootroot00000000000000"""Visualize scalar values interactively by hovering the mouse on a mesh Press c to clear the path""" from vedo import * def func(evt): ### called every time mouse moves! msh = evt.object # get the mesh that triggered the event if not msh: return # mouse hits nothing, return. pt = evt.picked3d # 3d coords of point under mouse pid = msh.closest_point(pt, return_point_id=True) txt =( f"Point: {precision(pt[:2] ,2)}\n" f"Height: {precision(arr[pid],3)}\n" f"Ground speed: {precision(evt.speed3d*100,2)}" ) msg.text(txt) # update text message ar = Arrow(pt - evt.delta3d, pt, s=0.001, c='orange5') fp = msh.flagpole( txt, point=pt,s=0.04, c='k', font="VictorMono", ) fp.follow_camera() # make it always face the camera plt.remove("FlagPole").add(ar, fp) # remove the old flagpole, add the new plt.render() msg = Text2D(pos='bottom-left', font="VictorMono") # an empty text hil = ParametricShape('RandomHills').cmap('terrain').add_scalarbar() arr = hil.pointdata["Scalars"] # numpy array with heights plt = Plotter(axes=1, bg2='lightblue') plt.add_callback('mouse move', func) # add the callback function plt.add_callback('keyboard', lambda _: plt.remove("Arrow").render()) plt.show(hil, msg, __doc__, viewup='z') plt.close() vedo-2025.5.3/examples/basic/mousehover2.py000066400000000000000000000014651474667405700204660ustar00rootroot00000000000000"""Hover mouse to interactively fit a sphere to a region of the mesh""" from vedo import * def func(event): # callback function p = event.picked3d if p is None: return pts = Points(msh.closest_point(p, n=50), r=6) sph = fit_sphere(pts).alpha(0.1).pickable(False) pts.name = "mypoints" # we give it a name to make it easy to sph.name = "mysphere" # remove the old and add the new ones txt.text(f'Radius : {sph.radius}\nResidue: {sph.residue}') plt.remove("mypoints", "mysphere").add(pts, sph).render() txt = Text2D(__doc__, bg='yellow', font='Calco') msh = Mesh(dataurl+'290.vtk').subdivide() msh.compute_curvature(method=2) msh.cmap('PRGn', vmin=-0.02).add_scalarbar() plt = Plotter(axes=1) plt.add_callback('mouse hover', func) plt.show(msh, txt, viewup='z') plt.close() vedo-2025.5.3/examples/basic/mousehover3.py000066400000000000000000000024231474667405700204620ustar00rootroot00000000000000"""Compute 3D world coordinates from 2D screen pixel coordinates (hover mouse to place the points)""" from vedo import * settings.default_font = "Ubuntu" settings.use_depth_peeling = True def func(evt): # this is the callback function i = evt.at # the renderer nr. which is being hit pt2d = evt.picked2d # 2D screen coordinate # passing a list of meshes will force the points to be placed on any of them pt3d = plt.at(i).compute_world_coordinate(pt2d, objs=[objs[i]]) if mag(pt3d) < 0.01: return newpt = Point(pt3d).color(i) txt.text(f'2D coords: {pt2d}\n3D coords: {pt3d}\nNpt = {len(plt.objects)}') txt.color(i) # update text and color on the fly plt.at(i).add(newpt).render() # add new point and render i # create an empty text (to be updated in the callback) txt = Text2D("", s=1.4, font='Brachium', c='white', bg='green8') # create two polygonal meshes mesh1 = TessellatedBox() mesh2 = ParametricShape('ConicSpiral') mesh2.c('indigo1').lc('grey9').lw(1) objs = [mesh1, mesh2] plt = Plotter(N=2, bg='blackboard', axes=1, sharecam=False) plt.add_callback('mouse move', func) plt.at(0).show(mesh1, __doc__, viewup='z') plt.at(1).show(mesh2, txt, zoom=1.4) plt.interactive().close() vedo-2025.5.3/examples/basic/multirenderers.py000066400000000000000000000021261474667405700212470ustar00rootroot00000000000000"""Manually define the number, shape and position of the renderers inside the rendering window""" from vedo import * settings.immediate_rendering = False # faster for multi-renderers # (0,0) is the bottom-left corner of the window, (1,1) the top-right # the order in the list defines the priority when overlapping custom_shape = [ dict(bottomleft=(0.0,0.0), topright=(1.00,1.00), bg='wheat', bg2='w' ),# ren0 dict(bottomleft=(0.0,0.0), topright=(0.40,0.30), bg='blue3', bg2='lb'),# ren1 dict(bottomleft=(0.5,0.4), topright=(0.95,0.95), bg='green', bg2='lg'),# ren2 dict(bottomleft=(0.7,0.2), topright=(0.90,0.50), bg='red', bg2='pink'),# ren3 dict(bottomleft=(0.1,0.6), topright=(0.30,0.80), bg='violet', bg2='w'),# ren4 ] plt = Plotter(shape=custom_shape, size=(1200,900)) for i, cust in enumerate(custom_shape): s = ParametricShape(i).color(i).lighting('glossy') msg = 'Renderer nr.'+str(i)+'\n'+str(cust)+'\nShape = '+s.name plt.at(i).show(s, msg) plt.at(0).add(Text2D(__doc__, pos='bottom-right', font="Quikhand", s=1.5)) plt.interactive().close() vedo-2025.5.3/examples/basic/multiwindows1.py000066400000000000000000000027631474667405700210400ustar00rootroot00000000000000""" Example of drawing objects on different windows and/or subwindows within the same window. We split the main window in many subwindows and draw somethingon specific windows numbers. Then open an independent window and draw a shape on it. """ from vedo import * ########################################################################## # this is one instance of the class Plotter with 5 raws and 5 columns plt1 = Plotter(shape=(5,5), axes=0) # set a different background color for a specific subwindow (the last one) plt1.background([0.8, 0.9, 0.9], at=24) # load the meshes and give them a name a = Mesh(dataurl+"shuttle.obj") b = Mesh(dataurl+"cessna.vtk").c("red") c = Mesh(dataurl+"porsche.ply") # show a Text2D in each renderer for i in range(25): plt1.at(i).show(f"renderer\nnr.{i}") plt1.at( 6).show(a) plt1.at(23).show(b) plt1.at(24).show(c) ########################################################################## # declare a second independent instance of the class Plotter # shape can also be given as a string, e.g.: # shape="2/6" means 2 renderers above and 6 below # shape="3|1" means 3 renderers on the left and one on the right s = Mesh(dataurl+'mug.ply') # Set the position of the horizontal of vertical splitting [0,1]: #settings.window_splitting_position = 0.5 plt2 = Plotter(pos=(500, 250), shape='2/6') for i in range(len(plt2.renderers)): s2 = s.clone(deep=False).color(i) plt2.at(i).show(s2, f'renderer #{i}') printc(__doc__) plt2.interactive() plt2.close() plt1.close() vedo-2025.5.3/examples/basic/multiwindows2.py000066400000000000000000000015071474667405700210340ustar00rootroot00000000000000"""Multiple plotter sync-ed windows""" from vedo import * acts = [Ellipsoid().color('Bisque'), Cone().color('RosyBrown'), Cylinder().color('Chocolate'), ] opts = dict(axes=1, interactive=False, new=True, size=(390,390)) ts = [f"Window nr.{i}" for i in range(4)] plt0 = show(acts[0], **opts, pos=( 200,0), title=ts[0], viewup='z') plt1 = show(acts[1], **opts, pos=( 600,0), title=ts[1], camera=plt0.camera) plt2 = show(acts[2], __doc__, **opts, pos=(1000,0), title=ts[2], camera=plt0.camera) plts = [plt0, plt1, plt2] def func(evt): for i in range(3): if ts[i] != evt.title: # only update the other windows plts[i].render() for plt in plts: plt.add_callback('Interaction', func) plt.add_callback('EndInteraction', func) # because zooming is not an "Interaction" event plt.interactive() vedo-2025.5.3/examples/basic/pca_ellipse.py000066400000000000000000000011671474667405700204670ustar00rootroot00000000000000"""Draw the ellipse (dark) and the ellipsoid (light) that in both cases contain 50% of a point cloud, then check how many points are inside both objects""" from vedo import * pts = Points(np.random.randn(1000,3)) pts.scale([2, 1.5, 0.01]).rotate_z(30).pos([50,60,0]) elli2d = pca_ellipse( pts, pvalue=0.5) elli3d = pca_ellipsoid(pts, pvalue=0.5).alpha(0.1) extruded = elli2d.z(-0.1).extrude(0.2) # make an oval box printc("Inside ellipse :", extruded.inside_points(pts).npoints, c='b') printc("Inside ellipsoid:", elli3d.inside_points(pts).npoints, c='b') show(pts, elli2d, elli3d, __doc__, axes=1, zoom='tight').close() vedo-2025.5.3/examples/basic/pca_ellipsoid.py000066400000000000000000000026101474667405700210100ustar00rootroot00000000000000"""Draw the ellipsoid that contains 50% of a cloud of Points, then check how many points are inside the surface""" # # NB: check out pca_ellipse() method for 2D problems # from vedo import * settings.use_depth_peeling = True pts = Points(np.random.randn(10_000, 3)*[3,2,1]) pts.rotate_z(45).rotate_x(20).shift([30,40,50]) elli = pca_ellipsoid(pts, pvalue=0.50) # 50% of points inside ids = elli.inside_points(pts, return_ids=True) pts.print() # a new "IsInside" array now exists in pts.pointdata pin = pts.coordinates[ids] print("inside points #", len(pin)) # Create an inverted mask instead of calling inside_points(invert=True) mask = np.ones(pts.npoints, dtype=bool) mask[ids] = False pout = pts.coordinates[mask] print("outside points #", len(pout)) # Extra info can be retrieved with: print("axis 1 size:", elli.va) print("axis 2 size:", elli.vb) print("axis 3 size:", elli.vc) print("axis 1 direction:", elli.axis1) print("axis 2 direction:", elli.axis2) print("axis 3 direction:", elli.axis3) print("asphericity:", elli.asphericity(), '+-', elli.asphericity_error()) a1 = Arrow(elli.center, elli.center + elli.axis1) a2 = Arrow(elli.center, elli.center + elli.axis2) a3 = Arrow(elli.center, elli.center + elli.axis3) triad = Assembly(a1, a2, a3) # let's group them show( elli, triad, Points(pin).c("green4"), Points(pout).c("red5").alpha(0.2), __doc__, axes=1, ).close() vedo-2025.5.3/examples/basic/record_play.py000066400000000000000000000007571474667405700205160ustar00rootroot00000000000000"""Record and playback camera movements and other events \rightarrow Move the cube around, press 1, and finally press q""" from vedo import Cube, Plotter plt1 = Plotter(axes=1, interactive=0, title="recording window") evts = plt1.show(Cube(), __doc__).record() # print("Events:", evts) # a simple string (also saved as .vedo_recorded_events.log) plt2 = Plotter(axes=1, interactive=0, title="playback window", pos=(1100,0)) plt2.show(Cube(), "...now playing!").play(evts).interactive().close() vedo-2025.5.3/examples/basic/ribbon.py000066400000000000000000000010241474667405700174520ustar00rootroot00000000000000"""Form a surface by joining two lines""" from vedo import * import numpy as np l1 = [[sin(x), cos(x), x/3] for x in np.arange(0,9, 0.1)] l2 = [[sin(x)+0.2, cos(x) + x/15, x/3] for x in np.arange(0,9, 0.1)] t1 = Tube(l1, r=0.02).color("green5") t2 = Tube(l2, r=0.02).color("blue3") r12 = Ribbon(l1, l2, res=(200,5)).alpha(0.5) r1 = Ribbon(l1, width=0.1).color('orange',0.5) plt = Plotter(N=2, axes=1) plt.at(0).show(__doc__, r12, t1, t2) plt.at(1).show("..or along a single line", r1, t1, viewup="z") plt.interactive().close() vedo-2025.5.3/examples/basic/rotate_image.py000066400000000000000000000006051474667405700206430ustar00rootroot00000000000000"""Normal jpg/png image formats can be loaded, cropped, rotated and positioned in 3D.""" from vedo import Plotter, Image, dataurl plt = Plotter(axes=7) pic = Image(dataurl+"images/dog.jpg") for i in range(5): p = pic.clone() p.crop(bottom=0.20) # crop 20% from bottom p.scale(1-i/10.0).rotate_x(20*i).z(30*i) p.alpha(0.8) plt += p plt += __doc__ plt.show().close() vedo-2025.5.3/examples/basic/run_all.sh000077500000000000000000000002661474667405700176270ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo Press Esc at anytime to skip example, F1 to interrupt for f in *.py do echo "Processing $f script.." python "$f" done vedo-2025.5.3/examples/basic/scalarbars.py000066400000000000000000000017121474667405700203200ustar00rootroot00000000000000"""Insert 2D and 3D scalarbars in the rendering scene""" from vedo import Mesh, dataurl, show shape = Mesh(dataurl + "lamp.vtk") ms = [] cmaps = ("jet", "PuOr", "viridis") for i in range(3): s = shape.clone(deep=False).pos([0, i * 2.2, 0]) # colorize mesh scalars = s.points[:, 2] s.cmap(cmaps[i], scalars) ms.append(s) # add 2D scalar bar to first mesh ms[0].add_scalarbar(title="my scalarbar\nnumber #0") # 2D # add 3D scalar bars ms[1].add_scalarbar3d(c="k", title="scalarbar #1", size=[0, 3]) sc = ms[2].add_scalarbar3d( c="k", size=[None, 2.8], # change y-size only title="A viridis colormap\nscalarbar to play with", title_font="Quikhand", title_xoffset=-2, # offset of labels title_size=1.5, ) sc.scalarbar.rotate_x(90).scale(1.2).shift(0,2,0) # make it vertical # create a 2D copy scalarbar to the 3D one sc2d = sc.scalarbar.clone2d(size=0.3, ontop=True) show(ms, sc2d, __doc__, axes=1, viewup="z").close() vedo-2025.5.3/examples/basic/shadow1.py000066400000000000000000000005411474667405700175500ustar00rootroot00000000000000"""Cast a shadow of 2 meshes onto the wall""" from vedo import dataurl, Mesh, Sphere, show spider = Mesh(dataurl+"spider.ply") # spider.rotate_z(-90).normalize() spider.texture(dataurl+'textures/leather.jpg') spider.add_shadow('x', -3) sphere = Sphere(r=0.4).pos(0.5,0,1).add_shadow('x', -3) show(spider, sphere, __doc__, axes=1, viewup="z").close() vedo-2025.5.3/examples/basic/shadow2.py000066400000000000000000000010641474667405700175520ustar00rootroot00000000000000from vedo import * man = Mesh(dataurl+'man.vtk').c('k9').lighting('glossy') floor = Box(length=9, width=9, height=0.1).z(-1.6).c('white') cube = Cube().pos(2,-2,-1) p1 = Arrow([4,0,4], [0,0,0], c='red5').scale(0.2) p2 = Arrow([0,4,4], [0,0,0], c='green5').scale(0.2) p3 = Arrow([-4,-4,4], [0,0,0], c='blue5').scale(0.2) # Add light sources at the given positions # (grab the position and color of the arrow object) l1 = Light(p1) l2 = Light(p2) l3 = Light(p3) plt = Plotter(bg='blackboard').add_shadows() plt.show(l1, l2, l3, p1, p2, p3, man, floor, cube) vedo-2025.5.3/examples/basic/shadow3.py000066400000000000000000000007711474667405700175570ustar00rootroot00000000000000"""Project a shadow of a mesh in a specified direction""" from vedo import * settings.use_depth_peeling = False # depending on your system msh = Mesh(dataurl+"man.vtk").c("k5") plane = Plane(pos=(0,0,-1.6), normal=(0,0,1), s=[6,7]).alpha(0.2) shad = msh.clone().project_on_plane(plane, direction=(0.5,1,-1)) shad.c("k7").alpha(1).lighting("off").use_bounds(False) plane.shift(0,-0,0.001) # a small tolerance to avoid coplanarity with shad show(msh, plane, shad, __doc__, viewup='z', axes=7).close() vedo-2025.5.3/examples/basic/shrink.py000066400000000000000000000003171474667405700175010ustar00rootroot00000000000000"""Shrink mesh polygons to make the inside visible""" from vedo import * pot = Mesh(dataurl+"teapot.vtk").shrink(0.75) s = Sphere(r=0.2).pos(0, 0, -0.5) show(pot, s, __doc__, axes=11, viewup="z").close() vedo-2025.5.3/examples/basic/silhouette1.py000066400000000000000000000007361474667405700204560ustar00rootroot00000000000000"""Generate the silhouette of a mesh as seen along a specified direction """ from vedo import * s = Hyperboloid().rotate_x(20) sx = s.clone().project_on_plane('x').c('r').x(-3) # sx is 2d sy = s.clone().project_on_plane('y').c('g').y(-3) sz = s.clone().project_on_plane('z').c('b').z(-3) show(s, sx, sx.silhouette('2d'), # 2d objects dont need a direction sy, sy.silhouette('2d'), sz, sz.silhouette('2d'), __doc__, axes=7, viewup='z', ).close() vedo-2025.5.3/examples/basic/silhouette2.py000066400000000000000000000027641474667405700204620ustar00rootroot00000000000000"""Generate the silhouette of a mesh as seen along a specified direction Axes font: """ # Author: Zhi-Qiang Zhou (https://github.com/zhouzq-thu) from vedo import * settings.default_font = "Kanopus" s = Hyperboloid().rotate_x(20) pts = s.points n = len(pts) plt = Plotter(title="Example of project_on_plane()") plt += [s, __doc__ + settings.default_font] # orthogonal projection ############################### plane1 = Plane(pos=(2, 0, 2), normal=(1, 0, 1), s=[5, 5]).alpha(0.1) so = s.clone().project_on_plane(plane1).c("y") plt += [plane1, so, so.silhouette("2d")] pts1 = so.silhouette("2d").points # perspective projection ############################## plane2 = Plane(pos=(3, 3, 3), normal=(1, 1, 1), s=[5, 5]).alpha(0.1) point = [6, 6, 6] sp = s.clone().project_on_plane(plane2, point=point).c("m") plt += [plane2, sp, sp.silhouette("2d")] # oblique projection ################################## plane3 = Plane(pos=(4, 8, -4), normal=(-1, 0, 1), s=[5, 5]).alpha(0.1) sob = s.clone().project_on_plane(plane3, direction=(1, 2, -1)).c("g") plt += [plane3, sob, sob.silhouette("2d")] pts2 = sob.silhouette("2d").points # draw the lines for i in range(0, n, int(n / 20)): plt += Line(pts1[i], pts[i]).color("black",0.2) plt += Line(point, pts[i]).color("black",0.2) plt += Line(pts2[i], pts[i]).color("black",0.2) plt.show( axes=dict( xtitle="X-axis in :mum", ytitle="Y-axis in :mum", ztitle="Z-axis in :mum", yzgrid=False, text_scale=1.5, ), ).close() vedo-2025.5.3/examples/basic/silhouette3.py000066400000000000000000000005041474667405700204510ustar00rootroot00000000000000"""Make the silhouette of an object move along with camera position""" from vedo import * # Need to create a Plotter instance to access the camera plt = Plotter(bg='blue4', bg2='white') s = Mesh(dataurl+'shark.ply').c('gray',0.1).lw(1).lc('k') silh = s.silhouette().c('red3',0.9).lw(3) plt.show(s, silh, __doc__).close() vedo-2025.5.3/examples/basic/skybox.py000066400000000000000000000007321474667405700175230ustar00rootroot00000000000000"""Embed a mesh into a skybox environment Mesh lighting is by Physically Based Rendering (PBR)""" from vedo import * msh = Mesh(dataurl+"man.vtk").rotate_x(-90) # Use physically based rendering (PBR): msh.c("white").lighting(metallicity=1, roughness=0.05) # Specify a skybox environment from a HDR file # (more skybox example HDR files at https://polyhaven.com/hdris) cubemap_path = download(dataurl+"kloppenheim_06_4k.hdr") show(msh, __doc__, bg=cubemap_path).close() vedo-2025.5.3/examples/basic/slider_browser.py000066400000000000000000000017251474667405700212340ustar00rootroot00000000000000"""Mouse hind limb growth from day 10 9h to day 15 21h""" from vedo import settings, dataurl, Assembly from vedo import Text2D, Plotter, Image, Axes, Line def sliderfunc(widget, event): i = int(widget.value) days = int((i * 2 + 249) / 24) widget.title = f"{days}d {i*2+249-days*24}h" # remove the old and add the new shape # (no need to render as the slider makes a call to rendering) plt.pop().add(objs[i]) objs = Assembly(dataurl+"timecourse1d.npy") # load a list of shapes settings.default_font = "Glasgo" plt = Plotter(bg="blackboard") plt += Text2D(__doc__, pos="top-center", s=1.2).color("w") plt += Image(dataurl + "images/limbs_tc.jpg").scale(0.0154).y(10) plt += Line([(0, 8), (0, 10), (28.6, 10), (4.5, 8)]).color("gray") plt += Axes(objs[-1]) plt += objs[0] plt.add_slider( sliderfunc, 0, len(objs) - 1, pos=[(0.4, 0.1), (0.9, 0.1)], show_value=False, title_size=1.5, ) plt.show(zoom=1.2, mode="image") plt.close() vedo-2025.5.3/examples/basic/sliders1.py000066400000000000000000000011441474667405700177300ustar00rootroot00000000000000"""Use two sliders to change color and transparency of a mesh""" from vedo import Plotter, Mesh, dataurl def slider1(widget, event): mesh.color(widget.value) def slider2(widget, event): mesh.alpha(widget.value) mesh = Mesh(dataurl+"magnolia.vtk").flat().lw(1) plt = Plotter() plt += [mesh, __doc__] plt.add_slider( slider1, xmin=-9, xmax=9, value=0, pos="bottom-right", title="color number", ) plt.add_slider( slider2, xmin=0.01, xmax=0.99, value=0.5, c="blue", pos="bottom-right-vertical", title="alpha value (opacity)", ) plt.show().close() vedo-2025.5.3/examples/basic/sliders2.py000066400000000000000000000026601474667405700177350ustar00rootroot00000000000000"""Sliders and buttons controlling objects""" from vedo import * settings.use_depth_peeling = True def slider0(widget, event): sphere.color(widget.value) def slider1(widget, event): val = widget.value widget.title = get_color_name(val) cube.color(val) def button_func(obj, event): cube.alpha(1 - cube.alpha()) # toggle mesh transparency sphere.alpha(1 - sphere.alpha()) button.switch() # change to next status ###### sphere = Sphere(r=0.6).lw(1).color(0).alpha(0.8) cube = Cube().lw(1).color(0).alpha(0.8) plt = Plotter(N=2, axes=True) ###### plt.at(0).show(sphere, __doc__) # show the sphere on the first renderer plt.add_slider( slider0, -9, 9, # slider range value=0, # initial value pos=([0.1,0.1], # first point of slider in the renderer [0.4,0.1]), # 0.4 = 40% of the window size width title="slider nr.0, color number", ) ###### plt.at(1).show(cube) plt.add_slider( slider1, -9, 9, value=0, pos=([0.1,0.1], [0.4,0.1]), title="slider nr.1, color number", ) ###### button = plt.at(1).add_button( button_func, pos=(0.5, 0.95), # x,y fraction from bottom left corner states=["HIGH alpha (click here!)", "LOW alpha (click here!)"], c = ["w", "k"], # colors of states (foreground) bc= ["k", "grey"], # colors of states (background) font="Quikhand", size=35, ) plt.show().interactive().close() vedo-2025.5.3/examples/basic/sliders3d.py000066400000000000000000000010061474667405700200730ustar00rootroot00000000000000"""3D slider to move a mesh interactively""" from vedo import Plotter, Mesh, dataurl plt = Plotter() mesh = Mesh(dataurl+"spider.ply") # mesh.normalize().rotate_z(190) def slider_y(widget, event): mesh.x(widget.value) # set y coordinate position plt.add_slider3d( slider_y, pos1=[1, 0, 0.35], pos2=[6, 0, 0.35], xmin=-2, xmax=2, value=0, s=0.04, c="r", rotation=45, title="position", ) plt.show(mesh, __doc__, axes=11, bg='bb', bg2='navy', elevation=-30) plt.close() vedo-2025.5.3/examples/basic/sliders_hsv.py000066400000000000000000000031541474667405700205320ustar00rootroot00000000000000"""Explore RGB and HSV color spaces""" from vedo import * from vedo.colors import rgb2hsv, hsv2rgb, rgb2hex def update_txt(rgb, hsv): RGB = np.round(np.array(rgb)*255).astype(int) HEX = rgb2hex(rgb) name = get_color_name(rgb) tx1.text(f"RGB: {precision(rgb, 3)}\n {RGB}\nHEX: {HEX}") tx2.text(f"HSV: {precision(hsv, 3)}\n ~ {name}") box.color(rgb) def func_rgb(w, e): rgb = slr.value, slg.value, slb.value hsv = rgb2hsv(rgb) slh.value, sls.value, slv.value = hsv update_txt(rgb, hsv) def func_hsv(w, e): hsv = slh.value, sls.value, slv.value rgb = hsv2rgb(hsv) slr.value, slg.value, slb.value = rgb update_txt(rgb, hsv) box = Cube().linewidth(2).color([0.5, 0.5, 0.5]).lighting("off") tx1 = Text2D(font="Calco", s=1.4, pos="top-left", bg="k5").text(__doc__) tx2 = Text2D(font="Calco", s=1.4, pos="top-right", bg="k5") plt = Plotter() slr = plt.add_slider(func_rgb, 0, 1, value=0.5, show_value=False, c="r3", pos=((0.05,0.18),(0.40,0.18))) slg = plt.add_slider(func_rgb, 0, 1, value=0.5, show_value=False, c="g3", pos=((0.05,0.12),(0.40,0.12))) slb = plt.add_slider(func_rgb, 0, 1, value=0.5, show_value=False, c="b3", pos=((0.05,0.06),(0.40,0.06)), title="RGB") slh = plt.add_slider(func_hsv, 0, 1, value=0.5, show_value=False, c="k1", pos=((0.60,0.18),(0.95,0.18))) sls = plt.add_slider(func_hsv, 0, 1, value=0.0, show_value=False, c="k1", pos=((0.60,0.12),(0.95,0.12))) slv = plt.add_slider(func_hsv, 0, 1, value=0.5, show_value=False, c="k1", pos=((0.60,0.06),(0.95,0.06)), title="HSV") plt.show(box, tx1, tx2, viewup="z").close() vedo-2025.5.3/examples/basic/sliders_range.py000066400000000000000000000016101474667405700210210ustar00rootroot00000000000000"""Create a double range slider to scale two spheres""" from vedo import * def slider1(w, e): if slid1.value > slid2.value: slid1.value = slid2.value s1.scale(slid1.value, reset=True) def slider2(w, e): if slid2.value < slid1.value: slid2.value = slid1.value s2.scale(slid2.value, reset=True) s1 = Sphere().c("red5").alpha(0.5).scale(0.8) s2 = Sphere().c("green4").alpha(0.5).scale(1.2) plt = Plotter() slid2 = plt.add_slider( slider2, xmin=0.1, xmax=2, value=1.2, slider_length=0.02, slider_width=0.06, alpha=0.5, c="green4", show_value=True, font="Calco", ) slid1 = plt.add_slider( slider1, xmin=0.1, xmax=2.0, value=0.8, slider_length=0.01, slider_width=0.05, alpha=0.5, tube_width=0.0015, c="red5", show_value=True, font="Calco", ) plt.show(s1, s2, __doc__, axes=1).close() vedo-2025.5.3/examples/basic/specular.py000066400000000000000000000013041474667405700200160ustar00rootroot00000000000000"""Setting illumination properties: ambient, diffuse, specular power and color.""" from vedo import Plotter, Mesh, dataurl ambient = 0.1 diffuse = 0 specular = 0 specular_power = 20 specular_color = "white" apple = Mesh(dataurl + "apple.ply") apple.flat().c("gold") plt = Plotter(axes=1, bg='black', bg2='white') for i in range(8): x = (i % 4) * 2.2 y = int(i < 4) * 3 apple_copy = apple.clone().pos(x, y) # modify the default with specific values apple_copy.lighting( "default", ambient, diffuse, specular, specular_power, specular_color ) plt += apple_copy ambient += 0.125 diffuse += 0.125 specular+= 0.125 plt += __doc__ plt.show().close() vedo-2025.5.3/examples/basic/spline_tool.py000066400000000000000000000017371474667405700205410ustar00rootroot00000000000000"""Modify a spline interactively. - Drag points with mouse - Add points by clicking on the line - Remove them by selecting&pressing DEL --- PRESS q TO PROCEED ---""" from vedo import Circle, show # Create a set of points in space pts = Circle(res=8).extrude(zshift=0.5).ps(4) # Visualize the points plt = show(pts, __doc__, interactive=False, axes=1) # Add the spline tool using the same points and interact with it sptool = plt.add_spline_tool(pts, closed=True) # Add a callback to print the center of mass of the spline sptool.add_observer( "end of interaction", lambda o, e: ( print(f"Spline changed! CM = {sptool.spline().center_of_mass()}"), print(f"\tNumber of points: {sptool.spline().points.size}"), ) ) # Stay in the loop until the user presses q plt.interactive() # Switch off the tool sptool.off() # Extract and visualize the resulting spline sp = sptool.spline().lw(4) show(sp, "My spline is ready!", interactive=True, resetcam=False).close() vedo-2025.5.3/examples/basic/ssao.py000066400000000000000000000010301474667405700171410ustar00rootroot00000000000000"""Rendering with Screen Space Ambient Occlusion (SSAO)""" from vedo import dataurl, Mesh, Volume, Plotter # mesh = Mesh(dataurl + "porsche.ply").rotate_x(90) mesh = Volume(dataurl+"embryo.tif").isosurface() mesh.compute_normals().c('white') plt = Plotter(N=2, bg='blue1') plt.at(0) radius = mesh.diagonal_size()/5 # need to specify it! plt.add_ambient_occlusion(radius) plt += mesh.clone() plt += __doc__ plt.at(1) plt += mesh.clone() plt += '..without ambient occlusion' plt.show(viewup='z', zoom=1.3) plt.interactive().close() vedo-2025.5.3/examples/basic/surf_intersect.py000066400000000000000000000005341474667405700212430ustar00rootroot00000000000000"""Intersection of two polygonal meshes""" from vedo import * settings.use_depth_peeling = True car = Mesh(dataurl+"porsche.ply").alpha(0.2) line = [(-9.,0.,0.), (0.,1.,0.), (9.,0.,0.)] tube = Tube(line).triangulate().c("violet",0.2) contour = car.intersect_with(tube).linewidth(4).c('black') show(car, tube, contour, __doc__, axes=7).close() vedo-2025.5.3/examples/basic/texture_coords.py000066400000000000000000000014101474667405700212470ustar00rootroot00000000000000"""Assign texture coordinates to a polygon""" from vedo import * settings.default_font = 'Bongas' # define a polygon of 4 vertices: polygon = [ [(82, 92, 47), (87, 88, 47), # x,y,z of vertices (93, 95, 47), (88, 99, 47)], [[0, 1, 2, 3]], # vertex connectivity ] # texture coordinates, one (u,v) pair for each vertex: tc = [(0,0), (1,0), (1,1), (0,1)] #tc = [(0,0), (2,0), (2,2), (0,2)] # create the Mesh object (a rectangle) m = Mesh(polygon) # apply texture to m fpath = download('https://vedo.embl.es/examples/data/images/dog.jpg') m.texture( fpath, tcoords=tc, interpolate=True, repeat=True, # when tcoords extend beyond [0,1] edge_clamp=False, # only used when repeat is False ) show(m, __doc__, axes=1).close() vedo-2025.5.3/examples/basic/texturecubes.py000066400000000000000000000007701474667405700207300ustar00rootroot00000000000000""" Show a cube for each available texture name. Any jpg file can be used as texture. """ from vedo import dataurl, show, Cube textures_path = dataurl+'textures/' print(__doc__) print('example textures:', textures_path) cubes = [] cubes.append(Cube().texture(textures_path+'leather.jpg')) cubes.append(Cube().texture(textures_path+'paper2.jpg')) cubes.append(Cube().texture(textures_path+'wood1.jpg')) cubes.append(Cube().texture(textures_path+'wood2.jpg')) show(cubes, N=4, bg2='lightblue').close() vedo-2025.5.3/examples/basic/tube_radii.py000066400000000000000000000014051474667405700203110ustar00rootroot00000000000000"""Use array to vary radius and color of a line represented as a tube""" from vedo import * settings.default_font = 'Quikhand' ln = [[sin(x), cos(x), x / 2] for x in np.arange(0,9, 0.1)] N = len(ln) ############################### a simple tube( along ln t1 = Tube(ln, c="blue", r=0.08) ############################### vary radius rads = [0.3*(cos(6.0*ir/N))**2+0.1 for ir in range(N)] t2 = Tube(ln, r=rads, c="tomato", res=24) ############################### vary color cols = list(range(N)) cols = make_bands(cols, 5) # make color bins t3 = Tube(ln, r=rads, c=cols, res=24) ############################### visualize plt = Plotter(N=3, axes=dict(text_scale=4)) plt.at(0).show(t1, __doc__) plt.at(1).show(t2) plt.at(2).show(t3, viewup="z") plt.interactive().close() vedo-2025.5.3/examples/basic/voronoi1.py000066400000000000000000000013311474667405700177540ustar00rootroot00000000000000"""Voronoi convex tiling of the plane from a set of random points""" import numpy as np from vedo import Points, show # Generate a set of random points in the unit square points = np.random.random((500, 2)) # Create a Voronoi tiling of the plane from a set of points. pts = Points(points).subsample(0.02) # impose a min distance of 2% vor = pts.generate_voronoi(padding=0.01) vor.cmap('Set3', "VoronoiID", on='cells').wireframe(False) # Create a label for each cell showing its ID vor.compute_normals() # needed for the labels to face the camera labels = vor.labels("VoronoiID", on='cells', scale=0.01, justify='center') # Plot the objects and close the window to continue show(pts, vor, labels, __doc__, zoom=1.3).close() vedo-2025.5.3/examples/notebooks/000077500000000000000000000000001474667405700165525ustar00rootroot00000000000000vedo-2025.5.3/examples/notebooks/align1.ipynb000066400000000000000000003143711474667405700210010ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[32mave. squared distance = 43.20515185350062\u001b[0m\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Align 2 shapes: a simple line to a polygonal mesh\"\"\"\n", "from vedo import *\n", "\n", "settings.default_backend = '2d' # or k3d, ipyvtk,trame or vtk\n", "\n", "limb = Mesh(dataurl + \"270.vtk\").alpha(0.5)\n", "rim = Mesh(dataurl + \"270_rim.vtk\").c(\"red4\").lw(3)\n", "\n", "# make a clone copy of the rim line and align it to the surface\n", "arim = rim.clone().align_to(limb, rigid=True).c(\"g\")\n", "\n", "plt = Plotter()\n", "plt += [limb, rim, arim]\n", "\n", "# compute how well it fits\n", "d = 0\n", "for p in arim.vertices:\n", " cpt = limb.closest_point(p)\n", " d += mag2(p - cpt) # square of residual distance\n", "\n", "printc(\"ave. squared distance =\", d / arim.npoints, c=\"g\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", "vedo.mesh.Mesh
(....embl.es/examples/data/270.vtk)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
4.480 ... 892.7
-570.2 ... 623.1
-513.1 ... 421.8
center of mass (375, -3.34, -99.9)
average size 470.220
nr. points / faces 820 / 1526
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limb" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.2" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2025.5.3/examples/notebooks/distance2mesh.ipynb000066400000000000000000000523621474667405700223560ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Distance: [2.54950976 2.54950976 2.41422468 ... 2.14595456 2.27999987 2.41536531]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Compute the (signed) distance from one mesh to another.\"\"\"\n", "from vedo import *\n", "\n", "settings.default_backend = 'vtk' # or 2d, ipyvtk, or vtk\n", "\n", "s1 = Sphere().flat() # flat shading\n", "s2 = Cube(pos=(3,0,0), c='white', alpha=0.2)\n", "\n", "# add scalars to the sphere that correspond to their distance from the cube\n", "s1.distance_to(s2, signed=True, invert=False)\n", "s1.cmap(\"magma_r\").add_scalarbar()\n", "\n", "print(\"Distance:\", s1.pointdata[\"Distance\"])\n", "show(s1, s2, viewup='z', axes=1, bg='bb')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Sphere:   vedo.mesh.Mesh\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-0.9977 ... 0.9977
-0.9977 ... 0.9977
-1.000 ... 1.000
center of mass (0, 0, 0)
average size 1.000
nr. points / faces 1058 / 2112
point data array Distance
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1.pipeline" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 4 } vedo-2025.5.3/examples/notebooks/interpolate_volume.ipynb000066400000000000000000000432221474667405700235350ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "\"\"\"Generate a voxel dataset by interpolating a scalar\n", "which is only known on a scattered set of points or mesh.\n", "Available interpolation kernels are: shepard, gaussian, voronoi, linear.\n", "The middle layer is the result of thresholding the volume\n", "between 0.3 and 0.4 and assigning it the new value of 0.9\"\"\"\n", "from vedo import *\n", "import numpy as np\n", "\n", "settings.default_backend = 'vtk' # or k3d, ipyvtk, or vtk\n", "\n", "npts = 500 # nr. of points of known scalar value\n", "coords = np.random.rand(npts, 3) # range is [0, 1]\n", "scals = np.abs(coords[:, 2]) # let the scalar be the z of point itself\n", "\n", "apts = Points(coords)\n", "apts.pointdata['scals'] = scals\n", "\n", "vol = apts.tovolume(kernel='shepard', radius=0.2, dims=(90,90,90))\n", "vol.cmap([\"tomato\", \"g\", \"b\"]) # set color transfer functions\n", "\n", "# this produces a hole in the histogram in the range [0.3, 0.4]'\n", "vol.threshold(above=0.3, below=0.4, replace=0.9) # replace voxel value in [vmin,vmax]\n", "\n", "plt = show(apts, vol, axes=1, elevation=-30)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Points:   vedo.pointcloud.Points\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
3.855e-4 ... 0.9994
1.426e-3 ... 0.9982
1.414e-4 ... 0.9987
center of mass (0.494, 0.504, 0.485)
average size 0.486
nr. points 500
point data array scals
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apts" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.close()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 } vedo-2025.5.3/examples/notebooks/legosurface.ipynb000066400000000000000000044427401474667405700221330ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[7m\u001b[1m\u001b[36mvedo.volume.Volume at (0x2303fb0) \u001b[0m\n", "\u001b[0m\u001b[36;1mname : Volume\n", "filename : /home/musy/.cache/vedo/embryo.tif\n", "dimensions : [125 80 107]\n", "origin : (0, 0, 0)\n", "center : (6450.40, 4109.53, 5514.05)\n", "spacing : (104.039, 104.039, 104.039)\n", "bounds : x=(0, 1.29e+4), y=(0, 8.22e+3), z=(0, 1.10e+4)\n", "memory size : 1 MB\n", "scalar size : 1 bytes (unsigned char)\n", "scalar range : (0.0, 150.0)\u001b[0m\n" ] }, { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAJYA4QDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD02iiiuw8sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooopDCiiigAooooAKKKKACiiigAoopaAEooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKWgBKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACilpKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAWiiikMKKKKACiiigAooooAKKKKACiiigAoooOAMngUAFFRW1zBe26XFtMk0LjKyRtuB/GpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApaKKQwooooASlpKp6nqlppFk11eSbIxwABlnPZVHcn0ouFi7SViw+KNPl0GDVmW4jjmk8lITEWlMm4rs2rnnKmpodetZJooZ4rqzklYLH9qgZA5PQBumfbOfai6Hys1KWqN9rOm6bJHHe3sMMkgJRGb5mHqB1xUtlqFlqMTSWV3Bcop2s0UgYKfQ46H2ouKxYpajaaJZBG0qBz0UsMn8KkoASsTxgmqS+FL+PR1LXrx7VAOGwSA233xnFblJQxrR3PKPhLZeIrK8vYrmKWHS1yrxTggiYY+6p5Bx17dPavWKyLD9z4i1iDp5gguh77lMf/tL+Va9KKsipvmdxKWiimQJRS0UAJS0lLQAUlLRQAlLRRQAUlLRQAUlLRQAUUUUAJS0UUAFJS0UAFFFJQAtJS0UAFFFFABSUtFABSUtFABSUtFACUtFFACUtFFABSUtFACUtFFABSUtFACUtJS0AFFFFABSUtFABRRRQAUUUUAJRS0lAC0UUlABRRS0AFFFFACUtFFABSUUtACUtFFABRRRQAlFLRQAlLRRQAlLSUtABSUtFACUUtFACUtFFACUUtFABRSUtABSUtFABRRRQAlLRRQAlFLRQAUUUUAJRRS0A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bUb7SIb2G1WOBFDLG8pjkusjDEN/CMZxnGc9hzXn/wBo8ll2KBIhBXuARyDXft4jubHT7X+y7ie0gu0VLp04V5Su5miTHykkYyuASeATyPNzKj7KpFKfN8tn1vfc3puLg9LfqUvFlzo/2MW8Fg8N/Au0jZ5RgA/hbsfpz659eb0XVZtPF0qyyRJcqFklj++QOdoPYH1HPHatG90ee0lNzeWzRWsxBVSchTgD5/Q8Z57nqTWBeNFHMVt3JT88fQ12QgnR5q0tOy797f19xi99CeGS60q987Co5BwrKro6nr6hga+gPhd4sj1zwxDb3Mmy7t5GgG8gCUD5hs9cKQMckYGetfP8t3Ld6fbWICqkP3VI7k5LE9hzWzpzwW9vbWkSySzJdBpJ4uSAcKQo/ibrj0+tcuIhGUVC1muvX+v60C1z6jorzfw14++zxNb6vdi4hi2gXJjKMinON2SQ59cEk9t5PHotvcQ3UCTwSrJE4yrqcg15kouLsyXFrckpKWikISilooASilooASloooASilooASilooASilooASilooASloooASilooASilooASilooASilooAKSlooASilooAKSlooAKKKKACiiikMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDI8M/Jocdt3tZZbbHskjKP0AP0Na9Y+kjydY1u2wADcJcIPZ41B/8eR62KAYUUUUAFFFFABRRRQAUUUUAFee/GK5urLwhb3FrIVC3iLMmfldCr8MO4zivQq4b4sT2kfg9IL13jiubuKLzlGfLPLZI7jCkfiK0pO00CPn29mtrmKGSzR4p1VvOVmzk+oPpyeP8mW6ZotS/cXxaC48sPIBj5cjh146Efp2p9nZKmrT26RJcQMHVBvH7wBuCjdN3H+c5qpK8jokjKDJDGF3pwQR/eH9fpXXOp+85fJ/lfsbqF4uRp7zZRT2dwUeEzJIYEbaHX5TuR8cE4/I/jS35tLnVGurHdDZs6jYB+8iyBxjnPzfXJHenalCTcybbeKINEknlBspLgsSYz247fX61DZKPssrxxHEMyyLLn95CflPI7j5fzwee3PCVry6/wBfqXL4VbYljjjWNst5rC5TjH7m4BKnGecHDH8PXHFq5VUg1BFtH2RkTqJD++gbaBkEn5l+XH0x1ou5mQX6+bbxmWITbIx+6n4PzL6N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", "image/png": "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", "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Represent a volume as lego blocks (voxels). Colors correspond to the volume's scalar.\"\"\"\n", "from vedo import dataurl, settings, Volume, Plotter\n", "\n", "settings.default_backend = '2d' # or k3d, 2d, ipyvtk or vtk\n", "\n", "vol = Volume(dataurl+'embryo.tif') # load Volume\n", "vol.print()\n", "\n", "# show lego blocks whose value is between vmin and vmax\n", "lego = vol.legosurface(vmin=65).cmap('seismic').add_scalarbar()\n", "\n", "plt = Plotter(axes=1, bg='wheat', bg2='lb', size=(900,600))\n", "plt.show(lego, viewup='z', zoom=1.75)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Volume:   vedo.volume.Volume
(...me/musy/.cache/vedo/embryo.tif)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 1.290e+4
0 ... 8219
0 ... 1.103e+4
dimensions (125, 80, 107)
voxel spacing (104, 104, 104)
in memory size 1MB
point data array Tiff Scalars
scalar range (0, 150.0)
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vol" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 4 } vedo-2025.5.3/examples/notebooks/manipulate_camera.ipynb000066400000000000000000000046251474667405700232730ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4be5195458e1498290d9d80a396b2c09", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Manipulate Camera for K3D backend\"\"\"\n", "import vedo\n", "\n", "vedo.settings.default_backend = 'k3d'\n", "\n", "bu = vedo.Mesh(vedo.dataurl+'bunny.obj')\n", "bu.show()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Manually set the k3d camera. Syntax is:\n", "# [posx,posy,posz, targetx,targety,targetz, upx,upy,upz]\n", "vedo.notebook_plotter.camera = [0., 0. ,1.,\n", " 0., 0., 0.,\n", " 0., 1., 0.]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k3dcam is [-0.017 0.11 0.48 -0.017 0.11 0.08 0. 1. 0. ]\n" ] } ], "source": [ "# Convert a vtkCamera object into the appropiate K3D list\n", "import vtk\n", "vcam = vtk.vtkCamera()\n", "vcam.SetPosition( [-0.017, 0.11, 0.48] )\n", "vcam.SetFocalPoint( [-0.017, 0.11, -0.001] )\n", "vcam.SetViewUp( [0.0, 1.0, 0.0] )\n", "vcam.SetDistance( 0.4 )\n", "k3dcam = vedo.utils.vtkCameraToK3D(vcam)\n", "print('k3dcam is', k3dcam)\n", "\n", "vedo.notebook_plotter.camera = k3dcam" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2025.5.3/examples/notebooks/numpy2volume.ipynb000066400000000000000000021127301474667405700223050ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "scalar min, max = 0.0 1.0\n" ] }, { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAJYAyADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKiubmCztpLi6njggjG55ZXCqo9STwKAJaKbHLHNEssTrJGwyrKcgj1BrP13X9M8NaXJqWrXaW1snG5uSx7KoHJPsKANKisTw/4v8P8AiiHzNG1S3uSBlog22Rfqhww/KqnjPx1o3gjTftGozb7hwfItIzmSY+w7L6seB9cAg7O9jpqK828NfG7wproSK9mfSLonGy7/ANWT7SDjH1xT/Hvxd0bwnZ+Tp0kOp6rKgaKKJ90aAjIZ2HbHOByfYHNK6HySvax6NRXgvhv9ohgEh8S6R7G5sT/ONj/Jvwr1nw/458M+KABpGsW88p/5Ysdkn/fDYP44oTTCUJR3R0NFQ3V1b2NpLdXc0cFvCpeSWRgqoo6kk9BXn9h8cPBV7qctm95PaqsmyO4uISIpR6gjOB/vAUxJNno1FQWl5a39slzZ3MNxA4yksLh1YexHFT0CCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii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un+eaz40gud7TOks7D5kYY2D0APNaI860lklvbd3kfrPF86gegHUD8Kq301pcRrsVLiRjhAvUH69q7aemiXzX9f5HoUpdZPbo/6/RmZcx/ZiBBIwZvuxn5gf8BVbDxMzTRksf415AHpjtVw2c0B3rMHkIwwcZH0B6iq890YxtkiKv25yD+PpXZB30WprVikued49luv6+4qTtFIBtAdj0x1/+tVZoSOc5PfNXDCjLvLbmPO8H+VVpdyHAbdnoD1rog+iPKxEG/emvu/r/MrnDSEyHA7j1Ffcfh3VrfXfDun6nap5cNzAkix7gxQEA7TjuK+HMAMS+c4/Wur8AeNrjwP4gTUjBJc2xjZHtlnMatnueCCRzjIrdOx5VSDlr1Psuisrw1r0Hifw7Za1bQTQQ3aF0jmADgZI5wSO2foa1as5gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDzz4jfFfTfAymwgj+2a06bkt+QkYPRnb09hyfbrXy9r2t6n4m1mXVdVumnu5cZYjAUDoqjoAPSvTP2h7AReOrG8xhbiwUE/7Su4P6Fa8jIcYIyR0GetRJ62OmlBcvM0DMVxuXOO4p8YD8nBoypQL0ORwaNoZvlOP9oVmdSTTvuTKCrBYSd3dTyBViFhE26dSG/v9R/8AWqCLdCPuhl9R1qxHKbg7Im2r3bv+ArKR6NCya79F/X5ll3SUeUiLKx59l9yas21nNA4ljlWSTGCJen0B6j9arpaogzEzREdwev1B61JHdXLrgKfKzgzxLk49h/XmuaV2rR2PSlZe9VXvdLf1+L0NEasIz5Ji2XGQMOw2LnuW/wAmtSDSoJR5lyTNO3PmglSv+7joKp2H2Q25WAo0f8WeST757/WkhheaUjSZXt4eQ0nWMn0VT/MY/GuGfVR93+v60OSrzaOfvX/r0froaP2i+s7n7LZyi/fGfLlGGjHYs44x7Hk1e0ie1jut167pqTjBNyu3j+6nbH0P1qpYznSohFc2hRM5aeHMisfVv4gfrn61be4GuI1rZiN7XpLcuoZfogPU+/Qe9clRXurad/6/Lc8+ovPXt/X5lrUorWa78qygLaqRxJA/lmMersO3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5wFf734Eda6acEtIHaqdl7SutF26f15NizXU0I/fIHB4DR9SfoarxsspMjsrOeNv90emKRZgZS8+Vk6KG6AexpJ/LILuBx/F3roUbaWMp1XL3r3S6P8AX/gkcqpECyMY/YdD+FVi77g8i59MdvwpT5hIcncB0VuopjTDocqfet4xPLq1U9dv6+4R5FYHkEVWA3N0wvWnN+8cHHGaeiB2J/hH61qtEcEm6shOWhP93PHvT1UPIMj5QMj3pUUukYx8pPPv3qTaJHds/u1GD71LZrCne39ef3EO0sm48KW49+adw7M54VRxmnqN4iUj5AM898CmuN6SSE/IW49+1Fx8ml/62/IiwRsLcADpXYfCbT/7S+KOgxlQVScznI4Hlqzg/mork2OWZ2GAo4FW9E13U/DOpx6lpV21teIpVXUBuD1BBBBFXFnPVhpofc1FZHhW8vdR8JaRfaiUN5c2cU02xNoDMobGO3WtetDiCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArntXm1K2u447TUd95cP/o1msC7NgI3NITltoB5YEckAAkgHoazbnQdMvL5724tRJcOgjZmdsFRnAxnGOT+ZoA5+/ku7C41G71CaW4treVplCan5BWLAIXYuMnqMMee55q143e9fwjNeWKQ4tlS+fzwwZREyyjAA65TocV0BsLNpY5WtIDJEAI3MYygHQA44p13bJeWU9rJ9yaNo24zwRg/zoALT7R9lj+1PE82PmaFSEP0BJPT3qasjwrcvd+E9Jml/wBcbWNZRnOHCgMP++ga16ACiiigCtqGoWmlafPf39xHb2sCF5ZZDgKBXzP8TfjBc+L4ZtH0aNrbRSR5jyKPMucMCCf7q5AIHXjn0r2v4u2LX/ws12JScpCs3GeiOrn9FNfIAyiHuMfjUyZtSim7skVgI2VhtJHU96k2An5OH9R2+tNX96v+zSRb0UEAMuM46GsWejHpfYI5MbfM4x0PahkUlmPr1oEikYXqSeo6VDIpWTC8jrimlqRKVorqSqH6/eHp3p3ytIgHXkEHrUaS44wc+lSSKWhZmPzcYx25oe44tON1rYRlUthDj1I6U7BX7y8eq1ArMnUZHtUqOZOAcL3x1NDTCE4t+Y6OMNEOhHSmiNllO09B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qIEUKP8A9dOoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKz9Sv7e0AjvbaRrSUbZJigaJc8YcZyB7kbfU1ekUvGyB2QsCAy4yvuM8Vyl3o9xYaRcPdyzanJGU8uWWSV8gsAXeAHYdg+bCjnB4HcAq6p4Z1a2ukg8NTPbaeyb54Hn2x5DDEcRwWiLDOSPlA6AHkadhrNvcz/YpopLG/UZNpcAK+PVccOvupI+lMsZYX1exXR9TudQj+Zr6U3HnRbNhxz91XLlSFTHG7jGK29R0qx1a3EN9bpMqnchPDI395WHKn3BBoAiorHa21rQyoTzNY08cEnAuoh69hKPyb/eNXdP1Oz1W38+ynWVAdrDBDI3dWU8qfYgGgC3RRRQAUUUUAFMdj9xD85HX+770rttAwMknAHvQi7QcnJJyT70AKqhRgDiloooARlDDDAEehFM2tH90lh/dY8/gf8AGpKKAGq4bPUEdQRyKdTWRXxuHI6EcEfjTcvH1y6+oHI/xoAk57DJ9BV2GLy15xuPUio7aIYErDkj5Qe1WKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsTVvDFnql3HepJLZ30f3bm2wrN6B8ghwPQ5H481t0UAcm+qXuifL4ghQQZwNRtlPkn08xeTGfrlf9rtWyjrIgdGDKwyGU5BFafWudm8MtYyPceH51snZt72jgm2kJ6/KOYyfVfxBoA0aRmCjJPFYyeI7e3aSDWYzpVzGpYrcMPLdQMlo36MMc9iO4FadtMl5DFdR7vKkQPHuUqSCM5IPIOOx5FAEiKfvuPnI6f3fan0UUAFFFFABRRRQAVLBF5jbj90H8zTI4zK+0HA7n0FXgAoAAwBQAtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVh6hrlq2+Gw1WL7XE5DpDAbogjgqyJ8w5+h4rcql/ZVsl9JfQKYLmQYdo2IWQ4wCy9GI9SM8daAOdv7jRvElvY6d4gDxOGjlntGVhCZSpKxu+MBuQwQkHpkVYl07V9FJfT3bU7ED/j0mcCeMf7Eh++PZ+f8Aa7U+x0vUBqe66traOCSN1vfLkLRXbHGH8sjCsecn8MtwR0YAUAAAAcACgDB07V7PUxItvIRNEds0EilJYj6Mh5H9e1Xqbqmg2Wqss0ivDdoMRXcDbJY/YN3H+ycg9xWPNeanoAJ1eP7XYKMnUbdMFB/01jHI/wB5cjuQtAG1RUFnd29/ZxXdrKssEqh0dTwQanoAKUAsQFGSaToKtwQ+WNzD5z+ntQA+OMRrgfUn1p9FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUhUMMMAR6GiigDCu/DKLcyX2jznTrx8l1Vd0Ex9ZI+Mn/aUhvc9Kx9Q8Xw+HYR/wk1u+nyFgiSIDLDMScZRwO3UhgCAD1HNFFAHV2iLIqzAhkYZQjoferdFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf//Z", "image/png": "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", "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make a Volume from a numpy object\n", "#\n", "import numpy as np\n", "from vedo import *\n", "\n", "settings.default_backend = '2d' # or k3d, 2d, or vtk\n", "\n", "X, Y, Z = np.mgrid[:30, :30, :30]\n", "\n", "# scaled distance from the center at (15, 15, 15)\n", "scalar_field = ((X-15)**2 + (Y-15)**2 + (Z-15)**2)/225/3\n", "print('scalar min, max =', np.min(scalar_field), np.max(scalar_field))\n", "\n", "vol = Volume(scalar_field)\n", "lego = vol.legosurface(vmin=.3, vmax=.6)\n", "lego.cmap(\"hot_r\")\n", "\n", "show(lego, axes=1, zoom=1.1, viewup='z')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Volume:   vedo.volume.Volume\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 29.00
0 ... 29.00
0 ... 29.00
dimensions (30, 30, 30)
voxel spacing (1.00, 1.00, 1.00)
in memory size 0MB
point data array input_scalars
scalar range (0, 1.000)
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vol" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 4 } vedo-2025.5.3/examples/notebooks/pca.ipynb000066400000000000000000000077001474667405700203640ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[32minside points # 2500\u001b[0m\n", "\u001b[1m\u001b[31moutside points # 2500\u001b[0m\n", "\u001b[1masphericity: 0.5208038794048852\u001b[0m\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ab661bcbf16948c288da403947912b54", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"\n", "Draw the PCA (Principal Component Analysis) ellipsoid that contains\n", "50% of a cloud of a pointcloud, then check how many points are inside the surface.\n", "\"\"\"\n", "from vedo import *\n", "import numpy as np\n", "\n", "settings.default_backend = 'k3d' # or k3d, ipyvtk, trame, or vtk\n", "\n", "plt = Plotter(size=(1000,500))\n", "\n", "pts = np.random.randn(5000, 3) * [3,2,1] # random gaussian point cloud\n", "\n", "elli = pca_ellipsoid(pts, pvalue=0.5) # group of [ellipse, 3 axes]\n", "plt += elli\n", "\n", "ipts = elli.inside_points(pts) # extract points inside mesh\n", "opts = elli.inside_points(pts, invert=True)\n", "plt += Points(ipts, c=\"g\")\n", "plt += Points(opts, c=\"r\")\n", "\n", "printc(\"inside points #\", ipts.npoints, c='g')\n", "printc(\"outside points #\", opts.npoints, c='r')\n", "printc(\"asphericity:\", elli.asphericity())\n", "plt.show(axes=1)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.close()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[7m\u001b[1mvedo version : 2024.5.2+dev17 (https://vedo.embl.es) \u001b[0m\n", "\u001b[1mvtk version : 9.4.0\u001b[0m\n", "\u001b[1mnumpy version : 1.26.4\u001b[0m\n", "\u001b[1mpython version : 3.12.5 | packaged by conda-forge | (main, Aug 8 2024, 18:36:51) [GCC 12.4.0]\u001b[0m\n", "\u001b[1mpython interpreter: /home/musy/soft/miniforge3/bin/python3.12\u001b[0m\n", "\u001b[1minstallation point: /home/musy/Projects/vedo\u001b[0m\n", "\u001b[1msystem : Linux 5.4.0-200-generic posix x86_64\u001b[0m\n", "\u001b[2mk3d version : 2.16.1\u001b[0m\n", "\u001b[1m\u001b[33m💡 No input files? Try:\n", " vedo https://vedo.embl.es/examples/data/panther.stl.gz\u001b[0m\n" ] } ], "source": [ "!vedo" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2025.5.3/examples/notebooks/shrink.ipynb000066400000000000000000001130331474667405700211140ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "37ffab037b1847aaa7db0a1c2894b734", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Shrink the triangulation of a mesh to make the inside visible.\"\"\"\n", "from vedo import *\n", "\n", "settings.default_backend = 'k3d' # or k3d, 2d or vtk\n", "\n", "pot = Mesh(dataurl+\"teapot.vtk\").shrink(0.75)\n", "s = Sphere(r=0.2).pos(0, 0, -0.5)\n", "show(pot, s, axes=1, bg=\"gray1\", viewup='z')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", "vedo.mesh.Mesh
(...bl.es/examples/data/teapot.vtk)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-1.505 ... 1.664
-0.9845 ... 0.9843
-0.8471 ... 0.7045
center of mass (-8.90e-3, -1.19e-4, 3.90e-3)
average size 0.960
nr. points / faces 18960 / 6320
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pot" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2025.5.3/examples/notebooks/slider2d.ipynb000066400000000000000000001023771474667405700213370ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "d7392fcc", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b4ee2f17c7754436b4265528a2403b23", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7f72d9258d4a4dcc997c8ca1ba802849", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Button(button_style='info', description='Change Color', style=ButtonStyle(), tooltip='click to select a random…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "21f8b6cd01994d15a41d621983375390", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatSlider(value=0.0, description='x-position', max=0.2, min=-0.2, step=0.02)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display, clear_output\n", "import ipywidgets as widgets\n", "from vedo import *\n", "\n", "############################## button\n", "button = widgets.Button(\n", " description='Change Color',\n", " button_style='info',\n", " tooltip='click to select a random color',\n", ")\n", "\n", "def on_button_click(b):\n", " with out:\n", " rgb = (np.random.rand(3)*255).astype(int)\n", " mesh.color(rgb)\n", " vtxt.text(f\"RGB: {rgb} \\n({get_color_name(rgb)})\")\n", " clear_output(wait=True)\n", " img = plt.show()\n", " display(img)\n", "button.on_click(on_button_click)\n", "\n", "############################## slider\n", "slider = widgets.FloatSlider(\n", " description='x-position', \n", " min=-0.2, value=0, max=0.2, \n", " step=0.02,\n", " continuous_update=True,\n", ")\n", "\n", "def on_slider(change):\n", " with out:\n", " value = change['new']\n", " mesh.x(slider.value)\n", " clear_output(wait=True)\n", " img = plt.show(resetcam=True)\n", " display(img)\n", "slider.observe(on_slider, names='value')\n", "\n", "############################################## vedo\n", "# settings.default_backend = \"2d\" # this example only works with \"2d\"\n", "settings.backend_autoclose = False # do not close Plotter after show()\n", "\n", "plt = Plotter(size=[600,500], axes=1, bg2=\"lightblue\")\n", "mesh = Mesh(dataurl+\"bunny.obj\").color(\"white\")\n", "vtxt = Text2D(font=\"Cartoons123\")\n", "plt += [mesh, vtxt]\n", "\n", "out = widgets.Output()\n", "display(out, button, slider)\n", "with out:\n", " img = plt.show()\n", " display(img)" ] }, { "cell_type": "code", "execution_count": 11, "id": "d3d61d2b", "metadata": {}, "outputs": [], "source": [ "plt.close()" ] }, { "cell_type": "code", "execution_count": 2, "id": "f1ac44ea", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Mesh:   vedo.mesh.Mesh
(...mbl.es/examples/data/bunny.obj)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-0.09438 ... 0.06078
0.03331 ... 0.1870
-0.06168 ... 0.05871
center of mass (-0.0280, 0.0942, 9.05e-3)
average size 0.063
nr. points / faces 2503 / 4968
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mesh\n" ] }, { "cell_type": "code", "execution_count": null, "id": "10545467-9489-42e6-a4ea-a331242ab9ae", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 5 } vedo-2025.5.3/examples/notebooks/sphere.ipynb000066400000000000000000000500641474667405700211100ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "57e24154bb6744b683e93d69c55631ed", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from vedo import *\n", "\n", "settings.default_backend = 'k3d' # or k3d, ipyvtk,trame or vtk\n", "\n", "sph = Sphere()\n", "sph.cut_with_plane(normal=(1,1,1))\n", "scalars = sph.vertices[:,2] # use z-coords to color vertices\n", "\n", "# NB, actions can be concatenated into a pipeline:\n", "# add point scalars with a choice of color map, use flat shading, print infos and then show\n", "sph.cmap('Set3', scalars).add_scalarbar()\n", "sph.show(axes=1, viewup='z')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Sphere:   vedo.mesh.Mesh\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-0.8135 ... 0.9977
-0.8135 ... 0.9977
-0.8146 ... 1.000
center of mass (0.155, 0.192, 0.361)
average size 0.879
nr. points / faces 657 / 1184
point data array Scalars
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sph" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2025.5.3/examples/notebooks/test_types.ipynb000066400000000000000000010212101474667405700220150ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "e462be6a-32f4-4780-b713-207fd809f1e3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Points:   vedo.pointcloud.Points\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-3.536 ... 2.940
-2.830 ... 3.425
-2.752 ... 3.211
center of mass (0.0624, 0.0172, 0.0132)
average size 1.587
nr. points 1000
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import np, Points\n", "pts = Points(np.random.randn(1000,3)).color(\"green5\")\n", "pts" ] }, { "cell_type": "code", "execution_count": 1, "id": "31128ecf", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Mr. Rabbit:   vedo.mesh.Mesh
(...mbl.es/examples/data/bunny.obj)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-0.09438 ... 0.06078
0.03331 ... 0.1870
-0.06168 ... 0.05871
center of mass (-0.0280, 0.0942, 9.05e-3)
average size 0.063
nr. points / faces 2503 / 4968
cell data array Quality
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import dataurl, Mesh\n", "mesh = Mesh(dataurl + \"bunny.obj\")\n", "mesh.name = \"Mr. Rabbit\"\n", "mesh.compute_quality().cmap(\"Reds\")\n", "mesh" ] }, { "cell_type": "code", "execution_count": 2, "id": "59ebe06a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Wild-type Embryo:   vedo.volume.Volume
(/tmp/embryo.tif)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 1.290e+4
0 ... 8219
0 ... 1.103e+4
dimensions (125, 80, 107)
voxel spacing (104, 104, 104)
in memory size 1MB
point data array Tiff Scalars
scalar range (0, 150.0)
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import dataurl, Volume\n", "vol = Volume(dataurl+\"embryo.tif\")\n", "vol.name = \"Wild-type Embryo\"\n", "vol" ] }, { "cell_type": "code", "execution_count": 3, "id": "b22e6d01", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Domestic Cat:   vedo.image.Image
(...onalGeographic_2572187_2x3.jpg)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
shape (2048, 3072)
in memory size 18432 KB
point data array JPEGImage
intensity range (0.0, 255.0)
level / window 127.5 / 255.0
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import Image\n", "pic = Image(\"https://i.natgeofe.com/n/548467d8-c5f1-4551-9f58-6817a8d2c45e/NationalGeographic_2572187_2x3.jpg\")\n", "pic.name = \"Domestic Cat\"\n", "pic" ] }, { "cell_type": "code", "execution_count": 4, "id": "ddd6fbb6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " MouseLimb:   vedo.tetmesh.TetMesh
(/tmp/limb_ugrid.vtk)\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 1416
-711.3 ... 700.2
-851.6 ... 463.9
center of mass (582, 18.1, -252)
nr. points / tets 10926 / 58977
cell data array chem_0
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import dataurl, TetMesh\n", "tet = TetMesh(dataurl+\"limb_ugrid.vtk\")\n", "tet.name = \"MouseLimb\"\n", "tet" ] }, { "cell_type": "code", "execution_count": 2, "id": "221660dc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " UnstructuredGrid:   vedo.grids.UnstructuredGrid\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 13.00
0 ... 2.000
0 ... 3.000
center of mass (4.44, 1.15, 1.66)
nr. points / cells 33 / 18
point data array SignedDistance
cell data array elem_val
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import dataurl, UnstructuredGrid, Cylinder\n", "ug1 = UnstructuredGrid(dataurl+'ugrid.vtk')\n", "cyl = Cylinder(r=3, height=7).x(3)\n", "ug1.cut_with_mesh(cyl)" ] }, { "cell_type": "code", "execution_count": 6, "id": "72739648-d783-4f56-9c84-8e845e6e6811", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " StructuredGrid:   vedo.grids.StructuredGrid
(...usy/.cache/vedo/structgrid.vts)\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 6.365
-5.144 ... 5.144
23.37 ... 32.89
center of mass (3.18, 0.111, 28.0)
nr. points / cells 648 / 440
point data array Density
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import StructuredGrid, dataurl\n", "sgrid1 = StructuredGrid(dataurl + \"structgrid.vts\")\n", "sgrid1" ] }, { "cell_type": "code", "execution_count": 7, "id": "08d1bed0-9663-4ae2-83fe-262e77155d7d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " RectilinearGrid:   vedo.grids.RectilinearGrid\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
7.000 ... 36.58
0 ... 19.00
0 ... 19.00
center of mass (26.6, 9.50, 9.50)
nr. points / cells 14400 / 12635
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import np, RectilinearGrid\n", "xcoords = 7 + np.sqrt(np.arange(0,900,25))\n", "ycoords = np.arange(0, 20)\n", "zcoords = np.arange(0, 20)\n", "rgrid = RectilinearGrid([xcoords, ycoords, zcoords])\n", "rgrid" ] }, { "cell_type": "code", "execution_count": 8, "id": "24f64426", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Axes:   vedo.assembly.Assembly\n", "\n", "\n", "\n", "\n", "\n", "
nr. of objects 26
position (0.0, 0.0, 0.0)
diagonal size 3.7067
bounds
(x/y/z)
-1.204 ... 1.011
-1.164 ... 1.011
-1.013 ... 1.013
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import Sphere, Axes\n", "axes = Axes(Sphere())\n", "axes" ] }, { "cell_type": "code", "execution_count": 3, "id": "5ab995ad", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Histogram1D:   vedo.pyplot.Figure\n", "\n", "\n", "\n", "\n", "\n", "\n", "
nr. of parts 42
position (0.0, 0.0, 0.0)
x-limits (-2.919, 3.682)
y-limits (0, 136.0)
world bounds
(x/y/z)
-3.280 ... 3.682
-0.2056 ... 5.118
0 ... 1.320e-3
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo.pyplot import np, histogram\n", "histo = histogram(np.random.randn(1000))\n", "histo" ] }, { "cell_type": "code", "execution_count": 15, "id": "d6788c1f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[7m\u001b[1mvedo.transformations.LinearTransform at (0x7fa45c870410) \u001b[0m\n", "name : LinearTransform\n", "concatenations: 1\n", "inverse flag : False\n", "matrix 4x4 :\n", "[[ 0.612372, -0.612372, 0.5 , 0.887628],\n", " [ 0.707107, 0.707107, 0. , 2.12132 ],\n", " [-0.353553, 0.353553, 0.866025, 2.95163 ],\n", " [ 0. , 0. , 0. , 1. ]]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import LinearTransform\n", "T = LinearTransform()\n", "T.shift([1,2,3]).rotate_z(45).rotate_y(30)\n", "T" ] }, { "cell_type": "code", "execution_count": null, "id": "48127118-58fa-4630-a2cd-c793051075b2", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 5 } vedo-2025.5.3/examples/other/000077500000000000000000000000001474667405700156705ustar00rootroot00000000000000vedo-2025.5.3/examples/other/clone2d.py000066400000000000000000000012601474667405700175670ustar00rootroot00000000000000"""Make a static 2D clone copy of a mesh and place it in the rendering window""" from vedo import Mesh, dataurl, show man3d = Mesh(dataurl+'man.vtk') man3d.rotate_z(20).rotate_x(-70).scale(0.2) man3d.c('darkgreen').lighting('glossy') # Make a 2D snapshot of a 3D mesh # The coordinate system options are # 0. Displays # 1. Normalized Display # 2. Viewport (origin is the bottom-left corner of the window) # 3. Normalized Viewport # 4. View (origin is the center of the window) # 5. World (anchor the 2d image to mesh) # (returns a Actor2D) man2d = man3d.clone2d().coordinate_system(4).pos([0.4,0.4]) man2d.c('red4') show(man3d, man2d, __doc__, axes=1).close() vedo-2025.5.3/examples/other/dolfin/000077500000000000000000000000001474667405700171435ustar00rootroot00000000000000vedo-2025.5.3/examples/other/dolfin/README.md000066400000000000000000000010651474667405700204240ustar00rootroot00000000000000# _FEniCS/Dolfin_ examples In this directory you will find a bunch of examples of to visualize meshes in conjunction with [FEniCS/Dolfin](https://fenicsproject.org/) package. The `plot()` function emulates the *matplotlib* functionality. Install `mshr` with ``` conda install conda-forge::mshr ``` To gain more control on the property of the shown objects one can access the output of the `plot()` method and change their properties, e.g.: ```python plt = plot(u_solution) msh = plt.actors[0] msh.color('blue').alpha(0.5).cut_with_plane() # etc plt.show() ``` vedo-2025.5.3/examples/other/dolfin/__init__.py000066400000000000000000000000031474667405700212450ustar00rootroot00000000000000# #vedo-2025.5.3/examples/other/dolfin/ascalarbar.py000066400000000000000000000006761474667405700216210ustar00rootroot00000000000000"""#Control scalar bar range. > plot(u, mode='color', vmin=-3, vmax=3, style=1) Available styles: 0. vtk 1. matplotlib 2. meshlab 3. paraview 4. bw """ from dolfin import * mesh = UnitSquareMesh(16, 16) V = FunctionSpace(mesh, 'Lagrange', 1) f = Expression('10*(x[0]+x[1]-1)', degree=1) u = interpolate(f, V) ################################## vedo from vedo.dolfin import plot plot(u, mode='color', vmin=-3, vmax=3, style=1, text=__doc__) vedo-2025.5.3/examples/other/dolfin/awefem.py000066400000000000000000000052711474667405700207660ustar00rootroot00000000000000""" Solve the constant velocity scalar wave equation in an arbitrary number of dimensions. It injects a point source with a time-dependent source time function. """ #Original script by Carlos da Costa: #https://github.com/cako/fenics-scripts/blob/master/awefem/awefem.py # from dolfin import * from vedo import ProgressBar, printc, download, settings from vedo.dolfin import plot import numpy as np set_log_level(30) def ricker_source(t, f=40): t -= 2 / f return (1 - 2 * (np.pi*f*t)**2) * np.exp(-(np.pi*f*t)**2) def sine_source(t, f=40): return np.sin(2 * np.pi*f*t) def awefem(mesh, t, source_loc=None): # Function space V = FunctionSpace(mesh, "Lagrange", 1) # Boundary condition bc = DirichletBC(V, Constant(0), "on_boundary") # Trial and test functions u = TrialFunction(V) v = TestFunction(V) # Discretization c = 6 dt = t[1] - t[0] u0 = Function(V) # u0 = uN-1 u1 = Function(V) # u1 = uN1 # Variational formulation F = (u - 2 * u1 + u0) * v * dx + (dt * c) ** 2 * dot( grad(u + 2 * u1 + u0) / 4, grad(v) ) * dx a, L = lhs(F), rhs(F) # Solver A, b = assemble_system(a, L) solver = LUSolver(A, "mumps") solver.parameters["symmetric"] = True bc.apply(A, b) # Solution u = Function(V) # uN+1 # Source if source_loc is None: mesh_center = np.mean(mesh.coordinates(), axis=0) source_loc = Point(mesh_center) else: source_loc = Point(source_loc) # Time stepping printc('\bomb Hit F1 to interrupt.', c='yellow') pb = ProgressBar(0, len(t)) for i, t_ in enumerate(t[1:]): pb.print() b = assemble(L) delta = PointSource(V, source_loc, ricker_source(t_) * dt**2) delta.apply(b) solver.solve(u.vector(), b) u0.assign(u1) u1.assign(u) if t_>0.03: plt = plot( u, warp_zfactor=20, # set elevation along z vmin=.0, # sets a minimum to the color scale vmax=0.003, cmap='rainbow', # the color map style alpha=1, # transparency of the mesh lw=0.1, # linewidth of mesh scalarbar=None, #lighting='plastic', #elevation=-.3, interactive=False, ) # continue execution plt.clear() plt.interactive() if __name__ == "__main__": ot, dt, nt = 0, 1e-3, 150 t = ot + np.arange(nt) * dt print("Computing wavefields over dolfin mesh") fpath = download("https://vedo.embl.es/examples/data/dolfin_fine.xml") mesh = Mesh(fpath) awefem(mesh, t, source_loc=(0.8, 0.8)) vedo-2025.5.3/examples/other/dolfin/calc_surface_area.py000066400000000000000000000021571474667405700231240ustar00rootroot00000000000000from dolfin import * import sympy as sp # Credits: # https://github.com/pf4d/fenics_scripts/calc_surface_area.py x, y = sp.symbols('x, y') # surface : def s(x,y): return sp.exp(x) # x-derivative of surface def dsdx(x,y): return s(x,y).diff(x, 1) # y-derivative of surface def dsdy(x,y): return s(x,y).diff(y, 1) # outward-pointing-normal-vector magnitude at surface : def n_mag_s(x,y): return sp.sqrt(1 + dsdx(x,y)**2 + dsdy(x,y)**2) # surface area of surface : def area(x,y): return sp.integrate(n_mag_s(x,y), (x,0,1), (y,0,1)) A_exact = area(x,y) for n in [5,10,100,500]: mesh = UnitSquareMesh(n,n) Q = FunctionSpace(mesh, "CG", 1) e = Expression('exp(x[0])', degree=2) f = interpolate(e, Q) A_num = assemble( sqrt(f.dx(0)**2 + f.dx(1)**2 + 1) * dx) print('for n = %i -- error = %.2e' % (n, abs(A_exact.evalf()-A_num))) n = 10 mesh = UnitSquareMesh(n,n) Q = FunctionSpace(mesh, "CG", 1) e = Expression('exp(x[0])', degree=2) f = interpolate(e, Q) A_vector = project( sqrt(f.dx(0)**2 + f.dx(1)**2 + 1), Q) from vedo.dolfin import plot plot(A_vector) vedo-2025.5.3/examples/other/dolfin/demo_eigenvalue.py000066400000000000000000000020001474667405700226350ustar00rootroot00000000000000# A simple eigenvalue solver # ========================== from dolfin import * from vedo import download from vedo.dolfin import plot # Define mesh, function space fpath = download("https://vedo.embl.es/examples/data/box_with_dent.xml.gz") mesh = Mesh(fpath) V = FunctionSpace(mesh, "Lagrange", 1) # Define basis and bilinear form u = TrialFunction(V) v = TestFunction(V) a = dot(grad(u), grad(v))*dx # Assemble stiffness form A = PETScMatrix() assemble(a, tensor=A) # Create eigensolver eigensolver = SLEPcEigenSolver(A) # Compute all eigenvalues of A x = \lambda x print("Computing eigenvalues. This can take a minute.") eigensolver.solve() # Extract largest (first) eigenpair r, c, rx, cx = eigensolver.get_eigenpair(0) print("Largest eigenvalue: ", r) # Initialize function and assign eigenvector u = Function(V) u.vector()[:] = rx # plot eigenfunction on mesh as colored points (ps=point size) plot(u, mode='mesh', ps=12, cmap='gist_earth') #or as wireframe plot(u, mode='mesh', wireframe=True, cmap='magma') vedo-2025.5.3/examples/other/dolfin/demo_submesh.py000066400000000000000000000020001474667405700221570ustar00rootroot00000000000000"""Extract matchingsub meshes from a common mesh""" from dolfin import * class Structure(SubDomain): def inside(self, x, on_boundary): return x[0] > 1.4 - DOLFIN_EPS and x[0] < 1.6 \ + DOLFIN_EPS and x[1] < 0.6 + DOLFIN_EPS mesh = RectangleMesh(Point(0.0, 0.0), Point(3.0, 1.0), 60, 20) # Create sub domain markers and mark everaything as 0 sub_domains = MeshFunction("size_t", mesh, mesh.topology().dim()) sub_domains.set_all(0) # Mark structure domain as 1 structure = Structure() structure.mark(sub_domains, 1) # Extract sub meshes fluid_mesh = SubMesh(mesh, sub_domains, 0) structure_mesh = SubMesh(mesh, sub_domains, 1) # Move structure mesh for x in structure_mesh.coordinates(): x[0] += 0.2*x[0]*x[1] # Move fluid mesh according to structure mesh ALE.move(fluid_mesh, structure_mesh) fluid_mesh.smooth() ############################################# from vedo.dolfin import plot plot(fluid_mesh, text=__doc__, interactive=False) plot(structure_mesh, c='tomato', add=True) plot() vedo-2025.5.3/examples/other/dolfin/elasticbeam.py000066400000000000000000000034651474667405700217760ustar00rootroot00000000000000"""A beam deforming under its own weight.""" from dolfin import * # Scaled variables l, w = 1, 0.1 mu_, lambda_ = 1, 1 rho = 10 gamma = (w/l)**2 wind = (0, 0.0, 0) # Create mesh and define function space mesh = BoxMesh(Point(0, 0, 0), Point(l, w, w), 50, 5, 5) V = VectorFunctionSpace(mesh, "P", 1) # Define boundary condition def clamped_boundary(x, on_boundary): return on_boundary and (near(x[0], 0) or near(x[0], l)) bc = DirichletBC(V, Constant((0, 0, 0)), clamped_boundary) # Define strain and stress def epsilon(u): return 0.5 * (nabla_grad(u) + nabla_grad(u).T) def sigma(u): return lambda_ * nabla_grad(u) * Identity(3) + 2 * mu_ * epsilon(u) # Define variational problem u = TrialFunction(V) v = TestFunction(V) f = Constant((0, 0, -rho * gamma)) T = Constant(wind) a = inner(sigma(u), epsilon(v)) * dx L = dot(f, v) * dx + dot(T, v) * ds # Compute solution u = Function(V) solve(a == L, u, bc) s = sigma(u) - (1.0 / 3) * tr(sigma(u)) * Identity(3) # deviatoric stress von_Mises = sqrt(3.0 / 2 * inner(s, s)) V = FunctionSpace(mesh, "P", 1) von_Mises = project(von_Mises, V) u_magnitude = sqrt(dot(u, u)) u_magnitude = project(u_magnitude, V) ################################ Plot solution from vedo import Text3D from vedo.dolfin import plot plot( u, mode="displaced mesh", text=__doc__, scalarbar=False, axes=1, viewup='z', ) #export_window('elasticbeam1.x3d') # generate a html test page txt = Text3D("Von Mises stress intensity", pos=(0.1,.12,0), s=0.03, c='white') plot(von_Mises, txt, cmap='plasma', scalarbar=False, new=True) #export_window('elasticbeam2.x3d') # generate a html test page txt = Text3D("Magnitude of displacement", pos=(0.1,.12,0), s=0.03, c='white') plot(u_magnitude, txt, scalarbar=False, new=True) #export_window('elasticbeam3.x3d') # generate a html test page vedo-2025.5.3/examples/other/dolfin/elasticity1.py000066400000000000000000000030471474667405700217540ustar00rootroot00000000000000""" Show mesh and displacement solution with arrows. Refer to original script for the detailed description: https://fenicsproject.org/docs/dolfin/2018.1.0/python/ demos/hyperelasticity/demo_hyperelasticity.py.html """ print(__doc__) ########################################################### dolfin from dolfin import * # Create mesh and define function space mesh = UnitCubeMesh(10, 10, 10) V = VectorFunctionSpace(mesh, "Lagrange", 1) # Mark boundary subdomains left = CompiledSubDomain("near(x[0], side) && on_boundary", side=0.0) right = CompiledSubDomain("near(x[0], side) && on_boundary", side=1.0) # Define Dirichlet boundary (x = 0 or x = 1) c = Constant((0.0, 0.0, 0.0)) r = Expression(( "scale*0.0", "scale*(y0 + (x[1]-y0)*cos(theta) - (x[2]-z0)*sin(theta) - x[1])", "scale*(z0 + (x[1]-y0)*sin(theta) + (x[2]-z0)*cos(theta) - x[2])", ), scale=0.5, y0=0.5, z0=0.5, theta=pi/3, degree=2 ) bcl = DirichletBC(V, c, left) bcr = DirichletBC(V, r, right) w = TrialFunction(V) # Incremental displacement v = TestFunction(V) # Test function u = Function(V) # solution solve(inner(grad(w), grad(v)) * dx == inner(c, v) * dx, u, [bcl, bcr]) bmesh = BoundaryMesh(mesh, "exterior") ########################################################### vedo from vedo.dolfin import * # ps = point size, only mesh vertices are shown plot(u, mode='mesh', ps=10, scalarbar='3d') # plot displacements as white arrows, lw controls the mesh visibility plot(u, mode='arrows', add=True, color='w', alpha=0.5, cmap='gist_earth', lw=1) vedo-2025.5.3/examples/other/dolfin/elasticity2.py000066400000000000000000000020501474667405700217460ustar00rootroot00000000000000"""Show fenics mesh and displacement solution.""" from dolfin import * # Create mesh and define function space mesh = UnitCubeMesh(12, 12, 12) V = VectorFunctionSpace(mesh, "Lagrange", 1) # Mark boundary subdomains left = CompiledSubDomain("near(x[0], side) && on_boundary", side=0.0) right = CompiledSubDomain("near(x[0], side) && on_boundary", side=1.0) # Define Dirichlet boundary (x=0 or x=1) c = Constant((0.0, 0.0, 0.0)) r = Expression(( "scale*0.0", "scale*(y0 + (x[1]-y0)*cos(theta) - (x[2]-z0)*sin(theta)-x[1])", "scale*(z0 + (x[1]-y0)*sin(theta) + (x[2]-z0)*cos(theta)-x[2])", ), scale=0.5, y0=0.5, z0=0.5, theta=pi/4, degree=2) bcl = DirichletBC(V, c, left) bcr = DirichletBC(V, r, right) w = TrialFunction(V) # Incremental displacement v = TestFunction(V) # Test function u = Function(V) # Solution solve(inner(grad(w), grad(v)) * dx == inner(c, v) * dx, u, [bcl, bcr]) ########################################################### vedo from vedo.dolfin import plot plot(u, mode='displacements', azimuth=45) vedo-2025.5.3/examples/other/dolfin/elasticity3.py000066400000000000000000000063031474667405700217540ustar00rootroot00000000000000#!/usr/bin/env python3 """An initial circle is stretched by means of a variable force into its final shape. Colored lines are the trajectories of a few initial points.""" from dolfin import * from mshr import * import numpy as np import vedo from vedo.dolfin import plot set_log_level(30) class AllBoundaries(SubDomain): def inside(self, x, on_boundary): return on_boundary and x[0]<-10 def solve_problem(mesh, mfunc, force): V = VectorFunctionSpace(mesh, "CG", 1) u = TrialFunction(V) v = TestFunction(V) displacement = Function(V) bc = [DirichletBC(V, Constant((0,0)), mfunc, 1)] F = Constant(force) E = Constant(5000) nu = Constant(0.3) mu = E / (2.0*(1+nu)) lmbda = E * nu / ((1.0+nu) * (1.0-2*nu)) sigma = 2.0 * mu * sym(grad(u)) + lmbda * tr( sym(grad(u)) ) * Identity(2) solve(inner(sigma, grad(v)) * dx == inner(F, v) * dx, displacement, bc) displacement.set_allow_extrapolation(True) return displacement def update(mesh, displacement): new_mesh = Mesh(mesh) ALE.move(new_mesh, displacement) return new_mesh def remesh(mesh, res=50): if isinstance(mesh, vedo.Mesh): vmesh = mesh else: vmesh = vedo.Mesh([mesh.coordinates(), mesh.cells()]) bpts = vmesh.computeNormals(cells=True).boundaries().join(reset=1) #extract boundary vz = vmesh.celldata["Normals"][0][2] # check z component of normals at first point bpts.generate_mesh(invert=vz<0).smooth().write('tmpmesh.xml') #vedo REMESHING + smoothing return Mesh("tmpmesh.xml") ################################################################################# N = 40 # number of iterations of stretching res = 15 # resolution of meshes do_remesh = False # grab the boundary and remesh the interior at each iteration vedo.settings.use_parallel_projection = True # avoid perspective parallax circle = Circle(Point(0, 0), 50) mesh = generate_mesh(circle, res) meshes = [mesh] displacements = [] for i in range(N): mfunc = MeshFunction('size_t', mesh, 1, mesh.domains()) mfunc.set_all(0) allb = AllBoundaries() allb.mark(mfunc, 1) F = np.array([2, (i-N/2)/N]) # some variable force displacement = solve_problem(mesh, mfunc, F) new_mesh = update(mesh, displacement) if do_remesh: mesh = remesh(new_mesh) else: mesh = new_mesh meshes.append(mesh) displacements.append(displacement) dmesh_i = meshes[0] # initial mesh dmesh_f = meshes[-1] # final mesh vmesh_i = vedo.Mesh([dmesh_i.coordinates(), dmesh_i.cells()], c='grey5').z(-1) vmesh_f = vedo.Mesh([dmesh_f.coordinates(), dmesh_f.cells()], c='grey3').wireframe() plt = vedo.Plotter() # move a few points along the deformation of the circle seeds = vedo.Circle(r=50, res=res).vertices[:,(0,1)] # make points 2d with [:,(0,1)] endpoints = [] for i, p in enumerate(seeds): line = [p] for u in displacements: p = p + u(p) line.append(p) plt += vedo.Line(line, c=i, lw=4).z(1) endpoints.append(p) plt += [vmesh_i, vmesh_f, __doc__] plt.show(axes=1) # to invert everything and move the end points back in place, check out discussion: #https://fenicsproject.discourse.group/t/precision-in-hyperelastic-model/6824/3 vedo-2025.5.3/examples/other/dolfin/elasticity4.py000066400000000000000000000045571474667405700217660ustar00rootroot00000000000000import numpy as np from dolfin import * import vedo set_log_level(30) class AllBoundaries(SubDomain): def inside(self, x, on_boundary): return on_boundary and x[0]<-10 def solve_problem(mesh, mfunc, force): V = VectorFunctionSpace(mesh, "CG", 1) u = TrialFunction(V) v = TestFunction(V) displacement = Function(V) bc = [DirichletBC(V, Constant((0,0)), mfunc, 1)] F = Constant(force) E = Constant(5000) nu = Constant(0.3) mu = E / (2.0*(1+nu)) lmbda = E * nu / ((1.0+nu) * (1-2*nu)) sigma = 2.0 * mu * sym(grad(u)) + lmbda * tr( sym(grad(u)) ) * Identity(2) solve(inner(sigma, grad(v)) * dx == inner(F, v) * dx, displacement, bc) displacement.set_allow_extrapolation(True) return displacement def update(mesh, displacement): new_mesh = Mesh(mesh) ALE.move(new_mesh, displacement) return new_mesh def remesh(mesh): if isinstance(mesh, vedo.Mesh): vmesh = mesh else: vmesh = vedo.Mesh([mesh.coordinates(), mesh.cells()]) bpts = vmesh.compute_normals(cells=True).boundaries().join(reset=1) #extract boundary vz = vmesh.celldata["Normals"][0][2] # check z component of normals at first point bpts.generate_mesh(invert=vz<0).write('tmpmesh.xml') #vedo REMESHING + smoothing return Mesh("tmpmesh.xml") ################################################################################# N = 20 # number of iterations of stretching do_remesh = 0 # grab the boundary and remesh the interior at each iteration circle = vedo.Circle(r=50) mesh = remesh(circle) half_circle = circle.boundaries().cut_with_plane(origin=[-10,0,0], normal='-x').z(2) half_circle.linewidth(5).c("red4") plt = vedo.Plotter(N=N, size=(2250, 1300)) meshes = [mesh] displacements = [] for i in range(N): mfunc = MeshFunction('size_t', mesh, 1, mesh.domains()) mfunc.set_all(0) allb = AllBoundaries() allb.mark(mfunc, 1) F = np.array([4, 2*(i-N/2)/N]) displacement = solve_problem(mesh, mfunc, F) new_mesh = update(mesh, displacement) mesh = remesh(new_mesh) if do_remesh else new_mesh meshes.append(mesh) displacements.append(displacement) varrow = vedo.Arrow2D([0,0], F*15).z(1).c("red4") vmesh = vedo.Mesh([mesh.coordinates(), mesh.cells()]).c("k4").lc('k5') plt.at(i).show(f"t={i}, F={F}", half_circle, vmesh, varrow, zoom=1.5) plt.interactive().close() vedo-2025.5.3/examples/other/dolfin/elastodynamics.py000066400000000000000000000146001474667405700225350ustar00rootroot00000000000000'''Time-integration of the elastodynamics equation ''' from dolfin import * import numpy as np # Form compiler options parameters["form_compiler"]["cpp_optimize"] = True parameters["form_compiler"]["optimize"] = True # Define mesh mesh = BoxMesh(Point(0., 0., 0.), Point(1., 0.1, 0.04), 20, 5, 4) # Sub domain for clamp at left end def left(x, on_boundary): return near(x[0], 0.) and on_boundary # Sub domain for rotation at right end def right(x, on_boundary): return near(x[0], 1.) and on_boundary # Elastic parameters E = 800.0 nu = 0.3 mu = Constant(E / (2.0*(1.0 + nu))) lmbda = Constant(E*nu / ((1.0 + nu)*(1.0 - 2.0*nu))) # Mass density rho = Constant(1.0) # Rayleigh damping coefficients eta_m = Constant(0.) eta_k = Constant(0.) # Generalized-alpha method parameters alpha_m = Constant(0.2) alpha_f = Constant(0.4) gamma = Constant(0.5+alpha_f-alpha_m) beta = Constant((gamma+0.5)**2/4.) # Time-stepping parameters T = 4.0 Nsteps = 50 dt = Constant(T/Nsteps) p0 = 1. cutoff_Tc = T/5 # Define the loading as an expression depending on t p = Expression(("0", "t <= tc ? p0*t/tc : 0", "0"), t=0, tc=cutoff_Tc, p0=p0, degree=0) # Define function space for displacement, velocity and acceleration V = VectorFunctionSpace(mesh, "CG", 1) # Define function space for stresses Vsig = TensorFunctionSpace(mesh, "DG", 0) # Test and trial functions du = TrialFunction(V) u_ = TestFunction(V) # Current (unknown) displacement u = Function(V, name="Displacement") # Fields from previous time step (displacement, velocity, acceleration) u_old = Function(V) v_old = Function(V) a_old = Function(V) # Create mesh function over the cell facets boundary_subdomains = MeshFunction("size_t", mesh, mesh.topology().dim() - 1) boundary_subdomains.set_all(0) force_boundary = AutoSubDomain(right) force_boundary.mark(boundary_subdomains, 3) # Define measure for boundary condition integral dss = ds(subdomain_data=boundary_subdomains) # Set up boundary condition at left end zero = Constant((0.0, 0.0, 0.0)) bc = DirichletBC(V, zero, left) # Stress tensor def sigma(r): return 2.0*mu*sym(grad(r)) + lmbda*tr(sym(grad(r)))*Identity(len(r)) # Mass form def m(u, u_): return rho*inner(u, u_)*dx # Elastic stiffness form def k(u, u_): return inner(sigma(u), sym(grad(u_)))*dx # Rayleigh damping form def c(u, u_): return eta_m*m(u, u_) + eta_k*k(u, u_) # Work of external forces def Wext(u_): return dot(u_, p)*dss(3) # Update formula for acceleration # a = 1/(2*beta)*((u - u0 - v0*dt)/(0.5*dt*dt) - (1-2*beta)*a0) def update_a(u, u_old, v_old, a_old, ufl=True): if ufl: dt_ = dt beta_ = beta else: dt_ = float(dt) beta_ = float(beta) return (u-u_old-dt_*v_old)/beta_/dt_**2 - (1-2*beta_)/2/beta_*a_old # Update formula for velocity # v = dt * ((1-gamma)*a0 + gamma*a) + v0 def update_v(a, u_old, v_old, a_old, ufl=True): if ufl: dt_ = dt gamma_ = gamma else: dt_ = float(dt) gamma_ = float(gamma) return v_old + dt_*((1-gamma_)*a_old + gamma_*a) def update_fields(u, u_old, v_old, a_old): """Update fields at the end of each time step.""" # Get vectors (references) u_vec, u0_vec = u.vector(), u_old.vector() v0_vec, a0_vec = v_old.vector(), a_old.vector() # use update functions using vector arguments a_vec = update_a(u_vec, u0_vec, v0_vec, a0_vec, ufl=False) v_vec = update_v(a_vec, u0_vec, v0_vec, a0_vec, ufl=False) # Update (u_old <- u) v_old.vector()[:], a_old.vector()[:] = v_vec, a_vec u_old.vector()[:] = u.vector() def avg(x_old, x_new, alpha): return alpha*x_old + (1-alpha)*x_new # Residual a_new = update_a(du, u_old, v_old, a_old, ufl=True) v_new = update_v(a_new, u_old, v_old, a_old, ufl=True) res = m(avg(a_old, a_new, alpha_m), u_) + c(avg(v_old, v_new, alpha_f), u_) \ + k(avg(u_old, du, alpha_f), u_) - Wext(u_) a_form = lhs(res) L_form = rhs(res) # Define solver for reusing factorization K, res = assemble_system(a_form, L_form, bc) solver = LUSolver(K, "mumps") solver.parameters["symmetric"] = True # Time-stepping time = np.linspace(0, T, Nsteps+1) u_tip = np.zeros((Nsteps+1,)) energies = np.zeros((Nsteps+1, 4)) E_damp = 0 E_ext = 0 sig = Function(Vsig, name="sigma") #xdmf_file = XDMFFile("elastodynamics-results.xdmf") #xdmf_file.parameters["flush_output"] = True #xdmf_file.parameters["functions_share_mesh"] = True #xdmf_file.parameters["rewrite_function_mesh"] = False def local_project(v, V, u=None): """Element-wise projection using LocalSolver""" dv = TrialFunction(V) v_ = TestFunction(V) a_proj = inner(dv, v_)*dx b_proj = inner(v, v_)*dx solver = LocalSolver(a_proj, b_proj) solver.factorize() if u is None: u = Function(V) solver.solve_local_rhs(u) return u else: solver.solve_local_rhs(u) return ################################################################### time loop from vedo import Box, ProgressBar from vedo.dolfin import plot # add a frame box box = Box(length=1, width=1, height=1).pos(0.5,0,0).wireframe() pb = ProgressBar(0, len(np.diff(time)), c='blue') for (i, dt) in enumerate(np.diff(time)): t = time[i+1] # Forces are evaluated at t_{n+1-alpha_f}=t_{n+1}-alpha_f*dt p.t = t-float(alpha_f*dt) # Solve for new displacement res = assemble(L_form) bc.apply(res) solver.solve(K, u.vector(), res) # Update old fields with new quantities update_fields(u, u_old, v_old, a_old) # Save solution to XDMF format #xdmf_file.write(u, t) # Compute stresses and save to file local_project(sigma(u), Vsig, sig) #xdmf_file.write(sig, t) p.t = t # Record tip displacement and compute energies if MPI.comm_world.size == 1: u_tip[i+1] = u(1., 0.05, 0.)[1] E_elas = assemble(0.5*k(u_old, u_old)) E_kin = assemble(0.5*m(v_old, v_old)) E_damp += dt*assemble(c(v_old, v_old)) # E_ext += assemble(Wext(u-u_old)) E_tot = E_elas+E_kin+E_damp #-E_ext energies[i+1, :] = np.array([E_elas, E_kin, E_damp, E_tot]) plot(u, box, mode='displace', style='matplotlib', axes=0, # no axes scalarbar=False, azimuth=1, # at each iteration add an angle to rotate scene text=__doc__, # add this file header interactive=False).clear() #screenshot('bar'+str(i)+'.png') # uncomment to save screenshots pb.print("Time: "+str(t)+" seconds") vedo-2025.5.3/examples/other/dolfin/heat_gaussian.py000066400000000000000000000030011474667405700223220ustar00rootroot00000000000000""" FEniCS tutorial demo program: Diffusion of a Gaussian hill. u'= Laplace(u) + f in a square domain u = u_D on the boundary u = u_0 at t = 0 u_D = f = 0 The initial condition u_0 is chosen as a Gaussian hill. """ # https://fenicsproject.org/pub/tutorial/html/._ftut1006.html from fenics import * set_log_level(30) num_steps = 50 # number of time steps dt = 0.02 # time step size # Create mesh and define function space nx = ny = 30 mesh = RectangleMesh(Point(-2, -2), Point(2, 2), nx, ny) V = FunctionSpace(mesh, 'P', 1) # Define boundary condition def boundary(x, on_boundary): return on_boundary bc = DirichletBC(V, Constant(0), boundary) # Define initial value u_0 = Expression('exp(-5*pow(x[0],2) - 5*pow(x[1],2))', degree=2) u_n = interpolate(u_0, V) # Define variational problem u = TrialFunction(V) v = TestFunction(V) f = Constant(0) F = u*v*dx + dt*dot(grad(u), grad(v))*dx - (u_n + dt*f)*v*dx a, L = lhs(F), rhs(F) ############################################################# vedo from vedo.dolfin import plot from vedo import Latex f = r'\frac{\partial u}{\partial t}=\nabla^2 u+f~\mathrm{in}~\Omega\times(0,T]' formula = Latex(f, pos=(-.4,-.8, .1), s=0.6, c='w') formula.crop(0.2, 0.4) # crop top and bottom 20% and 40% # Time-stepping u = Function(V) for n in range(num_steps): # Compute solution solve(a == L, u, bc) # Plot solution plot(u, formula, scalarbar=False, interactive=False) # Update previous solution u_n.assign(u) plot() vedo-2025.5.3/examples/other/dolfin/heatconv.py000066400000000000000000000050771474667405700213350ustar00rootroot00000000000000"""Heat equation in moving media.""" # Credits: Jan Blechta # https://github.com/blechta/fenics-handson/blob/master/heatconv from dolfin import * set_log_level(30) # Create mesh and build function space mesh = UnitSquareMesh(30, 30, "crossed") V = FunctionSpace(mesh, "Lagrange", 1) # Create boundary markers tdim = mesh.topology().dim() boundary_parts = MeshFunction("size_t", mesh, tdim - 1) left = AutoSubDomain(lambda x: near(x[0], 0.0)) right = AutoSubDomain(lambda x: near(x[0], 1.0)) bottom = AutoSubDomain(lambda x: near(x[1], 0.0)) left.mark(boundary_parts, 1) right.mark(boundary_parts, 2) bottom.mark(boundary_parts, 2) # Initial condition and right-hand side ic = Expression("""pow(x[0] - 0.25, 2) + pow(x[1] - 0.25, 2) < 0.2*0.2 ? -25.0 * ((pow(x[0] - 0.25, 2) + pow(x[1] - 0.25, 2)) - 0.2*0.2) : 0.0""", degree=1, ) f = Expression("""pow(x[0] - 0.75, 2) + pow(x[1] - 0.75, 2) < 0.2*0.2 ? 1.0 : 0.0""", degree=1, ) # Equation coefficients K = Constant(1e-2) # thermal conductivity g = Constant(0.01) # Neumann heat flux b = Expression(("-(x[1] - 0.5)", "x[0] - 0.5"), degree=1) # convecting velocity # Define boundary measure on Neumann part of boundary dsN = Measure("ds", subdomain_id=1, subdomain_data=boundary_parts) # Define steady part of the equation def operator(u, v): return (K * inner(grad(u), grad(v)) - f * v + dot(b, grad(u)) * v ) * dx - K * g * v * dsN # Define trial and test function and solution at previous time-step u = TrialFunction(V) v = TestFunction(V) u0 = Function(V) # Time-stepping parameters dt = 0.02 theta = Constant(0.5) # Crank-Nicolson scheme # Define time discretized equation F = ((1.0 / dt) * inner(u - u0, v) * dx + theta * operator(u, v) + (1.0 - theta) * operator(u0, v) ) # Define boundary condition bc = DirichletBC(V, Constant(0.0), boundary_parts, 2) # Prepare solution function and solver u = Function(V) problem = LinearVariationalProblem(lhs(F), rhs(F), u, bc) solver = LinearVariationalSolver(problem) # Prepare initial condition u0.interpolate(ic) u.interpolate(ic) ######################################################Time-stepping from vedo.dolfin import plot t = 0.0 while t < 3: solver.solve() plot(u, text=__doc__+"\nTemperature at t = %g" % t, style=2, axes=3, lw=0, # no mesh edge lines warp_zfactor=0.1, isolines={"n": 12, "lw":1, "c":'black', "alpha":0.1}, scalarbar=False, interactive=False, ).clear() # Move to next time step u0.assign(u) t += dt vedo-2025.5.3/examples/other/dolfin/magnetostatics.py000066400000000000000000000054121474667405700225440ustar00rootroot00000000000000"""Compute the magnetic field B in an iron cylinder, the copper wires, and the surrounding vacuum. Isolines of Az are also shown.""" # https://fenicsproject.org/pub/tutorial/html/._ftut1015.html # conda install conda-forge::mshr from fenics import * from mshr import * from math import sin, cos, pi a = 1.0 # inner radius of iron cylinder b = 1.2 # outer radius of iron cylinder c_1 = 0.8 # radius for inner circle of copper wires c_2 = 1.4 # radius for outer circle of copper wires r = 0.1 # radius of copper wires R = 2.5 # radius of domain n = 5 # number of windings # Define geometry for background domain = Circle(Point(0, 0), R) # Define geometry for iron cylinder cylinder = Circle(Point(0, 0), b) - Circle(Point(0, 0), a) # Define geometry for wires (N = North (up), S = South (down)) angles_N = [i*2*pi/n for i in range(n)] angles_S = [(i + 0.5)*2*pi/n for i in range(n)] wires_N = [Circle(Point(c_1*cos(v), c_1*sin(v)), r) for v in angles_N] wires_S = [Circle(Point(c_2*cos(v), c_2*sin(v)), r) for v in angles_S] # Set subdomain for iron cylinder domain.set_subdomain(1, cylinder) # Set subdomains for wires for (i, wire) in enumerate(wires_N): domain.set_subdomain(2 + i, wire) for (i, wire) in enumerate(wires_S): domain.set_subdomain(2 + n + i, wire) # Create mesh mesh = generate_mesh(domain, 64) # Define function space V = FunctionSpace(mesh, 'P', 1) # Define boundary condition bc = DirichletBC(V, Constant(0), 'on_boundary') # Define subdomain markers and integration measure markers = MeshFunction('size_t', mesh, 2, mesh.domains()) dx = Measure('dx', domain=mesh, subdomain_data=markers) # Define current densities J_N = Constant(1.0) J_S = Constant(-1.0) # Define magnetic permeability class Permeability(UserExpression): def __init__(self, markers, **kwargs): self.markers = markers super().__init__(**kwargs) def eval_cell(self, values, x, cell): if self.markers[cell.index] == 0: values[0] = 4*pi*1e-7 # vacuum elif self.markers[cell.index] == 1: values[0] = 1e-5 # iron (should really be 6.3e-3) else: values[0] = 1.26e-6 # copper mu = Permeability(markers, degree=1) # Define variational problem A_z = TrialFunction(V) v = TestFunction(V) a = (1 / mu)*dot(grad(A_z), grad(v))*dx L_N = sum(J_N*v*dx(i) for i in range(2, 2 + n)) L_S = sum(J_S*v*dx(i) for i in range(2 + n, 2 + 2*n)) L = L_N + L_S # Solve variational problem A_z = Function(V) solve(a == L, A_z, bc) # Compute magnetic field (B = curl A) W = VectorFunctionSpace(mesh, 'P', 1) B = project(as_vector((A_z.dx(1), -A_z.dx(0))), W) # Plot solution from vedo.dolfin import plot plot(A_z, B, lw=0, # linewidth of mesh isolines={'n':10, 'lw':0, 'c':'black'}, scalarbar=False, ) vedo-2025.5.3/examples/other/dolfin/markmesh.py000066400000000000000000000007071474667405700213300ustar00rootroot00000000000000''' Mark mesh with boundary function ''' from dolfin import * mesh = UnitCubeMesh(5,5,5) V = FunctionSpace(mesh, "Lagrange", 1) class left(SubDomain): def inside(self, x, on_boundary): return on_boundary and abs(x[0]) < DOLFIN_EPS left = left() tcond = MeshFunction("size_t", mesh, 0) tcond.set_all(0) left.mark(tcond, 1) ################################## from vedo.dolfin import plot plot(tcond, cmap='cool', elevation=20, text=__doc__) vedo-2025.5.3/examples/other/dolfin/mixed-poisson.py000066400000000000000000000031241474667405700223130ustar00rootroot00000000000000"""Solving Poisson equation using a mixed (two-field) formulation.""" # https://fenicsproject.org/docs/dolfin/2018.1.0/python/demos/mixed-poisson from dolfin import * # Create mesh mesh = UnitSquareMesh(30, 30) # Define finite elements spaces and build mixed space BDM = FiniteElement("BDM", mesh.ufl_cell(), 1) DG = FiniteElement("DG", mesh.ufl_cell(), 0) W = FunctionSpace(mesh, BDM * DG) # Define trial and test functions (sigma, u) = TrialFunctions(W) (tau, v) = TestFunctions(W) # Define source function f = Expression("10*exp(-(pow(x[0]-0.5, 2) + pow(x[1]-0.5, 2))/0.02)", degree=2) # Define variational form a = (dot(sigma, tau) + div(tau) * u + div(sigma) * v) * dx L = -f * v * dx # Define function G such that G \cdot n = g class BoundarySource(UserExpression): def __init__(self, mesh, **kwargs): self.mesh = mesh super().__init__(**kwargs) def eval_cell(self, values, x, ufc_cell): cell = Cell(self.mesh, ufc_cell.index) n = cell.normal(ufc_cell.local_facet) g = sin(5 * x[0]) values[0] = g * n[0] values[1] = g * n[1] def value_shape(self): return (2,) G = BoundarySource(mesh, degree=2) # Define essential boundary def boundary(x): return x[1] < DOLFIN_EPS or x[1] > 1.0 - DOLFIN_EPS bc = DirichletBC(W.sub(0), G, boundary) # Compute solution w = Function(W) solve(a == L, w, bc) (sigma, u) = w.split() ########################################################### vedo from vedo.dolfin import plot # Plot solution on mesh, and warp z-axis by the scalar value plot(u, warp_zfactor=0.8, legend='u', text=__doc__) vedo-2025.5.3/examples/other/dolfin/navier-stokes_lshape.py000066400000000000000000000055351474667405700236530ustar00rootroot00000000000000""" Solve the incompressible Navier-Stokes equations on an L-shaped domain using Chorin's splitting method. """ from dolfin import * import numpy as np from vedo import download from vedo.dolfin import plot # Print log messages only from the root process in parallel parameters["std_out_all_processes"] = False # Load mesh from file fpath = download("https://vedo.embl.es/examples/data/lshape.xml.gz") mesh = Mesh(fpath) # Define function spaces (P2-P1) V = VectorFunctionSpace(mesh, "Lagrange", 2) Q = FunctionSpace(mesh, "Lagrange", 1) # Define trial and test functions u = TrialFunction(V) p = TrialFunction(Q) v = TestFunction(V) q = TestFunction(Q) # Set parameter values dt = 0.01 T = 3 nu = 0.01 # Define time-dependent pressure boundary condition p_in = Expression("sin(3.0*t)", t=0.0, degree=2) # Define boundary conditions noslip = DirichletBC( V, (0, 0), ( "on_boundary &&" "(x[0] < DOLFIN_EPS | x[1] < DOLFIN_EPS | " "(x[0] > 0.5 - DOLFIN_EPS && x[1] > 0.5 - DOLFIN_EPS))" ), ) inflow = DirichletBC(Q, p_in, "x[1] > 1.0 - DOLFIN_EPS") outflow = DirichletBC(Q, 0, "x[0] > 1.0 - DOLFIN_EPS") bcu = [noslip] bcp = [inflow, outflow] # Create functions u0 = Function(V) u1 = Function(V) p1 = Function(Q) # Define coefficients k = Constant(dt) f = Constant((0, 0)) # Tentative velocity step F1 = ( (1 / k) * inner(u - u0, v) * dx + inner(grad(u0) * u0, v) * dx + nu * inner(grad(u), grad(v)) * dx - inner(f, v) * dx ) a1 = lhs(F1) L1 = rhs(F1) # Pressure update a2 = inner(grad(p), grad(q)) * dx L2 = -(1 / k) * div(u1) * q * dx # Velocity update a3 = inner(u, v) * dx L3 = inner(u1, v) * dx - k * inner(grad(p1), v) * dx # Assemble matrices A1 = assemble(a1) A2 = assemble(a2) A3 = assemble(a3) # Use amg preconditioner if available prec = "amg" if has_krylov_solver_preconditioner("amg") else "default" # Use nonzero guesses - essential for CG with non-symmetric BC parameters["krylov_solver"]["nonzero_initial_guess"] = True # Time-stepping for t in np.arange(0, T, dt): # Update pressure boundary condition p_in.t = t # Compute tentative velocity step b1 = assemble(L1) [bc.apply(A1, b1) for bc in bcu] solve(A1, u1.vector(), b1, "bicgstab", "default") # Pressure correction b2 = assemble(L2) [bc.apply(A2, b2) for bc in bcp] [bc.apply(p1.vector()) for bc in bcp] solve(A2, p1.vector(), b2, "bicgstab", prec) # Velocity correction b3 = assemble(L3) [bc.apply(A3, b3) for bc in bcu] solve(A3, u1.vector(), b3, "bicgstab", "default") # Move to next time step u0.assign(u1) t += dt # Plot solution plotter = plot( u1, mode="mesh and arrows", text="Velocity of fluid", cmap="jet", scale=0.3, # unit conversion factor scalarbar=False, interactive=False, ) plotter.remove("Arrows") vedo-2025.5.3/examples/other/dolfin/point_load.py000066400000000000000000000027741474667405700216570ustar00rootroot00000000000000"""Apply a vector-valued point load to a corner of a linear-elastic cube. """ # Credit https://fenicsproject.discourse.group/t/ #applying-pointsource-at-two-different-vectors/1459/2 from dolfin import * from vedo.dolfin import plot BULK_MOD = 1.0 SHEAR_MOD = 1.0 mesh = UnitCubeMesh(10, 10, 10) VE = VectorElement("Lagrange", mesh.ufl_cell(), 1) V = FunctionSpace(mesh, VE) # Constrain normal displacement on two sides: def boundary1(x, on_boundary): return on_boundary and near(x[1], 0.0) bc1 = DirichletBC(V.sub(1), Constant(0.0), boundary1) def boundary2(x, on_boundary): return on_boundary and near(x[0], 0.0) bc2 = DirichletBC(V.sub(0), Constant(0.0), boundary2) # Solve linear elasticity with point load at upper-right corner: u = TrialFunction(V) v = TestFunction(V) eps = 0.5 * (grad(u) + grad(u).T) I = Identity(3) sigma = BULK_MOD*tr(eps)*I + 2*SHEAR_MOD*(eps-tr(eps)*I/3) a = inner(sigma, grad(v)) * dx L = inner(Constant((0,0,0)), v) * dx # Assemble: A = assemble(a) B = assemble(L) # Apply point sources: ptSrcLocation = Point(1-DOLFIN_EPS, 1-DOLFIN_EPS) # Vectorial point load: f = [0.01, 0.02] # Distinct point sources for x- and y-components ptSrc_x = PointSource(V.sub(0), ptSrcLocation, f[0]) ptSrc_y = PointSource(V.sub(1), ptSrcLocation, f[1]) ptSrcs = [ptSrc_x, ptSrc_y] # Apply to RHS of linear system: for ptSrc in ptSrcs: ptSrc.apply(B) # Apply BCs: for bc in [bc1, bc2]: bc.apply(A) bc.apply(B) # Solve: u = Function(V) solve(A, u.vector(), B) plot(u, mode='displacement')vedo-2025.5.3/examples/other/dolfin/poisson.py000066400000000000000000000025541474667405700212150ustar00rootroot00000000000000"""Poisson equation with Dirichlet conditions. -Laplace(u) = f in the unit square u = uD on the boundary uD = 1 + x^2 + 2*y^2 (f = -6) """ ########################################################### fenics import numpy as np from fenics import * # Create mesh and define function space mesh = UnitSquareMesh(8, 8) V = FunctionSpace(mesh, "P", 1) # Define boundary condition uD = Expression("1 + x[0]*x[0] + 2*x[1]*x[1]", degree=2) bc = DirichletBC(V, uD, "on_boundary") # Define variational problem w = TrialFunction(V) v = TestFunction(V) u = Function(V) f = Constant(-6.0) # Compute solution solve( dot(grad(w), grad(v))*dx == f*v*dx, u, bc) f = r'-\nabla^{2} u=f' ########################################################### vedo from vedo.dolfin import plot from vedo.pyplot import histogram from vedo import Latex l = Latex(f, s=0.2, c='k3').shift([.3,.6,.1]) plot(u, l, cmap='jet', scalarbar='h', text=__doc__).clear() # Now show uD values on the boundary of a much finer mesh bmesh = BoundaryMesh(UnitSquareMesh(80, 80), "exterior") plot(uD, bmesh, cmap='cool', ps=5, legend='boundary') # ps = point size # now make some nonsense plot with the same plot() function yvals = u.compute_vertex_values(mesh) xvals = np.arange(len(yvals)) plt = plot(xvals, yvals, 'go-') plt.show(new=True) # and a histogram hst = histogram(yvals) hst.show(new=True) vedo-2025.5.3/examples/other/dolfin/poisson_membrane.py000066400000000000000000000030511474667405700230540ustar00rootroot00000000000000""" FEniCS tutorial demo program: Deflection of a membrane. -Laplace(w) = p in the unit circle w = 0 on the boundary The load p is a Gaussian function centered at (0, 0.6). """ from fenics import * from mshr import Circle, generate_mesh # Create mesh and define function space domain = Circle(Point(0, 0), 1) mesh = generate_mesh(domain, 64) V = FunctionSpace(mesh, 'P', 2) w_D = Constant(0) def boundary(x, on_boundary): return on_boundary bc = DirichletBC(V, w_D, boundary) # Define load p = Expression('4*exp(-pow(beta, 2)*(pow(x[0], 2) + pow(x[1] - R0, 2)))', degree=1, beta=8, R0=0.6) # Define variational problem w = TrialFunction(V) v = TestFunction(V) a = dot(grad(w), grad(v))*dx L = p*v*dx # Compute solution w = Function(V) solve(a == L, w, bc) p = interpolate(p, V) # Curve plot along x = 0 comparing p and w import numpy as np tol = 0.001 # avoid hitting points outside the domain y = np.linspace(-1 + tol, 1 - tol, 101) points = [(0, y_) for y_ in y] # 2D points w_line = np.array([w(point) for point in points]) p_line = np.array([p(point) for point in points]) ####################################################################### from vedo.dolfin import plot from vedo import Line, Latex pde = r'-T \nabla^{2} D=p, ~\Omega=\left\{(x, y) | x^{2}+y^{2} \leq R\right\}' tex = Latex(pde, pos=(0,1.1,.1), s=0.2, c='w') wline = Line(np.c_[y, w_line*10], c='white', lw=4) pline = Line(np.c_[y, p_line/ 4], c='lightgreen', lw=4) plot(w, wline, tex, bg='bb', text='Deflection') plot(p, pline, bg='bb', text='Load') vedo-2025.5.3/examples/other/dolfin/run_all.sh000077500000000000000000000004721474667405700211410ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo conda install conda-forge::mshr echo for f in *.py do echo "Processing $f script.." python3 "$f" done vedo-2025.5.3/examples/other/dolfin/scalemesh.py000066400000000000000000000011421474667405700214570ustar00rootroot00000000000000"""Scale a mesh asymmetrically in one coordinate""" from dolfin import * from mshr import * domain = Rectangle(Point(0.0, 0.0), Point(5.0, 0.01)) mesh = generate_mesh(domain, 20) V = FunctionSpace(mesh, "CG", 2) e = Expression("sin(2*pi*(x[0]*x[0]+x[1]*x[1]))", degree=2) f = interpolate(e, V) #################################################### from vedo.dolfin import plot plt = plot( f, xtitle="y-coord is scaled by factor 100", scale_mesh_factors=(0.01, 1, 1), style=1, lw=0, warp_zfactor=0.001, scalarbar="horizontal", axes={"xtitle_offset": 0.2}, text=__doc__, ) vedo-2025.5.3/examples/other/dolfin/stokes-iterative.py000066400000000000000000000040261474667405700230210ustar00rootroot00000000000000""" Stokes equations with an iterative solver. """ # https://fenicsproject.org/docs/dolfin/2018.1.0/python/demos/ # stokes-iterative/demo_stokes-iterative.py.html from dolfin import * mesh = UnitCubeMesh(10, 10, 10) # Build function space P2 = VectorElement("Lagrange", mesh.ufl_cell(), 2) P1 = FiniteElement("Lagrange", mesh.ufl_cell(), 1) TH = P2 * P1 W = FunctionSpace(mesh, TH) # Boundaries def right(x, on_boundary): return x[0] > (1.0 - DOLFIN_EPS) def left(x, on_boundary): return x[0] < DOLFIN_EPS def top_bottom(x, on_boundary): return x[1] > 1.0 - DOLFIN_EPS or x[1] < DOLFIN_EPS # No-slip boundary condition for velocity noslip = Constant((0.0, 0.0, 0.0)) bc0 = DirichletBC(W.sub(0), noslip, top_bottom) # Inflow boundary condition for velocity inflow = Expression(("-sin(x[1]*pi)", "0.0", "0.0"), degree=2) bc1 = DirichletBC(W.sub(0), inflow, right) # Define variational problem (u, p) = TrialFunctions(W) (v, q) = TestFunctions(W) f = Constant((0.0, 0.0, 0.0)) a = inner(grad(u), grad(v)) * dx + div(v) * p * dx + q * div(u) * dx L = inner(f, v) * dx # Form for use in constructing preconditioner matrix b = inner(grad(u), grad(v)) * dx + p * q * dx # Assemble system A, bb = assemble_system(a, L, [bc0, bc1]) # Assemble preconditioner system P, btmp = assemble_system(b, L, [bc0, bc1]) # Create Krylov solver and AMG preconditioner if has_krylov_solver_method("minres"): krylov_method = "minres" elif has_krylov_solver_method("tfqmr"): krylov_method = "tfqmr" solver = KrylovSolver(krylov_method, "amg") # Associate operator (A) and preconditioner matrix (P) solver.set_operators(A, P) # Solve U = Function(W) solver.solve(U.vector(), bb) # Get sub-functions u, p = U.split() pressures = p.compute_vertex_values(mesh) #################################################### vedo from vedo.dolfin import plot # Plot u and p solutions on N=2 synced renderers plot(u, mode='mesh arrows', at=0, N=2, legend='velocity', scale=0.1, wireframe=1, lw=0.03, alpha=0.5, scalarbar=False).close() plot(p, mode='mesh').close() vedo-2025.5.3/examples/other/dolfin/stokes1.py000066400000000000000000000032041474667405700211050ustar00rootroot00000000000000"""This demo solves the Stokes equations, using quadratic elements for the velocity and first degree elements for the pressure (Taylor-Hood elements)""" # Credits: # https://github.com/pf4d/fenics_scripts/blob/master/cbc_block/stokes.py from dolfin import * import numpy as np from vedo.dolfin import plot from vedo import Latex, dataurl, download # Load mesh and subdomains fpath = download(dataurl + "dolfin_fine.xml") mesh = Mesh(fpath) fpath = download(dataurl + "dolfin_fine_subdomains.xml.gz") sub_domains = MeshFunction("size_t", mesh, fpath) # Define function spaces P2 = VectorElement("Lagrange", mesh.ufl_cell(), 2) P1 = FiniteElement("Lagrange", mesh.ufl_cell(), 1) TH = P2 * P1 W = FunctionSpace(mesh, TH) # No-slip boundary condition for velocity noslip = Constant((0, 0)) bc0 = DirichletBC(W.sub(0), noslip, sub_domains, 0) # Inflow boundary condition for velocity inflow = Expression(("-sin(x[1]*pi)", "0.0"), degree=2) bc1 = DirichletBC(W.sub(0), inflow, sub_domains, 1) bcs = [bc0, bc1] # Define variational problem (u, p) = TrialFunctions(W) (v, q) = TestFunctions(W) f = Constant((0, 0)) a = (inner(grad(u), grad(v)) - div(v) * p + q * div(u)) * dx L = inner(f, v) * dx w = Function(W) solve(a == L, w, bcs) # Split the mixed solution using a shallow copy (u, p) = w.split() ##################################################################### vedo f = r"-\nabla \cdot(\nabla u+p I)=f ~\mathrm{in}~\Omega" formula = Latex(f, pos=(0.55, 0.45, -0.05), s=0.1) plot( u, N=2, mode="mesh and arrows", scale=0.03, wireframe=True, scalarbar=False, style=1, ).close() plot(p, text="pressure", cmap="rainbow").close() vedo-2025.5.3/examples/other/ellipt_fourier_desc.py000066400000000000000000000015311474667405700222640ustar00rootroot00000000000000"""Elliptic Fourier Descriptors parametrizing a closed contour (in red)""" import numpy as np import vedo import pyefd shapes = vedo.Assembly(vedo.dataurl+'timecourse1d.npy') s = shapes[55].c('red5').lw(3) pts1 = s.points[:,(0,1)].copy() pts2 = s.points[:,(0,1)].copy() pts2[:,0] *= -1 pts2 = np.flip(pts2, axis=0) pts = np.array(pts1.tolist() + pts2.tolist()) rlines = [] for order in range(5,30, 5): coeffs = pyefd.elliptic_fourier_descriptors(pts, order=order, normalize=False) a0, c0 = pyefd.calculate_dc_coefficients(pts) rpts = pyefd.reconstruct_contour(coeffs, locus=(a0,c0), num_points=400) color = vedo.color_map(order, "Blues", 5,30) rline = vedo.Line(rpts).lw(3).c(color) rlines.append(rline) s.z(0.1) # move it on top so it's visible vedo.show(s, *rlines, __doc__, axes=1, bg='k', size=(1190, 630), zoom=1.8).close() vedo-2025.5.3/examples/other/export_numpy.py000066400000000000000000000007431474667405700210170ustar00rootroot00000000000000from vedo import * m1 = Mesh(dataurl+'bunny.obj').c('g').normalize().rotate_x(+90) m2 = Mesh(dataurl+'teddy.vtk').c('v').normalize().rotate_z(-90).pos(3,0,0) plt = show(m1, m2, axes=1) plt.export('scene.npz') printc("Window exported to numpy file: scene.npz", c='g') plt.close() ################################################ plt = import_window('scene.npz') plt += Text2D("Imported scene", c='k', bg='b') plt.show().close() printc("\nTry also:\n> vedo scene.npz", c='g') vedo-2025.5.3/examples/other/export_x3d.py000066400000000000000000000012201474667405700203340ustar00rootroot00000000000000"""Embed a 3D scene in a webpage with x3d""" from vedo import dataurl, Plotter, Volume, Text3D plt = Plotter(size=(800,600), bg='GhostWhite') embryo = Volume(dataurl+'embryo.tif').isosurface().decimate(0.5) coords = embryo.coordinates embryo.cmap('PRGn', coords[:,1]) # add dummy colors along y txt = Text3D(__doc__, font='Bongas', s=350, c='red2', depth=0.05) txt.pos(2500, 300, 500) plt.show(embryo, txt, txt.box(padding=250), axes=1, viewup='z', zoom=1.2) # This exports the scene and generates 2 files: # embryo.x3d and an example embryo.html to inspect in the browser plt.export('embryo.x3d', binary=False) print("Type: \n firefox embryo.html") vedo-2025.5.3/examples/other/fast_simpl.py000066400000000000000000000026511474667405700204070ustar00rootroot00000000000000"""Use fast-simplification to decimate a mesh and transfer data defined on the original vertices to the decimated ones.""" # https://github.com/pyvista/fast-simplification # pip install fast-simplification # Credits: Louis Pujol, see #992 import numpy as np import fast_simplification as fs import vedo # Load a mesh and define a signal on vertices mesh = vedo.Sphere() points = mesh.vertices faces = mesh.cells signal = points[:, 0] mesh.pointdata["signal"] = signal mesh.cmap("rainbow").lw(1) # Decimate the mesh and compute the mapping between the original vertices # and the decimated ones with fast-simplification points_decim, faces_decim, collapses = fs.simplify( points, faces, target_reduction=0.9, return_collapses=True ) points_decim, faces_decim, index_mapping = fs.replay_simplification( points, faces, collapses ) # Compute the average of the signal on the decimated vertices (scatter operation) unique_values, counts = np.unique(index_mapping, return_counts=True) a = np.zeros(len(unique_values), dtype=signal.dtype) np.add.at(a, index_mapping, signal) # scatter addition a /= counts # divide by the counts of each vertex index to get the average # Create a new mesh with the decimated vertices and the averaged signal decimated_mesh = vedo.Mesh([points_decim, faces_decim]) decimated_mesh.pointdata["signal"] = a decimated_mesh.cmap("rainbow").lw(1) vedo.show([[mesh, __doc__], decimated_mesh], N=2, axes=1).close() vedo-2025.5.3/examples/other/flag_labels1.py000066400000000000000000000016001474667405700205530ustar00rootroot00000000000000"""Hover mouse onto an object to pop a flag-style label""" from vedo import * b = Mesh(dataurl + "bunny.obj") b.color("purple5").legend("Bugs the bunny") c = Cube(side=0.1).y(-0.02).compute_normals() c.alpha(0.8).lighting("off").lw(1).legend("The Cube box") cap = c.caption( "2d caption for a cube\nwith face indices", point=[0.044, 0.03, -0.04], size=(0.3, 0.06), font="VictorMono", alpha=1, ) # create a new object made of polygonal text labels to indicate the cell numbers flabs = c.labels("id", on="cells", font="Theemim", scale=0.02, c="k") vlabs = c.clone().clean().labels2d(font="ComicMono", scale=3, bc="orange7") # create a custom entry to the legend lbox = LegendBox([b, c], font="Bongas", width=0.25, bg='blue6') with Plotter(axes=11, bg2="linen") as plt: plt.add(b, c, cap, flabs, vlabs, lbox, __doc__) plt.add_hint(b, "My fave bunny") plt.show() vedo-2025.5.3/examples/other/flag_labels2.py000066400000000000000000000006441474667405700205630ustar00rootroot00000000000000"""A flag-post style marker""" from vedo import ParametricShape, precision, color_map, show s = ParametricShape("RandomHills").cmap("coolwarm") pts = s.clone().decimate(n=10).points fss = [] for p in pts: col = color_map(p[2], name="coolwarm", vmin=0, vmax=0.7) ht = precision(p[2], 3) fs = s.flagpost(f"Heigth:\nz={ht}m", p, c=col) fss.append(fs) show(s, *fss, __doc__, bg="bb", axes=1, viewup="z") vedo-2025.5.3/examples/other/icon.py000066400000000000000000000005101474667405700171660ustar00rootroot00000000000000"""Make a icon to indicate orientation and place it in one of the 4 corners within the same renderer""" from vedo import * plt = Plotter(axes=5) plt += Text3D(__doc__).bc('tomato') elg = Image(dataurl+"images/embl_logo.jpg") plt.add_icon(elg, pos=2, size=0.06) plt.add_icon(VedoLogo(), pos=1, size=0.06) plt.show().close() vedo-2025.5.3/examples/other/iminuit1.py000066400000000000000000000015111474667405700177770ustar00rootroot00000000000000"""Use iminuit to find the minimum of a 3D scalar field""" from vedo import show, Point, Line, printc from iminuit import Minuit # pip install iminuit # https://github.com/scikit-hep/iminuit import numpy as np def fcn(x, y, z): f = (x - 4) ** 4 + (y - 3) ** 4 + (z - 2) ** 2 if not vals or f < vals[-1]: path.append([x,y,z]) vals.append(f) return f paths = [] for x,y,z in np.random.rand(200, 3)*3: path, vals = [], [] m = Minuit(fcn, x=x, y=y, z=z) m.errordef = m.LEAST_SQUARES # m.simplex() # run simplex optimiser m.migrad() # run migrad optimiser line = Line(path).cmap('jet_r', vals).lw(2).alpha(0.25) paths.append(line) printc('Last optimization output:', c='green7', invert=1) printc(m, c='green7', italic=1) show(paths, Point([4,3,2]), __doc__, axes=1).close() vedo-2025.5.3/examples/other/iminuit2.py000066400000000000000000000026121474667405700200030ustar00rootroot00000000000000"""Fit a 3D polynomial surface to a set of noisy data using iminuit. You can rotate the scene by dragging with the left mouse button.""" from iminuit import Minuit from vedo import Points, Arrows2D, show, dataurl, printc, settings def func(x, y, *pars): # the actual surface model to fit a, b, c, u, v = pars z = c - ((x + u) * a)**2 - (y + v) * b return z def cost_fcn(pars): cost = 0.0 for p in pts: x, y, z = p f = func(x, y, *pars) cost += (f - z)**2 # compute the chi-square return cost / pts.size # Load a set of points from a file and fit a surface to them points = Points(dataurl + "data_points.vtk").ps(6).color("k3") pts = points.coordinates # Run the fit (minimize the cost_fcn) and print the result m = Minuit(cost_fcn, [0.01, 0.05, 200, 550, 400]) # init values m.errordef = m.LEAST_SQUARES m.migrad() # migrad is a sophisticated gradient descent algorithm printc(m, c="green7", italic=True) # Create a set of points that lie on the fitted surface fit_pts = [] for x, y, _ in pts: fit_pts.append([x, y, func(x, y, *m.values)]) fit_pts = Points(fit_pts).ps(9).color("r5") lines = Arrows2D(pts, fit_pts, rotation=90).color("k5", 0.25) # Show the result of the fit with the original points in grey settings.use_parallel_projection = True show(points, fit_pts, lines, __doc__, axes=1, size=(1250, 750), bg2="lavender", zoom=1.4).close() vedo-2025.5.3/examples/other/inset.py000066400000000000000000000021471474667405700173700ustar00rootroot00000000000000"""Render meshes into inset windows (which can be dragged)""" from vedo import * plt = Plotter(bg2='bisque', size=(1000,800), interactive=False) e = Volume(dataurl+"embryo.tif").isosurface() e.normalize().shift(-2,-1.5,-2).c("gold") plt.show(e, __doc__, viewup='z') # make clone copies of the embryo surface and cut them: e1 = e.clone().cut_with_plane(normal=[0,1,0]).c("green4") e2 = e.clone().cut_with_plane(normal=[1,0,0]).c("red5") # add 2 draggable inset windows: plt.add_inset(e1, pos=(0.9,0.8)) plt.add_inset(e2, pos=(0.9,0.5)) # customised axes can also be inserted: ax = Axes( xrange=(0,1), yrange=(0,1), zrange=(0,1), xtitle='front', ytitle='left', ztitle='head', yzgrid=False, xtitle_size=0.15, ytitle_size=0.15, ztitle_size=0.15, xlabel_size=0, ylabel_size=0, zlabel_size=0, tip_size=0.05, axes_linewidth=2, xline_color='dr', yline_color='dg', zline_color='db', xtitle_offset=0.05, ytitle_offset=0.05, ztitle_offset=0.05, ) ex = e.clone().scale(0.25).pos(0,0.1,0.1).alpha(0.1).lighting('off') plt.add_inset(ax, ex, pos=(0.1,0.1), size=0.15, draggable=False) plt.interactive().close() vedo-2025.5.3/examples/other/madcad1.py000066400000000000000000000042401474667405700175340ustar00rootroot00000000000000# Example of usage of the madcad library # See https://pymadcad.readthedocs.io/en/latest/index.html import vedo from madcad import * ########################################################################## points = [O, X, X + Z, 2 * X + Z, 2 * (X + Z), X + 2 * Z, X + 5 * Z, 5 * Z] section = Wire(points).segmented().flip() rev = revolution(2 * pi, (O, Z), section) rev.mergeclose() vedo.show("Revolution of a wire", rev, axes=7).close() ########################################################################## # m = screw(10, 20) # m["part"].option(color=vec3(70, 130, 180) / 255) # RGB # vedo.show("A blue screw", m, axes=1).close() ########################################################################## # Obtain two different shapes that has noting to to with each other m1 = brick(width=vec3(2)) m2 = m1.transform(vec3(0.5, 0.3, 0.4)).transform(quat(0.7 * vec3(1, 1, 0))) # Remove the volume of the second to the first diff = difference(m1, m2) vedo.show("Boolean difference", diff, axes=14).close() ########################################################################## cube = brick(width=vec3(2)) bevel( cube, [(0, 1), (1, 2), (2, 3), (0, 3), (1, 5), (0, 4)], # Edges to smooth ("width", 0.3), # Cutting description, known as 'cutter' ) vedo.show("A bevel cube", cube, axes=1).close() ########################################################################## square_profile = square((O, Z), 5).flip() primitives = [ ArcCentered(( 5 * X, Y), O, 10 * X), ArcCentered((15 * X, -Y), 10 * X, 20 * X), ] # Generate a path path = web(primitives) path.mergeclose() m = tube(square_profile, path) vmesh = vedo.utils.madcad2vedo(m) # <-- convert to vedo.Mesh print(vmesh) scalar = vmesh.vertices[:, 0] vmesh.cmap("rainbow", scalar, on="points").add_scalarbar(title="x-value") vedo.show("Generating a path", vmesh, axes=7).close() ########################################################################## c1 = Circle((vec3(0), Z), 1) c2 = Circle((2 * X, X), 0.5) c3 = (Circle((2 * Y, Y), 0.5), "tangent", 2) e1 = extrusion(2 * Z, web(c1)) m = junction(e1, c2, c3, tangents="normal") vm = vedo.utils.madcad2vedo(m) vedo.show(vm, e1, axes=1, viewup="z").close() vedo-2025.5.3/examples/other/madcad2.py000066400000000000000000000012751474667405700175420ustar00rootroot00000000000000"""Convert a vedo mesh to a madcad mesh and vice versa""" # See https://pymadcad.readthedocs.io/en/latest/index.html import vedo import madcad mesh = vedo.Mesh(vedo.dataurl+"bunny.obj") mesh.compute_normals() ############################################################ madcad_mesh = vedo.utils.vedo2madcad(mesh) madcad.thicken(madcad_mesh, thickness=0.1) if vedo.settings.dry_run_mode == 0: madcad.show([madcad_mesh]) ############################################################# vedo_mesh = vedo.utils.madcad2vedo(madcad_mesh) verts = vedo_mesh.vertices norms = vedo_mesh.pointdata["Normals"] arrs = vedo.Arrows(verts, verts + 0.005 * norms) vedo.show(mesh, arrs, __doc__, axes=1).close() vedo-2025.5.3/examples/other/magic-class1.py000066400000000000000000000021631474667405700205100ustar00rootroot00000000000000"""Use magicclass to plot\nrandom points and a histogram.""" import numpy as np import vedo try: from magicclass import magicclass, field from magicclass.ext.vtk import VedoCanvas except ImportError: print("Please install magicclass with: pip install magic-class") @magicclass class ViewerUI: canvas = field(VedoCanvas) def plot_random_points(self): """Plot random data.""" # create a points object and a set of axes coords = np.random.randn(1000, 3) data = np.cos(coords[:,1]) points = vedo.Points(coords) points.cmap("viridis", data).add_scalarbar3d() axes = vedo.Axes(points, c="white") # create a histogram of data histo = vedo.pyplot.histogram( data, c="viridis", title=" ", xtitle="", ytitle="", ) histo = histo.clone2d("bottom-right", size=0.25) ui.canvas.plotter.remove("Axes", "Points", "Histogram1D") ui.canvas.plotter.add(points, axes, histo) ui.canvas.plotter.reset_camera().render() if __name__ == "__main__": ui = ViewerUI() ui.canvas.plotter.add(__doc__) ui.show() vedo-2025.5.3/examples/other/make_video.py000066400000000000000000000032411474667405700203450ustar00rootroot00000000000000"""Make a video file with or without graphic window""" from vedo import dataurl, Plotter, Mesh, Axes, Video msh = Mesh(dataurl+"data/teapot.vtk").normalize()#.rotate_x(-90) msh.shift(-msh.center_of_mass()) plt = Plotter(bg="beige", bg2="lb", offscreen=False) plt += [msh, Axes(msh), __doc__] ############################################################## # Open a video file and force it to last 3 seconds in total video = Video("vedo_video.mp4", duration=3) # or gif ############################################################## # Any rendering loop goes here, e.g.: # for i in range(80): # plt.show(elevation=1, azimuth=2) # render the scene # video.add_frame() # add individual frame ############################################################## # OR use the automatic video shooting function: # Options are: elevation=(0,80), # range of elevation values # azimuth=(0,359), # zoom=None, # cameras=None ############################################################## # OR set a sequence of camera positions, e.g.: cam1 = dict( position=(5.805, 17.34, -0.8418), focal_point=(0.133, 0.506, -0.132), viewup=(-0.3099, 0.1871, -0.9322), clipping_range=(12.35, 21.13), ) cam2 = dict( position=(-1.167, 3.356, -18.66), focal_point=(0.133, 0.506, -0.132), clipping_range=(8.820, 25.58), ) cam3 = dict( position=(-4.119, 0.9889, -0.8867), focal_point=(0.948, 0.048, -0.592), viewup=(-0.01864, 0.9995, -0.02682), clipping_range=(0.07978, 17.04), ) video.action(cameras=[cam1, cam2, cam3, cam1]) video.close() # merge all the recorded frames and write to disk plt.interactive().close() vedo-2025.5.3/examples/other/meshio_read.py000066400000000000000000000006161474667405700205240ustar00rootroot00000000000000"""Read and show meshio objects""" import meshio from vedo import download, show, Mesh fpath = download('https://vedo.embl.es/examples/data/shuttle.obj') mesh = meshio.read(fpath) # vedo understands meshio format for polygonal data: # show(mesh, __doc__, axes=7) # explicitly convert it to a vedo.Mesh object: m = Mesh(mesh).linewidth(1).color('tomato').print() show(m, __doc__, axes=7).close() vedo-2025.5.3/examples/other/meshlib1.py000066400000000000000000000076531474667405700177610ustar00rootroot00000000000000import numpy as np import vedo from meshlib import mrmeshpy as mm from meshlib import mrmeshnumpy as mn ################################################################################ # Example of mesh relaxation path = vedo.download(vedo.dataurl + "mouse_brain.stl") mesh = mm.loadMesh(path) relax_params = mm.MeshRelaxParams() relax_params.iterations = 5 mm.relax(mesh, relax_params) props = mm.SubdivideSettings() props.maxDeviationAfterFlip = 0.5 mm.subdivideMesh(mesh, props) plus_z = mm.Vector3f() plus_z.z = 1.0 rotation_xf = mm.AffineXf3f.linear(mm.Matrix3f.rotation(plus_z, 3.1415 * 0.5)) mesh.transform(rotation_xf) vedo.Mesh(mesh).show().close() ################################################################################ # Simple triangulation u, v = np.mgrid[0 : 2 * np.pi : 100j, 0 : np.pi : 100j] x = np.cos(u) * np.sin(v) y = np.sin(u) * np.sin(v) z = np.cos(v) # Prepare for MeshLib PointCloud verts = np.stack((x.flatten(), y.flatten(), z.flatten()), axis=-1).reshape(-1, 3) # verts = vedo.Mesh(vedo.dataurl+"bunny.obj").subdivide(2).vertices # Create MeshLib PointCloud from np ndarray pc = mn.pointCloudFromPoints(verts) # Remove duplicate points pc.validPoints = mm.pointUniformSampling(pc, 0.1) pc.invalidateCaches() # Triangulate it triangulated_pc = mm.triangulatePointCloud(pc) # Fix possible issues triangulated_pc = mm.offsetMesh(triangulated_pc, 0.0) vedo.show(vedo.Points(pc), vedo.Mesh(triangulated_pc, alpha=0.4)).close() ################################################################################ # Example of Boolean operation # create first sphere with radius of 1 unit sphere1 = mm.makeUVSphere(1.0, 64, 64) # create second sphere by cloning the first sphere and moving it in X direction sphere2 = mm.copyMesh(sphere1) xf = mm.AffineXf3f.translation(mm.Vector3f(0.7, 0.0, 0.0)) sphere2.transform(xf) # perform boolean operation result = mm.boolean(sphere1, sphere2, mm.BooleanOperation.Intersection) if not result.valid(): print(result.errorString) vedo.show(vedo.Mesh(result.mesh, alpha=0.4)).close() ################################################################################ # Example of mesh offset mesh = mm.loadMesh(path) # Setup parameters params = mm.OffsetParameters() # offset grid precision (algorithm is voxel based) params.voxelSize = mesh.computeBoundingBox().diagonal() * 5e-3 if mm.findRightBoundary(mesh.topology).empty(): # use if you have holes in mesh params.signDetectionMode = mm.SignDetectionMode.HoleWindingRule # Make offset mesh offset = mesh.computeBoundingBox().diagonal() * 0.025 result_mesh = mm.offsetMesh(mesh, offset, params) vedo.show(vedo.Mesh(result_mesh).lw(1)).close() ################################################################################ # Example of fill holes path = vedo.download(vedo.dataurl + "bunny.obj") mesh = mm.loadMesh(path) # Find single edge for each hole in mesh hole_edges = mesh.topology.findHoleRepresentiveEdges() for e in hole_edges: # Setup filling parameters params = mm.FillHoleParams() params.metric = mm.getUniversalMetric(mesh) # Fill hole represented by `e` mm.fillHole(mesh, e, params) vedo.show(vedo.Mesh(mesh)).close() ################################################################################ # Example of stitch holes mesh_a = vedo.Mesh(vedo.dataurl + "bunny.obj").cut_with_plane( origin=(+0.01, 0, 0), normal=(+1, 0, 0) ) mesh_b = vedo.Mesh(vedo.dataurl + "bunny.obj").cut_with_plane( origin=(-0.01, 0, 0), normal=(-1, 0, 0) ) mesh_a.write("meshAwithHole.stl") mesh_b.write("meshBwithHole.stl") mesh_a = mm.loadMesh("meshAwithHole.stl") mesh_b = mm.loadMesh("meshBwithHole.stl") # Unite meshes mesh = mm.mergeMeshes([mesh_a, mesh_b]) # Find holes edges = mesh.topology.findHoleRepresentiveEdges() # Connect two holes params = mm.StitchHolesParams() params.metric = mm.getUniversalMetric(mesh) mm.buildCylinderBetweenTwoHoles(mesh, edges[0], edges[1], params) vedo.show(vedo.Mesh(mesh).lw(1)).close() vedo-2025.5.3/examples/other/morphomatics_tube.py000066400000000000000000000024261474667405700217720ustar00rootroot00000000000000"""Morphomatics example""" try: from morphomatics.geom import Surface from morphomatics.stats import StatisticalShapeModel from morphomatics.manifold import FundamentalCoords except ModuleNotFoundError: print("Install with:") print("pip install git+https://github.com/morphomatics/morphomatics.git#egg=morphomatics") exit(0) import numpy as np import vedo ln1 = [[1, 1, x / 2] for x in np.arange(0,15, 0.15)] ln2 = [[np.sin(x), np.cos(x), x / 2] for x in np.arange(0,15, 0.15)] rads= [0.4*(np.cos(6*ir/len(ln2)))**2+0.1 for ir in range(len(ln2))] vmesh1 = vedo.Tube(ln1, r=0.08).triangulate().clean() vmesh2 = vedo.Tube(ln2, r=rads).triangulate().clean() verts1 = vmesh1.vertices verts2 = vmesh2.vertices faces = np.array(vmesh1.cells) # construct model SSM = StatisticalShapeModel(lambda ref: FundamentalCoords(ref)) surfaces = [Surface(v, faces) for v in [verts1, verts2]] SSM.construct(surfaces) # sample trajectory along the main mode of variation shapes = [] std = np.sqrt(SSM.variances[0]) for t in np.linspace(-1.0, 1.0, 20): e = SSM.space.exp(SSM.mean_coords, t * std * SSM.modes[0]) v = SSM.space.from_coords(e) shapes.append(vedo.Mesh([v, faces])) plt = vedo.applications.Browser(shapes, slider_title="shape", bg2='lb') plt.show(viewup='z').close() vedo-2025.5.3/examples/other/napari1.py000066400000000000000000000013521474667405700175760ustar00rootroot00000000000000import numpy as np import napari import vedo print("\nSEE ALSO https://github.com/jo-mueller/napari-vedo-bridge") # Load the surface, triangulate just in case, and compute vertex normals surf = vedo.Mesh(vedo.dataurl+"beethoven.ply").triangulate().compute_normals() surf.rotate_x(180).rotate_y(60) vertices = surf.vertices faces = np.array(surf.cells) normals = surf.vertex_normals # generate vertex values by projecting normals on a "lighting vector" values = np.dot(normals, [-1, 1, 1]) # create an empty viewer viewer = napari.Viewer() # add the surface viewer.add_surface((vertices, faces, values), opacity=0.8) viewer.add_points(vertices, size=0.05, face_color='pink') # turn on 3D rendering viewer.dims.ndisplay = 3 napari.run()vedo-2025.5.3/examples/other/nelder-mead.py000066400000000000000000000015621474667405700204230ustar00rootroot00000000000000"""Nelder-Mead minimization algorithm for the 4D function: F = (x/4-1)**2 + (y+2)**2 + z**2 + (w-6)**2 + 3""" from vedo import Minimizer, Line, show from vedo.pyplot import plot def func(pars): x, y, z, w = pars # unpack parameters for convenience F = (x/4-1)**2 + (y+2)**2 + z**2 + (w-6)**2 + 3 return F mini = Minimizer(func) mini.set_parameter("x", 4.0) # set initial values mini.set_parameter("y", -3.0) mini.set_parameter("z", 1.0) mini.set_parameter("w", 1.0) res = mini.minimize() # run the minimization mini.compute_hessian() # compute the Hessian to estimate the errors print(mini) # Draw the path of the minimization path = res["parameters_path"] vals = res["function_path"] line = Line(path[:,:3], lw=5).cmap("jet", path[:,3]).add_scalarbar() plo = plot(vals, xtitle="iteration", ytitle="function eval", lw=3) show(line, plo.clone2d(), __doc__, axes=1) vedo-2025.5.3/examples/other/nevergrad_opt.py000066400000000000000000000016161474667405700211050ustar00rootroot00000000000000"""Using nevergrad package to find the minimum of the 2-variable function: z = (x-1)**2 + (y-1)**2 + 9*sin(y-1)**2 """ from vedo import * from vedo.pyplot import plot import nevergrad as ng # install with: pip install nevergrad def f(x,y): z = (x-1)**2 + (y-1)**2 + 9*sin(y-1)**2 + 1 return z/12 def func(v): return f(v[0],v[1]) def callbk(opti, v, value): global minv if value < minv: pts.append([v.value[0], v.value[1], value]) minv = value optimizer = ng.optimizers.OnePlusOne(parametrization=2, budget=100) pts, minv = [], 1e30 optimizer.register_callback("tell", callbk) # define a constraint on first variable of x: #optimizer.parametrization.register_cheap_constraint(lambda v: v[0]>-3) res = optimizer.minimize(func) # best value printc('Minimum at:', res.value) ln = Line(pts).lw(3).c("red5") fu = plot(f, xlim=[-3,4], ylim=[-3,4]) show(fu, ln, __doc__) vedo-2025.5.3/examples/other/printc.py000066400000000000000000000022461474667405700175450ustar00rootroot00000000000000# Available modifiers: # c (foreground color), bc (background color) # bold, blink, underLine, dim, invert, box from vedo import printc printc(":world: 1- Change the world by being yourself - Amy Poehler", c=1) printc(":smile: 2- Never regret anything that made you smile - Mark Twain", c="r", bold=0) printc(":construction: 3- Every moment is a fresh beginning - T.S Eliot", c="m", underline=1) printc(":thumbup: 4- Die with memories, not dreams - Unknown", blink=1, bold=0) printc(":pin: 5- When words fail, music speaks - Shakespeare") printc(":rocket: 6- Everything you can imagine is real - Pablo Picasso", c=3) printc(":idea: 7- Simplicity is the ultimate sophistication - Leonardo da Vinci", c=4) printc(":rainbow: 8- Whatever you do, do it well - Walt Disney", c=3, bc=1) printc(":target: 9- What we think, we become - Buddha", c=6, invert=1) printc(":sparks:10- All limitations are self-imposed - Oliver Wendell Holmes", c=7, dim=1) printc(":checked:11- If you tell the truth you don't have to remember anything - Mark Twain", underline=True, invert=True, c="indigo9", ) from vedo.colors import emoji for k in emoji.keys(): print(emoji[k], "\t", k) vedo-2025.5.3/examples/other/pygeodesic1.py000066400000000000000000000010171474667405700204550ustar00rootroot00000000000000"""pygeodesic library to compute geodesic distances""" from pygeodesic import geodesic # pip install pygeodesic import vedo m = vedo.Mesh(vedo.dataurl+"bunny.obj").c("green9") geoalg = geodesic.PyGeodesicAlgorithmExact(m.vertices, m.cells) # Use source and target point ids distance, path = geoalg.geodesicDistance(639, 834) distances, _ = geoalg.geodesicDistances([639, 1301]) # any of the two line = vedo.Line(path).c("k").lw(4) m.cmap("Set2", distances, name="GeodesicDistance") vedo.show(m, line, __doc__, axes=1) vedo-2025.5.3/examples/other/pygmsh_cut.py000066400000000000000000000020221474667405700204200ustar00rootroot00000000000000# Example usage with pygmsh package: # https://github.com/nschloe/pygmsh import pygmsh # pip install pygmsh from vedo import TetMesh, SphereCutter, Plotter with pygmsh.occ.Geometry() as geom: geom.characteristic_length_min = 0.1 geom.characteristic_length_max = 0.1 rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0) disk1 = geom.add_disk([-1.2, 0.0, 0.0], 0.5) disk2 = geom.add_disk([+1.2, 0.0, 0.0], 0.5) disk3 = geom.add_disk([0.0, -0.9, 0.0], 0.5) disk4 = geom.add_disk([0.0, +0.9, 0.0], 0.5) flat = geom.boolean_difference( geom.boolean_union([rectangle, disk1, disk2]), geom.boolean_union([disk3, disk4]), ) geom.extrude(flat, [0, 0, 0.3]) msh = geom.generate_mesh() lines, triangles, tetras, vertices = msh.cells vmsh = TetMesh([msh.points, tetras.data]).tomesh(fill=True) plt = Plotter(axes=1, interactive=False) plt.show( vmsh, "Drag the sphere,\nright-click&drag to zoom", ) cutter = SphereCutter(vmsh) plt.add(cutter) plt.interactive() plt.close() vedo-2025.5.3/examples/other/pymeshlab1.py000066400000000000000000000016761474667405700203210ustar00rootroot00000000000000import vedo import pymeshlab # tested on pymeshlab-2022.2.post2 filepath = vedo.download(vedo.dataurl+'bunny.obj') ms = pymeshlab.MeshSet() ms.load_new_mesh(filepath) pt = [0.0234, 0.0484, 0.0400] ms.compute_scalar_by_geodesic_distance_from_given_point_per_vertex(startpoint=pt) # vedo.show(ms, axes=True) # this already works! mlab_mesh = ms.current_mesh() vedo_mesh = vedo.Mesh(mlab_mesh).cmap('Paired').add_scalarbar("distance") print("We can also convert it back to pymeshlab.MeshSet:", type(vedo.utils.vedo2meshlab(vedo_mesh)) ) vedo.show( __doc__, vedo_mesh, vedo.Point(pt), axes=True, bg='green9', bg2='blue9', title="vedo + pymeshlab", ) ################################################################################ # Full list of filters, https://pymeshlab.readthedocs.io/en/latest/filter_list.html # pymeshlab.print_filter_list() # pymeshlab.print_filter_parameter_list('generate_surface_reconstruction_screened_poisson') vedo-2025.5.3/examples/other/pymeshlab2.py000066400000000000000000000011371474667405700203120ustar00rootroot00000000000000"""pymeshlab interoperability example: Surface reconstruction by ball pivoting""" import vedo import pymeshlab # tested on pymeshlab-2022.2.post2 pts = vedo.Mesh(vedo.dataurl+'cow.vtk').points # numpy array of vertices m = pymeshlab.Mesh(vertex_matrix=pts) ms = pymeshlab.MeshSet() ms.add_mesh(m) p = pymeshlab.Percentage(2) ms.generate_surface_reconstruction_ball_pivoting(ballradius=p) mlab_mesh = ms.current_mesh() reco_mesh = vedo.Mesh(mlab_mesh).compute_normals().flat().backcolor('t') vedo.show( __doc__, vedo.Points(pts), reco_mesh, axes=True, bg2='blue9', title="vedo + pymeshlab", ) vedo-2025.5.3/examples/other/qt_cutter.py000066400000000000000000000033171474667405700202600ustar00rootroot00000000000000import sys # from PySide2 import QtWidgets, QtCore from PyQt5 import Qt from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Mesh, BoxCutter, dataurl class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create renderer and add the vedo objects and callbacks self.plt = Plotter(qt_widget=self.vtkWidget) mesh = Mesh(dataurl+'cow.vtk') self.cutter = BoxCutter(mesh) self.plt += [mesh, self.cutter] self.plt.show() box_cutter_button_on = Qt.QPushButton("Start the box cutter") box_cutter_button_on.clicked.connect(self.ctool_start) box_cutter_button_off = Qt.QPushButton("Stop the box cutter") box_cutter_button_off.clicked.connect(self.ctool_stop) # Set-up the rest of the Qt window self.layout.addWidget(self.vtkWidget) self.layout.addWidget(box_cutter_button_on) self.layout.addWidget(box_cutter_button_off) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.show() def ctool_start(self): self.cutter.on() def ctool_stop(self): self.cutter.off() def onClose(self): #Disable the interactor before closing to prevent it #from trying to act on already deleted items self.vtkWidget.close() if __name__ == "__main__": app = Qt.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) # <-- connect the onClose event app.exec_() vedo-2025.5.3/examples/other/qt_tabs.py000066400000000000000000000076401474667405700177060ustar00rootroot00000000000000import sys from PyQt5 import QtCore, QtWidgets from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Mesh, dataurl, Plotter from vedo.pyplot import np, plot try: _encoding = QtWidgets.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtWidgets.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtWidgets.QApplication.translate(context, text, disambig) class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tab1 = QtWidgets.QWidget() self.tab1.setObjectName("tab1") self.gridLayout1 = QtWidgets.QGridLayout(self.tab1) self.vtkLayout1 = QtWidgets.QVBoxLayout() self.vtkLayout1.setObjectName("vtkLayout1") self.gridLayout1.addLayout(self.vtkLayout1, 0, 0, 1, 1) self.tab2 = QtWidgets.QWidget() self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) self.tabWidget.addTab(self.tab1, "tab1") self.tabWidget.addTab(self.tab2, "tab2") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.addWidget(self.tabWidget) self.gridLayout2 = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout2.addLayout(self.verticalLayout, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 31)) MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) MainWindow.setStatusBar(self.statusbar) MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) self.tabWidget.setTabText( self.tabWidget.indexOf(self.tab1), _translate("MainWindow", "Tab 1", None) ) self.tabWidget.setTabText( self.tabWidget.indexOf(self.tab2), _translate("MainWindow", "Tab 2", None) ) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, parent=None): QtWidgets.QMainWindow.__init__(self, parent) self.setupUi(self) self.vtkWidget1 = QVTKRenderWindowInteractor(self) self.vtkLayout1.addWidget(self.vtkWidget1) self.plt1 = Plotter(qt_widget=self.vtkWidget1, axes=1) self.id2 = self.plt1.add_callback("key press", self.onKeypress) self.plt1 += Mesh(dataurl+'shark.ply').c('cyan') self.plt1.show() self.vtkWidget2 = QVTKRenderWindowInteractor(self) self.verticalLayout.addWidget(self.vtkWidget2) self.plt2 = Plotter(qt_widget=self.vtkWidget2) ##################################################### # add a plot using a formatted Figure x = np.random.randn(100) + 10 y = np.random.randn(100) * 20 + 20 fig = plot( x, y, lw=0, # do not join points with lines xtitle="variable x", ytitle="variable y", marker="*", # marker style mc="dr", # marker color aspect=16/9, # aspect ratio ) self.plt2 += fig ##################################################### show self.plt2.show(zoom=1.8, mode='image') def onClose(self): self.vtkWidget1.close() def onKeypress(self, evt): print("You have pressed key:", evt.keypress) if evt.keypress=='q': sys.exit(0) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) window.show() sys.exit(app.exec_()) vedo-2025.5.3/examples/other/qt_window1.py000066400000000000000000000037011474667405700203370ustar00rootroot00000000000000import sys from PyQt5 import Qt from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Cone, printc class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create renderer and add the vedo objects and callbacks self.plt = Plotter(qt_widget=self.vtkWidget) self.id1 = self.plt.add_callback("mouse click", self.onMouseClick) self.id2 = self.plt.add_callback("key press", self.onKeypress) self.plt += Cone().rotate_x(20) self.plt.show() # <--- show the vedo rendering # Set-up the rest of the Qt window button = Qt.QPushButton("My Button makes the cone red") button.setToolTip('This is an example button') button.clicked.connect(self.onClick) self.layout.addWidget(self.vtkWidget) self.layout.addWidget(button) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.show() # <--- show the Qt Window def onMouseClick(self, evt): printc("You have clicked your mouse button. Event info:\n", evt, c='y') def onKeypress(self, evt): printc("You have pressed key:", evt.keypress, c='b') @Qt.pyqtSlot() def onClick(self): printc("..calling onClick") self.plt.objects[0].color('red').rotate_z(40) self.plt.interactor.Render() def onClose(self): #Disable the interactor before closing to prevent it #from trying to act on already deleted items printc("..calling onClose") self.vtkWidget.close() if __name__ == "__main__": app = Qt.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) # <-- connect the onClose event app.exec_() vedo-2025.5.3/examples/other/qt_window2.py000066400000000000000000000034271474667405700203450ustar00rootroot00000000000000import sys from PyQt5 import Qt from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Image, Text2D, printc class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create vedo renderer and add objects and callbacks self.plt = Plotter(qt_widget=self.vtkWidget) self.cbid = self.plt.add_callback("key press", self.onKeypress) self.imgActor = Image("https://icatcare.org/app/uploads/2018/07/Helping-your-new-cat-or-kitten-settle-in-1.png") self.text2d = Text2D("Use slider to change contrast") self.slider = Qt.QSlider(1) self.slider.valueChanged.connect(self.onSlider) self.layout.addWidget(self.vtkWidget) self.layout.addWidget(self.slider) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.plt.show(self.imgActor, self.text2d, mode='image') # build the vedo rendering self.show() # show the Qt Window def onSlider(self, value): self.imgActor.window(value*10) # change image contrast self.text2d.text(f"window level is now: {value*10}") self.plt.render() def onKeypress(self, evt): printc("You have pressed key:", evt.keypress, c='b') if evt.keypress=='q': self.plt.close() self.vtkWidget.close() exit() def onClose(self): self.vtkWidget.close() if __name__ == "__main__": app = Qt.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) app.exec_() vedo-2025.5.3/examples/other/qt_window3.py000066400000000000000000000032621474667405700203430ustar00rootroot00000000000000import sys from PyQt5 import Qt from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Cone class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.widget = QVTKRenderWindowInteractor(self.frame) # Create renderer and add the vedo objects and callbacks self.plt = Plotter(N=2, axes=1, qt_widget=self.widget) self.id1 = self.plt.add_callback("mouse click", self.onMouseClick) self.id2 = self.plt.add_callback("key press", self.onKeypress) cone1 = Cone().rotate_x(20) cone2 = Cone().rotate_x(40).c("blue5") self.plt.at(0).show(cone1) self.plt.at(1).show(cone2) # Set up the rest of the Qt window button = Qt.QPushButton("My Button makes the cone red") button.setToolTip("This is an example button") button.clicked.connect(self.onClick) self.layout.addWidget(self.widget) self.layout.addWidget(button) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.show() # NB: qt, not a Plotter method def onMouseClick(self, evt): print("mouse clicked") def onKeypress(self, evt): print("key pressed:", evt.keypress) @Qt.pyqtSlot() def onClick(self): self.plt.objects[0].color("red5").rotate_z(40) self.plt.render() def onClose(self): self.widget.close() if __name__ == "__main__": app = Qt.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) app.exec_() vedo-2025.5.3/examples/other/remesh_ACVD.py000066400000000000000000000017541474667405700203310ustar00rootroot00000000000000"""Remesh a surface mesh using the ACVD algorithm.""" # Needs PyACVD: pip install pyacvd # See: https://github.com/akaszynski/pyacvd from vedo import Sphere, Mesh, show from vedo.pyplot import histogram from pyvista import wrap from pyacvd import Clustering msh1 = Sphere(res=50).cut_with_plane() msh1.compute_quality().cmap('RdYlGn', on='cells', vmin=0, vmax=70).linewidth(1) clus = Clustering(wrap(msh1.dataset)) clus.cluster(1000, maxiter=100, iso_try=10, debug=False) pvremsh1 = clus.create_mesh() msh2 = Mesh(pvremsh1).shift([2,0,0]) msh2.compute_quality().cmap('RdYlGn', on='cells', vmin=0, vmax=70).linewidth(1) his1 = histogram(msh1.celldata["Quality"], xlim=(0,70), aspect=2, c='RdYlGn', title='Original Quality') his2 = histogram(msh2.celldata["Quality"], xlim=(0,70), aspect=2, c='RdYlGn', title='Remeshed Quality') his1 = his1.clone2d('bottom-left', 0.75) his2 = his2.clone2d('bottom-right', 0.75) show(msh1, msh2, his1, his2, __doc__, bg='k5', bg2='wheat') #remsh1.write('sphere.vtk') vedo-2025.5.3/examples/other/remesh_meshfix.py000066400000000000000000000020301474667405700212430ustar00rootroot00000000000000#Credits: #M. Attene. A lightweight approach to repairing digitized polygon meshes. #The Visual Computer, 2010. (c) Springer. DOI: 10.1007/s00371-010-0416-3 #http://pymeshfix.pyvista.org #TetGen, a Delaunay-Based Quality Tetrahedral Mesh Generator #https://github.com/pyvista/tetgen # # pip install pymeshfix # pip install tetgen # import pymeshfix import tetgen import vedo amesh = vedo.Mesh(vedo.dataurl+'290.vtk') # repairing also closes the mesh in a nice way meshfix = pymeshfix.MeshFix(amesh.points, amesh.cells) meshfix.repair() repaired = vedo.Mesh(meshfix.mesh).linewidth(1).alpha(0.5) # tetralize the closed surface tet = tetgen.TetGen(repaired.points, repaired.cells) tet.tetrahedralize(order=1, mindihedral=20, minratio=1.5) tmesh = vedo.TetMesh(tet.grid) # save it to disk # tmesh.write("my_tetmesh.vtu") plt = vedo.Plotter(N=3, axes=1) plt.at(0).show("Original mesh", amesh) plt.at(1).show("Repaired mesh", repaired) plt.at(2).show("Tetrahedral mesh\n(click & press shift-X)", tmesh.tomesh().shrink()) plt.interactive().close() vedo-2025.5.3/examples/other/run_all.sh000077500000000000000000000005751474667405700176720ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo Press Esc at anytime to skip example, F1 to interrupt for f in *.py; do case $f in qt*.py) continue;; esac case $f in wx*.py) continue;; esac case $f in trame*.py) continue;; esac case $f in *video*.py) continue;; esac case $f in *napari*.py) continue;; esac echo "Processing: examples/other/$f" python "$f" donevedo-2025.5.3/examples/other/spherical_harmonics1.py000066400000000000000000000062311474667405700223420ustar00rootroot00000000000000"""Expand and reconstruct any surface (here a simple box) into spherical harmonics""" # Expand an arbitrary closed shape into spherical harmonics # using SHTOOLS (https://shtools.github.io/SHTOOLS) # and then truncate the expansion to a specific lmax and # reconstruct the projected points on a finer grid. import pyshtools import numpy as np from scipy.interpolate import griddata from vedo import spher2cart, mag, Box, Point, Points, Plotter ########################################################################### lmax = 8 # maximum degree of the spherical harm. expansion N = 50 # number of grid intervals on the unit sphere rmax = 500 # line length x0 = [250, 250, 250] # set SPH sphere at this position ########################################################################### x0 = np.array(x0) surface = Box(pos=x0+[10,20,30], size=(300,150,100)) surface.color('grey').alpha(0.2) ############################################################ # cast rays from the sphere center and find intersections agrid, pts = [], [] for th in np.linspace(0, np.pi, N, endpoint=True): longs = [] for ph in np.linspace(0, 2*np.pi, N, endpoint=False): p = spher2cart(rmax, th, ph) intersections = surface.intersect_with_line(x0, x0+p) if len(intersections): value = mag(intersections[0]-x0) longs.append(value) pts.append(intersections[0]) else: print('No hit for theta, phi =', th, ph, c='r') longs.append(rmax) pts.append(p) agrid.append(longs) agrid = np.array(agrid) hits = Points(pts) hits.cmap('jet', agrid.ravel()).add_scalarbar3d('scalar distance to x_0') hits.scalarbar = hits.scalarbar.clone2d(size=0.12) ############################################################# grid = pyshtools.SHGrid.from_array(agrid) clm = grid.expand() grid_reco = clm.expand(lmax=lmax).to_array() # cut "high frequency" components ############################################################# # interpolate to a finer grid ll = [] for i, long in enumerate(np.linspace(0, 360, num=grid_reco.shape[1], endpoint=False)): for j, lat in enumerate(np.linspace(90, -90, num=grid_reco.shape[0], endpoint=True)): th = np.deg2rad(90 - lat) ph = np.deg2rad(long) p = spher2cart(grid_reco[j][i], th, ph) ll.append((lat, long)) radii = grid_reco.T.ravel() n = 200j lnmin, lnmax = np.array(ll).min(axis=0), np.array(ll).max(axis=0) grid = np.mgrid[lnmax[0]:lnmin[0]:n, lnmin[1]:lnmax[1]:n] grid_x, grid_y = grid grid_reco_finer = griddata(ll, radii, (grid_x, grid_y), method='cubic') pts2 = [] for i, long in enumerate(np.linspace(0, 360, num=grid_reco_finer.shape[1], endpoint=False)): for j, lat in enumerate(np.linspace(90, -90, num=grid_reco_finer.shape[0], endpoint=True)): th = np.deg2rad(90 - lat) ph = np.deg2rad(long) p = spher2cart(grid_reco_finer[j][i], th, ph) pts2.append(p+x0) plt = Plotter(N=2, axes=1) plt.at(0).show(surface, hits, Point(x0), __doc__) plt.at(1).show( f'Spherical harmonics expansion of order {lmax}', Points(pts2).c("red5").alpha(0.5), surface, ) plt.interactive().close() vedo-2025.5.3/examples/other/tensor_grid1.py000066400000000000000000000003171474667405700206430ustar00rootroot00000000000000from vedo import Grid, Tensors, show domain = Grid(res=[5,5]) # Generate random attributes on this mesh domain.generate_random_data() ts = Tensors(domain, scale=0.1) ts.print() show(domain, ts).close() vedo-2025.5.3/examples/other/tensor_grid2.py000066400000000000000000000113141474667405700206430ustar00rootroot00000000000000"""Cauchy-Green and Green-Lagrange strain tensors on a 2D grid.""" import numpy as np import vedo # Define a simple deformation function def deform(x, y): xd = np.array([x + 0.25 * x * x, y + 0.25 * x * y]) # Add rotation to the deformation. # note that the rotation is applied to the deformed configuration # and it has no effect on the deformation gradient tensor C and E rotation_angle_degrees = 10 rotation_angle_radians = np.radians(rotation_angle_degrees) cos_angle = np.cos(rotation_angle_radians) sin_angle = np.sin(rotation_angle_radians) x_def, y_def = xd x_rot = x_def * cos_angle - y_def * sin_angle y_rot = x_def * sin_angle + y_def * cos_angle return np.array([x_rot, y_rot]) # Compute the deformation gradient tensor F def deformation_gradient(x, y, ds=0.001): # Compute the deformation gradient tensor F # F = (df/dx, df/dy) fxy = deform(x, y) fxy_x = deform(x + ds, y) fxy_y = deform(x, y + ds) F = np.zeros((2, 2)) F[0, 0] = (fxy_x[0] - fxy[0]) / ds F[0, 1] = (fxy_y[0] - fxy[0]) / ds F[1, 0] = (fxy_x[1] - fxy[1]) / ds F[1, 1] = (fxy_y[1] - fxy[1]) / ds return F # Compute the right Cauchy-Green deformation tensor C def cauchy_green(F): return F.T @ F # Right Cauchy-Green tensor (C) is used to define the Green-Lagrange # strain tensor (E), which is a measure of deformation in the reference # (undeformed) configuration: def green_lagrange(C): return 0.5 * (C - np.eye(2)) # Left Cauchy-Green tensor (B) is used to define the Almansi strain tensor (e), # which is a measure of deformation in the current (deformed) configuration: # e = 0.5 * (I - B^-1) (this is less used in practice) def almansi(F): B = F @ F.T return 0.5 * (np.eye(2) - np.linalg.inv(B)) # Compute the principal stretches and directions def principal_stretches_directions(T): # T is a symmetric tensor # eigenvalues are sorted in ascending order eigenvalues, eigenvectors = np.linalg.eigh(T) principal_stretches = np.sqrt(np.abs(eigenvalues))*np.sign(eigenvalues) return principal_stretches, eigenvectors ###################################################################### # Define the original grid (undeformed configuration) x, y = np.meshgrid(np.linspace(-1, 1, 8), np.linspace(-1, 1, 8)) grid = vedo.Grid(s=(x[0], y.T[0])) grid_pts = grid.points grid_pts_defo = deform(grid_pts[:, 0], grid_pts[:, 1]) grid_defo = grid.clone() grid_defo.points = grid_pts_defo.T # Initialize the vedo plotter plotter = vedo.Plotter() for i in range(x.shape[0]): for j in range(y.shape[1]): pt = x[i, j], y[i, j] displaced_pt = deform(*pt) F = deformation_gradient(*pt) C = cauchy_green(F) stretches, directions = principal_stretches_directions(C) ellipsoid_axes = np.diag(stretches) @ directions.T / 8 ellipsoid_C = vedo.Ellipsoid( axis1=ellipsoid_axes[0], axis2=ellipsoid_axes[1], axis3=[0, 0, 0.01], pos=(*pt, 0), ) ellipsoid_C.lighting("off").color("blue5") E = green_lagrange(C) # E = almansi(F) stretches, directions = principal_stretches_directions(E) ellipsoid_axes = np.diag(stretches) @ directions.T / 8 ellipsoid_E = vedo.Ellipsoid( axis1=ellipsoid_axes[0], axis2=ellipsoid_axes[1], axis3=[0, 0, 0.01], pos=(*pt, 0), ).z(0.01) ellipsoid_E.lighting("off").color("purple5") if stretches[0] < 0 or stretches[1] < 0: ellipsoid_E.c("red4") # Plot the deformation gradient tensor, we cannot compute the # principal stretches and directions of the deformation gradient # tensor because it is not a symmetric tensor. # F = deformation_gradient(*pt) # circle = vedo.Circle(r=0.05).pos(*pt).color("black") # cpts = circle.points # cpts_defo = F @ cpts.T[:2] # circle.points = cpts_defo.T # Same as: circle = vedo.Circle(r=0.06).pos(*pt).color("black") cpts = circle.points cpts_defo = deform(cpts[:,0], cpts[:,1]) circle.points = cpts_defo.T plotter += [ellipsoid_C, ellipsoid_E, circle] pts = np.array([x, y]).T.reshape(-1, 2) defo_pts = deform(x, y).T.reshape(-1, 2) plotter += vedo.Arrows2D(pts, defo_pts, s=0.2).color("blue5") plotter += grid_defo plotter += __doc__ plotter.show(axes=8, zoom=1.2) ##################################################################### # Resources: # https://en.wikipedia.org/wiki/Deformation_gradient # https://en.wikipedia.org/wiki/Almansi_strain_tensor # https://en.wikipedia.org/wiki/Principal_stretch # https://www.continuummechanics.org/deformationstrainintro.htmlvedo-2025.5.3/examples/other/tetgen1.py000066400000000000000000000025111474667405700176100ustar00rootroot00000000000000"""Use tetgenpy to tetrahedralize a cube.""" try: import tetgenpy except ImportError: print("tetgenpy not installed, try: pip install tetgenpy") import vedo # Tetrahedralize unit cube, define points points = [ [0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 1.0], [0.0, 1.0, 1.0], [1.0, 1.0, 1.0], ] # Define facets, here they are hexa faces facets = [ [1, 0, 2, 3], [0, 1, 5, 4], [2, 0, 4, 6], [1, 3, 7, 5], [3, 2, 6, 7], [4, 5, 7, 6], ] # Prepare TetgenIO - input for tetgen tetgen_in = tetgenpy.TetgenIO() # Set points, facets, and facet_markers. # facet_markers can be useful for setting boundary conditions tetgen_in.setup_plc( points=points, facets=facets, facet_markers=[[i] for i in range(1, len(facets) + 1)], ) # Tetgen's tetraheralize function with switches tetgen_out = tetgenpy.tetrahedralize("qa.05", tetgen_in) # Unpack output # print(tetgen_out.points()) # print(tetgen_out.tetrahedra()) # print(tetgen_out.trifaces()) # print(tetgen_out.trifacemarkers()) plt = vedo.Plotter().add_ambient_occlusion(0.1) tmesh = vedo.TetMesh(tetgen_out).shrink().color("pink7") plt.show(tmesh, __doc__, axes=14).close() # Or simply: # vedo.show(tetgen_out, axes=14).close() # Save to file # tmesh.write("tetramesh.vtu") vedo-2025.5.3/examples/other/trame_ex1.py000066400000000000000000000016701474667405700201330ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # See more examples at: # https://github.com/Kitware/trame-tutorial from trame.app import get_server from trame.ui.vuetify import SinglePageLayout from trame.widgets import vtk, vuetify import vedo sphere = vedo.Sphere().lw(1) sphere.cmap("Spectral_r", sphere.vertices[:, 1]) axes = vedo.Axes(sphere) plt = vedo.Plotter() plt += sphere plt += axes.unpack() plt += vedo.Text3D("A color sphere", font='Quikhand', s=0.2, pos=[-1,1,-1]) # ----------------------------------------------------------------------------- # Trame # ----------------------------------------------------------------------------- server = get_server() with SinglePageLayout(server) as layout: layout.title.set_text("Hello trame") with layout.content: with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): plt.reset_camera() view = vtk.VtkLocalView(plt.window) server.start() vedo-2025.5.3/examples/other/trame_ex2.py000066400000000000000000000015561474667405700201370ustar00rootroot00000000000000#!/usr/bin/env python # from trame.app import get_server from trame.ui.vuetify import SinglePageLayout from trame.widgets import vtk, vuetify from vedo import Volume, Axes, Plotter, dataurl vol = Volume(dataurl+"embryo.slc") plt = Plotter(bg='Wheat') plt += [vol, Axes(vol)] plt += vol.isosurface().shift(300,0,0) # ------------------------------------------------------------ # Web Application setup # ------------------------------------------------------------ server = get_server() ctrl = server.controller with SinglePageLayout(server) as layout: layout.title.set_text("Hello trame") with layout.content: with vuetify.VContainer( fluid=True, classes="pa-0 fill-height", ): plt.reset_camera() view = vtk.VtkRemoteView(plt.window) # view = vtk.VtkLocalView(plt.window) server.start() vedo-2025.5.3/examples/other/trame_ex3.py000066400000000000000000000043521474667405700201350ustar00rootroot00000000000000from trame.app import get_server from trame.ui.vuetify import SinglePageLayout from trame.widgets import vtk, vuetify import vedo cone = vedo.Cone() axes = vedo.Axes(cone).unpack() plt = vedo.Plotter() plt += [cone, axes] # ----------------------------------------------------------------------------- # Trame setup # ----------------------------------------------------------------------------- server = get_server() state, ctrl = server.state, server.controller # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- @state.change("resolution") def update_resolution(resolution, **kwargs): cone.color(resolution) ctrl.view_update() def reset_resolution(): cone.color("red5") ctrl.view_update() # ----------------------------------------------------------------------------- # GUI # ----------------------------------------------------------------------------- with SinglePageLayout(server) as layout: layout.title.set_text("Use slider to change color") with layout.content: with vuetify.VContainer( fluid=True, classes="pa-0 fill-height", ): plt.reset_camera() view = vtk.VtkLocalView(plt.window) ctrl.view_update = view.update ctrl.view_reset_camera = view.reset_camera with layout.toolbar: vuetify.VSpacer() vuetify.VSlider( v_model=("resolution", "blue5"), min=3, max=60, step=1, hide_details=True, dense=True, style="max-width: 300px", ) with vuetify.VBtn(icon=True, click=reset_resolution): vuetify.VIcon("mdi-restore") vuetify.VDivider(vertical=True, classes="mx-2") vuetify.VSwitch( v_model="$vuetify.theme.dark", hide_details=True, dense=True, ) with vuetify.VBtn(icon=True, click=ctrl.view_reset_camera): vuetify.VIcon("mdi-crop-free") # ----------------------------------------------------------------------------- # Main # ----------------------------------------------------------------------------- server.start() vedo-2025.5.3/examples/other/trimesh/000077500000000000000000000000001474667405700173435ustar00rootroot00000000000000vedo-2025.5.3/examples/other/trimesh/README.md000066400000000000000000000034501474667405700206240ustar00rootroot00000000000000# _Trimesh_ In this directory you will find a bunch of examples of interoperability with the [trimesh](https://trimsh.org) package. (Still a bit experimental, especially when running from a jupyter notebook. Use in this case _embedWindow(False)_). To run the examples: ```bash git clone https://github.com/marcomusy/vedo.git cd vedo/vedo/examples/other/trimesh python example.py ``` (_click thumbnail image to get to the python script_) | | | |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-----| | [![trim_section](https://user-images.githubusercontent.com/32848391/60594020-55220100-9da4-11e9-8d7f-281965616795.png)](https://github.com/marcomusy/vedo/blob/master/vedo/examples/other/trimesh/section.py)
`section.py` | Find a bunch of parallel cross sections to a mesh. | | | | | [![trim_ray](https://user-images.githubusercontent.com/32848391/60594021-55220100-9da4-11e9-87be-f2004f1060df.png)](https://github.com/marcomusy/vedo/blob/master/vedo/examples/other/trimesh/ray.py)
`ray.py` | Find hits of a ray to mesh. | | | | | [![trim_nearest](https://user-images.githubusercontent.com/32848391/60594022-55220100-9da4-11e9-82ba-19f38af63d35.png)](https://github.com/marcomusy/vedo/blob/master/vedo/examples/other/trimesh/nearest.py)
`nearest.py` | Find the closest points on a mesh to a set of random point. | | | | | [![trim_shortest](https://user-images.githubusercontent.com/32848391/60594023-55220100-9da4-11e9-87b4-73ea7f8b04f7.png)](https://github.com/marcomusy/vedo/blob/master/vedo/examples/other/trimesh/shortest.py)
`shortest.py` | Shortest path query using length for edge weight. | vedo-2025.5.3/examples/other/trimesh/__init__.py000066400000000000000000000000051474667405700214470ustar00rootroot00000000000000# # vedo-2025.5.3/examples/other/trimesh/nearest.py000066400000000000000000000022511474667405700213560ustar00rootroot00000000000000"""Find the closest point on the mesh to each random point """ import numpy as np from vedo import show, Arrows, download import trimesh plyfile = download('https://github.com/mikedh/trimesh/blob/main/models/cycloidal.ply') mesh = trimesh.load(plyfile) points = mesh.bounding_box_oriented.sample_volume(count=30) # find the closest point on the mesh to each random point closest_points, distances, triangle_id = mesh.nearest.on_surface(points) #print('Distance from point to surface of mesh:\n{}'.format(distances)) # create a PointCloud object out of each (n,3) list of points cloud_original = trimesh.points.PointCloud(points) cloud_close = trimesh.points.PointCloud(closest_points) # create a unique color for each point cloud_colors = np.array([trimesh.visual.random_color() for i in points]) # set the colors on the random point and its nearest point to be the same cloud_original.vertices_color = cloud_colors cloud_close.vertices_color = cloud_colors arrs = Arrows(cloud_original.vertices, cloud_close.vertices, c='w') ## create a scene containing the mesh and two sets of points show(mesh, cloud_original, cloud_close, arrs, __doc__, bg='bb', axes=1, viewup='z').close() vedo-2025.5.3/examples/other/trimesh/ray.py000066400000000000000000000022141474667405700205070ustar00rootroot00000000000000import trimesh import numpy as np from vedo import show, settings settings.use_depth_peeling = True # test on a sphere mesh mesh = trimesh.creation.icosphere() # create some rays ray_origins = np.array([[0, 0, -3], [1, 2, -3]]) ray_directions = np.array([[0, 0, 1], [0, -1, 1]]) # run the mesh-ray query locations, index_ray, index_tri = mesh.ray.intersects_location( ray_origins=ray_origins, ray_directions=ray_directions ) locs = trimesh.points.PointCloud(locations) # stack rays into line segments for visualization as Path3D ray_visualize = trimesh.load_path( np.hstack((ray_origins, ray_origins + ray_directions)).reshape(-1, 2, 3) ) print("The rays hit the mesh at coordinates:\n", locations) print(f"The rays with index: {index_ray} hit triangles stored at mesh.faces[{index_tri}]") # stack rays into line segments for visualization as Path3D ray_visualize = trimesh.load_path( np.hstack((ray_origins, ray_origins + ray_directions * 5.0)).reshape(-1, 2, 3) ) # make mesh white-ish mesh.visual.face_colors = [200, 200, 250, 100] mesh.visual.face_colors[index_tri] = [255, 0, 0, 255] show(mesh, ray_visualize, locs, axes=1).close() vedo-2025.5.3/examples/other/trimesh/run_all.sh000077500000000000000000000003761474667405700213440ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo Running examples in directory other/trimesh/ echo Running nearest.py python3 nearest.py echo Running ray.py python3 ray.py echo Running section.py python3 section.py echo Running shortest.py python3 shortest.py vedo-2025.5.3/examples/other/trimesh/section.py000066400000000000000000000031341474667405700213620ustar00rootroot00000000000000import numpy as np from vedo import show, Plane, printc, download, settings import trimesh settings.immediate_rendering = False # load the mesh from filename, file objects are also supported f = download('https://github.com/mikedh/trimesh/raw/main/models/featuretype.STL') mesh = trimesh.load_mesh(f) # get a single cross section of the mesh txt = 'cross section of the mesh' mslice = mesh.section(plane_origin=mesh.centroid, plane_normal=[0,0,1]) pl = Plane(mesh.centroid, normal=[0,0,1], s=[6,4], c='green', alpha=0.3) slice_2D, to_3D = mslice.to_planar() # show objects on N=2 non-synced renderers: show([(mesh, pl), (slice_2D, txt)], N=2, sharecam=False, axes=7).close() # if we wanted to take a bunch of parallel slices, like for a 3D printer # we can do that easily with the section_multiplane method # we're going to slice the mesh into evenly spaced chunks along z # this takes the (2,3) bounding box and slices it into [minz, maxz] z_extents = mesh.bounds[:,2] # slice every .125 model units (eg, inches) z_levels = np.arange(*z_extents, step=0.125) # find a bunch of parallel cross sections sections = mesh.section_multiplane(plane_origin=mesh.bounds[0], plane_normal=[0,0,1], heights=z_levels) N = len(sections) printc("nr. of sections:", N, c='green') # summing the array of Path2D objects will put all of the curves # into one Path2D object, which we can plot easily combined = np.sum(sections) sections.append([combined, 'combined']) # show objects in N synced renderers: show(sections, N=N, axes=1, new=True).interactive().close() vedo-2025.5.3/examples/other/trimesh/shortest.py000066400000000000000000000022511474667405700215700ustar00rootroot00000000000000from vedo import show import trimesh import networkx as nx # test on a sphere mesh mesh = trimesh.primitives.Sphere() # edges without duplication edges = mesh.edges_unique # the actual length of each unique edge length = mesh.edges_unique_length # create the graph with edge attributes for length g = nx.Graph() for edge, L in zip(edges, length): g.add_edge(*edge, length=L) # alternative method for weighted graph creation ga = nx.from_edgelist([(e[0], e[1], {"length": L}) for e, L in zip(edges, length)]) # arbitrary indices of mesh.vertices to test with start = 0 end = int(len(mesh.vertices) / 2.0) # run the shortest path query using length for edge weight path = nx.shortest_path(g, source=start, target=end, weight="length") ################################### VISUALIZE RESULT # make the sphere transparent-ish mesh.visual.face_colors = [150, 150, 180, 255] # Path3D with the path between the points path_visual = trimesh.load_path(mesh.vertices[path]) # visualizable two points points_visual = trimesh.points.PointCloud(mesh.vertices[[start, end]]) txt = 'Shortest path query\nusing length for edge weight' show(mesh, points_visual, path_visual, txt, axes=6).close() vedo-2025.5.3/examples/other/wx_window.py000066400000000000000000000031121474667405700202640ustar00rootroot00000000000000import wx from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor import vedo ##################################################### # Every wx app needs an app app = wx.App(False) # create the top-level frame, sizer and wxVTKRWI frame = wx.Frame(None, -1, "vedo with wxpython", size=(600,600)) widget = wxVTKRenderWindowInteractor(frame, -1) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(widget, 1, wx.EXPAND) frame.SetSizer(sizer) frame.Layout() # It would be more correct (API-wise) to call widget.Initialize() and # widget.Start() here, but Initialize() calls RenderWindow.Render(). # That Render() call will get through before we can setup the # RenderWindow() to render via the wxWidgets-created context; this # causes flashing on some platforms and downright breaks things on # other platforms. Instead, we call widget.Enable(). widget.Enable(1) widget.AddObserver("ExitEvent", lambda o,e,f=frame: f.Close()) ##################################################### vedo example def func(evt): print("Event dump:\n", evt) plt.azimuth(10) # rotate by one degree the camera cone = vedo.shapes.Cone(c='green8') axes = vedo.Axes(cone, c='white') cube = vedo.shapes.Cube() # Create 2 subwindows with a cone and a cube plt = vedo.Plotter(N=2, bg='blue2', bg2='blue8', wx_widget=widget) plt.add_callback("right mouse click", func) plt.at(0).add([cone, axes, "right-click anywhere"]).reset_camera() plt.at(1).add(cube).reset_camera() # plt.show() # vedo.show() is now disabled in wx ##################################################### # Show everything frame.Show() app.MainLoop() vedo-2025.5.3/examples/pyplot/000077500000000000000000000000001474667405700160765ustar00rootroot00000000000000vedo-2025.5.3/examples/pyplot/andrews_cluster.py000066400000000000000000000021411474667405700216520ustar00rootroot00000000000000"""Andrews curves for the Iris dataset.""" import numpy as np from sklearn import datasets from vedo import * from vedo.pyplot import Figure, plot iris = datasets.load_iris() # loading iris data set AC = andrews_curves(iris.data) theta = np.linspace(-np.pi, np.pi, 100) settings.remember_last_figure_format = True fig = Figure( xlim=(-np.pi, np.pi), ylim=(-2, 16), padding=0, axes=dict(htitle="", axes_linewidth=2, xyframe_line=0), ) setosas = [] for r in AC[:20]: # setosa p = pol2cart(r, theta).T fig += plot(theta, r, c="red5") setosas.append(Line(p)) setosas = merge(setosas).lw(3).c("red5") versicolors = [] for r in AC[50:70]: # versicolor p = pol2cart(r, theta).T fig += plot(theta, r, c="blue5") versicolors.append(Line(p)) versicolors = merge(versicolors).lw(3).c("blue5") virginicas = [] for r in AC[100:120]: # virginica p = pol2cart(r, theta).T fig += plot(theta, r, c="green5") virginicas.append(Line(p)) virginicas = merge(virginicas).lw(3).c("green5") fig = fig.clone2d(size=0.75) show(setosas, versicolors, virginicas, fig, __doc__, axes=12) vedo-2025.5.3/examples/pyplot/anim_lines.py000066400000000000000000000051641474667405700205740ustar00rootroot00000000000000"""Animated plot showing multiple temporal data lines""" # Copyright (c) 2021, Nicolas P. Rougier. License: BSD 2-Clause* # Adapted for vedo by M. Musy, February 2021 import numpy as np from vedo import settings, Line, show settings.default_font = "Theemim" # Generate random data np.random.seed(1) data = np.random.uniform(0, 1, (25, 100)) X = np.linspace(-1, 1, data.shape[-1]) G = 0.15 * np.exp(-4 * X**2) # use a gaussian as a weight # Generate line plots lines = [] for i, d in enumerate(data): pts = np.c_[X, np.zeros_like(X)+i/10, G*d] lines.append(Line(pts, lw=3)) # Set up the first frame axes = dict(xtitle=':Deltat /:mus', ytitle="source", ztitle="") plt = show(lines, __doc__, axes=axes, elevation=-30, interactive=False, bg='k8') for i in range(50): data[:, 1:] = data[:, :-1] # Shift data to the right data[:, 0] = np.random.uniform(0, 1, len(data)) # Fill-in new values for line, d in zip(lines, data): # Update data v = line.points v[:,2] = G * d line.points = v line.cmap('gist_heat_r', v[:,2]) plt.render() plt.interactive().close() ############################################################################# # *BSD 2-Clause License # # Copyright (c) 2021, Nicolas P. Rougier # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Original version at: https://github.com/rougier/unknown-pleasures vedo-2025.5.3/examples/pyplot/caption.py000066400000000000000000000012431474667405700201050ustar00rootroot00000000000000"""Attach a 2D caption to an object""" from vedo import Cone, Axes, show cone = Cone().rotate_x(30).rotate_z(20).c('steelblue') txt = "Japanese\nこれは青い円錐形です\n" txt += "Chinese\n這是一個藍錐\n" txt += "Russian\nЭто синий конус\n" txt += "English\nThis is a blue cone" capt = cone.caption(txt, size=(0.4,0.3), font="LogoType", c='lb') axes = Axes( cone, xtitle='マイクロメートル単位のx軸', ytitle='y軸にも長い説明があります', ztitle='Z軸始終來自中國', title_font='LogoType', text_scale=1.5, c='white', ) show(cone, capt, axes, __doc__, viewup='z', bg='k', bg2='bb').close() vedo-2025.5.3/examples/pyplot/custom_axes1.py000066400000000000000000000040751474667405700210710ustar00rootroot00000000000000"""Customizing axes style (40+ control parameters!) Title font: """ from vedo import Box, Lines, Points, Spline, show, settings settings.default_font = 'Theemim' # an invisible box: world = Box(pos=(2.7,0,0), size=(12,10,8), alpha=0) # a dummy spline with its shadow on the xy plane pts = Points([(-2,-3.2,-1.5), (3,-1.2,-2), (7,3,4)], r=12) spl = Spline(pts, res=50) # make a spline from points spl.add_shadow(plane='z', point=-4) # add its shadow at z=-4 lns = Lines(spl, spl.shadows[0]) # join spline points with its own shadow # make a dictionary of axes options axes_opts = dict( xtitle='My variable :Omega^:lowerxi_lm in units of :mum^3', # latex-style syntax ytitle='This is my highly\ncustomized y-axis', ztitle='z in units of Å', # many unicode chars are supported (type: vedo -r fonts) y_values_and_labels=[(-3.2,'Mark^a_-3.2'), (-1.2,'Carmen^b_-1.2'), (3,'John^c_3')], text_scale=1.3, # make all text 30% bigger number_of_divisions=5, # approximate number of divisions on longest axis axes_linewidth= 2, grid_linewidth= 1, zxgrid2=True, # show zx plane on opposite side of the bounding box yzgrid2=True, # show yz plane on opposite side of the bounding box xyplane_color='green7', xygrid_color='green3', # darkgreen line color xyalpha=0.2, # grid opacity xtitle_position=0.5, # title fractional positions along axis xtitle_justify="top-center", # align title wrt to its axis ytitle_size=0.02, ytitle_box=True, ytitle_offset=0.05, ylabel_offset=0.4, yhighlight_zero=True, # draw a line highlighting zero position if in range yhighlight_zero_color='red', zline_color='blue5', ztitle_color='blue5', ztitle_backface_color='v',# violet color of axis title backface label_font="Quikhand", ylabel_size=0.025, # size of the numeric labels along Y axis ylabel_color='green4', # color of the numeric labels along Y axis ) show(world, pts, spl, lns, __doc__+settings.default_font, axes=axes_opts).close() vedo-2025.5.3/examples/pyplot/custom_axes2.py000066400000000000000000000016671474667405700210760ustar00rootroot00000000000000from vedo import Points, Axes, show import numpy as np pts = np.random.randn(2000,3)*[3,2,4]-[1,2,3] vpts1 = Points(pts).alpha(0.2).c('blue2') vpts2 = vpts1.clone().shift(5,6,7).c('green2') axs = Axes( [vpts1, vpts2], # build axes for this set of objects xtitle="X-axis in :mum", ytitle="Variable Y in :mum", ztitle="Inverted Z in :mum", htitle='My :Gamma^2_ijk plot', htitle_font='Kanopus', htitle_color='red2', htitle_size=0.035, htitle_offset=(0,0.075,0), htitle_rotation=45, zhighlight_zero=True, xyframe_line=2, yzframe_line=1, zxframe_line=1, xyframe_color='red3', xyshift=1.05, # move xy 5% above the top of z-range yzgrid=True, zxgrid=True, zxshift=1.0, xtitle_justify='bottom-right', xtitle_offset=-1.175, xlabel_offset=-1.75, ylabel_rotation=90, z_inverted=True, tip_size=0.25, ) show(vpts1, vpts2, axs, "Customizing Axes", viewup='z').close() vedo-2025.5.3/examples/pyplot/custom_axes3.py000066400000000000000000000014131474667405700210640ustar00rootroot00000000000000"""Customizing Axes. Cartesian planes can be displaced from their lower-range default position""" from vedo import Sphere, Axes, precision, show sph = Sphere().scale([4, 3, 2]).shift(5, 6, 7).c("green2", 0.1).wireframe() axs = Axes( sph, # build axes for object sph xtitle="x axis", ytitle="y axis", ztitle="z axis", htitle="An ellipsoid at " + precision(sph.center_of_mass(), 2), htitle_font=1, htitle_color="red3", zxgrid=True, xyframe_line=2, yzframe_line=2, zxframe_line=2, xyframe_color="red3", yzframe_color="green3", zxframe_color="blue3", xyshift=0.2, # move xy plane 20% along z yzshift=0.2, # move yz plane 20% along x zxshift=0.2, # move zx plane 20% along y ) show(sph, axs, __doc__).close() vedo-2025.5.3/examples/pyplot/custom_axes4.py000066400000000000000000000020611474667405700210650ustar00rootroot00000000000000"""Create individual axes to each separate object in a scene. Access any element to change its size and color""" from vedo import * settings.use_depth_peeling = True # Create a bunch of objects s1 = Sphere(pos=(10, 0, 0), r=1, c='r') s2 = Sphere(pos=( 0,10, 0), r=2, c='g') s3 = Sphere(pos=( 0, 0,10), r=3, c='b') pt = Point([-4,-4,-4], c='k') # Build individual axes for each object. # A new Assembly object is returned: axes1 = Axes(s1, c='r') axes2 = Axes(s2, c='g') axes3 = Axes(s3, c='b', number_of_divisions=10) # axes3 is an Assembly (group of Meshes). # Unpack it and scale the 7th label getting it by its name, # make it 5 times bigger big and fuchsia: # Print all element names in axes3: #for m in axes3.get_meshes(): print(m.name) axes3['xNumericLabel 7'].scale(5).c('fuchsia') # By specifiyng axes in show(), new axes are # created which span the whole bounding box. # Options are passed through a dictionary show(pt, s1, s2, s3, axes1, axes2, axes3, __doc__, viewup='z', axes=dict(c='black', number_of_divisions=10, yzgrid=False), ).close() vedo-2025.5.3/examples/pyplot/earthquake_browser.py000066400000000000000000000041761474667405700223550ustar00rootroot00000000000000"""Earthquakes of magnitude 2.5+ in the past 30 days areas are proportional to energy release [hover mouse to get more info]""" import pandas from vedo import * num = 50 # nr of earthquakes to be visualized at once path = download("https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv", force=True) usecols = ['time', 'place', 'latitude', 'longitude', 'depth', 'mag'] data = pandas.read_csv(path, usecols=usecols)[usecols][::-1].reset_index(drop=True) # reverse list pic = Image(dataurl + "images/eo_base_2020_clean_3600x1800.png") pic.pickable(False).level(185).window(120) # add some contrast to the original image scale = [pic.shape[0]/2, pic.shape[1]/2, 1] comment = Text2D(__doc__, bg='green9', alpha=0.7, font='Ubuntu') centers = [] for i, d in progressbar(data.iterrows()): M = d['mag'] # earthquake estimated magnitude E = np.sqrt(np.exp(5.24+1.44*M) * scale[0])/10000 # empirical formula for sqrt(energy_release(M)) rgb = color_map(E, name='Reds', vmin=0, vmax=7) # map energy to color lat = np.deg2rad(d['latitude']) lon = np.deg2rad(d['longitude']) ce = GeoCircle(lat, lon, E/50).scale(scale).z(num/M) ce.color(rgb, 0.7).force_opaque().use_bounds(False) ce.time = i ce.info = '\n'.join(str(d).split('\n')[:-1]) # remove of the last line in string d if i < len(data) - num: ce.off() # switch off older ones: make circles invisible centers.append(ce) def sliderfunc(widget, event): val = widget.value # get the slider current value widget.title = f"{data['time'][int(val)][:10]}" for ce in centers: isinside = abs(val-ce.time) < num # switch on if inside of time window ce.on() if isinside else ce.off() plt = Plotter(size=(2200,1100), title="vedo - Earthquake Browser").parallel_projection(True) plt.add_slider(sliderfunc, 0, len(centers)-1, value=len(centers)-1, show_value=False) plt.add_hover_legend(use_info=True, alpha=1, c='white', bg='red2', s=1) plt.show(pic, centers, comment, zoom="tightest", mode='image').close() vedo-2025.5.3/examples/pyplot/embed_matplotlib.py000066400000000000000000000010551474667405700217540ustar00rootroot00000000000000"""Include background images in the rendering scene (generated by matplotlib)""" import matplotlib.pyplot as plt from vedo import * tmsh = TetMesh(dataurl + "limb.vtu") msh = tmsh.tomesh().shrink(0.8) # Create a histogram with matplotlib fig = plt.figure() plt.hist(msh.celldata["chem_0"], log=True) plt.title(r"$\mathrm{Matplotlib\ Histogram\ of\ log(chem_0)}$") # pic1 = Image(fig).clone2d("top-right", 0.5).alpha(0.8) pic2 = Image(dataurl + "images/embryo.jpg").clone2d("bottom-right") show(msh, fig, pic2, __doc__, bg="lightgrey", zoom=1.2, axes=1) vedo-2025.5.3/examples/pyplot/explore5d.py000066400000000000000000000035721474667405700203660ustar00rootroot00000000000000"""Read a data from ascii file and make a simple analysis visualizing 3 of the 5 dimensions of the dataset""" import numpy as np from vedo import download, Points, Axes, show from vedo.pyplot import histogram ################################### Read the csv data: delimiter=',' fpath = download('https://vedo.embl.es/examples/data/genes.csv') with open(fpath, "r") as f: lines = f.readlines() data = [] for i,lns in enumerate(lines): if i==0: names = lns.split(delimiter) # read header continue ln = lns.split(delimiter) vals = [float(x) for x in ln] data.append(vals) data = np.array(data) print("Print first 5 rows:\n", names) print(data[:5]) print("Number of rows:", len(data)) ################################################## # extract the columns into separate vectors: g0, g1, g2, g3, g4 = data.T # unpack genes n0, n1, n2, n3, n4 = names # now create and show histograms of the gene expressions h0 = histogram(g0, xtitle=n0, c=0) h1 = histogram(g1, xtitle=n1, c=1) h2 = histogram(g2, xtitle=n2, c=2) h3 = histogram(g3, xtitle=n3, c=3, logscale=True) h4 = histogram(g4, xtitle=n4, c=4) # this is where you choose what variables to show as 3D points pts = np.c_[g4,g2,g3] # form an array of 3d points from the columns pts_1 = pts[g0>0] # select only points that have g0>0 p1 = Points(pts_1).ps(4).c('red5') # create the vedo object (ps=point size) print("after selection nr. of points is", len(pts_1)) pts_2 = pts[(g0<0) & (g1>.5)] # select excluded points that have g1>0.5 p2 = Points(pts_2).ps(8).c('green') # create the vedo object axes = Axes(p1+p2, xtitle='gene4', ytitle='gene2', ztitle='gene3', c='k') # Show the two clouds superposed on a new plotter window: show([h0, h1, h2, h3, h4, (p1,p2, axes, __doc__)], shape="1/5", # 1 spaces above and 5 below sharecam=0, axes=0, zoom=1.4, interactive=True, ).close() vedo-2025.5.3/examples/pyplot/fill_gap.py000066400000000000000000000014731474667405700202320ustar00rootroot00000000000000"""Interpolate gap between two functions""" # https://www.youtube.com/watch?v=vD5g8aVscUI import numpy as np from vedo.pyplot import plot from vedo import settings settings.remember_last_figure_format = True # useful for pf += plot(...) x1 = np.linspace(-2,2, num=100) x = np.linspace(-2,2, num=100) x2 = np.linspace(-2,2, num=100) fx = np.sin(x1*3) - 1 gx = x2*x2/3 -1 def phi(x): psi = np.exp(-1/x) psi_1 = np.exp(-1/(1-x)) phi = psi / (psi + psi_1) phi = np.where(x<=0, 0, phi) phi = np.where(x>1, 1, phi) return phi w = phi(x) h = (1-w) * fx + w * gx pf = plot(x1[:50], fx[:50], xlim=[-2,2], ylim=[-2,1.5], lw=5, title=__doc__) pf += plot(x[50:75], h[50:75], c='red5') pf += plot(x2[75:], gx[75:], lw=5) pf += plot(x[50:75], w[50:75], c='green4', lw=1) pf.show(mode='image', zoom='tight') vedo-2025.5.3/examples/pyplot/fit_circle.py000066400000000000000000000017311474667405700205550ustar00rootroot00000000000000"""Fit circles analytically to measure the signed curvature of a line""" from vedo import * shape = Spline([ [1.0, 2.0, -1.0], [1.5, 0.0, 0.4], [2.0, 4.0, 0.5], [4.0, 1.5, -0.3]], res=200, ) n = 5 # nr. of points to use for the fit npt = shape.npoints points = shape.points fitpts, circles, curvs = [], [], [0]*npt for i in range(n, npt - n-1): pts = points[i-n:i+n] center, R, normal = fit_circle(pts) z = cross(pts[-1]-pts[0], center-pts[0])[2] curvs[i] = sqrt(1/R) * z/abs(z) if R < 0.75: circle = Circle(center, r=R).wireframe() circle.reorient([0,0,1], normal) circles.append(circle) fitpts.append(center) shape.lw(8).cmap('coolwarm', curvs).add_scalarbar3d(title=':pm1/:sqrtR', c='w') # use this trick to make the scalarbar3d become a 2d screen object: shape.scalarbar = shape.scalarbar.clone2d("bottom-right", 0.2) show(shape, circles, Points(fitpts, c='white'), __doc__, axes=1, bg='bb').close() vedo-2025.5.3/examples/pyplot/fit_curve1.py000066400000000000000000000016601474667405700205220ustar00rootroot00000000000000"""Fitting a curve to a dataset""" import numpy as np from scipy.optimize import curve_fit from vedo.pyplot import plot from vedo import settings def func(x, h, a, x0, k): return h + a * (x-x0) * np.sin((x-x0)**2 / k) # generate simulated data xdata = np.linspace(3, 10, 80) true_params = [20, 2, 8, 3] ydata_true = func(xdata, *true_params) ydata = np.random.normal(ydata_true, 3, 80) fit_params, pcov = curve_fit(func, xdata, ydata, p0=[19, 3, 8, 2.5]) ydata_fit = func(xdata, *fit_params) print("true params = ", true_params) print("fit params = ", fit_params) settings.default_font = "ComicMono" settings.remember_last_figure_format = True # when adding with p += ... p = plot(xdata, ydata, "o", mc="blue2", title=__doc__, label="Data") p += plot(xdata, ydata_true, "-g", lw=2, label="Ground Truth") p += plot(xdata, ydata_fit, "-r", lw=4, label="Fit") p.add_legend(pos="bottom-right") p.show(size=(900, 650), zoom="tight") vedo-2025.5.3/examples/pyplot/fit_curve2.py000066400000000000000000000022461474667405700205240ustar00rootroot00000000000000"""Create slider that changes the value of the k parameter in the function.""" import numpy as np from vedo.pyplot import plot from vedo import settings, Line, Text2D, Plotter settings.default_font = "Brachium" settings.remember_last_figure_format = True def func(x, h, a, x0, k): return h + a * (x-x0) * np.sin((x-x0)**2 / k) def callback(w, e): y = func(xdata, *true_params[:3], slider.value) res = np.sum((ydata - y)**2 / 100) txt2d.text(f"Residuals: {res:.3f}") # remove previous fit line and insert the new one line = Line(np.c_[xdata, y], c="green4", lw=3) p.remove(p[2]).insert(line) true_params = [20, 2, 8, 3] xdata = np.linspace(3, 10, 100) ydata_true = func(xdata, *true_params) ydata = np.random.normal(ydata_true, 3, 100) p = plot( xdata, ydata, "o", mc="blue2", title="f = h + a*(x-x_0 )*sin((x-x_0 )**2 /k)", label="Data", ) p += plot(xdata, ydata_true, "-g", lw=2, label="Fit") p.add_legend(pos="top-right") txt2d = Text2D(pos="bottom-left", bg='yellow5', s=1.2) plt = Plotter(size=(900, 650)) slider = plt.add_slider(callback, 1, 5, value=3, title="k-value") plt.show(p, txt2d, __doc__, zoom=1.3, mode="2d") vedo-2025.5.3/examples/pyplot/fit_erf.py000066400000000000000000000021461474667405700200710ustar00rootroot00000000000000from scipy import special from scipy.optimize import curve_fit from vedo import np, settings, Marker from vedo.pyplot import plot settings.default_font = 'Calco' settings.remember_last_figure_format = True xdata = [230, 234, 240, 243, 246, 249, 252] ydata = [0, 0, 11, 62, 15, 21, 100] tdata = [100, 31, 34, 80, 21, 21, 100] yerrs = np.sqrt(ydata) /np.array(tdata) + 0.1 ydata = np.array(ydata) /np.array(tdata) def func(x, a, x0): return (1 + special.erf(a*(x-x0))) / 2 p0 = [1/25, 240] # initial guess popt, _ = curve_fit(func, xdata, ydata, p0) x = np.linspace(225, 255, 50) y = func(x, *popt) x0, y0 = popt[1], func(popt[1], *popt) fig = plot( xdata, ydata, 'o', yerrors=yerrs, ylim=(-0.1,1.3), title="ERF(x) fit to data", ytitle='Embryos with visible HL', xtitle='Hind Limb age (h)', mc='blue2', ms=0.3, lwe=2, label='data', ) fig += plot(x, y, lw=5, label='fit') fig += Marker('*', s=0.05, c='r4').pos(x0,y0, 0.1) fig.add_label(':mu', marker='*', mc="r4") fig.add_legend("top-left", vspace=2.5) fig.show(size=(900, 650), zoom='tight').close() vedo-2025.5.3/examples/pyplot/fit_polynomial1.py000066400000000000000000000027051474667405700215620ustar00rootroot00000000000000"""Fit y=ax+b and compute error bands""" from vedo import Text2D, DashedLine, show from vedo.pyplot import plot, fit import numpy as np # np.random.seed(0) # Generate some noisy data points along a line a, b = (np.random.rand(2)-0.5)*10 # choose a and b x = np.linspace(0, 15, 25) y = a*x + b noise = np.random.randn(len(x)) * 5 # create gaussian noise # Plot the points and add the "true" line without noise fig = plot(x, y+noise, '*k', title=__doc__, label='data') fig += DashedLine(x, y).c('red5') # Fit points and evaluate, with a bootstrap and Monte-Carlo technique, # the correct error coeffs and error bands. Return a Line object: pfit = fit( [x, y+noise], deg=1, # degree of the polynomial niter=500, # nr. of MC iterations to compute error bands nstd=2, # nr. of std deviations to display ) fig += [pfit, pfit.error_band, *pfit.error_lines] # add these objects to fig msg = f"Generated a, b : {np.array([a,b])}"\ f"\nFitted a, b : {pfit.coefficients}"\ f"\nerrors on a, b : {pfit.coefficient_errors}"\ f"\nave point spread: :sigma :approx {pfit.data_sigma:.3f} in y units" msg = Text2D(msg, font='VictorMono', pos='bottom-left', c='red3') fig.add_label("y = a:dotx+b", c='k', marker='-', mc='red4') fig.add_label("ground truth", c='k', marker='--', mc='red5') fig.add_label("1:sigma error band", c='k', marker='s', mc='grey') fig.add_legend(pos=[1.07,1], vspace=2) show(fig, msg, zoom=1.1).close() vedo-2025.5.3/examples/pyplot/fit_polynomial2.py000066400000000000000000000036431474667405700215650ustar00rootroot00000000000000"""A polynomial fit of degree=""" from vedo import np, precision, Text3D, DashedLine, show from vedo.pyplot import plot, fit, histogram # np.random.seed(0) n = 25 # nr of data points to generate deg = 3 # degree of the fitting polynomial # Generate some noisy data points x = np.linspace(0, 12, n) y = (x-6)**3 /50 + 6 # the "truth" is a cubic function! xerrs = np.linspace(0.4, 1.0, n) # make last points less precise yerrs = np.linspace(1.0, 0.4, n) # make first points less precise noise = np.random.randn(n) # Plot the noisy points with their error bars fig1 = plot( x, y+noise, ".k", title=__doc__+str(deg), xerrors=xerrs, yerrors=yerrs, aspect=4/5, xlim=(-3,15), ylim=(-3,15), padding=0, ) fig1 += DashedLine(x, y, c='r') # Fit points and evaluate, with a bootstrap and Monte-Carlo technique, # the correct errors and error bands. Return a Line object: pfit = fit( [x, y+noise], deg=deg, # degree of the polynomial niter=500, # nr. of MC iterations to compute error bands nstd=2, # nr. of std deviations to display xerrors=xerrs, # optional array of errors on x yerrors=yerrs, # optional array of errors on y vrange=(-3,15), # specify the domain of fit ) fig1 += [pfit, pfit.error_band, pfit.error_lines] # add these objects to Figure # Add some text too txt = "fit coefficients:\n " + precision(pfit.coefficients, 2) \ + "\n:pm" + precision(pfit.coefficient_errors, 2) \ + "\n:Chi^2_:nu = " + precision(pfit.reduced_chi2, 3) fig1 += Text3D(txt, s=0.42, font='VictorMono').pos(4,-2).c('k') # Create a 2D histo to show the correlation of fit parameters fig2 = histogram( pfit.monte_carlo_coefficients[:,0], pfit.monte_carlo_coefficients[:,1], title="parameters correlation", xtitle='coeff_0', ytitle='coeff_1', cmap='ocean_r', scalarbar=True, ) show(fig1, fig2, N=2, sharecam=False, zoom='tight').close() vedo-2025.5.3/examples/pyplot/fonts3d.py000066400000000000000000000072071474667405700200360ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os from vedo import printc, Text2D, Text3D, show, Plotter from vedo import fonts, fonts_path, settings import numpy as np ################################################################################## 2D inred = Text2D( "°monospaced fonts are marked in red", c="r5", pos="bottom-center", font="VictorMono" ) acts2d = [inred] txt = "The quick fox jumps over the lazy dog. 1234567890 αβγδεθλμνπστφψω" for i, f in enumerate(fonts): bg = None if f in ["Calco", "Glasgo", "SmartCouric", "VictorMono"]: bg = "red5" t = Text2D(f"{f}: {txt}", pos=(0.015, 1 - (i + 3) * 0.06), font=f, s=1.3, c="k", bg=bg) acts2d.append(t) acts2d.append(Text2D("List of built-in fonts", pos="top-center", bg="k", s=1.3)) plt0a = show(acts2d, bg2="cornsilk", size=(1300, 800), interactive=False) ## online fonts: acts2d = [] i = 0 for key, props in sorted(settings.font_parameters.items()): if props["islocal"]: continue if key in ("Justino2", "Justino3"): continue bg = None if props["mono"]: bg = "red5" t = Text2D(f"{key}: {txt}", pos=(0.015, 1 - (i + 2) * 0.03), font=key, c="k", bg=bg) acts2d.append(t) i += 1 plt0b = show( acts2d, Text2D("Additional fonts (https://vedo.embl.es/fonts)", pos="top-center", bg="k"), bg2="lb", size=(1300, 1350), pos=(1200, 0), new=True, ) ################################################################################ printout for font in fonts: printc(font + " - available characters:", " " * 25, bold=1, invert=1) fontfile = os.path.join(fonts_path, font + ".npz") font_meshes = np.load(fontfile, allow_pickle=True)["font"][0] for k in font_meshes.keys(): printc(k, end=" ") print() printc("\n(use the above to copy&paste any char into your python script!)", italic=1) printc("Symbols ~ ^ _ are reserved modifiers:", italic=1) printc(" use ~ to add a short space, 1/4 of the default size,", italic=1) printc(" use ^ and _ to start up/sub scripting, space terminates them.\n", italic=1) ################################################################################## 3D # Symbols ~ ^ _ are reserved modifiers: # use ~ to add a short space, 1/4 of the default size, # use ^ and _ to start up/sub scripting, a space terminates them. txt = """The quick fox jumps over the lazy dog. Symbols: !@#$%&*()+=-{}[]:;|<>?/:euro1234567890 Units: :delta=0.25E-03 ~μm, T_sea ~=~5.3~±0.7~:circC LaTeX: :nabla:dotE=~4:pi~:rho, :nabla:timesE=~-1/c~~:partialB/:partialt ih~:partial/:partialt~:Psi = [-h^2 /2m:nabla^2 + V(r,t)]~:Psi(r,t) :DeltaE~=~h:nu, y = :Sigma_n ~A_n cos(:omega_n t+:delta_n ) sin(k_n x) :intx:dot~dx = :onehalf x:^2 + const. d^2 x^:mu + :Gamma^:mu_:alpha:beta ~dx^:alpha ~dx^:beta = 0 -∇:^2u(x) = f(x) in Ω, u(x)~=~u_D (x) in :partial:Omega """ plt = Plotter(N=4, pos=(300, 0), size=(1600, 950)) cam = dict( pos=(3.99e5, 8.51e3, 6.47e5), focal_point=(2.46e5, 1.16e5, -9.24e3), viewup=(-0.0591, 0.983, 0.175), distance=6.82e5, clipping_range=(5.26e5, 8.92e5), ) for i, fnt in enumerate(["Kanopus", "Normografo", "Theemim", "VictorMono"]): t = Text3D(txt, font=fnt, italic=0).c("darkblue").scale(12300) plt.at(i) plt.show( t, Text2D("Font: " + fnt, font=fnt, bg="r"), axes=dict( xtitle="my units for L_x (:mum)", ytitle="my Y-axis with:na long description", title_font=fnt, label_font=fnt, digits=2, ), camera=cam, resetcam=not bool(i), ) plt.interactive().close() plt0b.close() plt0a.close() vedo-2025.5.3/examples/pyplot/goniometer.py000066400000000000000000000012331474667405700206170ustar00rootroot00000000000000"""The 3D-ruler axes and a goniometer""" from vedo import * settings.use_parallel_projection = True # avoid parallax effects mesh = Cone().rotate_y(90).pos([1, 2, 3]) mesh.c("steelblue") # measure the angle formed by 3 points gon = Goniometer( [-0.5, 1, 2], [2.5, 2, 2], [-0.5, 3, 3], prefix=":alpha_c =~", lw=2, s=0.8 ) # show distance of any 2 points rul = Ruler3D( (-0.5, 2, 1.9), (2.5, 2, 2.9), prefix="L_x =", units="μm", axis_rotation=90, tick_angle=70, ) # make 3d rulers along the bounding box (similar to set axes=7) ax3 = RulerAxes(mesh, units="μm") show(mesh, gon, rul, ax3, __doc__, bg2="lb", viewup="z").close() vedo-2025.5.3/examples/pyplot/graph_lineage.py000066400000000000000000000017331474667405700212410ustar00rootroot00000000000000"""Generate a lineage graph of cell divisions""" # N.B.: no positions are specified here, only connectivity! from vedo import show from vedo.pyplot import DirectedGraph # Layouts: [2d, fast2d, clustering2d, circular, circular3d, cone, force, tree] #g = Graph(layout='2d', zrange=7) g = DirectedGraph(layout='cone') #g = DirectedGraph(layout='circular3d', height=1, radius=1.5) #g = DirectedGraph(layout='force') # Vertex generation is automatic, # add a child to vertex0, so that now vertex1 exists g.add_child(0, edge_label="Mother cell") g.add_child(1); g.add_child(1) g.add_child(2); g.add_child(2); g.add_child(2) g.add_child(3); g.add_child(3, edge_label="daughter_38") g.add_child(4); g.add_child(4) for i in range(7): g.add_child(5, node_label="cell5_"+str(i)) g.add_child(7); g.add_child(7); g.add_child(7) g.build() # optimize layout g[0].color('dg').lw(3) #0=graph, 1=vertexLabels, 2=edge_labels, 3=arrows g[2].color('dr') show(g, __doc__, axes=9, elevation=-40).close() vedo-2025.5.3/examples/pyplot/graph_network.py000066400000000000000000000031741474667405700213270ustar00rootroot00000000000000"""Visualize a 2D/3D network and its properties""" # (see also example: lineage_graph.py) from vedo import Points, show, sin from vedo.pyplot import DirectedGraph # Create some graph with nodes and edges # layouts: [2d, fast2d, clustering2d, circular, circular3d, cone, force, tree] g = DirectedGraph(layout='fast2d') ##################### Use networkx to create random nodes and edges # import networkx # G = networkx.gnm_random_graph(n=20, m=35) # for i, j in G.edges(): g.add_edge(j,i) ##################### Manually create nodes and edges for i in range(6): g.add_child(i) # add one child node to node i for i in range(3): g.add_child(i) for i in range(3): g.add_child(i) for i in range(7,9): g.add_child(i) for i in range(3): g.add_child(12) # add 3 children to node 12 g.add_edge(1,16) ##################### build and draw g.build() graph = g[0].linewidth(4) # get the vedo 3d graph lines nodes = graph.vertices # get the 3d points of the nodes pts = Points(nodes, r=10).lighting('off') v1 = ['node'+str(n) for n in range(len(nodes))] v2 = [sin(x) for x in range(len(nodes))] labs1 = pts.labels(v1, scale=.02, italic=True).shift(.05,0.02,0).c('green') labs2 = pts.labels(v2, scale=.02, precision=3).shift(.05,-.02,0).c('red') # Interpolate the node value to color the edges: graph.cmap('viridis', v2).add_scalarbar3d(c='k') graph.scalarbar.shift(0.15,0,0).use_bounds(True) pts.cmap('viridis', v2) # This would colorize the edges directly with solid color based on a v3 array: # v3 = [sin(x) for x in range(graph.ncells)] # graph.cmap('jet', v3).add_scalarbar() show(pts, graph, labs1, labs2, __doc__, zoom='tight').close() vedo-2025.5.3/examples/pyplot/histo_1d_a.py000066400000000000000000000001421474667405700204570ustar00rootroot00000000000000from vedo.pyplot import np, histogram data = np.random.randn(1000) histogram(data).show().close() vedo-2025.5.3/examples/pyplot/histo_1d_b.py000066400000000000000000000016541474667405700204710ustar00rootroot00000000000000"""Superimpose and compare histograms""" import numpy as np from vedo.pyplot import histogram from vedo import settings settings.remember_last_figure_format = True np.random.seed(0) theory = np.random.randn(500).tolist() backgr = ((np.random.rand(100)-0.5)*6).tolist() data = np.random.randn(500).tolist() + backgr # A first histogram: fig = histogram( theory + backgr, ylim=(0,90), title=__doc__, xtitle='measured variable', c='red4', gap=0, # no gap between bins padding=0, # no extra spaces label="theory", ) # Extract the 11th bin and color it purple fig[10].c('purple4') fig.add_label("special bin", marker='s', mc='purple4') # Add a second histogram to be superimposed fig += histogram(backgr, label='background') # Add the data histogram with poissonian errors fig += histogram(data, marker='o', errors=True, fill=False, label='data') fig.add_legend(s=0.8) fig.show(zoom='tight').close() vedo-2025.5.3/examples/pyplot/histo_1d_c.py000066400000000000000000000016071474667405700204700ustar00rootroot00000000000000"""Uniform distribution weighted by sin^2 12x + :onehalf""" import numpy as np from vedo import Line, settings from vedo.pyplot import histogram settings.default_font = "DejavuSansMono" data = np.random.rand(10000) weights = np.ones_like(data) * np.sin(12*data)**2 + 1/2 fig = histogram( data, weights=weights, bins=50, aspect=16/9, # desired aspect ratio of the figure xtitle=__doc__, # x-axis title padding=[0,0,0,0.1], # allow 10% padding space only on the top gap=0, # no gap between bins ac='k7', # axes color c='yellow9', label='my histogram', ) x = np.linspace(0,1, 200) y = 200*np.sin(12*x)**2 + 100 fig += Line(np.c_[x, y], c='red5', lw=3).z(0.001) fig.add_label('my function', marker='-', mc='red5') fig.add_legend(pos=[0.7,1.33], alpha=0.2) fig.show(size=(1000,700), bg='black', zoom='tight').close() vedo-2025.5.3/examples/pyplot/histo_1d_d.py000066400000000000000000000021401474667405700204620ustar00rootroot00000000000000"""Insert a Figure into another (note that the x-axes stay aligned)""" from vedo import Marker, settings, show, np from vedo.pyplot import histogram settings.default_font = "Ubuntu" data = np.random.normal(loc=100, size=1000) + 7 ################## Create the first Figure fig1 = histogram( data, bins=20, xlim=(95,111), aspect=16/9, xtitle="shifted gaussian", c='cyan3', ) # let's add an asterix marker where the mean is fig1 += Marker('a', [fig1.mean,150,0.1], s=8).c('orange5') ################## Create a second Figure fig2 = histogram( data - 7, bins=60, aspect=4/3, density=True, outline=True, c='purple9', axes=dict(xygrid=True, xyplane_color='grey2', xyalpha=1, grid_linewidth=0), label='finer binning', ) # let's add an asterix marker where the mean is fig2 += Marker('a', [fig2.mean,0.2,0.1], s=0.02).c('orange5') # shift fig2 in vertical by 25, and in z by 0.1 (to make it show on top) fig2.shift(0, 25, 0.1) ################## Insert fig2 into fig1 fig2.add_legend() fig1.insert(fig2) show(fig1, __doc__, zoom='tight', size=(1200,900)).close() vedo-2025.5.3/examples/pyplot/histo_1d_e.py000066400000000000000000000014401474667405700204650ustar00rootroot00000000000000"""Plot a histogram of the distance of each point of a sphere to the oceans mesh. The distance is used to threshold the sphere and create continents.""" from vedo import * from vedo.pyplot import histogram # Download the oceans mesh oceans = Mesh(dataurl + "oceans.vtk").c("blue9") size = oceans.average_size() # Create a sphere and compute the distance to the oceans mesh sphere = IcoSphere(subdivisions=5).scale(size*1.01) dists = sphere.distance_to(oceans) # Create a histogram of the distance histo = histogram(dists, logscale=True, c="gist_earth") histo+= Arrow2D([200,1], [200,0]).z(1).c("red5") # Threshold the sphere to create continents continents = sphere.threshold("Distance", above=20.0) continents.cmap("gist_earth").linewidth(1) show(oceans, continents, histo.clone2d(), __doc__) vedo-2025.5.3/examples/pyplot/histo_2d_a.py000066400000000000000000000011531474667405700204630ustar00rootroot00000000000000"""Histogram of 2 variables""" from vedo import Marker, Points, np from vedo.pyplot import histogram n = 10_000 x = np.random.randn(n) + 20 y = x + np.random.randn(n) + 10 xm, ym = np.mean(x), np.mean(y) histo = histogram( x, y, # this is interpreted as 2D bins=25, zlim=(0,150), # saturate color above 150 entries cmap='Blues_r', ztitle="Number of entries in bin", ) # Add a marker to the plot histo += Marker('*', s=0.2, c='r').pos(xm, ym, 0.2) # Add also the original points pts = np.array([x,y]).T histo += Points(pts, r=2).z(0.1) histo.show(zoom='tight', bg='light yellow').close() vedo-2025.5.3/examples/pyplot/histo_2d_b.py000066400000000000000000000010571474667405700204670ustar00rootroot00000000000000"""Histogram of 2 variables as 3D bars""" import numpy as np from vedo import Points, show from vedo.pyplot import histogram n = 1000 x = np.random.randn(n)*1.5 + 60 y = np.random.randn(n) + 70 histo = histogram( x, y, bins=(12, 10), cmap="summer", ztitle="Number of entries in bin", mode="3d", gap=0.0, zscale=0.4, # rescale the z axis aspect=16/9, ) print(histo.frequencies) # Add also the original points on top histo += Points(np.c_[x, y]).z(3).c("red5").point_size(4) show(histo, __doc__, elevation=-80).close() vedo-2025.5.3/examples/pyplot/histo_3d.py000066400000000000000000000010431474667405700201620ustar00rootroot00000000000000"""Histogram (or plot) in 3D. The size of each cube is proportional to the value at that point""" import numpy as np from vedo import Volume, Cube, Glyph, show # Make up some arbitrary data X, Y, Z = np.mgrid[:10, :6, :4] counts = 50 - ( (X-4)**2 + (Y-4)**2 + (Z-4)**2 ) # This is now a point cloud with an associated array of counts pcloud = Volume(counts).topoints() marker = Cube().scale(0.015) glyphed_pcl = Glyph(pcloud, marker, scale_by_scalar=True) glyphed_pcl.cmap('seismic').add_scalarbar('counts') show(glyphed_pcl, __doc__, axes=1) vedo-2025.5.3/examples/pyplot/histo_gauss.py000066400000000000000000000014361474667405700210040ustar00rootroot00000000000000"""Superimpose histograms and curves""" import numpy as np from vedo.pyplot import histogram, plot from vedo import settings settings.default_font = "Bongas" settings.remember_last_figure_format = True mu, sigma, n, bins = 100.0, 15.0, 600, 50 samples = np.random.normal(loc=mu, scale=sigma, size=n) x = np.linspace(min(samples), max(samples), num=50) y = 1/(sigma*np.sqrt(2*np.pi)) * np.exp( -(x-mu)**2 /(2*sigma**2)) dy = 1/np.sqrt(n) fig = histogram( samples, title=__doc__, bins=bins, density=True, c='cyan3', aspect=9/7, label="gaussian", ) fig += plot(x, y, "-", lc='orange5', label="some fit") fig += plot(x, y*(1+dy), "--", c='orange5', lw=2) fig += plot(x, y*(1-dy), "--", c='orange5', lw=2) fig.add_legend() fig.show(size=(800,700), zoom="tight").close() vedo-2025.5.3/examples/pyplot/histo_hexagonal.py000066400000000000000000000011001474667405700216140ustar00rootroot00000000000000from vedo import Latex, show from vedo.pyplot import histogram import numpy as np N = 2000 x = np.random.randn(N) * 1.0 y = np.random.randn(N) * 1.5 # hexagonal binned histogram: histo = histogram(x, y, bins=10, mode="hexbin", fill=True, cmap="terrain") # add a formula: f = r"f(x, y)=A \exp \left(-\left(\frac{\left(x-x_{o}\right)^{2}}" f += r"{2 \sigma_{x}^{2}}+\frac{\left(y-y_{o}\right)^{2}}" f += r"{2 \sigma_{y}^{2}}\right)\right)" formula = Latex(f, c="k", s=1.5) formula.rotate_x(90).rotate_z(90).pos([-4, -5, 2]) show(histo, formula, axes=1, viewup="z").close() vedo-2025.5.3/examples/pyplot/histo_manual.py000066400000000000000000000050471474667405700211410ustar00rootroot00000000000000"""Categories and repeats""" # manually create a plot by adding Rectangles to a Figure object from vedo import np, settings, Rectangle, Text3D, Line, DashedLine from vedo.pyplot import Figure settings.default_font = "Theemim" #################################################################### First plot groupA = np.random.randn(3)*10+50 groupB = np.random.randn(3)*10+60 groupC = np.random.randn(3)*10+70 fig = Figure( [-5,55], [-10,100], # x and y ranges xtitle='', ytitle='', # this disables x and y axes ) ################# x0 = 0 for i in range(3): x1 = x0 + 4 val= groupA[i] fig += Rectangle([x0,0], [x1, val], c=f'red{3+i*2}') x0 = x1 fig += Text3D("Group A", justify='center', c='k').pos(6,-7).scale(4) fig += Line([-1,0], [13, 0], lw=2) ################# x0 = 20 for i in range(3): x1 = x0 + 4 val= groupB[i] fig += Rectangle([x0,0], [x1, val], c=f'purple{3+i*2}') x0 = x1 fig += Text3D("Group B", justify='center', c='k').pos(26,-7).scale(4) fig += Line([19,0], [33, 0], lw=2) ################# x0 = 40 for i in range(3): x1 = x0 + 4 val= groupC[i] fig += Rectangle([x0,0], [x1, val], c=f'orange{3+i*2}') x0 = x1 fig += Text3D("Group C", justify='center', c='k').pos(46,-7).scale(4) fig += Line([39,0], [53, 0], lw=2) ################# fig += DashedLine([-2,50], [55,50], c='k3', lw=1) fig += Text3D("50%").pos(-7,49).scale(3).c('k') fig.show(size=(1000,700), zoom='tight', title=__doc__).clear() #################################################################### Second plot fig = Figure( [0, 100], [-20, 80], aspect=3/4, # can change the aspect ratio xtitle='', ytitle='', # this disables x and y axes ) for i in range(5): val = np.random.randn()*10+50 y0, y1 = 2*i, 2*i+1 fig += Rectangle([0,y0], [100,y1], radius=0.5, c='k6') fig += Rectangle([0,y0], [val,y1], radius=0.5, c='r4').z(1) fig += Text3D("Group A", justify='center', c='k').pos(50,-5).scale(2.5) for i in range(5): val = np.random.randn()*10+60 y0, y1 = 2*i + 20, 2*i+1 + 20 fig += Rectangle([0,y0], [100,y1], radius=0.5, c='k6') fig += Rectangle([0,y0], [val,y1], radius=0.5, c='p5').z(1) fig += Text3D("Group B", justify='center', c='k').pos(50,15).scale(2.5) for i in range(5): val = np.random.randn()*10+70 y0, y1 = 2*i + 40, 2*i+1 + 40 fig += Rectangle([0,y0], [100,y1], radius=0.5, c='k6') fig += Rectangle([0,y0], [val,y1], radius=0.5, c='o5').z(1) fig += Text3D("Group C", justify='center', c='k').pos(50,35).scale(2.5) fig.show(size=(1000,700), zoom='tight').close() vedo-2025.5.3/examples/pyplot/histo_pca.py000066400000000000000000000022231474667405700204200ustar00rootroot00000000000000"""Histogram along a PCA axis""" import numpy as np from vedo import Points, pca_ellipse, Arrow2D, Goniometer from vedo.pyplot import Figure, histogram data = np.random.randn(1000, 3) pts = Points(data).color('#1f77b4').ps(6) pts.scale([2,1,0.01]).rotate_z(45).shift(5,1) # rotate and shift! # Recover the rotation pretending we only know the points # Fit a 1-sigma ellipse to the points elli = pca_ellipse(pts) ec, e1, e2 = elli.center, elli.axis1, elli.axis2 arrow1 = Arrow2D(ec, ec - 3*e1) arrow2 = Arrow2D(ec, ec + 3*e2) angle = np.arctan2(e1[1], e1[0]) * 180/np.pi mypts = pts.clone() # rotate back to make the histo: mypts.shift(-ec).rotate_z(-angle) histo = histogram( # a Histogram1D(Figure) object mypts.points[:,1], # grab the y-values (PCA2) ytitle='', title=' ', # no automatic title, no y-axis c='#1f77b4', # color aspect=16/9, # aspect ratio ) histo.rotate_z(90 + angle).pos(ec - 6*e1) gon = Goniometer(ec-5.5*e1, ec, [ec[0]-5.5*e1[0], ec[1],0]).z(0.2) fig = Figure([0,14], [-4,9], aspect="equal", title=__doc__) fig += [pts, elli.z(-0.1), arrow1, arrow2, gon, histo] fig.show(zoom='tight').close() vedo-2025.5.3/examples/pyplot/histo_polar.py000066400000000000000000000023621474667405700207760ustar00rootroot00000000000000from vedo import Hyperboloid, show from vedo.pyplot import histogram import numpy as np np.random.seed(1) ################################################################## radhisto = histogram( np.random.rand(200)*6.28, mode='polar', title="random orientations", bins=10, c=range(10), #'orange', #uniform color alpha=0.8, labels=["label"+str(i) for i in range(10)], ) show(radhisto, at=0, N=2, axes=0, sharecam=False) ################################################################## hyp = Hyperboloid(res=20).cut_with_plane().rotate_y(-90) hyp.color('grey').alpha(0.3) # select 10 random indices of points on the surface idx = np.random.randint(0, hyp.npoints, size=10) radhistos = [] for i in idx: #generate a random histogram rh = histogram( np.random.randn(100), mode='polar', bins=12, r1=0.2, # inner radius phigap=1.0, # leave a space btw phi bars cmap='viridis_r', show_disc=False, show_angles=False, show_errors=False, ) rh.scale(0.15) # scale histogram to make it small rh.pos(hyp.points[i]) # set its position on the surface radhistos.append(rh) show(hyp, radhistos, at=1).interactive().close() vedo-2025.5.3/examples/pyplot/histo_spheric.py000066400000000000000000000005541474667405700213170ustar00rootroot00000000000000"""A uniform distribution on a plane is not uniform on a sphere""" import numpy as np from vedo.pyplot import histogram from vedo import Plotter phi = np.random.rand(1000)*np.pi*2 the = np.random.rand(1000)*np.pi h = histogram(the, phi, mode='spheric').add_scalarbar() plt = Plotter(axes=12).add_ambient_occlusion(0.05) plt.show(h, __doc__, viewup='z').close() vedo-2025.5.3/examples/pyplot/histo_violin.py000066400000000000000000000011071474667405700211550ustar00rootroot00000000000000from vedo import * from vedo.pyplot import violin import numpy as np n = 1000 acts = [ Text3D('gaussian', pos=(0,4.5), s=0.3, c='k', justify='center'), violin(np.random.randn(n)), Text3D('exponential', pos=(5,-1), s=0.3, c='k', justify='center'), violin(np.random.exponential(1, n), x=5, width=3, splined=False, centerline=False, c='t', lc='k'), Text3D('chisquare', pos=(10,11), s=0.3, c='k', justify='center'), violin(np.random.chisquare(9, n)/4, x=10, vlim=(0,10), c='lg', lc='dg'), ] show(acts, axes=dict(xtitle=False, ytitle='distribution')).close() vedo-2025.5.3/examples/pyplot/intersect2d.py000066400000000000000000000021671474667405700207040ustar00rootroot00000000000000"""Find the overlap area of 2 triangles""" from vedo import Mesh, precision, show import numpy as np verts1 = [(1.9, 0.50), (2.1, 0.8), (2.4, 0.4)] verts2 = [(2.3, 0.75), (1.7, 0.4), (2.1, 0.3)] faces = [(0,1,2)] m1 = Mesh([verts1, faces]).c('g').lw(4).wireframe() m2 = Mesh([verts2, faces]).c('b').lw(4).wireframe() a1 = precision(m1.area(),3) + " :mum:^2" a2 = precision(m2.area(),3) + " :mum:^2" fp1 = m1.flagpole('Triangle 1\nA=' + a1, point=(2.1,0.7), s=0.012, offset=(-0.3,0.04)) fp2 = m2.flagpole('Triangle 2\nA=' + a2, point=(1.9,0.4), s=0.012, offset=(0.2,-0.2)) m3 = m1.clone().wireframe(False).c('tomato').lw(0) zax = (0,0,1) v0,v1,v2 = np.insert(np.array(verts2), 2, 0, axis=1) m3.cut_with_plane(origin=v0, normal=np.cross(zax, v1-v0)) if m3.npoints: m3.cut_with_plane(origin=v1, normal=np.cross(zax, v2-v1)) if m3.npoints: m3.cut_with_plane(origin=v2, normal=np.cross(zax, v0-v2)) fp3 = m3.flagpole('Overlap polygon\nA=' + precision(m3.area(),3), point=(2.2,0.6), s=0.012) show(m1, m2, m3, fp1, fp2, fp3, __doc__, axes=1, size=(800,600), zoom=1.3).close() vedo-2025.5.3/examples/pyplot/isolines.py000066400000000000000000000021671474667405700203030ustar00rootroot00000000000000"""Draw the isolines and isobands of a scalar field H (height) on a surface""" from vedo import * mesh0 = ParametricShape('RandomHills') # ParametricShapes already have a scalar associated to points printc('Mesh point arrays:', mesh0.pointdata.keys()) # so assign it a colormap: mesh0.cmap('terrain') isol = mesh0.isolines(n=10).color('w') isob = mesh0.isobands(n=5).add_scalarbar("H=Elevation") # make a copy and interpolate the Scalars from points to cells mesh1 = mesh0.clone().map_points_to_cells() printc('Mesh cell arrays :', mesh1.celldata.keys()) gvecs = mesh1.gradient(on='cells') cc = mesh1.cell_centers().coordinates ars = Arrows(cc, cc + gvecs*0.01, c='bone_r').lighting('off') ars.add_scalarbar3d(title='|:nablaH|:dot0.01 [arb.units]') # colormap the gradient magnitude directly on the mesh mesh2 = mesh1.clone().cmap('jet', mag(gvecs), on='cells') mesh2.add_scalarbar3d(title='|:nablaH| [arb.units]') plt = Plotter(N=4, size=(1200,900), axes=11) plt.at(0).show(mesh0, isol, __doc__) plt.at(1).show(isob) plt.at(2).show(mesh1, isol, ars, "Arrows=:nablaH") plt.at(3).show(mesh2, "Color=|:nablaH|") plt.interactive().close() vedo-2025.5.3/examples/pyplot/latex.py000066400000000000000000000012161474667405700175650ustar00rootroot00000000000000from vedo import Latex # https://matplotlib.org/tutorials/text/mathtext.html latex1 = r'x= \frac{ - b \pm \sqrt {b^2 - 4ac} }{2a}' latex2 = r'\mathcal{A}\mathrm{sin}(2 \omega t)' latex3 = r'I(Y | X)=\sum_{x \in \mathcal{X}, y \in \mathcal{Y}} p(x, y) \log \left(\frac{p(x)}{p(x, y)}\right)' latex4 = r'\Gamma_{\epsilon}(x)=\left[1-e^{-2 \pi \epsilon}\right]^{1-x} \prod_{n=0}^{\infty} \frac{1-\exp (-2 \pi \epsilon(n+1))}{1-\exp (-2 \pi \epsilon(x+n))}' ltx = Latex(latex4, s=1, c='darkblue', bg='', usetex=False, res=40) ltx.crop(0.3, 0.3) # crop top and bottom 30% ltx.pos([2,0,0]) ltx.show(axes=8, size=(1400,700), bg2='lb', zoom='tight').close() vedo-2025.5.3/examples/pyplot/lines_intersect.py000066400000000000000000000016101474667405700216400ustar00rootroot00000000000000"""Find the intersection points of two coplanar lines""" import numpy as np from vedo import * p1, p2 = (-1,-1,0), (10,2,0) x = np.linspace(0,10, 50) y = np.sin(x)*4 pts = np.c_[x,y] # create 2 lines and assign some arbitrary rotations line1 = Spline(pts).lw(5).c('black').rotate_y(10).rotate_x(15) line2 = Line(p1,p2).lw(5).c('green').rotate_y(10).rotate_x(15) # make a small extrusion of line1 and intersect it with line2: ds = line1.diagonal_size()*0.02 # 1% tolerance pint = line1.extrude(ds).shift(0,0,-ds/2).intersect_with_line(line2) ps = Points(pint, r=15).c('red') # lets fill the convex area between the first 2 hits: id0 = line1.closest_point(pint[0], return_point_id=True) id1 = line1.closest_point(pint[1], return_point_id=True) msh = Line(line1.points[id0:id1]).triangulate().lw(0).shift(0,0,-0.01) show(line1, line2, ps, msh, __doc__+f"\narea = {msh.area()} cm:^2", axes=1).close() vedo-2025.5.3/examples/pyplot/markers.py000066400000000000000000000006371474667405700201220ustar00rootroot00000000000000"""Markers set, analogous to matplotlib""" from vedo import Plotter, Marker, Text3D symbols = ['.','o','O', '0', 'p','*','h','D','d','v','^','>','<','s', 'x', 'a'] plt = Plotter(size=(1500,300)) plt += __doc__ for i,s in enumerate(symbols): plt += Marker(s, filled=True).x(i*0.6).backcolor('blue5') plt += Text3D(s, pos=[i*0.6,-0.6,0], s=0.12, literal=True, font="Calco") plt.show(zoom='tight').close() vedo-2025.5.3/examples/pyplot/markpoint.py000066400000000000000000000006571474667405700204640ustar00rootroot00000000000000"""Lock an object orientation to constantly face the scene camera""" from vedo import * sp = Sphere().wireframe() verts = sp.vertices tx1 = Text3D("Fixed Text", verts[10], s=0.07, depth=0.1, c="lb") tx2 = Text3D("Follower Text", verts[144], s=0.07, c="lg") tx2.follow_camera() fp = sp.flagpole("The\nNorth Pole", c='k6', rounded=True) fp = fp.scale(0.4).follow_camera() show(sp, tx1, tx2, fp, __doc__, bg='bb', axes=1).close() vedo-2025.5.3/examples/pyplot/np_matrix.py000066400000000000000000000010541474667405700204510ustar00rootroot00000000000000"""Visualize a n:dotm numpy matrix""" from vedo.pyplot import matrix from vedo import show import numpy as np n, m = (6, 5) M = np.eye(n, m)/2 + np.random.randn(n, m)*0.1 # print(M) mat = matrix( M, cmap='Reds', title='My numpy Matrix', xtitle='Genes of group A', ytitle='Genes of group B', xlabels=[f'hox{i}' for i in range(m)], ylabels=[f'bmp{i}' for i in range(n)], scale=0.15, # size of bin labels; set it to 0 to remove labels lw=2, # separator line width ) show(mat, __doc__, bg='k7', zoom=1.2).close() vedo-2025.5.3/examples/pyplot/pie_chart.py000066400000000000000000000006361474667405700204130ustar00rootroot00000000000000from vedo import settings, show from vedo.pyplot import pie_chart settings.default_font = "Komika" title = "A pie chart plot" fractions = [0.1, 0.2, 0.3, 0.1, 0.3] colors = [ 1, 2, 3, 4, 'white'] labels = ["stuff_1 ", "stuff_2 ", "comp^A ", "comp^B ", ""] pc = pie_chart(fractions, c=colors, labels=labels, title=title) pc2d = pc.clone2d("top-left", size=0.975, ontop=False) show(pc2d).close() vedo-2025.5.3/examples/pyplot/plot_bars.py000066400000000000000000000016621474667405700204420ustar00rootroot00000000000000# A plot(mode="bars") example. Useful to plot categories. from vedo import precision, Text3D, color_map, settings from vedo.pyplot import plot settings.default_font = "Meson" counts = [1946, 8993, 3042, 1190, 1477, 0, 0] percent = [11.68909178, 54.01850072, 18.27246516, 7.14800577, 8.87193657, 0, 0] labels = ['<100', '100-250', '250-500', '500-750', '750-1000', '1000-2000', '>2000'] colors = color_map(range(len(counts)), "hot") # plot() will return a PlotBars object fig = plot( [counts, labels, colors], mode="bars", ylim=(0,10_000), aspect=16/9, title='Clusters in lux range', axes=dict( xlabel_rotation=30, xlabel_size=0.02, ), ) for i in range(len(percent)): val = precision(percent[i], 3)+'%' txt = Text3D(val, pos=(fig.centers[i], counts[i]), justify="bottom-center").c("blue2") fig += txt.scale(200).shift(0,170,0) fig.show(size=(1000,750), zoom='tight').close() vedo-2025.5.3/examples/pyplot/plot_density2d.py000066400000000000000000000014531474667405700214160ustar00rootroot00000000000000"""Density plot from a distribution of points in 2D""" import numpy as np from vedo import * settings.use_depth_peeling = True n = 10000 p = np.random.normal(0, 0.3, (n,2)) p[:int(n*1/3) ] += [1.0, 0.0] # shift 1/3 of the points along x by 1 p[ int(n*2/3):] += [1.7, 0.4] # create the point cloud pts = Points(p).color('k', 0.2) # radius of local search can be specified (None=automatic) vol = pts.density(radius=None).cmap('Paired_r') # returns a Volume # Other cool color mapping: Set1_r, Dark2. Or you can build your own, e.g.: # vol.c(['w','w','y','y','r','r','g','g','b','k']).alpha([0,1]) r = precision(vol.metadata['radius'], 2) # retrieve automatic radius value vol.add_scalarbar3d(title='Density (counts in r_search ='+r+')', c='k', italic=1) show([(pts,__doc__), vol], N=2, axes=True).close() vedo-2025.5.3/examples/pyplot/plot_density3d.py000066400000000000000000000011071474667405700214130ustar00rootroot00000000000000"""Density plot from a distribution of points in 3D""" import numpy as np from vedo import * settings.use_depth_peeling = True n = 3000 p = np.random.normal(7, 0.3, (n,3)) p[:int(n*1/3) ] += [1,0,0] # shift 1/3 of the points along x by 1 p[ int(n*2/3):] += [1.7,0.4,0.2] pts = Points(p, alpha=0.5) vol = pts.density() # density() returns a Volume vol.cmap('Dark2').alpha([0.1,1]) r = precision(vol.metadata['radius'][0], 2) # retrieve automatic radius value vol.add_scalarbar3d(title=f'Density (counts in r_s ={r})', italic=1) show(pts, vol, __doc__, axes=True).close() vedo-2025.5.3/examples/pyplot/plot_density4d.py000066400000000000000000000020061474667405700214130ustar00rootroot00000000000000# Plot a volume evolution in time # Credits: https://github.com/edmontz import numpy as np from scipy.fftpack import fftn, fftshift from vedo import Axes, Plotter, Volume, progressbar def f(x, y, z, t): r = np.sqrt(x*x + y*y + z*z + 2*t*t) + 0.1 return np.sin(9*np.pi * r)/r n = 64 qn = 25 vol = np.zeros((n, n, n)) n1 = int(n/2) plt = Plotter(bg="black", interactive=False) axes = Axes(xrange=(0,n), yrange=(0,n), zrange=(0,n)) plt.show(axes, viewup='z') for q in progressbar(range(qn), c='r'): t = 2 * q / qn - 1 for k in range(n1): z = 2 * k / n1 - 1 for j in range(n1): y = 2 * j / n1 - 1 for i in range(n1): x = 2 * i / n1 - 1 vol[i, j, k] = f(x, y, z, t) volf = fftn(vol) volf = fftshift(abs(volf)) volf = np.log(12*volf/volf.max()+ 1) / 2.5 volb = Volume(volf) volb.mode(1).cmap("rainbow").alpha([0, 0.8, 1]) volb.name = "MyVolume" plt.remove("MyVolume").add(volb).render() plt.interactive().close() vedo-2025.5.3/examples/pyplot/plot_empty.py000066400000000000000000000020311474667405700206400ustar00rootroot00000000000000"""Create an empty Figure to be filled in a loop Any 3D Mesh object can be added to the figure!""" from vedo import * from vedo.pyplot import plot, Figure settings.default_font = "Cartoons123" settings.palette = 2 settings.remember_last_figure_format = True # Create an empty Figure and plot on it fig = Figure( xlim=(0,12), ylim=(-1.5, 1.5), padding=0, # no extra space aspect=16/9, # desired aspect ratio xtitle="speed [mph]", grid=True, axes=dict(axes_linewidth=3, xyframe_line=3), ) for i in range(2,11,2): x = np.linspace(0, 4*np.pi, 20) y = np.sin(x) * np.sin(x/12) * i/5 fig += plot(x, y, '-0', c=i, splined=True) fig += Arrow([5,-1], [8,-1], s=0.5, c='green3') # Add any number of polygonal Meshes. # Use insert() to preserve the object aspect ratio inside the Figure coord system: mesh = Mesh(dataurl+'cessna.vtk').c('blue5').scale(0.25).pos(4, 0.5, 0.5) circle = Circle([5,0.5,-0.1], r=0.5, c='orange5') fig.insert(mesh, circle) show(fig, __doc__, size=(800,700), zoom='tight').close() vedo-2025.5.3/examples/pyplot/plot_errband.py000066400000000000000000000025331474667405700211260ustar00rootroot00000000000000"""Plotting functions with error bands""" from vedo import np, Rectangle, Text3D, Marker, Line from vedo.pyplot import plot # Make up same dummy data x = np.arange(0, 6, 0.05) y = 2+2*np.sin(2*x)/(x+1) ye= y**2 / 10 miny = np.min(y-ye) idx = np.argmax(y) # Plot the two variables, return a Plot(Assembly) object: fig = plot( x, y, yerrors=ye, xtitle='time in :museconds', ytitle='y oscillation [a.u.]', ylim=(0.5, 5), aspect=5/3, # plot aspect ratio (xsize/ysize) error_band=True, # join errors on y into an error band lc="red2", # line color ec="red7", # error band color padding=0, # no extra spaces around the content grid=0, # no background grid axes=dict(axes_linewidth=2, xyframe_line=0), ) # Add a grey transparent rectangle to represent an exclusion region: fig += Rectangle([1,0.5], [2.7,5], c='grey5').lighting('off') # Add some text (set z=2 so it stays on top): fig += Text3D("Excluded\ntime range!", s=0.2, c='k', font="Quikhand").rotate_z(20).pos(1.3,3.6) # Add a star marker at maximum of function (set z=0.1, so it stays on top): fig += Marker('*', c='blue4').pos(x[idx], y[idx], 0.1) # Add a dashed line to indicate the minimum fig += Line((x[0], miny), (x[-1], miny)).pattern('- . -').lw(3) fig.show(zoom='tight', mode='image', size=(900,600)).close() vedo-2025.5.3/examples/pyplot/plot_errbars.py000066400000000000000000000021731474667405700211510ustar00rootroot00000000000000"""Superpose plots in different styles""" from vedo.pyplot import plot from vedo import np, settings settings.default_font = 'Theemim' settings.remember_last_figure_format = True x = np.linspace(0, 10, num=21) y = 3 * np.sin(x) ################# first plot fig = plot( x, y, "*r-", # markers: *,o,p,h,D,d,v,^,s,x,a title=__doc__, xtitle="t variable (:mus)", ytitle="y(x) = :pmK_i :dot:sqrtsin^2 t", aspect=16/9, # aspect ratio x/y of plot xlim=(-1, 14), # specify x range axes=dict(text_scale=1.2), label="3 :dot sin(x)", ) ################# plot on top of fig fig += plot( x + np.pi, y, "sb--", like=fig, # format like fig splined=True, # continuous spline through points lw=3, # line width label="3 :dot sin(x - :pi)", ) ################## plot again on top of fig fig += plot(x, y/5, "g", label="3/5 :dot sin(x)") ################## plot again on top of fig fig += plot(x, y/5-1, "purple5 -", label="3/5 :dot sin(x) - 1") ################## Show! ################## fig.add_legend(pos=[0.95,1]) fig.show(size=(1400,900), zoom='tight').close() vedo-2025.5.3/examples/pyplot/plot_extra_yaxis.py000066400000000000000000000035141474667405700220510ustar00rootroot00000000000000"""Add a secondary y-axis for units conversion""" from vedo import np, settings, dataurl, Mesh, show from vedo.pyplot import plot, Figure settings.annotated_cube_texts = ['front','back','left','right','top','bttm'] x0, x1 = [0.3, 2.0] x = np.linspace(x0, x1, num=50) # The main plot fig1 = plot( x, 1000*np.cos(x+1), xlim=[x0, x1], ylim=[-1000, 250], aspect=16/9, padding=0, # do not mess up with margins title="Wing pull vs position", xtitle="Distance from airplane axis [m]", ytitle="N [Kg*m/s^2 ]", axes=dict( xygrid_transparent=False, xygrid_color='k7', xyalpha=1, xyplane_color='w', yhighlight_zero=True, ), ) # fig1copy = fig1.clone2d("bottom-right") # can make it 2d (on screen) # This empty Figure just creates a new y-axis in red fig2 = Figure( fig1.xlim, # same as fig1 fig1.ylim * 7.236, # units conversion factor aspect=fig1.aspect, # same as fig1 padding=fig1.padding, # same as fig1 xtitle='', # don't draw the x-axis! ytitle='Poundal [lb*ft/s^2 ]', axes=dict( # extra options for y-axis number_of_divisions=10, yshift_along_x=1, # shift 100% to the right ylabel_offset=-1, ylabel_justify="center-left", ytitle_position=0.5, ytitle_justify="top-center", axes_linewidth=3, c='red3', ), ) fig1.rotate_x(90).rotate_z(90).shift(-0.5, 0, 1) fig2.rotate_x(90).rotate_z(90).shift(-0.5, 0, 1) msh = Mesh(dataurl+"cessna.vtk") cam = dict( # press C to get these values pos=(3.899, -0.4781, 1.157), focal_point=(-0.1324, 0.9041, 0.3530), viewup=(-0.1725, 0.06857, 0.9826), ) show(msh, fig1, fig2, __doc__, axes=5, camera=cam, bg2='lb').close() vedo-2025.5.3/examples/pyplot/plot_fxy1.py000066400000000000000000000025061474667405700204000ustar00rootroot00000000000000'''Draw a z = f(x,y) surface specified as a string or as a reference to an external function. Red points indicate where the function does not exist!''' from vedo import dataurl, sin, cos, log, show, Text2D from vedo.pyplot import plot doc = Text2D(__doc__, pos='bottom-left', c='darkgreen', font='Quikhand') ############################################################### REAL def f(x, y): return sin(2*x*y) * cos(3*y)/2 f1 = plot(f, c='summer') # use a colormap # red dots are shown where the function does not exist (y>x): def f(x, y): return sin(3*x) * log(x-y)/3 f2 = plot(f, texture=dataurl+'textures/paper3.jpg') # specify x and y ranges and z vertical limits: def f(x, y): return log(x**2+y**2-1) f3 = plot( f, xlim=[-2,2], ylim=[-1,8], zlim=[-1,None], texture=dataurl+'textures/paper1.jpg', ) show([(f1, 'y = sin(2*x*y) * cos(3*y) /2', doc), (f2, 'y = sin(3*x)*log(x-y)/3'), (f3, 'y = log(x**2+y**2-1)'), ], N=3, sharecam=False, ).close() ############################################################## COMPLEX comment = """Vertical axis shows the real part of complex z: z = sin(log(x:doty)) Color map the value of the imaginary part (green=positive, purple=negative)""" plt = plot(lambda x,y: sin(log(x*y))/25, mode='complex', bins=(51,51)) show(plt, comment, viewup='z').close() vedo-2025.5.3/examples/pyplot/plot_fxy2.py000066400000000000000000000054531474667405700204050ustar00rootroot00000000000000"""Draw a z = BesselJ(x,y) surface with a custom color map and a custom scalar bar with labels in radians""" import numpy as np from scipy import special from scipy.special import jn_zeros from vedo import ScalarBar3D, Line, show, settings from vedo.colors import color_map, build_lut from vedo.pyplot import plot Nr = 1 Nθ = 3 settings.default_font = "Theemim" settings.interpolate_scalars_before_mapping = False axes_opts = dict( xtitle="x", ytitle="y", ztitle="|f(x,y)|", xlabel_rotation=90, ylabel_rotation=90, zlabel_rotation=90, xtitle_rotation=90, ytitle_rotation=90, zaxis_rotation=45, ztitle_offset=0.03, ) def custom_lut_surface(name, vmin=0, vmax=1, N=256): # Create a custom look-up-table for the surface table = [] x = np.linspace(vmin, vmax, N) for i in range(N): rgb = color_map(i, name, 0, N-1) table.append([x[i], rgb]) return build_lut(table) def custom_table_scalarbar(name): # Create a custom table of colors and labels for the scalarbar table = [] x = np.linspace(-np.pi,np.pi, 401) labs = ["-:pi" , "-3:pi/4", "-:pi/2", "-:pi/4", "0", "+:pi/4", "+:pi/2", "+3:pi/4","+:pi"] for i in range(401): rgb = color_map(i, name, 0, 400) if i%50 == 0: table.append([x[i], rgb, 1, labs[i//50]]) else: table.append([x[i], rgb]) return table, build_lut(table) ###################################################################### def f(x, y): d2 = x**2 + y**2 if d2 > 1: return np.nan else: r = np.sqrt(d2) θ = np.arctan2(y, x) kr = jn_zeros(Nθ, 4)[Nr] return special.jn(Nθ, kr * r) * np.exp(1j * Nθ * θ) p1 = plot( lambda x,y: np.abs(f(x,y)), xlim=[-1, 1], ylim=[-1, 1], bins=(100, 100), show_nan=False, axes=axes_opts, ) # Unpack the 0-element (the surface of the plot) to customize it msh = p1[0].lighting('glossy') pts = msh.points # get the points zvals = pts[:,2] # get the z values θvals = [np.angle(f(*p[:2])) for p in pts] # get the phases lut = custom_lut_surface("hsv", vmin=-np.pi, vmax=np.pi) msh.cmap(lut, θvals) # apply the color map table, lut = custom_table_scalarbar("hsv") line = Line((1,-1), (1,1)) # a dummy line to attach the scalarbar to line.cmap("hsv", [0, 1]) scbar = ScalarBar3D( line, title=f"N_r ={Nr}, N_θ ={Nθ}, phase :theta in radians", label_rotation=90, categories=table, c='black', ) # convert the scalarbar to a 2D object and place it to the bottom scbar = scbar.clone2d([-0.6,-0.7], size=0.2, rotation=-90, ontop=True) # Set a specific camera position and orientation (shift-C to see it) cam = dict( position=(3.88583, 0.155949, 3.88584), focal_point=(0, 0, 0), viewup=(-0.7, 0, 0.7), distance=5.4, ) show(p1, scbar, __doc__, camera=cam).close() vedo-2025.5.3/examples/pyplot/plot_hexcells.py000066400000000000000000000012641474667405700213200ustar00rootroot00000000000000"""3D Bar plot of a TOF camera with hexagonal pixels""" from vedo import * import numpy as np settings.default_font = "Glasgo" settings.use_parallel_projection = True vals = np.abs(np.random.randn(4*6)) # pixel heights cols = color_map(vals, "summer") k = 0 items = [__doc__] for i in range(4): for j in range(6): val, col= vals[k], cols[k] x, y, z = [i+j%2/2, j/1.155, val+0.01] zbar= Polygon([x,y,0], nsides=6, r=0.55, c=col).extrude(val) line= Polygon([x,y,z], nsides=6, r=0.55, c='k').wireframe().lw(2) txt = Text3D(f"{i}/{j}", [x,y,z],s=0.15, c='k', justify='center') items += [zbar, line, txt] k += 1 show(items, axes=7) vedo-2025.5.3/examples/pyplot/plot_multi.py000066400000000000000000000010311474667405700206330ustar00rootroot00000000000000"""Use of plot() function analogous to matplotlib""" from vedo import * from vedo.pyplot import plot x = np.linspace(0, 5, 10) fig1 = plot(x, x*x, 'sg-', title='Plot1: y=x*x') fig2 = plot(x, cos(x), '*r--', title='Plot2: y=cos(x)') fig3 = plot(x, sqrt(x),'Db-', title='Plot3: y=sqrt(x)') fig4 = plot(x, sin(x), '*t--', title='Plot4: y=sin(x)') # window shape can be expressed as "n/m" or "n|m" plt = show( fig1, fig2, fig3, fig4, shape="3|1", sharecam=False, size=(1300,900), zoom='tight', ) plt.interactive().close() vedo-2025.5.3/examples/pyplot/plot_pip.py000066400000000000000000000015551474667405700203040ustar00rootroot00000000000000"""Picture in picture plotting""" from vedo import np, settings, show from vedo.pyplot import plot settings.default_font = 'Theemim' def f(x): return 3*np.exp(-x)*np.cos(2*x)**2 xa = np.arange(0, 0.5, 0.01) xb = np.arange(0, 4.0, 0.01) # Build first figure: fig1 = plot( xa, f(xa), title=__doc__, xtitle='time in seconds', ytitle='Intensity [a.u.]', ) # Build second figure w/ options for axes: fig2 = plot( xb, f(xb), title='3 e^-x cos 2x**2 (wider range)', xtitle=' ', ytitle=' ', # leave empty c='red5', axes=dict( xyplane_color='#dae3f0', grid_linewidth=0, # make it solid xyalpha=1, # make it opaque text_scale=2, # make text bigger ) ) # Scale fig to make it smaller fig2.scale(0.04).shift(0.05, 0.75) fig1.insert(fig2) ############# insert show(fig1, zoom='tight').close() vedo-2025.5.3/examples/pyplot/plot_polar.py000066400000000000000000000011121474667405700206160ustar00rootroot00000000000000"A splined polar plot" from vedo import * from vedo.pyplot import plot angles = vector([ 0, 20, 60, 160, 200, 250, 300, 340]) distances = vector([0.1, 0.2, 0.3, 0.5, 0.6, 0.4, 0.2, 0.1]) dn1 = plot(angles, distances, mode='polar', deg=True, splined=True, fill=True, c='green', bc='k', alpha=0.7, title=__doc__, vmax=0.65) dn2 = plot(angles+120, distances**2, mode='polar', deg=True, splined=True, fill=True, c='red', alpha=1, vmax=0.65) dn2.z(0.01) # set a positive z so it stays in front show(dn1, dn2, zoom=1.2, bg='k9').close() vedo-2025.5.3/examples/pyplot/plot_spheric.py000066400000000000000000000013721474667405700211460ustar00rootroot00000000000000"""Surface plotting in spherical coordinates Spherical harmonic function is: Y(l=2, m=0) = 3 :dot cos:^2:theta - 1 (red points are made NaN on purpose)""" from vedo import * from vedo.pyplot import plot import numpy as np def rhofunc(theta, phi): if theta < 0.2: return np.nan # make some points invalid #return cos(theta)**2 # Y(l=1 m=0) return (3*cos(theta)**2 - 1)**2 # Y(l=2 m=0) #return (5*cos(theta)**3 - 3*cos(theta))**2 # Y(l=3 m=0) # Build the plot, # return an Assembly of 3 meshes, the unit # grid sphere, the surface rho(theta, phi) and # the red Points where rho is a complex number: spl = plot(rhofunc, mode='spheric', cmap='viridis') show(spl, __doc__, axes=12, viewup='z').close() vedo-2025.5.3/examples/pyplot/plot_stream.py000066400000000000000000000013221474667405700207770ustar00rootroot00000000000000"""Plot streamlines for the 2D field: u(x,y) = -1 - x:^2 + y v(x,y) = 1 + x - y:^2 """ from vedo import Points, settings, show from vedo.pyplot import streamplot import numpy as np settings.default_font = "DejavuSansMono" # a grid with a vector field (U,V): X, Y = np.mgrid[-5:5 :15j, -4:4 :15j] U = -1 - X**2 + Y V = 1 + X - Y**2 # optionally, pick some random points as seeds: prob_pts = np.random.rand(200, 2)*8 - [4,4] sp = streamplot( X,Y, U,V, lw=2, # line width in pixel units direction='forward', # 'both' or 'backward' probes=prob_pts, cmap='viridis', ) sp.add_scalarbar() pts = Points(prob_pts).ps(5).c('white') show(sp, pts, __doc__, axes=1, bg='bb').close() vedo-2025.5.3/examples/pyplot/quiver.py000066400000000000000000000003741474667405700177670ustar00rootroot00000000000000"""A simple quiver plot""" from vedo import Grid, Arrows2D, show # Create displacements pts1 = Grid(s=[1.0,1.0]).points pts2 = Grid(s=[1.2,1.2]).rotate_z(4).points quiv = Arrows2D(pts1, pts2).c("red5") show(quiv, __doc__, axes=1, zoom=1.2).close() vedo-2025.5.3/examples/pyplot/run_all.sh000077500000000000000000000004271474667405700200740ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo for f in *.py do echo "Processing $f script.." python3 $f done vedo-2025.5.3/examples/pyplot/scatter1.py000066400000000000000000000006151474667405700202000ustar00rootroot00000000000000"""A simple scatter plot""" from vedo import show from vedo.pyplot import plot import numpy as np x = np.random.randn(100) + 10 y = np.random.randn(100) * 20 + 20 fig = plot( x, y, lw=0, # do not join points with lines xtitle="variable x", ytitle="variable y", marker="*", # marker style mc="dr", # marker color ) show(fig, __doc__, zoom='tight').close() vedo-2025.5.3/examples/pyplot/scatter2.py000066400000000000000000000024401474667405700201770ustar00rootroot00000000000000# Scatter plot of a gaussian distribution # with varying color and point sizes from vedo import Text2D, Plotter from vedo.pyplot import plot import numpy as np n = 500 x = np.random.randn(n) y = np.random.randn(n) # Define what size must have each marker: marker_sizes = np.sin(2*x)/8 # Define a (r,g,b) list of colors for each marker: marker_cols = np.c_[np.cos(2*x), np.zeros(n), np.zeros(n)] txt0 = Text2D("A scatter plot of a\n2D gaussian distribution") fig0 = plot( x, y, lw=0, # no joining of lines marker="*", # marker style xtitle="variable A", ytitle="variable B", grid=False, ) txt1 = Text2D("marker size proportional to sin(2x) ") fig1 = plot( x, y, lw=0, marker="*", ms=marker_sizes, # VARIABLE marker sizes mc='purple5', # same fixed color for markers grid=False, ) txt2 = Text2D("marker size proportional to sin(2x)\nred level proportional to cos(2x)") fig2 = plot( x, y, lw=0, marker=">", ms=marker_sizes, # VARIABLE marker sizes mc=marker_cols, # VARIABLE marker colors grid=False, ) plt = Plotter(N=3, size=(1800,500)) plt.at(0).show(fig0, txt0) plt.at(1).show(fig1, txt1) plt.at(2).show(fig2, txt2, zoom=1.2) plt.interactive().close() vedo-2025.5.3/examples/pyplot/scatter3.py000066400000000000000000000020161474667405700201770ustar00rootroot00000000000000"""Create a scatter plot to overlay three different distributions""" from vedo import * from numpy.random import randn ### first cloud in blue, place it at z=0: x = randn(2000) * 3 y = randn(2000) * 2 xy = np.c_[x, y] pts1 = Points(xy).z(0.0).color("blue5",0.5) bra1 = Brace([-7, -8], [7, -8], comment="whole population", s=0.4).c("blue5") ### second cloud in red x = randn(1200) + 4 y = randn(1200) + 2 xy = np.c_[x, y] pts2 = Points(xy).z(0.1).color("red",0.5) bra2 = Brace( [8, 2, 0.3], [6, 5, 0.3], comment="red zone", angle=180, justify="bottom-center", c="red5", ) ### third cloud with a black marker x = randn(20) + 4 y = randn(20) - 4 mark = Marker("*", s=0.25) pts3 = Glyph(xy, mark).z(0.2).color("red5",0.5) bra3 = Brace([8, -6], [8, -2], comment="my stars").z(0.3) # some text message msg = Text3D("preliminary\nresults!", font="Quikhand", s=1.5).c("black") msg.rotate_z(20).pos(-10, 3, 0.2) show( pts1, pts2, pts3, msg, bra1, bra2, bra3, __doc__, axes=1, zoom=1.2, mode="image", ).close() vedo-2025.5.3/examples/pyplot/scatter_large.py000066400000000000000000000006741474667405700212760ustar00rootroot00000000000000"""Scatter plot of 1M points with assigned colors and transparencies. Use mouse to zoom, press r to reset, press p to increase point size.""" from vedo import * N = 1000000 x = np.random.rand(N) y = np.random.rand(N) RGBA = np.c_[x*255, y*255, np.zeros(N), y*255] pts = np.array([x,y]).T pts = Points(pts).point_size(1) pts.pointcolors = RGBA # use mouse to zoom, press r to reset show(pts, __doc__, axes=1, mode="RubberBandZoom").close() vedo-2025.5.3/examples/pyplot/triangulate2d.py000066400000000000000000000006451474667405700212220ustar00rootroot00000000000000"""Triangulate arbitrary line contours in 2D. The contours may be concave, and even contain holes.""" from vedo import Star, merge, show # let's create two bidimensional contour lines s1 = Star(line=True, n=9) s2 = Star(line=True, n=5, r1=0.3, r2=0.4).x(0.12) # merge the 2 lines and triangulate the inner region sm = merge(s1, s2).triangulate().c('lightsalmon').lw(1) show([(s1,s2,__doc__), sm], N=2, axes=8).close() vedo-2025.5.3/examples/pyplot/whiskers.py000066400000000000000000000027041474667405700203120ustar00rootroot00000000000000"""Whisker plot with quantiles indication (horizontal line shows the mean value)""" from vedo import np, settings, Axes, Brace, Line, Ribbon, show from vedo.pyplot import whisker settings.default_font = "Theemim" # build some theoretical expectation to be shown as a grey band x = np.linspace(-1, 9, 100) y = x/5 + 0.2*np.sin(x) ye= y**2/5 + 0.1 # error on y line = Line(np.c_[x, y]) band = Ribbon(np.c_[x, y-ye], np.c_[x, y+ye]).c('black',0.1) # create 5 whisker bars with some random data ws = [] for i in range(5): xval = i*2 # position along x axis data = xval/5 + 0.2*np.sin(xval) + np.random.randn(25) w = whisker(data, bc=i, s=0.5).x(xval) ws.append(w) # print(i, 'whisker:\n', w.info) # build braces to inndicate stats significance and dosage bra1 = Brace([0, 3],[2, 3], comment='*~*', s=0.7, style='[') bra2 = Brace([4,-1],[8,-1], comment='dose > 3~:mug/kg', s=0.4) # build custom axes axes = Axes(xrange=[-1,9], yrange=[-3,5], htitle=':beta_c expression: change in time', xtitle=' ', ytitle='Level of :beta_c protein in :muM/l', x_values_and_labels=[(0,'Experiment^A\n at t=1h'), (4,'Experiment^B\n at t=2h'), (8,'Experiment^C\n at t=4h'), ], xlabel_size=0.02, xygrid=False, ) show(ws, bra1, bra2, line, band, __doc__, axes, zoom=1.3).close() vedo-2025.5.3/examples/run_all.sh000077500000000000000000000030251474667405700165420ustar00rootroot00000000000000#!/bin/bash # cd basic; ./run_all.sh; cd .. cd advanced; ./run_all.sh; cd .. cd simulations; ./run_all.sh; cd .. cd volumetric; ./run_all.sh; cd .. cd pyplot; ./run_all.sh; cd .. cd other; ./run_all.sh; cd .. # other/dolfin if python3 -c 'import pkgutil; exit(not pkgutil.find_loader("dolfin"))'; then cd other/dolfin; ./run_all.sh; cd ../.. else echo 'dolfin not found, skip.' fi # other/trimesh if python3 -c 'import pkgutil; exit(not pkgutil.find_loader("trimesh"))'; then cd other/trimesh; ./run_all.sh; cd ../.. else echo 'trimesh not found, skip.' fi ################################# command line tests echo '---------------------------- command line tests' echo vedo vedo echo '----------------------------' echo vedo ../data/2*.vtk vedo ../data/2*.vtk echo '----------------------------' echo vedo ../data/2*.vtk vedo -ni -k glossy ../data/2*.vtk echo '----------------------------' echo vedo -s "../data/2??.vtk" vedo -s ../data/2??.vtk echo '----------------------------' echo vedo ../data/embryo.tif vedo ../data/embryo.tif echo '----------------------------' echo vedo -g ../data/embryo.slc vedo -g ../data/embryo.slc echo '----------------------------' echo vedo --slicer2d ../data/embryo.tif vedo --slicer2d ../data/embryo.tif echo '----------------------------' echo vedo --slicer3d ../data/embryo.tif vedo --slicer3d ../data/embryo.tif echo '----------------------------' echo vedo --eog ../data/uv_grid.jpg vedo --eog ../data/uv_grid.jpg vedo-2025.5.3/examples/simulations/000077500000000000000000000000001474667405700171165ustar00rootroot00000000000000vedo-2025.5.3/examples/simulations/airplane1.py000066400000000000000000000010541474667405700213440ustar00rootroot00000000000000"""Draw the shadow and trailing line of a moving object.""" from vedo import * world = Box(size=(30,15,8)).wireframe() airplane = Mesh(dataurl+"cessna.vtk").c("green") airplane.pos(-15, 2.0, 0.15) airplane.add_trail(n=100).add_shadow('z', -4) plt = Plotter(interactive=False) plt.show(world, airplane, __doc__, viewup="z") for t in np.arange(0, 3.2, 0.04): pos = (9*t-15, 2-t, sin(3-t)) # make up some movement airplane.pos(pos).rotate_x(t) airplane.update_trail() airplane.update_shadows() plt.render() plt.interactive().close() vedo-2025.5.3/examples/simulations/airplane2.py000066400000000000000000000013711474667405700213470ustar00rootroot00000000000000"""Draw the shadows and trailing lines of 2 planes.""" from vedo import * world = Box([0,0,0], 30, 16, 8).wireframe() plane1 = Mesh(dataurl+"cessna.vtk").c("green") plane1.add_trail(n=100) plane1.add_shadow('z', -4).add_shadow('y', 8) plane2 = plane1.clone().c("tomato") plane2.add_trail(n=100) plane2.add_shadow('z', -4).add_shadow('y', 8) # Setup the scene plt = Plotter(interactive=False) plt.show(world, plane1, plane2, __doc__, viewup="z") for t in np.arange(0, 3.2, 0.04): plane1.pos(9*t-15, 2-t, sin(3-t)).rotate_x(0+t) # make up some movement plane2.pos(8*t-15, t-2, sin(t-3)).rotate_x(2-t) # for the 2 planes plane1.update_trail().update_shadows() plane2.update_trail().update_shadows() plt.render() plt.interactive().close() vedo-2025.5.3/examples/simulations/aspring1.py000066400000000000000000000022751474667405700212220ustar00rootroot00000000000000"""Simulation of a block connected to a spring in a viscous medium""" from vedo import * L = 0.1 # spring x position at rest x0 = 0.85 # initial x-coordinate of the block k = 25 # spring constant m = 20 # block mass b = 0.5 # viscosity friction (proportional to velocity) dt = 0.15 # time step v = vector(0, 0, 0.2) # initial conditions x = vector(x0, 0, 0) x0 = vector(-0.8, 0, 0) xr = vector(L, 0, 0) def loop_func(event): global v, x F = -k * (x - xr) - b * v # force and friction a = F / m # acceleration v = v + a*dt # velocity x = x + v*dt + 1/2 * a * dt**2 # position block.pos(x) # update block position and trail spr = Spring(x0, x, r1=0.06, thickness=0.01) plt.remove("Spring").add(spr).render() block = Cube(pos=x, side=0.2).color("tomato") spring = Spring(x0, x, r1=0.06, thickness=0.01) plt = Plotter(size=(1050, 600)) plt += Box(pos=(0, -0.1, 0), size=(2.0, 0.02, 0.5)) # floor plt += Box(pos=(-0.82, 0.15, 0), size=(0.04,0.50,0.3)) # wall plt += [block, spring, __doc__] plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show().close() vedo-2025.5.3/examples/simulations/aspring2_player.py000066400000000000000000000031321474667405700225700ustar00rootroot00000000000000"""Animation of a block attached to a spring""" from vedo import * from vedo.applications import AnimationPlayer L = 0.1 # spring x position at rest x0 = 0.85 # initial x-coordinate of the block k = 20 # spring constant m = 20 # block mass b = 5 # viscosity friction (proportional to velocity) dt = 0.15 # time step v = vector(0, 0, 0.3) # initial conditions x = vector(x0, 0, 0) xr = vector(L, 0, 0) x0 = vector(-0.8, 0, 0) # Pre-compute the trajectory of the block and store it in a list. history_x = [] for i in range(200): F = -k * (x - xr) - b * v # force and friction a = F / m # acceleration v = v + a * dt # velocity x = x + v * dt + 1/2 * a * dt**2 # position history_x.append(x) # Create the objects to be shown in the animation floor = Box(pos=(0, -0.1, 0), size=(2.0, 0.02, 0.5)).c('yellow2') wall = Box(pos=(-0.82, 0.15, 0), size=(0.04, 0.50, 0.3)).c('yellow2') block = Cube(pos=x, side=0.2).c("tomato") spring= Spring(x0, x, r1=0.05, thickness=0.005) text = Text2D(font="Calco", c='white', bg='k', alpha=1, pos='top-right') # Create the animation player and it's callback function def update_scene(i: int): # update block and spring position at frame i block.pos(history_x[i]) spring = Spring(x0, history_x[i], r1=0.05, thickness=0.005) text.text(f"Frame number {i}\nx = {history_x[i][0]:.4f}") plt.remove("Spring").add(spring).render() plt = AnimationPlayer(update_scene, irange=[0,200], loop=True) plt += [floor, wall, block, spring, text, __doc__] plt.set_frame(0) plt.show() plt.close() vedo-2025.5.3/examples/simulations/brownian2d.py000066400000000000000000000102041474667405700215320ustar00rootroot00000000000000"""Simple demo to illustrate the motion of a Big brownian particle in a swarm of small particles in 2D motion. The spheres collide elastically with themselves and with the walls of the box. The masses of the spheres are proportional to their radius**3 (as in 3D)""" # Adapted by M. Musy from E. Velasco (2009) from vedo import * import random screen_w = 800 screen_h = 800 # Constants and time step Nsp = 200 # Number of small spheres Rb = screen_w / 32 # Radius of the big sphere Rs = Rb * 0.43 # Radius of small spheres Ms = (Rs / Rb) ** 3 # Mass of the small spheres (Mbig=1) Dt = 0.03 # Time step LBox = (screen_w / 2, screen_h / 2) # Size of the box = 2LBox[0].2LBox[1] Lb0 = LBox[0] - Rb Lb1 = LBox[1] - Rb Ls0 = LBox[0] - Rs Ls1 = LBox[1] - Rs # Create the arrays with the initial positions of the spheres. # Start with the big sphere at the center, then put the small # spheres at random selected from a grid of possible positions. ListPos = [(0, 0)] PossiblePos = [ (x, y) for x in np.arange(-LBox[0] + 2 * Rs, LBox[0] - 2 * Rs, 2.2 * Rs) for y in np.arange(-LBox[1] + 2 * Rs, LBox[1] - 2 * Rs, 2.2 * Rs) if x * x + y * y > Rb + Rs ] if Nsp > len(PossiblePos) + 1: Nsp = len(PossiblePos) + 1 for s in range(Nsp - 1): n = random.randint(0, len(PossiblePos) - 1) ListPos.append(PossiblePos[n]) del PossiblePos[n] Pos = np.array(ListPos) # Create an array with all the radius and a list with all the masses Radius = np.concatenate((np.array([Rb]), np.array([Rs] * (Nsp - 1)))) Mass = [1.0] + [Ms] * (Nsp - 1) # Create the initial array of velocities at random with big sphere at rest ListVel = [(0.0, 0.0)] for s in range(1, Nsp): ListVel.append((Rb * random.uniform(-1, 1), Rb * random.uniform(-1, 1))) Vel = np.array(ListVel) plt = Plotter(size=(screen_w, screen_h), interactive=0) plt += Grid(s=[screen_w,screen_w]) plt.show(zoom='tight') # Auxiliary variables Id = np.identity(Nsp) Dij = (Radius + Radius[:, np.newaxis]) ** 2 # Matrix Dij=(Ri+Rj)**2 # The main loop for i in progressbar(500, c="r"): # Update all positions np.add(Pos, Vel * Dt, Pos) # Fast version of Pos = Pos + Vel*Dt # Impose the bouncing at the walls if Pos[0, 0] <= -Lb0: Pos[0, 0] = -Lb0 Vel[0, 0] = -Vel[0, 0] elif Pos[0, 0] >= Lb0: Pos[0, 0] = Lb0 Vel[0, 0] = -Vel[0, 0] elif Pos[0, 1] <= -Lb1: Pos[0, 1] = -Lb1 Vel[0, 1] = -Vel[0, 1] elif Pos[0, 1] >= Lb1: Pos[0, 1] = Lb1 Vel[0, 1] = -Vel[0, 1] for s in range(1, Nsp): if Pos[s, 0] <= -Ls0: Pos[s, 0] = -Ls0 Vel[s, 0] = -Vel[s, 0] elif Pos[s, 0] >= Ls0: Pos[s, 0] = Ls0 Vel[s, 0] = -Vel[s, 0] elif Pos[s, 1] <= -Ls1: Pos[s, 1] = -Ls1 Vel[s, 1] = -Vel[s, 1] elif Pos[s, 1] >= Ls1: Pos[s, 1] = Ls1 Vel[s, 1] = -Vel[s, 1] # Create the set of all pairs and the list the colliding spheres Rij = Pos - Pos[:, np.newaxis] Mag2ij = np.add.reduce(Rij * Rij, -1) # sphere-to-sphere distances**2 colliding = np.less_equal(Mag2ij, Dij) - Id hitlist = np.sort(np.nonzero(colliding.flat)[0]).tolist() # Check to see if the spheres are colliding for ij in hitlist: s1, s2 = divmod(ij, Nsp) # decode the spheres pair (s1,s2) colliding hitlist.remove(s2 * Nsp + s1) # remove symmetric (s2,s1) pair from list R12 = Pos[s2] - Pos[s1] nR12 = np.linalg.norm(R12) d12 = Radius[s1] + Radius[s2] - nR12 tau = R12 / nR12 DR0 = d12 * tau x1 = Mass[s1] / (Mass[s1] + Mass[s2]) x2 = 1 - x1 # x2 = Mass[s2]/(Mass[s1]+Mass[s2]) Pos[s1] -= x2 * DR0 Pos[s2] += x1 * DR0 DV0 = 2 * dot(Vel[s2] - Vel[s1], tau) * tau Vel[s1] += x2 * DV0 Vel[s2] -= x1 * DV0 spheres = Points(Pos).c("blue4").point_size(20) if not int(i) % 20: # every 20 steps: rsp = [Pos[0][0], Pos[0][1], 0] trace = Points(rsp).c("red").point_size(4) plt.add(trace) # leave a point trace spheres.name = "particles" plt.remove("particles").add(spheres).render() plt.interactive().close() vedo-2025.5.3/examples/simulations/doubleslit.py000066400000000000000000000040231474667405700216350ustar00rootroot00000000000000"""Simulation of the double slit experiment. (Any number of slits of any geometry can be added) Slit sources are placed on the plane shown as a thin grid""" # Can simulate the 'Arago spot', the bright point at the center of # a circular object shadow (https://en.wikipedia.org/wiki/Arago_spot). from vedo import * ######################################### lambda1 = 680e-9 # red wavelength 680nm width = 10e-6 # slit width in m D = 0.1 # screen distance in m ######################################### # create the slits as a set of individual coherent point-like sources n = 10 # nr of elementary sources in slit (to control precision). slit1 = list(zip([0]*n, np.arange(0,n)*width/n, [0]*n)) # source points inside slit1 slit2 = list(slit1 + np.array([1e-5, 0, 0])) # a shifted copy of slit 1 slits = slit1 + slit2 # slits += list(slit1 + array([-2e-5, 1e-5, 0])) # add another copy of slit1 # slits = [(cos(x)*4e-5, sin(x)*4e-5, 0) for x in arange(0,2*np.pi, .1)] # Arago spot # slits = Grid(s=[1e-4,1e-4], res=[9,9]).points # a square lattice screen = Grid(pos=[0, 0, -D], s=[0.1,0.1], lw=0, res=[200,50]).wireframe(False) # Compute the image on the far screen k = 0.0 + 1j * 2 * np.pi / lambda1 # complex wave number norm = len(slits) * 5e5 amplitudes = [] verts = screen.points for i, x in enumerate(verts): psi = 0 for s in slits: r = mag(x - s) psi += np.exp(k * r) / r psi2 = np.real(psi * np.conj(psi)) # psi squared amplitudes.append(psi2) verts[i] = x + [0, 0, psi2 / norm] screen.cmap("hot", amplitudes) plt = Plotter(title="The Double Slit Experiment", axes=9, bg="black") plt += [screen, __doc__] plt += Points(np.array(slits) * 200).color("w") # slits scale magnified by factor 200 plt += Grid(s=[0.1,0.1], res=[6,6],).color("w",0.1) plt += Line([0, 0, 0], [0, 0, -D],).color("w",0.1) plt += Text3D("source plane", pos=[-0.04, -0.05, 0], s=0.002).c("gray") plt += Text3D("detector plane D = "+str(D)+" m", pos=[-.04,-.05,-D+.001], s=.002).c("gray") plt.show(zoom=1.15).close() vedo-2025.5.3/examples/simulations/drag_chain.py000066400000000000000000000013601474667405700215470ustar00rootroot00000000000000"""Forward kinematics: hover the mouse to drag the chain""" from vedo import Plotter, versor, Plane, Line n = 15 # number of points l = 3 # length of one segment def func(evt): if not evt.object: return coords = line.points coords[0] = evt.picked3d for i in range(1, n): v = versor(coords[i] - coords[i-1]) coords[i] = coords[i-1] + v * l line.points = coords # update positions nodes.points = coords plt.render() surf = Plane(s=[60, 60]) line = Line([l*n/2, 0], [-l*n/2, 0], res=n, lw=12) line.render_lines_as_tubes() nodes= line.clone().c('red3').point_size(15) plt = Plotter() plt.add_callback("on mouse move please call", func) plt.show(surf, line, nodes, __doc__, zoom=1.3) plt.close() vedo-2025.5.3/examples/simulations/fourier_epicycles.py000066400000000000000000000045601474667405700232100ustar00rootroot00000000000000"""Fourier 2D shape reconstruction with epicycles representation""" # Original version from D. Shiffman (2019), adapted for vedo by M. Musy (2022) # https://thecodingtrain.com/CodingChallenges/130.2-fourier-transform-drawing.html import numpy as np import vedo order = 20 # restrict to this nr of fourier coefficients in reconstruction def DFT(x): X = [] N = len(x) for freq in range(N): re, im = [0, 0] for n in range(N): phi = (2 * np.pi * freq * n) / N re += x[n] * np.cos(phi) im -= x[n] * np.sin(phi) re, im = [re/N, im/N] amp = np.sqrt(re*re + im*im) phase = np.arctan2(im, re) X.append([re, im, freq, amp, phase]) return vedo.utils.sort_by_column(X, 3, invert=True) def epicycles(time, rotation, fourier, order): global objs plt.remove(objs) x, y = [0, 0] objs, path = [], [] for i in range(len(fourier[:order])): re, im, freq, amp, phase = fourier[i] if amp > 0.2: c = vedo.Circle([x,y], amp).wireframe().lw(1) objs.append(c) x += amp * np.cos(freq * time + phase + rotation) y += amp * np.sin(freq * time + phase + rotation) path.append([x,y]) if len(points)>0: hline = vedo.Line([x,y], points[-1]).c('red5').lw(1) pline = vedo.Line(path).c('green5').lw(2) oline = vedo.Line(points).c('red4').lw(5) objs += [hline, pline, oline] plt.add(objs).render() return [x, y] # Load some 2D shape and make it symmetric shaper = vedo.Assembly(vedo.dataurl+'timecourse1d.npy')[55] # shaper = shape.clone().mirror('x').reverse() shapel = vedo.Line(np.flip(shaper.clone().mirror('x').coordinates, axis=0)) shape = vedo.merge(shaper, shapel) x, y, _ = shape.points.T # Compute Fourier Discrete Transform in x and y separately: fourierX = DFT(x) fourierY = DFT(y) vedo.settings.default_font = 'Glasgo' plt = vedo.Plotter(size=(1500,750), bg='black', axes=1, interactive=False) txt = vedo.Text2D(f"{__doc__} (order={order})", c='red9', bg='white', pos='bottom-center') plt.show(shape, txt, mode='image', zoom=1.9) objs, points = [], [] times = np.linspace(0, 2*np.pi, len(fourierX), endpoint=False) for time in times: x, _ = epicycles(time, 0, fourierX, order) _, y = epicycles(time, np.pi/2, fourierY, order) points.append([x, y]) plt.interactive().close() vedo-2025.5.3/examples/simulations/gas.py000066400000000000000000000112621474667405700202440ustar00rootroot00000000000000"""A model of an ideal gas with hard-sphere collisions""" ## Based on gas.py by Bruce Sherwood for a cube as a container ## Slightly modified by Andrey Antonov for a torus. ## Adapted by M. Musy for vedo from random import random import numpy as np from vedo import Plotter, mag, versor, Torus, Spheres from vedo.addons import ProgressBarWidget ############################################################# Natoms = 400 # change this to have more or fewer atoms Nsteps = 200 # nr of steps in the simulation Matom = 4e-3 / 6e23 # helium mass Ratom = 0.025 RingThickness = 0.3 # thickness of the toroid RingRadius = 1 k = 1.4e-23 # Boltzmann constant T = 300 # room temperature dt = 1.5e-5 ############################################################ def reflection(p, pos): n = versor(pos) return np.dot(np.identity(3) - 2 * n * n[:, np.newaxis], p) plt = Plotter(title="gas in toroid", interactive=False) plt += __doc__ plt += Torus(r1=RingRadius, r2=RingThickness).c("green",0.1).wireframe(True) poslist = [] plist, mlist, rlist = [], [], [] mass = Matom pavg = np.sqrt(2.0 * mass * 1.5 * k * T) # average kinetic energy p**2/(2mass) = (3/2)kT colors = np.random.rand(Natoms) for i in range(Natoms): alpha = 2 * np.pi * random() x = RingRadius * np.cos(alpha) * 0.9 y = RingRadius * np.sin(alpha) * 0.9 z = 0 theta = np.pi * random() phi = 2 * np.pi * random() px = pavg * np.sin(theta) * np.cos(phi) py = pavg * np.sin(theta) * np.sin(phi) pz = pavg * np.cos(theta) poslist.append((x, y, z)) plist.append((px, py, pz)) mlist.append(mass) rlist.append(np.abs(Ratom + Ratom*np.random.rand() / 2)) pos = np.array(poslist) poscircle = pos p = np.array(plist) m = np.array(mlist) m.shape = (Natoms, 1) radius = np.array(rlist) r = pos - pos[:, np.newaxis] # all pairs of atom-to-atom vectors ds = (p / m) * (dt / 2.0) if "False" not in np.less_equal(mag(ds), radius).tolist(): pos = pos + (p / mass) * (dt / 2.0) # initial half-step pbw = ProgressBarWidget(Nsteps) plt += pbw plt.show() for it in range(Nsteps): # Update all positions ds = mag((p / m) * (dt / 2.0)) if "False" not in np.less_equal(ds, radius).tolist(): pos = pos + (p / m) * dt r = pos - pos[:, np.newaxis] # all pairs of atom-to-atom vectors rmag = np.sqrt(np.sum(np.square(r), -1)) # atom-to-atom scalar distances hit = np.less_equal(rmag, radius + radius[:, None]) - np.identity(Natoms) hitlist = np.sort(np.nonzero(hit.flat)[0]).tolist() # i,j encoded as i*Natoms+j # If any collisions took place: for ij in hitlist: i, j = divmod(ij, Natoms) # decode atom pair hitlist.remove(j * Natoms + i) # remove symmetric j,i pair from list ptot = p[i] + p[j] mi = m[i, 0] mj = m[j, 0] vi = p[i] / mi vj = p[j] / mj ri = Ratom rj = Ratom a = mag(vj - vi) ** 2 if a == 0: continue # exactly same velocities b = 2 * np.dot(pos[i] - pos[j], vj - vi) c = mag(pos[i] - pos[j]) ** 2 - (ri + rj) ** 2 d = b ** 2 - 4.0 * a * c if d < 0: continue # something wrong; ignore this rare case deltat = (-b + np.sqrt(d)) / (2.0 * a) # t-deltat is when they made contact pos[i] = pos[i] - (p[i] / mi) * deltat # back up to contact configuration pos[j] = pos[j] - (p[j] / mj) * deltat mtot = mi + mj pcmi = p[i] - ptot * mi / mtot # transform momenta to cm frame pcmj = p[j] - ptot * mj / mtot rrel = versor(pos[j] - pos[i]) pcmi = pcmi - 2 * np.dot(pcmi, rrel) * rrel # bounce in cm frame pcmj = pcmj - 2 * np.dot(pcmj, rrel) * rrel p[i] = pcmi + ptot * mi / mtot # transform momenta back to lab frame p[j] = pcmj + ptot * mj / mtot pos[i] = pos[i] + (p[i] / mi) * deltat # move forward deltat in time pos[j] = pos[j] + (p[j] / mj) * deltat # Bounce off the boundary of the torus for j in range(Natoms): poscircle[j] = versor(pos[j]) * RingRadius * [1, 1, 0] outside = np.greater_equal(mag(poscircle - pos), RingThickness - 2 * Ratom) for k in range(len(outside)): if outside[k] == 1 and np.dot(p[k], pos[k] - poscircle[k]) > 0: p[k] = reflection(p[k], pos[k] - poscircle[k]) # then update positions of display objects outside = np.greater_equal(mag(pos), RingRadius + RingThickness) pbw.update() # update progress bar plt.remove("Spheres").add(Spheres(pos, r=radius, c='b6')) plt.render().reset_camera().azimuth(0.5) plt.interactive().close() vedo-2025.5.3/examples/simulations/grayscott.py000066400000000000000000000056251474667405700215170ustar00rootroot00000000000000# ----------------------------------------------------------------------------- # From Numpy to Python # Copyright (2017) Nicolas P. Rougier - BSD license # More information at https://github.com/rougier/numpy-book # https://www.labri.fr/perso/nrougier/from-python-to-numpy/code/gray_scott.py # Parameters from http://www.aliensaint.com/uo/java/rd # Adapted for vedo by Marco Musy (2020) # ----------------------------------------------------------------------------- """Grey-Scott reaction-diffusion system""" import numpy as np from vedo import Plotter, Grid # --------------------------------------------------------------- Nsteps = 300 n = 200 # grid subdivisions #Du, Dv, F, k, name = 0.16, 0.08, 0.035, 0.065, 'Bacteria 1' #Du, Dv, F, k, name = 0.14, 0.06, 0.035, 0.065, 'Bacteria 2' #Du, Dv, F, k, name = 0.16, 0.08, 0.060, 0.062, 'Coral' #Du, Dv, F, k, name = 0.19, 0.05, 0.060, 0.062, 'Fingerprint' #Du, Dv, F, k, name = 0.10, 0.10, 0.018, 0.050, 'Spirals' #Du, Dv, F, k, name = 0.12, 0.08, 0.020, 0.050, 'Spirals Dense' #Du, Dv, F, k, name = 0.10, 0.16, 0.020, 0.050, 'Spirals Fast' #Du, Dv, F, k, name = 0.16, 0.08, 0.020, 0.055, 'Unstable' #Du, Dv, F, k, name = 0.16, 0.08, 0.050, 0.065, 'Worms 1' #Du, Dv, F, k, name = 0.16, 0.08, 0.054, 0.063, 'Worms 2' Du, Dv, F, k, name = 0.16, 0.08, 0.035, 0.060, 'Zebrafish' # --------------------------------------------------------------- Z = np.zeros((n+2, n+2), [('U', np.double), ('V', np.double)]) U, V = Z['U'], Z['V'] u, v = U[1:-1, 1:-1], V[1:-1, 1:-1] r = 20 u[...] = 1.0 U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50 V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25 u += 0.05*np.random.uniform(-1, 1, (n, n)) v += 0.05*np.random.uniform(-1, 1, (n, n)) sy, sx = V.shape grd = Grid(s=[sx,sy], res=[sx,sy]) grd.linewidth(0).wireframe(False).lighting(ambient=0.5) formula = r'(u,v)=(D_u\cdot\Delta u -u v v+F(1-u), D_v\cdot\Delta v +u v v -(F+k)v)' print('Du, Dv, F, k, name =', Du, Dv, F, k, name) def loop_func(event): global u, v for _ in range(25): Lu = ( U[0:-2, 1:-1] + U[1:-1, 0:-2] - 4*U[1:-1, 1:-1] + U[1:-1, 2:] + U[2: , 1:-1]) Lv = ( V[0:-2, 1:-1] + V[1:-1, 0:-2] - 4*V[1:-1, 1:-1] + V[1:-1, 2:] + V[2: , 1:-1]) uvv = u*v*v u += Du*Lu - uvv + F*(1-u) v += Dv*Lv + uvv - (F+k)*v grd.cmap('ocean_r', V.ravel(), on='cells', name="escals") grd.map_cells_to_points() # interpolate cell data to point data z = grd.pointdata['escals']*25 newverts = grd.points.copy() # get the original points newverts[:,2] = z # assign z elevation grd.points = newverts # update the mesh points plt.render() plt = Plotter(bg='linen') plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show(grd, __doc__, zoom=1.25, elevation=-30) plt.close() vedo-2025.5.3/examples/simulations/gyroscope1.py000066400000000000000000000045771474667405700216000ustar00rootroot00000000000000"""Simulation of a gyroscope hanging from a spring""" # (adapted by M. Musy from Bruce Sherwood, 2009) from vedo import * # ############################################################ parameters dt = 0.005 # time step ks = 15 # spring stiffness Lrest = 1 # unstretched length of spring Ls = 1 # length of gyroscope shaft M = 1 # mass of gyroscope (massless shaft) R = 0.4 # radius of gyroscope rotor omega = 50 # angular velocity of rotor (rad/s, not shown) gpos = vector(0, 0, 0) # initial position of spring free end # ############################################################ inits top = vector(0, 2, 0) # where top of spring is held precess = vector(0, 0, 0) # initial momentum of center of mass Fgrav = vector(0, -M * 9.81, 0) gaxis = vector(0, 0, 1) # initial orientation of gyroscope gaxis = versor(gaxis) I = 1 / 2 * M * R ** 2 # moment of inertia of gyroscope Lrot = I * omega * gaxis # angular momentum cm = gpos + 0.5 * Ls * gaxis # center of mass of shaft # ############################################################ the scene plt = Plotter() plt += __doc__ shaft = Cylinder([[0, 0, 0], Ls * gaxis], r=0.03).c("dark green") rotor = Cylinder([(Ls - 0.55) * gaxis, (Ls - 0.45) * gaxis], r=R).c("tomato") gyro = shaft + rotor # group meshes into a single one of type Assembly spring = Spring(top, gpos, r1=0.06, thickness=0.01).c("gray") plt += [gyro, spring] # add it to Plotter. plt += Box(top, length=0.2, width=0.02, height=0.2).c("gray") plt += Box(pos=(0, 0.5, 0), length=2.6, width=3, height=2.6).wireframe().c("gray",0.2) # ############################################################ the physics def loop_func(event): global t, Lrot, precess, cm, gpos t += dt Fspring = -ks * versor(gpos - top) * (mag(gpos - top) - Lrest) torque = cross(-1/2 * Ls * versor(Lrot), Fspring) # torque about center of mass Lrot += torque * dt precess += (Fgrav + Fspring) * dt # momentum of center of mass cm += (precess / M) * dt gpos = cm - 1/2 * Ls * versor(Lrot) # set orientation along gaxis and rotate it around its axis by omega*t degrees gyro.reorient([0,0,1], Lrot, rotation=omega*t, rad=True).pos(gpos) spring = Spring(top, gpos, r1=0.06, thickness=0.01).c("gray") plt.remove("Spring").add(spring) plt.render() t = 0 plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show().close() vedo-2025.5.3/examples/simulations/hanoi3d.py000066400000000000000000000041011474667405700210110ustar00rootroot00000000000000"""Demo to show how to solve the Tower of Hanoi""" # Credits: # https://github.com/gjbex/training-material/blob/master/Misc/Notebooks/hanoi.ipynb # Creative Commons Zero v1.0 Universal licence from vedo import Plotter, Cylinder, Box from copy import deepcopy class Hanoi: def __init__(self, nr_disks): self._nr_disks = nr_disks self._towers = [list(range(nr_disks, 0, -1)), list(), list()] @property def nr_disks(self): return self._nr_disks @property def nr_moves(self): return 2**self.nr_disks - 1 @property def towers(self): return deepcopy(self._towers) def tower(self, n): return self._towers[n].copy() def move_disk(self, from_tower, to_tower): disk = self._towers[from_tower].pop() self._towers[to_tower].append(disk) return disk, from_tower, to_tower def move_disks(self, n, from_tower, to_tower): if n == 1: yield self.move_disk(from_tower, to_tower) else: helper = 3 - from_tower - to_tower yield from self.move_disks(n - 1, from_tower, helper) yield self.move_disk(from_tower, to_tower) yield from self.move_disks(n - 1, helper, to_tower) def moves(self): yield from self.move_disks(self.nr_disks, 0, 1) nr_disks = 5 hanoi = Hanoi(nr_disks) tower_states = list([hanoi.towers]) for _ in hanoi.moves(): tower_states.append(hanoi.towers) disks = { hanoi.nr_disks - i : Cylinder(r=0.2*(hanoi.nr_disks-i+1), c=i) for i in range(hanoi.nr_disks) } plt = Plotter(interactive=False, size=(800, 600), bg='wheat', bg2='lb') plt += list(disks.values()) plt += Box(pos=(3,0,-0.5), size=(12,4,0.1)) cam = dict( pos=(14.60, -20.56, 7.680), focal_point=(3.067, 0.5583, 1.910), viewup=(-0.1043, 0.2088, 0.9724), ) plt.show(camera=cam) for t in range(len(tower_states)): state = tower_states[t] for tower_nr in range(3): for i, disk in enumerate(state[tower_nr]): disks[disk].pos([3 * tower_nr, 0, i+0.5]) plt.render() plt.interactive().close() vedo-2025.5.3/examples/simulations/koch_fractal.py000066400000000000000000000017421474667405700221140ustar00rootroot00000000000000"""Koch snowflake fractal""" from vedo import sqrt, Line, show levels = 7 def koch(level): # Compute Koch fractal contour points k = sqrt(3)/2 if level: points = koch(level-1) + [(0, 0)] # recursion! kpts = [] for i in range(len(points)-1): p1, p2 = points[i], points[i+1] dx, dy = (p2[0]-p1[0])/3, (p2[1]-p1[1])/3 pa = (p1[0] + dx , p1[1] + dy ) pb = (p1[0] + dx*2, p1[1] + dy*2) z = complex(pb[0]-pa[0], pb[1]-pa[1]) * (0.5-k*1j) p3 = (pa[0]+z.real, pa[1]+z.imag) kpts += [p1, pa, p3, pb] return kpts return [(0, 0), (1, 0), (0.5, k)] kochs = [] for i in range(levels): # Create a Line from the points and mesh the inside with minimum resolution kmsh = Line(koch(i)).generate_mesh(mesh_resolution=1).z(-i/1000) kmsh.lw(0).color(-i) kochs.append(kmsh) show(kochs, __doc__+ f"\nlevels: {levels}\npoints: {kmsh.npoints}", bg2='lb').close() vedo-2025.5.3/examples/simulations/lorenz.py000066400000000000000000000021761474667405700210070ustar00rootroot00000000000000"""The Lorenz attractor is a set of chaotic solutions of a particular system of ordinary differential equations""" from vedo import * p = (25, -10, -7) # starting point (initial condition) dt = 0.01 # time step # Define the ODE system to integrate (Lorenz equations) pts, vel = [], [] for t in np.arange(0, 20, dt): x, y, z = p v = np.array([-8/3*x+y*z, -10*(y-z), -y*x+28*y-z]) p = p + v * dt pts.append(p) vel.append(mag(v)) # Plot the trajectory in 3D space line = Line(pts).lw(2) line.cmap("winter", vel).add_scalarbar("speed") line.add_shadow("x", 3, alpha=0.2) line.add_shadow("z", -25, alpha=0.2) pt = Point(pts[0]).color("red4").ps(12) pt.add_trail(lw=4) pt.add_shadow("x", 3, alpha=0.5) pt.trail.add_shadow("x", 3, alpha=0.5) pt.trail.add_shadow("z",-25, alpha=0.5) def loop_func(event): # move the point if len(pts) > 0: pos = pts.pop(0) pt.pos(pos) pt.update_trail() pt.update_shadows() plt.render() plt = Plotter(axes=dict(xygrid=False)) plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show(line, pt, __doc__, viewup="z") plt.close() vedo-2025.5.3/examples/simulations/mag_field1.py000066400000000000000000000041051474667405700214600ustar00rootroot00000000000000"""Drag the red points to modify the wire path Press "b" to compute the magnetic field""" import numpy as np from vedo import settings, mag, utils from vedo import Arrows, Points, Axes, Plotter, Text2D, Circle def func(evt): if evt.keypress != "b": return txt.text("..computing field in space, please wait!") txt.c('red5').background('yellow7') plt.render() pts = sptool.spline().points # extract the current spline field = [] for probe in probes: B = np.zeros(3) for p0,p1 in zip(pts, np.roll(pts,1, axis=0)): p = (p0+p1)/2 r = mag(p-probe) B += np.cross(p1-p0, p-probe)/r**3 # Biot-Savart law B /= max(1, mag(B)) # clamp the field magnitude near the wire field.append(B) field = np.array(field) arrows = Arrows(probes, probes+field/5).c('black') txt.text(__doc__).c('black').background(None) ppts1 = Points(probes) ppts1.pointdata["BField"] = field domain = ppts1.tovolume(n=4, dims=(10,10,10)) # interpolate ppts2 = ppts1.clone() # make a copy ppts2.pointdata["BFieldIntensity"] = mag(field*255/3).astype(np.uint8) vol = ppts2.tovolume(n=4, dims=(10,10,10)).crop(back=0.5) isos = vol.isosurface(np.arange(0,250, 12)).smooth() isos.cmap("rainbow").lighting('off').alpha(0.5).add_scalarbar() isos.name = "Isosurfaces" streamlines = domain.compute_streamlines( probes, max_propagation=0.5, initial_step_size=0.01, direction="both", ) streamlines.c('black').linewidth(2) plt.remove("Arrows", "StreamLines", "Isosurfaces", "Axes") plt.add(arrows, streamlines, isos, Axes(streamlines)).render() probes = utils.pack_spheres([-2,2, -2,2, -2,2], radius=0.7) settings.use_depth_peeling = True settings.multi_samples = 0 plt = Plotter() plt.add_callback("key press", func) txt = Text2D(__doc__, font="Kanopus") plt += txt # Create a set of points in space to form a spline circle = Circle(res=8) # resolution = 8 points sptool = plt.add_spline_tool(circle, pc='red', lw=4, closed=True) plt.show().close() vedo-2025.5.3/examples/simulations/multiple_pendulum.py000066400000000000000000000101731474667405700232360ustar00rootroot00000000000000import numpy as np from vedo import Plotter, mag, versor, vector from vedo import Cylinder, Line, Box, Sphere ############## Constants N = 5 # number of bobs R = 0.3 # radius of bob (separation between bobs=1) Ks = 50 # k of springs (masses=1) g = 9.81 # gravity acceleration gamma = 0.1 # some friction Dt = 0.03 # time step # Create the initial positions and velocitites (0,0) of the bobs bob_x = [0] bob_y = [0] x_dot = np.zeros(N+1) # velocities y_dot = np.zeros(N+1) # Create the bobs for k in range(1, N + 1): alpha = np.pi / 5 * k / 10 bob_x.append(bob_x[k - 1] + np.cos(alpha) + np.random.normal(0, 0.1)) bob_y.append(bob_y[k - 1] + np.sin(alpha) + np.random.normal(0, 0.1)) plt = Plotter(title="Multiple Pendulum", bg2='ly') plt += Box(pos=(0, -5, 0), length=12, width=12, height=0.7).color("k").wireframe(1) sph = Sphere(pos=(bob_x[0], bob_y[0], 0), r=R / 2).color("gray") plt += sph bob = [sph] for k in range(1, N + 1): c = Cylinder(pos=(bob_x[k], bob_y[k], 0), r=R, height=0.3).color(k) plt += c bob.append(c) # Create some auxiliary variables x_dot_m = np.zeros(N+1) y_dot_m = np.zeros(N+1) dij = np.zeros(N+1) # array with distances to previous bob dij_m = np.zeros(N+1) for k in range(1, N + 1): dij[k] = mag([bob_x[k] - bob_x[k - 1], bob_y[k] - bob_y[k - 1]]) fctr = lambda x: (x - 1) / x Dt *= np.sqrt(1 / g) Dt2 = Dt / 2 # Midpoint time step DiaSq = (2 * R) ** 2 # Diameter of bob squared def loop_func(evt): global bob_x, bob_y bob_x_m = list(map((lambda x, dx: x + Dt2 * dx), bob_x, x_dot)) # midpoint variables bob_y_m = list(map((lambda y, dy: y + Dt2 * dy), bob_y, y_dot)) for k in range(1, N + 1): factor = fctr(dij[k]) x_dot_m[k] = x_dot[k] - Dt2 * (Ks * (bob_x[k] - bob_x[k - 1]) * factor + gamma * x_dot[k]) y_dot_m[k] = y_dot[k] - Dt2 * (Ks * (bob_y[k] - bob_y[k - 1]) * factor + gamma * y_dot[k] + g) for k in range(1, N): factor = fctr(dij[k + 1]) x_dot_m[k] -= Dt2 * Ks * (bob_x[k] - bob_x[k + 1]) * factor y_dot_m[k] -= Dt2 * Ks * (bob_y[k] - bob_y[k + 1]) * factor # Compute the full step variables bob_x = list(map((lambda x, dx: x + Dt * dx), bob_x, x_dot_m)) bob_y = list(map((lambda y, dy: y + Dt * dy), bob_y, y_dot_m)) for k in range(1, N + 1): dij[k] = mag([bob_x[k] - bob_x[k - 1], bob_y[k] - bob_y[k - 1]]) dij_m[k] = mag([bob_x_m[k] - bob_x_m[k - 1], bob_y_m[k] - bob_y_m[k - 1]]) factor = fctr(dij_m[k]) x_dot[k] -= Dt * (Ks * (bob_x_m[k] - bob_x_m[k - 1]) * factor + gamma * x_dot_m[k]) y_dot[k] -= Dt * (Ks * (bob_y_m[k] - bob_y_m[k - 1]) * factor + gamma * y_dot_m[k] + g) for k in range(1, N): factor = fctr(dij_m[k + 1]) x_dot[k] -= Dt * Ks * (bob_x_m[k] - bob_x_m[k + 1]) * factor y_dot[k] -= Dt * Ks * (bob_y_m[k] - bob_y_m[k + 1]) * factor # Check to see if they are colliding for i in range(1, N): for j in range(i + 1, N + 1): dist2 = (bob_x[i] - bob_x[j]) ** 2 + (bob_y[i] - bob_y[j]) ** 2 if dist2 < DiaSq: # are colliding Ddist = np.sqrt(dist2) - 2 * R tau = versor([bob_x[j] - bob_x[i], bob_y[j] - bob_y[i], 0]) DR = Ddist / 2 * tau bob_x[i] += DR[0] # DR.x bob_y[i] += DR[1] # DR.y bob_x[j] -= DR[0] # DR.x bob_y[j] -= DR[1] # DR.y Vji = vector(x_dot[j] - x_dot[i], y_dot[j] - y_dot[i]) DV = np.dot(Vji, tau) * tau x_dot[i] += DV[0] # DV.x y_dot[i] += DV[1] # DV.y x_dot[j] -= DV[0] # DV.x y_dot[j] -= DV[1] # DV.y # Update the loations of the bobs and the stretching of the springs plt.remove("Line") for k in range(1, N + 1): bob[k].pos([bob_x[k], bob_y[k], 0]) sp = Line(bob[k - 1].pos(), bob[k].pos()).color("gray").lw(8) plt.add(sp) plt.render() plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show().close() vedo-2025.5.3/examples/simulations/optics_base.py000066400000000000000000000262111474667405700217650ustar00rootroot00000000000000import vedo import numpy as np vedo.settings.use_depth_peeling = True ############################ class OpticalElement: # A base class def __init__(self): self.name = "OpticalElement" self.type = "undefined" self.normals = [] self._hits = [] self._hits_type = [] # +1 if ray is entering, -1 if exiting self.cellids = [] def n_at(self, wave_length): # to be overridden to implement dispersion return self.ref_index @property def hits(self): """Ray coordinates hitting this element""" return np.array(self._hits) @property def hits_type(self): """Flag +1 if ray is entering, -1 if exiting""" return np.array(self._hits_type) class Lens(vedo.Mesh, OpticalElement): """A refractive object of arbitrary shape defined by an arbitrary mesh""" def __init__(self, obj, ref_index="glass"): vedo.Mesh.__init__(self, obj.dataset, "blue8", 0.5) OpticalElement.__init__(self) self.name = obj.name self.type = "lens" self.compute_normals(cells=True, points=False) self.lighting('off') self.normals = self.celldata["Normals"] self.ref_index = ref_index def n_at(self, wave_length): # in meters """This is where material dispersion law is implemented""" if self.ref_index == "glass": # Dispersion of a common borosilicate glass, see: # https://en.wikipedia.org/wiki/Sellmeier_equation B1 = 1.03961212 B2 = 0.231792344 C1 = 6.00069867e-03 C2 = 2.00179144e-02 l2 = (wave_length*1e+06)**2 n = np.sqrt(1 + B1 * l2/(l2-C1) + B2 * l2/(l2-C2)) return n return self.ref_index class Mirror(vedo.Mesh, OpticalElement): """A mirror surface defined by an arbitrary Mesh""" def __init__(self, obj): vedo.Mesh.__init__(self, obj.dataset, "blue8", 0.5) OpticalElement.__init__(self) self.compute_normals(cells=True, points=True) self.name = obj.name self.type = "mirror" self.normals = self.celldata["Normals"] self.color('silver').lw(0).wireframe(False).alpha(1).phong() class Screen(vedo.Grid, OpticalElement): """A simple read out screen plane""" def __init__(self, sizex, sizey): vedo.Grid.__init__(self, res=[1,1], s=[sizex,sizey]) # self.triangulate() OpticalElement.__init__(self) self.compute_normals(cells=True, points=False) self.name = "Screen" self.type = "screen" self.normals = self.celldata["Normals"] self.color('red3').lw(2).lighting('off').wireframe(False).alpha(0.2) class Absorber(vedo.Grid, OpticalElement): """A simple non detecting absorber, not generating a hit.""" def __init__(self, sizex, sizey): vedo.Grid.__init__(self, res=[100,100], s=[sizex,sizey]) OpticalElement.__init__(self) self.compute_normals() self.name = "Absorber" self.type = "screen" self.normals = self.celldata["Normals"] self.color('k3').lw(1).lighting('default').wireframe(False).alpha(0.8) class Detector(vedo.Mesh, OpticalElement): """A detector surface defined by an arbitrary Mesh""" def __init__(self, obj): vedo.Mesh.__init__(self, obj.dataset, "k5", 0.5) OpticalElement.__init__(self) self.compute_normals() self.name = "Detector" self.type = "screen" self.normals = self.celldata["Normals"] self.color('k9').lw(2).lighting('off').wireframe(False).alpha(1) def count(self): """Count the hits on the detector cells and store them in cell array 'Counts'.""" arr = np.zeros(self.ncells, dtype=np.uint) for cid in self.cellids: arr[cid] += 1 self.celldata["Counts"] = arr return self def integrate(self, pols): """Integrate the polarization vector and store the probability in cell array 'Probability'.""" arr = np.zeros([self.ncells, 3], dtype=float) for i, cid in enumerate(self.cellids): arr[cid] += pols[i] arr = np.power(np.linalg.norm(arr, axis=1), 2) / len(self.cellids) self.celldata["Probability"] = arr return self ################################################### class Ray: """A photon to be tracked as a ray of light. wave_length in meters (so use e.g. 450.0e-09 m = 450 nm)""" def __init__(self, origin=(0,0,0), direction=(0,0,1), wave_length=450.0e-09, phase=0, pol=(1,0,0), n=1.003): self.name = "Ray" self.p = np.asarray(origin) # current position self.v = np.asarray(direction) self.v = self.v / np.linalg.norm(self.v) self.wave_length = wave_length self.path = [self.p] self._amplitudes = [1.0] self._polarizations = [np.array(pol)] self.phase = phase self.dmax = 20 self.maxiterations = 20 self.tolerance = None # will be computed automatically self.OBBTreeTolerance = 1e-05 # None = automatic self.ref_index = n @property def amplitudes(self): """ Amplitudes/attenuations at each hit. It assumes random light polarization (natural light). """ return np.array(self._amplitudes) @property def polarizations(self): """Exact polarization vector at each hit.""" return np.array(self._polarizations) def _rotate(self, p, angle, axis): magv = np.linalg.norm(axis) if not magv: return p a = np.cos(angle / 2) b, c, d = -axis * (np.sin(angle / 2) /magv) aa, bb, cc, dd = a * a, b * b, c * c, d * d bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d R = np.array([ [aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)], [2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)], [2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc] ]) return np.dot(R, p) def _reflectance(self, r12, theta_i, theta_t, inout): """Fresnel law for probability to reflect at interface, r12=n1/n2. This can be used to compute how much of the main ray arrives at the screen. A list of amplitudes at each step is stored in ray.aplitudes. """ if inout < 0: # need to check the sign ci = np.cos(theta_i) ct = np.cos(theta_t) else: # flip ct = np.cos(theta_i) ci = np.cos(theta_t) r12 = 1 / r12 a = (r12*ci - ct) / (r12*ci + ct) # Rs b = (r12*ct - ci) / (r12*ct + ci) # Rp return (a*a + b*b)/2 # def intersect(self, element, p0,p1): # not working (but no need to) # points = element.points # faces = element.cells # cids = [] # for i,f in enumerate(faces): # v0,v1,v2 = points[f] # res = vedo.utils.intersection_ray_triangle(p0,p1, v0,v1,v2) # if res is not False: # if res is not None: # cids.append([res, i]) # return cids def trace(self, elements): """Trace the path of a single photon through the input list of lenses, mirrors etc.""" for element in elements: self.tolerance = element.diagonal_size()/1000. for _ in range(self.maxiterations): hits, cids = element.intersect_with_line( # faster self.p, self.p + self.v * self.dmax, return_ids=True, tol=self.OBBTreeTolerance, ) # hit_cids = self.intersect(element, self.p, self.p + self.v * self.dmax) if len(hits) == 0: break # no hits hit, cid = hits[0], cids[0] # grab the first hit, point and cell ID of the mesh d = np.linalg.norm(hit - self.p) if d < self.tolerance: # it's picking itself.. get the second hit if it exists if len(hits) < 2: break hit, cid = hits[1], cids[1] d = np.linalg.norm(hit - self.p) n = element.normals[cid] w = np.cross(self.v, n) sintheta1 = np.linalg.norm(w) theta1 = np.arcsin(sintheta1) inout = np.sign(np.dot(n, self.v)) # ray entering of exiting ref_index = self.ref_index # polarization vector k = 2*np.pi / (self.wave_length/ref_index) pol = self._polarizations[-1] amp = self._amplitudes[-1] # this assumes random polarizations hit_type = -3 if element.type == "screen": if element.name == "Wall": break pol = pol * np.cos(k * d + self.phase) elif element.type == "mirror": theta1 *= inout # mirrors must reflect on both sides self.v = self._rotate(-self.v, 2*theta1, w) pol = pol * np.cos(k * d + self.phase + np.pi) hit_type = -2 elif element.type == "lens": ref_index = element.n_at(self.wave_length) # dispersion r = ref_index/self.ref_index if inout>0 else self.ref_index/ref_index sintheta2 = r * sintheta1 # Snell law if abs(sintheta2) > 1.0: # total internal reflection self.v = self._rotate(-self.v, 2*theta1, w) pol = pol * np.cos(k * d + self.phase + np.pi) hit_type = -2 else: # refraction theta2 = np.arcsin(sintheta2) self.v = self._rotate(self.v, theta2-theta1, -w*inout) amp = amp * (1-self._reflectance(r, theta1, theta2, inout)) pol = pol * np.cos(k * d + self.phase) hit_type = -inout else: print("Unknown element type", element.type) self._amplitudes.append(amp) self._polarizations.append(pol) self.path.append(hit) element._hits.append(hit) element._hits_type.append(hit_type) element.cellids.append(cid) if element.type == "screen": break self.p = hit # update position self.path = np.array(self.path) return self def asLine(self, min_hits=1, max_hits=1000, c=None, cmap_amplitudes="", vmin=0): """Return a vedo.Line object if it has at least min_hits and less than max_hits""" if min_hits < len(self.path) < max_hits: ln = vedo.Line(self.path).lw(1) if cmap_amplitudes: ln.cmap(cmap_amplitudes, self._amplitudes, vmin=vmin) elif c is None: c = vedo.colors.color_map(self.wave_length, "jet", 450e-09, 750e-09) /1.5 ln.color(c) else: ln.color(c) return ln return None vedo-2025.5.3/examples/simulations/optics_main1.py000066400000000000000000000063461474667405700220670ustar00rootroot00000000000000import numpy as np import vedo from optics_base import Lens, Ray, Mirror, Detector, Screen # see file ./optics_base.py ###################################################################### thin lenses s = vedo.Sphere(r=2, res=50) # construct a thin lens: shape = s.boolean("intersect", s.clone().z(3.5)).z(1.4) lens = Lens(shape, ref_index=1.52).color("orange9") screen= Screen(3,3).z(5) elements = [lens, screen] source = vedo.Disc(r1=0, r2=0.7, res=4).points # numpy 3d points lines = [Ray(pt).trace(elements).asLine() for pt in source] # list of vedo.Line vedo.show("Test of 1/f = (n-1) :dot (1/R1-1/R2) :approx 1/2", elements, lines, lens.boundaries().lw(2), azimuth=-90, zoom=1.2, size=(1100,700), axes=dict(zxgrid=True)).close() ####################################################################### dispersion s = vedo.Cone(res=4).scale([1,1,0.4]).rotate_y(-90).rotate_x(45).pos(-0.5,0,1.5) prism = Lens(s, ref_index="glass").lw(1) screen= Screen(2,2).z(6) lines = [] for wl in np.arange(450,750, 10)*1e-09: ray = Ray(direction=(-0.5,0,1), wave_length=wl) line = ray.trace([prism,screen]).asLine() lines.append(line) vedo.show("Test of chromatic dispersion", prism, screen, lines, zoom=1.5, size=(1100,700), axes=1).close() ################################################################ spherical mirrors s1 = vedo.Sphere(r=7, res=50).cut_with_plane([0,0,6],'z').cut_with_cylinder(invert=True) s2 = vedo.Sphere(r=5, res=50).cut_with_plane([0,0,-2],'-z').cut_with_cylinder().z(10) m1 = Mirror(s1) m2 = Mirror(s2) screen = Screen(5,5).z(9) elements = [m2, m1, m2, m1, screen] ## NOTE ordering! source= vedo.Disc(r1=1, r2=3, res=[20,60]).cut_with_plane().cut_with_plane(normal='y').z(1) lines = [Ray(pt).trace(elements).asLine(2) for pt in source.points] vedo.show("Reflection from spherical mirrors", elements, lines, axes=1).close() ################################################################# parabolic mirror s = vedo.Paraboloid(res=200).cut_with_plane([0,0,-0.4], 'z').scale([1,1,0.1]).z(1) elements = [Mirror(s), Screen(0.2,0.2).z(0.35)] source= vedo.Disc(r1=.1, r2=.3, res=[10,30]).cut_with_plane().cut_with_plane(normal='y') lines = [Ray(pt).trace(elements).asLine() for pt in source.points] vedo.show("Reflection from a parabolic mirror", elements, lines, axes=2, azimuth=-90).close() ################################################################# mesh mirror # Create the mirror from a vedo.Mesh object shape = vedo.Mesh(vedo.dataurl+"bunny.obj").fill_holes().subdivide().smooth() shape.scale(7).pos(0.1,-0.6,0).rotate_x(90) mirror = Mirror(shape).color("silver") # Create a detector surface as a quad-sphere surrounding the shape sd = vedo.Sphere(quads=1, res=12).cut_with_plane([0,-0.8,0], normal='y') detector = Detector(sd).color("white").alpha(1).lw(1) source = vedo.Grid(res=[30,30]).rotate_x(90).y(-1) lines=[] for pt in source.points: ray = Ray(pt, direction=(0,1,0)).trace([mirror, detector]) line = ray.asLine(min_hits=2, max_hits=4) lines.append(line) detector.count().cmap("Reds", on='cells', vmax=10).add_scalarbar("Counts") vedo.show(mirror, detector, lines, "A Mesh mirror and a spherical detector", elevation=-90, axes=1, bg='bb', bg2='blue9').close() vedo-2025.5.3/examples/simulations/optics_main2.py000066400000000000000000000041271474667405700220630ustar00rootroot00000000000000"""Simulation of an optical system with lenses and mirrors of arbitrary shapes and orientations (points mark the exit locations of photons, many from internal total reflection)""" import numpy as np from vedo import Grid, Sphere, Cube, Cone, Points, show from optics_base import Lens, Ray, Mirror, Screen # see file ./optics_base.py # Create meshes as ordinary vedo objects sm = Sphere(r=8).z(-8.1) sp = Sphere(r=8).z(+8.1) shape1 = Sphere(r=0.9, res=53).cut_with_plane().cap().rotate_y(-90).pos(0,0,0.5) shape2 = Cube(side=2).triangulate().boolean('-', sm).boolean("-", sp).z(3) shape3 = Cone().rotate_y(-90).z(6) shape4 = Cube().scale([1.7,1,0.2]).rotate_y(70).pos(-0.3,0,8) shape5 = Sphere(r=2).boolean("intersect", Sphere(r=2).z(3.5)).rotate_x(10).pos(0.8,0,7.5) shape6 = Grid(res=[1,1]).rotate_y(-60).rotate_x(30).pos(0,-1,11) # Build lenses (with their refractive indices), and mirrors, using those meshes lens1 = Lens(shape1, ref_index=1.35).c("blue9") # constant refr. index lens2 = Lens(shape2, ref_index="glass").c("blue7") lens3 = Lens(shape3, ref_index="glass").c("green9") lens4 = Lens(shape4, ref_index="glass").c("purple9").linewidth(1) lens5 = Lens(shape5, ref_index="glass").c("orange9") mirror= Mirror(shape6) screen= Screen(4,4).rotate_y(20).pos(1,0,12) elements = [lens1, lens2, lens3, lens4, lens5, mirror, screen] # Generate photons and trace them through the optical elements lines = [] source = Grid(res=[20,20]).points # a numpy array for pt in source: λ = np.random.uniform(low=450, high=750)*1e-09 # nanometers ray = Ray(pt, direction=(0,0,1), wave_length=λ) line = ray.trace(elements).asLine(min_hits=4, cmap_amplitudes="Blues") # vedo.Line lines.append(line) lines = list(filter(None, lines)) # remove possible None to add a scalar bar to lines[0] lines[0].add_scalarbar("Ampl.") # Grab the coords of photons exiting the conic lens3 (hits_type==-1) cone_hits = Points(lens3.hits[lens3.hits_type==-1]).color("green1").point_size(8) # Show everything show(__doc__, elements, lines, lens5.boundaries().lw(2), cone_hits, size=(1500,700), bg='k2', bg2='k9', zoom=2, azimuth=-90, ) vedo-2025.5.3/examples/simulations/optics_main3.py000066400000000000000000000026241474667405700220640ustar00rootroot00000000000000"""The butterfly effect with cylindrical mirrors and a laser""" # Original idea from "The Action Lab": https://www.youtube.com/watch?v=kBow0kTVn3s # from vedo import Plotter, Grid, Cylinder, merge from optics_base import Ray, Mirror, Detector # see file ./optics_base.py grid = Grid(res=[3,4]) # pick a few points in space to place cylinders pts = grid.points.tolist() + grid.cell_centers().points.tolist() # Create the mirror by merging many (y-scaled) cylinders into a single mesh object cyls = [Cylinder(p, r=0.065, height=0.2, res=2000).scale([1,1.5,1]) for p in pts] mirror = Mirror(merge(cyls)).color("silver") # Create a detector surface as a thin cylinder surrounding the mirror sd = Cylinder(r=1, height=0.3, cap=False).cut_with_plane([0,-0.95,0], normal='y') detector = Detector(sd) def slider(widget, event): ### callback to shift the beam along x dx = widget.value ray = Ray([dx,-1.2,-0.1], direction=(0,1,0.02)) ray.maxiterations = 1000 # max nr. of reflections ray.trace([mirror, detector]) # cumpute trajectory detector.count().cmap("Reds", on='cells', vmax=10) line = ray.asLine().linewidth(4).c('green5') plt.remove("Line").add(line) # remove the old and add the new one plt = Plotter(axes=1, bg='peachpuff', bg2='blue9') plt.add_slider(slider, -0.07, 0.07, value=0, pos=5, title="beam shift") plt.show(mirror, detector, __doc__, elevation=-30) plt.close() vedo-2025.5.3/examples/simulations/particle_simulator.py000066400000000000000000000101321474667405700233670ustar00rootroot00000000000000""" Simulate interacting charged particles in 3D space. """ # An example simulation of N particles scattering on a charged target. # See e.g. https://en.wikipedia.org/wiki/Rutherford_scattering # By Tommy Vandermolen import numpy as np from vedo import Plotter, Cube, Sphere, mag2, versor, vector K_COULOMB = 8987551787.3681764 # N*m^2/C^2 plt = None # so that it can be also used without visualization class ParticleSim: def __init__(self, dt, iterations): """ Creates a new particle simulator dt: time step, time between successive calculations of particle motion """ self.dt = dt self.particles = [] self.iterations = iterations def add_particle( self, pos=(0, 0, 0), charge=1e-6, mass=1e-3, radius=0.005, color=None, vel=(0, 0, 0), fixed=False, negligible=False, ): """ Adds a new particle with specified properties (in SI units) """ color = color or len(self.particles) # assigned or default color number p = Particle(pos, charge, mass, radius, color, vel, fixed, negligible) self.particles.append(p) def simulate(self): """ Runs the particle simulation. Simulates one time step, dt, of the particle motion. Calculates the force between each pair of particles and updates their motion accordingly """ # Main simulation loop for i in range(self.iterations): for a in self.particles: if a.fixed: continue ftot = vector(0, 0, 0) # total force acting on particle a for b in self.particles: if a.negligible and b.negligible or a == b: continue ab = a.pos - b.pos ftot += ((K_COULOMB * a.charge * b.charge) / mag2(ab)) * versor(ab) a.vel += ftot / a.mass * self.dt # update velocity and position of a a.pos += a.vel * self.dt a.vsphere.pos(a.pos) a.vsphere.update_trail() if plt: if i==0: plt.reset_camera() plt.azimuth(1) plt.render() class Particle: def __init__(self, pos, charge, mass, radius, color, vel, fixed, negligible): """ Creates a new particle with specified properties (in SI units) pos: XYZ starting position of the particle, in meters charge: charge of the particle, in Coulombs mass: mass of the particle, in kg radius: radius of the particle, in meters. No effect on simulation color: color of the particle. If None, a default color will be chosen vel: initial velocity vector, in m/s fixed: if True, particle will remain fixed in place negligible: assume charge is small wrt other charges to speed up calculation """ self.pos = vector(pos) self.radius = radius self.charge = charge self.mass = mass self.vel = vector(vel) self.fixed = fixed self.negligible = negligible self.color = color if plt: self.vsphere = Sphere(pos, r=radius, c=color).add_trail(lw=1, n=75, alpha=0.5) plt.add(self.vsphere) # Sphere representing the particle ##################################################################################################### if __name__ == "__main__": plt = Plotter(title="Particle Simulator", bg="black", interactive=False) plt += Cube().c('w').wireframe(True).lighting('off') # a wireframe cube sim = ParticleSim(dt=1e-5, iterations=50) sim.add_particle((-0.4, 0, 0), color="w", charge=3e-6, radius=0.01, fixed=True) # the target positions = np.random.randn(100, 3) / 60 # generate a beam of particles for p in positions: p[0] = -0.5 # Fix x position. Their charge are small/negligible compared to target: sim.add_particle(p, charge=0.01e-6, mass=0.1e-6, vel=(1000, 0, 0), negligible=True) sim.simulate() plt.interactive().close() vedo-2025.5.3/examples/simulations/pendulum_3d.py000066400000000000000000000023031474667405700217050ustar00rootroot00000000000000"""Double pendulum in 3D""" # Original idea and solution using sympy from: # https://www.youtube.com/watch?v=MtG9cueB548 import time from vedo import * # Load the solution: x1, y1, z1, x2, y2, z2 = np.load(download(dataurl+'3Dpen.npy')) p1, p2 = np.c_[x1,y1,z1], np.c_[x2,y2,z2] ball1 = Sphere(p1[0], r=0.1).color("green5") ball2 = Sphere(p2[0], r=0.1).color("blue5") ball1.add_shadow('z', -3) ball2.add_shadow('z', -3) ball1.add_trail(n=10) ball2.add_trail(n=10) ball1.trail.add_shadow('z', -3) # make trails project a shadow too ball2.trail.add_shadow('z', -3) rod1 = Line([0,0,0], ball1, lw=4).add_shadow('z', -3) rod2 = Line(ball1, ball2, lw=4).add_shadow('z', -3) axes = Axes(xrange=(-3,3), yrange=(-3,3), zrange=(-3,3)) # show the solution plt = Plotter(interactive=False) plt.show(ball1, ball2, rod1, rod2, axes, __doc__, viewup='z') i = 0 for b1, b2 in zip(p1,p2): ball1.pos(b1) ball2.pos(b2) ball1.update_trail().update_shadows() ball2.update_trail().update_shadows() rod1.points = [[0,0,0], b1] rod2.points = [b1, b2] rod1.update_shadows() rod2.update_shadows() plt.render() time.sleep(0.03) i += 1 if i > 100: break plt.interactive().close() vedo-2025.5.3/examples/simulations/pendulum_ode.py000066400000000000000000000035361474667405700221570ustar00rootroot00000000000000"""Double pendulum from ODE integration""" # Copyright (c) 2018, N. Rougier, https://github.com/rougier/pendulum # http://www.physics.usyd.edu.au/~wheat/dpend_html/solve_dpend.c # Adapted for vedo by M. Musy, 2021 from scipy import integrate from vedo import * G = 9.81 # acceleration due to gravity, in m/s^2 L1 = 1.0 # length of pendulum 1 in m L2 = 1.0 # length of pendulum 2 in m M1 = 1.0 # mass of pendulum 1 in kg M2 = 1.0 # mass of pendulum 2 in kg th1= 120 # initial angles (degrees) th2= -20 w1 = 0 # initial angular velocities (degrees per second) w2 = 0 dt = 0.015 def derivs(state, t): dydx = np.zeros_like(state) dydx[0] = state[1] a = state[2] - state[0] sina, cosa = sin(a), cos(a) den1 = (M1 + M2)*L1 - M2*L1*cosa*cosa dydx[1] = (M2*L1*state[1]*state[1]*sina*cosa + M2*G*sin(state[2])*cosa + M2*L2*state[3]*state[3]*sina - (M1+M2)*G*sin(state[0]) )/den1 dydx[2] = state[3] den2 = (L2/L1)*den1 dydx[3] = (-M2*L2*state[3]*state[3]*sina*cosa + (M1+M2)*G*sin(state[0])*cosa - (M1+M2)*L1*state[1]*state[1]*sina - (M1+M2)*G*sin(state[2]) )/den2 return dydx t = np.arange(0.0, 10.0, dt) state = np.radians([th1, w1, th2, w2]) y = integrate.odeint(derivs, state, t) P1 = np.dstack([L1*sin(y[:,0]), -L1*cos(y[:,0])]).squeeze() P2 = P1 + np.dstack([L2*sin(y[:,2]), -L2*cos(y[:,2])]).squeeze() plt = Plotter(interactive=False, size=(900,700),) ax = Axes(xrange=(-2,2), yrange=(-2,1), htitle=__doc__) for i in progressbar(len(t)): j = max(i- 5,0) k = max(i-10,0) l1 = Line([[0,0], P1[i], P2[i]]).lw(7).c("blue2", 1.0) l2 = Line([[0,0], P1[j], P2[j]]).lw(6).c("blue2", 0.4) l3 = Line([[0,0], P1[k], P2[k]]).lw(5).c("blue2", 0.2) plt.clear().show(l1, l2, l3, ax, zoom=1.4) plt.interactive().close() vedo-2025.5.3/examples/simulations/run_all.sh000077500000000000000000000004271474667405700211140ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo for f in *.py do echo "Processing $f script.." python3 $f done vedo-2025.5.3/examples/simulations/self_org_maps2d.py000066400000000000000000000053621474667405700225440ustar00rootroot00000000000000"""Self organizing maps""" # ----------------------------------------------------------------------------- # Copyright 2019 (C) Nicolas P. Rougier # Released under a BSD two-clauses license # # References: Kohonen, Teuvo. Self-Organization and Associative Memory. # Springer, Berlin, 1984. # https://github.com/rougier/ML-Recipes/blob/master/recipes/ANN/som.py # ----------------------------------------------------------------------------- import numpy as np import scipy.spatial from vedo import Sphere, Grid, Plotter, progressbar class SOM: def __init__(self, shape, distance): self.codebook = np.random.uniform(0, 1, shape) self.distance = distance / distance.max() self.samples = [] def learn(self, n_epoch=10000, sigma=(0.25,0.01), lrate=(0.5,0.01)): t = np.linspace(0, 1, n_epoch) lrate = lrate[0] * (lrate[1] / lrate[0]) ** t sigma = sigma[0] * (sigma[1] / sigma[0]) ** t I = np.random.randint(0, len(self.samples), n_epoch) self.samples = self.samples[I] for i in progressbar(n_epoch): # Get random sample data = self.samples[i] # Get index of nearest node (minimum distance) winner = np.argmin(((self.codebook - data)**2).sum(axis=-1)) # Gaussian centered on winner G = np.exp(-self.distance[winner]**2 / sigma[i]**2) # Move nodes towards sample according to Gaussian self.codebook -= lrate[i] * G[..., np.newaxis] * (self.codebook-data) # Draw network if i>500 and not i%20 or i==n_epoch-1: x, y, z = [self.codebook[:,i].reshape(n,n) for i in range(3)] grd.wireframe(False).lw(0.5).bc('blue9').flat() grdpts = grd.points for i in range(n): for j in range(n): grdpts[i*n+j] = (x[i,j], y[i,j], z[i,j]) grd.points = grdpts if plt: plt.azimuth(1.0).render() if plt: plt.interactive().close() return [self.codebook[:,i].reshape(n,n) for i in range(3)] # ------------------------------------------------------------------------------- if __name__ == "__main__": n = 20 X, Y = np.meshgrid(np.linspace(0, 1, n), np.linspace(0, 1, n)) P = np.c_[X.ravel(), Y.ravel()] D = scipy.spatial.distance.cdist(P, P) sphere = Sphere(res=90).cut_with_plane(origin=(0,-.3,0), normal='y') sphere.subsample(0.01).add_gaussian_noise(0.5).point_size(3) plt = Plotter(axes=6, interactive=False) grd = Grid(res=[n-1, n-1]).c('green2') plt.show(__doc__, sphere, grd) som = SOM((len(P), 3), D) som.samples = sphere.points.copy() som.learn(n_epoch=4000, sigma=(1, 0.01), lrate=(1, 0.01)) vedo-2025.5.3/examples/simulations/spline_ease.py000066400000000000000000000015311474667405700217570ustar00rootroot00000000000000"""Spline three points in space""" from vedo import * pts = [[0,0,0], [0.5,0.6,0.8], [1,1,1]] gpts = Points(pts, r=10).c('green',0.5) # Create a spline where the final points are more dense (easing) line = Spline(pts, easing="OutCubic", res=100) vpts = line.clone().point_size(3).shift(0,0.1,0) # a dotted copy # Calculate positions as a fraction of the length of the line, # being x=0 the first point and x=1 the last point. # This corresponds to an imaginary point that travels along the line # at constant speed: equi_pts = Points([line.eval(x) for x in np.arange(0,1, 0.1)]).c('blue') redpt = Point(r=25).c('red') plt = show(vpts, gpts, line, redpt, equi_pts, axes=1, interactive=0) # Animation pts = line.points for i in range(line.npoints): redpt.pos(pts[i]) # assign the new position plt.render() plt.interactive().close() vedo-2025.5.3/examples/simulations/springs_fem.py000066400000000000000000000034641474667405700220130ustar00rootroot00000000000000"""Solving a system of springs using the finite element method.""" # https://www.youtube.com/watch?v=YqpIEDWJCwc import numpy as np from vedo import * # np.random.seed(0) num_springs = 7 k = 1.0 # Stiffness of the springs # Define applied forces at each node num_nodes = num_springs + 1 # One more node than springs F = np.random.randn(num_nodes) /5 # Discretize the system nodes = np.arange(num_nodes) elements = list(zip(nodes[:-1], nodes[1:])) # Assemble global stiffness matrix and force vector K = np.zeros((num_nodes, num_nodes)) for element in elements: i, j = element K[i, i] += k K[j, j] += k K[i, j] -= k K[j, i] -= k # Apply boundary conditions (fixed nodes at both ends) fixed_nodes = [0, num_nodes - 1] for node in fixed_nodes: K[node, :] = 0 K[:, node] = 0 K[node, node] = 1 F[node] = 0 # Solve for displacements u = np.linalg.solve(K, F) yvals = np.zeros(num_nodes) nodes = np.c_[nodes, yvals] u = np.c_[u, yvals] F = np.c_[F, yvals] nodes_displaced = nodes + u # Visualize the solution vnodes1 = Points(nodes).color("k", 0.25).ps(20) vline1 = Line(nodes).color("k", 0.25) arr_disp = Arrows2D(nodes, nodes_displaced).y(0.4) arr_force= Arrows2D(nodes, nodes + F).y(-0.25) arr_disp.c("red4",0.8).legend('Displacements') arr_force.c("blue4",0.8).legend('Forces') vnodes2 = Points(nodes_displaced).color("k").ps(20).y(0.1) vline2 = Lines(vnodes1, vnodes2).color("k", 0.25) springs = [] for i in range(num_springs): s = Spring(nodes_displaced[i], nodes_displaced[i+1], r1=0.04).y(0.1) s.lighting("metallic") springs.append(s) lbox = LegendBox([arr_disp, arr_force], width=0.2, height=0.25, markers='s') lbox.font("Calco") show( __doc__, lbox, vnodes1, vnodes2, vline1, vline2, arr_disp, arr_force, springs, axes=8, size=(1900, 490), zoom=3.6, ).close() vedo-2025.5.3/examples/simulations/trail.py000066400000000000000000000010501474667405700205770ustar00rootroot00000000000000"""Add a trailing line to a moving object""" from vedo import Plotter, sin, Sphere, Point s = Sphere().c("green").bc("tomato") s.cut_with_plane([-0.8, 0, 0]) # cut left part of sphere p = Point([-2,0,0]).ps(12).color("black") # add a trail to point p with 50 segments p.add_trail(lw=3, n=50) plt = Plotter(axes=6, interactive=False) plt.show(s, p, __doc__) for i in range(150): p.pos(-2+i/100.0, sin(i/5.0)/15, 0).update_trail() plt.azimuth(-0.2) plt.render() # stay interactive and after pressing q close plt.interactive().close() vedo-2025.5.3/examples/simulations/tunnelling1.py000066400000000000000000000032021474667405700217250ustar00rootroot00000000000000"""Quantum tunneling using 4th order Runge-Kutta method""" import numpy as np from vedo import Plotter, Line N = 300 # number of points dt = 0.004 # time step x0 = 5 # peak initial position s0 = 0.75 # uncertainty on particle position k0 = 10 # initial momentum of the wave packet Vmax = 0.2 # height of the barrier (try 0 for particle in empty box) size = 20.0 # x span [0, size] def f(psi): nabla2psi = np.zeros(N+2, dtype=complex) dx2 = ((x[-1] - x[0]) / (N+2))**2 * 400 # dx**2 step, scaled nabla2psi[1 : N+1] = (psi[0:N] + psi[2 : N+2] - 2 * psi[1 : N+1]) / dx2 return 1j * (nabla2psi - V * psi) # this is the RHS of Schroedinger equation def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method k1 = f(psi) k2 = f(psi + dt / 2 * k1) k3 = f(psi + dt / 2 * k2) k4 = f(psi + dt * k3) return (k1 + 2 * k2 + 2 * k3 + k4) / 6 x = np.linspace(0, size, N+2) # we will need 2 extra points for the box wall V = Vmax * (np.abs(x-11) < 0.5) - 0.01 # simple square barrier potential Psi = np.sqrt(1/s0) * np.exp(-1/2 * ((x-x0)/s0)**2 + 1j * x * k0) # wave packet zeros = np.zeros_like(x) plt = Plotter(interactive=False, size=(1000,500)) barrier = Line(np.c_[x, V * 15]).c("red3").lw(3) wpacket = Line(np.c_[x, zeros]).c('blue4').lw(2) plt.show(barrier, wpacket, __doc__, zoom=2) for j in range(150): for i in range(500): Psi += d_dt(Psi) * dt # integrate for a while amp = np.real(Psi * np.conj(Psi)) * 1.5 # psi squared, probability(x) wpacket.points = np.c_[x, amp, zeros] # update points plt.render() plt.interactive().close() vedo-2025.5.3/examples/simulations/tunnelling2.py000066400000000000000000000052751474667405700217420ustar00rootroot00000000000000"""Quantum Tunnelling effect using 4th order Runge-Kutta method with arbitrary potential shape.""" from vedo import * nsteps = 150 # number of steps in time n = 300 # number of points in 1d space dt = 0.004 # time step x0 = 6 # peak initial position s0 = 0.75 # uncertainty on particle position k0 = 10 # initial momentum of the wave packet Vmax = 0.2 # height of the barrier (try 0 for particle in empty box) size = 20.0 # x axis span [0, size] # Uncomment below for more examples of the potential V(x). x = np.linspace(0, size, n+2) V = 0.15 * np.sin(1.5 * (x - 7)) # particle hitting a sinusoidal barrier # V = Vmax*(np.abs(x-11) < 0.5)-0.01 # simple square barrier potential # V = -0.5*(np.abs(x-11) < 1.7)-0.01 # a wide square well potential # V = 0.008*(x-10)**2 # elastic potential well # V = 0.05*(x-10) # particle on a slope bouncing back # V = 0.0 * x # free particle Psi = np.sqrt(1/s0) * np.exp(-1/2 * ((x-x0)/s0)**2 + 1j*x*k0) # wave packet dx2 = ((x[-1] - x[0]) / (n+2))**2 * 400 # dx**2 step, scaled nabla2psi = np.zeros(n+2, dtype=complex) def f(psi): # a smart numpy way to calculate the second derivative in x: nabla2psi[1 : n+1] = (psi[0:n] + psi[2 : n+2] - 2 * psi[1 : n+1]) / dx2 return 1j * (nabla2psi - V*psi) # this is the RH of Schroedinger equation! def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method k1 = f(psi) k2 = f(psi + dt / 2 * k1) k3 = f(psi + dt / 2 * k2) k4 = f(psi + dt * k3) return (k1 + 2 * k2 + 2 * k3 + k4) / 6 plt = Plotter(interactive=False) pic = Image(dataurl+"images/schrod.png").pos(0, -5, -0.1).scale(0.0255) barrier = Line(np.stack((x, V*15, np.zeros_like(x)), axis=1), c="black", lw=2) barrier.name = "barrier" plt.show(pic, barrier, __doc__) lines = [] for i in range(nsteps): for j in range(500): Psi += d_dt(Psi) * dt # integrate for a while before showing things A = np.real(Psi * np.conj(Psi)) * 1.5 # psi squared, probability(x) coords = np.stack((x, A), axis=1) Aline = Line(coords).color("db").linewidth(3) lines.append([Aline, A]) # store objects plt.remove("Line").add(Aline).render() # now show the same lines along z representing time plt.objects= [] # clean up internal list of objects to show plt.elevation(20).azimuth(20) barrier.color('black', 0.3) barrier_end = barrier.clone().pos([0,0,20]) rib = Ribbon(barrier, barrier_end).c("black",0.1) plt.add(rib) plt.reset_camera() for i in range(nsteps): p = [0, 0, i*size/nsteps] # shift along z line, A = lines[i] line.cmap("gist_earth_r", A).pos(p) plt.add(pic, line).render() plt.interactive().close() vedo-2025.5.3/examples/simulations/value_iteration.py000066400000000000000000000076421474667405700226730ustar00rootroot00000000000000"""Solve a random maze with Markovian Decision Process""" # ----------------------------------------------------------------------------- # Copyright 2019 (C) Nicolas P. Rougier & Anthony Strock # Released under a BSD two-clauses license # # References: Bellman, Richard (1957), A Markovian Decision Process. # Journal of Mathematics and Mechanics. Vol. 6, No. 5. # ----------------------------------------------------------------------------- #https://github.com/rougier/ML-Recipes/blob/master/recipes/MDP/value-iteration.py #https://en.wikipedia.org/wiki/Markov_decision_process import numpy as np from scipy.ndimage import generic_filter def maze(shape=(30, 50), complexity=0.8, density=0.8): shape = (np.array(shape)//2)*2 + 1 n_complexity = int(complexity*(shape[0]+shape[1])) n_density = int(density*(shape[0]*shape[1])) Z = np.ones(shape, dtype=bool) Z[1:-1, 1:-1] = 0 P = (np.dstack([np.random.randint(0, shape[0]+1, n_density), np.random.randint(0, shape[1]+1, n_density)])//2)*2 for (y,x) in P.squeeze(): Z[y, x] = 1 for j in range(n_complexity): neighbours = [] if x > 1: neighbours.append([(y, x-1), (y, x-2)]) if x < shape[1]-2: neighbours.append([(y, x+1), (y, x+2)]) if y > 1: neighbours.append([(y-1, x), (y-2, x)]) if y < shape[0]-2: neighbours.append([(y+1, x), (y+2, x)]) if len(neighbours): next_1, next_2 = neighbours[np.random.randint(len(neighbours))] if Z[next_2] == 0: Z[next_1] = Z[next_2] = 1 y, x = next_2 else: break return Z def solve(Z, start, goal): Z = 1 - Z G = np.zeros(Z.shape) G[start] = 1 # We iterate until value at exit is > 0. This requires the maze # to have a solution or it will be stuck in the loop. def diffuse(Z, gamma=0.99): return max(gamma*Z[0], gamma*Z[1], Z[2], gamma*Z[3], gamma*Z[4]) while G[goal] == 0.0: G = Z * generic_filter(G, diffuse, footprint=[[0, 1, 0], [1, 1, 1], [0, 1, 0]]) # Descent gradient to find shortest path from entrance to exit y, x = goal dirs = (0,-1), (0,+1), (-1,0), (+1,0) P = [] while (x, y) != start: P.append((y,x)) neighbours = [-1, -1, -1, -1] if x > 0: neighbours[0] = G[y, x-1] if x < G.shape[1]-1: neighbours[1] = G[y, x+1] if y > 0: neighbours[2] = G[y-1, x] if y < G.shape[0]-1: neighbours[3] = G[y+1, x] a = np.argmax(neighbours) x, y = x + dirs[a][1], y + dirs[a][0] P.append((y,x)) return P, G def show_solution3d(S, start, goal): from vedo import Text3D, Cube, Line, Grid, merge, show pts, cubes, txts = [], [], [] pts = [(x,-y) for y,x in S[0]] for y,line in enumerate(Z): for x,c in enumerate(line): if c: cubes.append(Cube([x,-y,0])) path = Line(pts).lw(6).c('red5') walls = merge(cubes).flat().c('orange1') sy, sx = S[1].shape gradient = np.flip(S[1], axis=0).ravel() grd = Grid(pos=((sx-1)/2, -(sy-1)/2, -0.49), s=[sx,sy], res=[sx,sy]) grd.lw(0).wireframe(False).cmap('gist_earth_r', gradient, on='cells') grd.add_scalarbar('Gradient', horizontal=True, c='k', nlabels=2) txts.append(__doc__) txts.append(Text3D('Start', pos=[start[1]-1,-start[0]+1.5,1], c='k')) txts.append(Text3D('Goal!', pos=[goal[1] -2,-goal[0] -2.7,1], c='k')) return show(path, walls, grd, txts, axes=0, zoom=1.2) ########################################################################## if __name__ == '__main__': np.random.seed(4) Z = maze(shape=(50, 70)) start, goal = (1,1), (Z.shape[0]-2, Z.shape[1]-2) S = solve(Z, start, goal) show_solution3d(S, start, goal).close() vedo-2025.5.3/examples/simulations/volterra.py000066400000000000000000000041111474667405700213230ustar00rootroot00000000000000"""The Lotka-Volterra model where: x is the number of preys y is the number of predators""" #Credits: #http://visual.icse.us.edu.pl/NPB/notebooks/Lotka_Volterra_with_SAGE.html #as implemented in K3D_Animations/Lotka-Volterra.ipynb #https://en.wikipedia.org/wiki/Lotka%E2%80%93Volterra_equations import numpy as np from scipy.integrate import odeint def rhs(y0, t, a): x, y = y0[0], y0[1] return [x-x*y, a*(x*y-y)] a_1 = 1.2 x0_1, x0_2, x0_3 = 2.0, 1.2, 1.0 y0_1, y0_2, y0_3 = 4.2, 3.7, 2.4 T = np.arange(0, 8, 0.02) sol1 = odeint(rhs, [x0_1, y0_1], T, args=(a_1,)) sol2 = odeint(rhs, [x0_2, y0_2], T, args=(a_1,)) sol3 = odeint(rhs, [x0_3, y0_3], T, args=(a_1,)) limx = np.linspace(np.min(sol1[:,0]), np.max(sol1[:,0]), 20) limy = np.linspace(np.min(sol1[:,1]), np.max(sol1[:,1]), 20) vx, vy = np.meshgrid(limx, limy) vx, vy = np.ravel(vx), np.ravel(vy) vec = rhs([vx, vy], t=0.01, a=a_1) origins = np.stack([np.zeros(np.shape(vx)), vx, vy]).T vectors = np.stack([np.zeros(np.shape(vec[0])), vec[0], vec[1]]).T vectors /= np.stack([np.linalg.norm(vectors, axis=1)]).T * 5 curve_points1 = np.vstack([np.zeros(sol1[:,0].shape), sol1[:,0], sol1[:,1]]).T curve_points2 = np.vstack([np.zeros(sol2[:,0].shape), sol2[:,0], sol2[:,1]]).T curve_points3 = np.vstack([np.zeros(sol3[:,0].shape), sol3[:,0], sol3[:,1]]).T ######################################################################## from vedo import Plotter, Arrows, Points, Line plt = Plotter(bg="blackboard") plt += Arrows(origins, origins+vectors, c='lr') plt += Points(curve_points1, c='y') plt += Line(curve_points1, c='y') plt += Line(np.vstack([T, sol1[:,0], sol1[:,1]]).T, c='y') plt += Points(curve_points2, c='g') plt += Line(curve_points2, c='g') plt += Line(np.vstack([T, sol2[:,0], sol2[:,1]]).T, c='g') plt += Points(curve_points3, c='lb') plt += Line(curve_points3, c='lb') plt += Line(np.vstack([T, sol3[:,0], sol3[:,1]]).T, c='lb') plt += __doc__ plt.show(axes={'xtitle':'time', 'ytitle':'x', 'ztitle':'y', 'zxgrid':True, 'yzgrid':False}, viewup='x', ) plt.close() vedo-2025.5.3/examples/simulations/wave_equation1d.py000066400000000000000000000070511474667405700225670ustar00rootroot00000000000000"""Simulate a discrete collection of oscillators We will use this as a model of a vibrating string and compare two methods of integration: Euler (red) and Runge-Kutta4 (green). For too large values of dt the simple Euler will diverge.""" # To model 'N' oscillators, we will use N+2 Points, numbered # 0, 1, 2, 3, ... N+1. Points 0 and N+1 are actually the boundaries. # We will keep them fixed, but adding them in as if they were # masses makes the programming easier. # Adapted from B.Martin (2009) http://www.kcvs.ca/martin by M.Musy from vedo import * #################################################### N = 400 # Number of coupled oscillators dt = 0.5 # Time step nsteps = 2000 # Number of steps in the simulation #################################################### # Initial positions #################################################### x = np.array(list(range(N + 2))) z = np.zeros(N + 2, float) y = np.zeros(N + 2, float) # y[p] is the position of particle p for p in x: # p is particle number along x axis y[p] = 100 * np.sin(p/15) * np.exp(-p/50) #################################################### # Initial velocities #################################################### v = np.zeros(N + 2, float) # or you can give one specific particle a kick: # v[40] = 50 #################################################### # Integrate forward #################################################### # Acceleration function for the simple harmonic oscillator def accel(y, v, t): a = np.zeros(N + 2, float) # acceleration of particles a[1 : N+1] = -(y[1 : N+1] - y[0:N]) - (y[1 : N+1] - y[2 : N+2]) return a def runge_kutta4(y, v, t, dt): # 4th Order Runge-Kutta yk1 = dt * v vk1 = dt * accel(y, v, t) yk2 = dt * (v + vk1 / 2) vk2 = dt * accel(y + yk1 / 2, v + vk1 / 2, t + dt / 2) yk3 = dt * (v + vk2 / 2) vk3 = dt * accel(y + yk2 / 2, v + vk2 / 2, t + dt / 2) yk4 = dt * (v + vk3) vk4 = dt * accel(y + yk3, v + vk3, t + dt) ynew = y + (yk1 + 2 * yk2 + 2 * yk3 + yk4) / 6 vnew = v + (vk1 + 2 * vk2 + 2 * vk3 + vk4) / 6 return ynew, vnew def euler(y, v, t, dt): # simple euler integrator vnew = v + accel(y, v, t) * dt ynew = y + vnew * dt + 1 / 2 * accel(y, vnew, t) * dt ** 2 return ynew, vnew positions_eu, positions_rk = [], [] y_eu, y_rk = np.array(y), np.array(y) v_eu, v_rk = np.array(v), np.array(v) t = 0 for i in progressbar(nsteps, c="b", title="integrating RK4 and Euler"): y_eu, v_eu = euler(y_eu, v_eu, t, dt) y_rk, v_rk = runge_kutta4(y_rk, v_rk, t, dt) t += dt positions_eu.append(y_eu) # store result of integration positions_rk.append(y_rk) #################################################### # Visualize the result #################################################### plt = Plotter(interactive=False, axes=2, size=(1400,1000)) line_eu = Line([0,0,0], [len(x)-1,0,0], res=len(x)).c("red5").lw(5) plt += line_eu line_rk = Line([0,0,0], [len(x)-1,0,0], res=len(x)).c("green5").lw(5) plt += line_rk # let's also add a fancy background image from wikipedia img = dataurl + "images/wave_wiki.png" plt += Image(img).alpha(0.8).scale(0.4).pos(0,-100,-1) plt += __doc__ plt.show(zoom=1.5) for i in progressbar(nsteps, title="visualize the result", c='y'): if i%10 != 0: continue y_eu = positions_eu[i] # retrieve the list of y positions at step i y_rk = positions_rk[i] pts = line_eu.points pts[:,1] = y_eu line_eu.points = pts pts = line_rk.points pts[:,1] = y_rk line_rk.points = pts plt.render() plt.interactive().close() vedo-2025.5.3/examples/simulations/wave_equation2d.py000066400000000000000000000031661474667405700225730ustar00rootroot00000000000000"""Solve the wave equation using finite differences and the Euler method""" import numpy as np from scipy.ndimage import gaussian_filter from vedo import Plotter, Grid, Text2D N = 400 # grid resolution A, B = 5, 4 # box sides end = 5 # end time nframes = 150 X, Y = np.mgrid[-A:A:N*1j, -B:B:N*1j] dx = X[1,0] - X[0,0] dt = 0.1 * dx time = np.arange(0, end, dt) m = int(len(time)/nframes) # initial condition (a ring-like wave) Z0 = np.ones_like(X) Z0[X**2+Y**2 < 1] = 0 Z0[X**2+Y**2 > 2] = 0 Z0 = gaussian_filter(Z0, sigma=4) Z1 = np.array(Z0) grid = Grid(s=(X[:,0], Y[0])).linewidth(0).lighting('glossy') txt = Text2D(font='Brachium', pos='bottom-left', bg='yellow5') cam = dict( pos=(5.715, -10.54, 12.72), focal_point=(0.1380, -0.7437, -0.5408), viewup=(-0.2242, 0.7363, 0.6384), distance=17.40, ) plt = Plotter(axes=1, size=(1000,700), interactive=False) plt.show(grid, txt, __doc__, camera=cam) for i in range(nframes): # iterate m times before showing the frame for _ in range(m): ZC = Z1.copy() Z1[1:N-1, 1:N-1] = ( 2*Z1[1:N-1, 1:N-1] - Z0[1:N-1, 1:N-1] + (dt/dx)**2 * ( Z1[2:N, 1:N-1] + Z1[0:N-2, 1:N-1] + Z1[1:N-1, 0:N-2] + Z1[1:N-1, 2:N ] - 4*Z1[1:N-1, 1:N-1] ) ) Z0[:] = ZC[:] wave = Z1.ravel() txt.text(f"frame: {i}/{nframes}, height_max = {wave.max()}") grid.cmap("Blues", wave, vmin=-2, vmax=2) newpts = grid.points newpts[:,2] = wave grid.points = newpts # update the z component plt.render() plt.interactive() plt.close() vedo-2025.5.3/examples/volumetric/000077500000000000000000000000001474667405700167405ustar00rootroot00000000000000vedo-2025.5.3/examples/volumetric/app_isobrowser.py000066400000000000000000000003641474667405700223530ustar00rootroot00000000000000from vedo import dataurl, Volume from vedo.applications import IsosurfaceBrowser vol = Volume(dataurl+'head.vti') # IsosurfaceBrowser(Plotter) instance: plt = IsosurfaceBrowser(vol, use_gpu=True, c='gold') plt.show(axes=7, bg2='lb').close() vedo-2025.5.3/examples/volumetric/app_raycaster.py000066400000000000000000000005131474667405700221460ustar00rootroot00000000000000from vedo import Volume, dataurl from vedo.applications import RayCastPlotter # Load Volume data embryo = Volume(dataurl + "embryo.slc") embryo.mode(1).cmap("jet") # change visual properties # Create a Plotter instance and show plt = RayCastPlotter(embryo, bg='black', bg2='blackboard', axes=7) plt.show(viewup="z") plt.close() vedo-2025.5.3/examples/volumetric/colorize_volume.py000066400000000000000000000020431474667405700225260ustar00rootroot00000000000000"""Custom color and transparency maps for Volumes""" from vedo import Volume, dataurl, show from vedo.pyplot import CornerHistogram # Build a Volume object. # A set of color/transparency values - of any length - can be passed # to define the transfer function in the range of the scalar. # E.g.: setting alpha=[0, 0, 0, 1, 0, 0, 0] would make visible # only voxels with value close to center of the range (see histogram). vol = Volume(dataurl + "embryo.slc") vol.color( [ (0, "green"), (49, "green"), (50, "blue"), (109, "blue"), (110, "red"), (180, "red"), ] ) # vol.mode('max-projection') vol.alpha([0.0, 1.0]) vol.alpha_unit(8) # absorption unit, higher factors = higher transparency vol.add_scalarbar3d(title="color:dot:alpha transfer function", c="k") # substitute scalarbar3d to a 2d scalarbar vol.scalarbar = vol.scalarbar.clone2d("center-right", 0.2) ch = CornerHistogram(vol, logscale=True, pos="bottom-left") # show both Volume and Mesh show(vol, ch, __doc__, axes=1, zoom=1.2).close() vedo-2025.5.3/examples/volumetric/delaunay3d.py000066400000000000000000000011071474667405700213420ustar00rootroot00000000000000"""Delaunay 3D tetralization""" from vedo import * import numpy as np settings.use_depth_peeling = True pts = (np.random.rand(10000, 3)-0.5)*2 s = Sphere().alpha(0.1) pin = s.inside_points(pts) pin.subsample(0.05) # impose min separation (5% of bounding box) printc("# of points inside the sphere:", pin.npoints) tmesh = pin.generate_delaunay3d().shrink(0.95) cmesh = tmesh.cut_with_plane(normal=(1,2,-1)) # cmesh.pipeline.show() # to show the graph of operations show([(s, pin, "Generate points in a Sphere"), (cmesh.tomesh(), __doc__), ], N=2, axes=1, ).close() vedo-2025.5.3/examples/volumetric/densifycloud.py000066400000000000000000000012611474667405700220020ustar00rootroot00000000000000"""Generate a denser point cloud. The new points are created in such a way that all points in any local neighborhood are within a target distance of one another""" from vedo import Points, printc, show import numpy as np npts = 50 # nr. of points coords = np.random.rand(npts, 3) # range is [0, 1] scals = np.abs(coords[:, 1]) # let the scalar be the y of the point itself pts = Points(coords, r=9) pts.pointdata["scals"] = scals densecloud = pts.densify(0.1, nclosest=10, niter=1) # return a new pointcloud.Points printc('nr. points increased', pts.npoints, ':rightarrow:', densecloud.npoints, c='lg') show([(pts, __doc__), densecloud], N=2, axes=1).close() vedo-2025.5.3/examples/volumetric/earth_model.py000066400000000000000000000041361474667405700216010ustar00rootroot00000000000000"""Visualization of a discretized Earth model""" import vedo vedo.settings.default_font = 'Kanopus' tet = vedo.TetMesh(vedo.dataurl+'earth_model.vtu') conductor = tet.clone().threshold('cell_scalars', above=0, below=4) # Crop the initial mesh box = vedo.Box([503500, 505000, 6414000, 6417000, -1830, 600]) tet.cut_with_mesh(box, whole_cells=True) # We need to build a look up table for our color bar lut_table = [ #value, color, alpha, category_label ( 0.0, 'black', 1, "Cond_0"), ( 1.0, 'cyan', 1, "Cond_1"), ( 2.0, 'skyblue', 1, "Cond_2"), ( 3.0, 'dodgerblue', 1, "Cond_3"), ( 4.0, 'blue', 1, "Cond_4"), ( 5.0, 'gray', 1, "Overburden"), ( 6.0, 'yellow', 1, "Layer^A"), ( 7.0, 'gold', 1, "Layer^B"), ( 9.0, 'red', 1, "Layer^C"), (11.0, 'powderblue', 1, "Layer^D"), (13.0, 'lime', 1, "Layer^E"), (15.0, 'seagreen', 1, "Layer^V"), ] lut = vedo.build_lut(lut_table, interpolate=1) msh = tet.tomesh(shrink=0.95, fill=True) msh.cmap(lut, 'cell_scalars', on='cells') msh.add_scalarbar3d( categories=lut_table, pos=(505700, 6417950, -1630), title='Units', title_size=1.25, label_size=1.5, size=[100, 2200], ) # Put scalarbar vertical, tell camera to keep bounds into account # msh.scalarbar.rotate_x(90).rotate_z(60).use_bounds(True) # OR: use clone2d to create a 2D scalarbar from the 3D one msh.scalarbar = msh.scalarbar.clone2d(pos=[0.7,-0.95], size=0.3) # Create cmap for conductor cond = conductor.tomesh().cmap(lut, 'cell_scalars', on='cells') axes = vedo.Axes( msh + cond, xtitle='Easting (m)', ytitle='Northing (m)', ztitle='Elevation (m)', xtitle_position=0.65, ytitle_position=0.65, ztitle_position=0.65, ytitle_offset=-0.22, ztitle_offset= 0.06, ylabel_rotation=90, ylabel_offset=-1.5, zaxis_rotation=15, axes_linewidth=3, grid_linewidth=2, yshift_along_x=1, tip_size=0, yzgrid=True, xyframe_line=True, ) vedo.show(msh, cond, axes, __doc__, size=(1305, 1020), roll=-80, azimuth=50, elevation=-10, zoom=1.2).close() vedo-2025.5.3/examples/volumetric/erode_dilate.py000066400000000000000000000005251474667405700217340ustar00rootroot00000000000000"""Erode or dilate a Volume by replacing a voxel with the max/min over an ellipsoidal neighborhood""" from vedo import * embryo = Volume(dataurl+'embryo.tif') eroded = embryo.clone().erode(neighbours=(2,2,2)) dilatd = eroded.clone().dilate(neighbours=(2,2,2)) show([(embryo, __doc__), eroded, dilatd], N=3, viewup='z', zoom=1.4).close() vedo-2025.5.3/examples/volumetric/euclidian_dist.py000066400000000000000000000004421474667405700222720ustar00rootroot00000000000000"""Euclidean Distance Transform using Saito algorithm. The distance map produced contains the square of the Euclidean distance values""" from vedo import * e = Volume(dataurl+'embryo.tif') edt = e.euclidean_distance() show([(e,__doc__), edt], N=2, viewup='z', axes=1, zoom=1.5).close() vedo-2025.5.3/examples/volumetric/image_false_colors.py000066400000000000000000000015471474667405700231360ustar00rootroot00000000000000"""Generate the Mandelbrot set as a color-mapped Image object""" import numpy as np from vedo import Image, dataurl, show def mandelbrot(h=400, w=400, maxit=20, r=2): # Returns an image of the Mandelbrot fractal of size (h,w) x = np.linspace(-2.5, 1.5, 4*h+1) y = np.linspace(-1.5, 1.5, 3*w+1) A, B = np.meshgrid(x, y) C = A + B*1j z = np.zeros_like(C) divtime = maxit + np.zeros(z.shape, dtype=int) for i in range(maxit): z = z**2 + C diverge = abs(z) > r # who is diverging div_now = diverge & (divtime == maxit) # who is diverging now divtime[div_now] = i # note when z[diverge] = r # avoid diverging too much return divtime img = Image(mandelbrot()).cmap("RdGy") show(img, __doc__, axes=1, size=[800,600], zoom=1.4).close() vedo-2025.5.3/examples/volumetric/image_fft.py000066400000000000000000000010541474667405700212330ustar00rootroot00000000000000# 2D Fast Fourier Transform of a image from vedo import Image, show url = 'https://vedo.embl.es/examples/data/images/dog.jpg' img = Image(url).resize([200,None]) # resize so that x has 200 pixels, but keep y aspect-ratio img_fft = img.fft(logscale=12) img_fft = img_fft.tomesh().cmap('Set1',"RGBA").add_scalarbar("12 log(fft)") # optional step show([ [img, f"Original image\n{url[-40:]}"], [img_fft, "2D Fast Fourier Transform"], [img.fft(mode='complex').rfft(), "Reversed FFT"], ], N=3, bg='gray7', axes=1, ).close() vedo-2025.5.3/examples/volumetric/image_probe.py000066400000000000000000000025331474667405700215660ustar00rootroot00000000000000"""Probe image intensities along a set of radii""" from vedo import Image, dataurl, Circle, Lines, show from vedo.pyplot import plot import numpy as np img = Image(dataurl+'images/spheroid.jpg') cpt = [580,600,0] circle = Circle(cpt, r=500, res=36).wireframe() pts = circle.points # 3d coords of the points of the circle centers = np.zeros_like(pts) + cpt # create the same amount of center coords lines = Lines(centers, pts, res=50) # create Lines with 50 pts of resolution each lines.interpolate_data_from(img, n=3) # interpolate all msh data onto the lines print(lines.pointdata) # print all available arrays rgb = lines.pointdata['JPEGImage'] # extract the rgb intensities intensities = np.sum(rgb, axis=1) # sum the rgb values into one single intensty intensities_ray = np.split(intensities, 36) # split array so we can index any radius mean_intensity = np.mean(intensities_ray, axis=0) # compute the average intensity # add some optional plotting here: fig = plot( mean_intensity, lc='black', lw=5, spline=True, xtitle='radial distance', ytitle='intensity', aspect=16/9, ) for i in range(0,36, 3): fig += plot(intensities_ray[i], lc=i, lw=1, like=fig) fig.scale(21).shift(60,-800) # scale up and move plot below the image show(img, circle, lines, fig, __doc__, size=(625,1000), zoom=1.5) vedo-2025.5.3/examples/volumetric/image_rgba.py000066400000000000000000000014331474667405700213700ustar00rootroot00000000000000"""Example plot of 2 images containing an alpha channel for modulating the opacity""" #Credits: https://github.com/ilorevilo from vedo import Image, show import numpy as np rgbaimage1 = np.random.rand(50, 50, 4) * 255 alpharamp = np.linspace(0, 255, 50).astype(int) rgbaimage1[:, :, 3] = alpharamp rgbaimage2 = np.random.rand(50, 50, 4) * 255 rgbaimage2[:, :, 3] = alpharamp[::-1] img1 = Image(rgbaimage1, channels=4) img2 = Image(rgbaimage2, channels=4).z(12) show(img1, img2, __doc__, axes=7, viewup="z").close() # Second example: a b&w image from a numpy array img = np.zeros([512,512]) img[0:256, 0:256] = 0 img[0:256, 256:] = 64 img[256:, 0:256] = 128 img[256:, 256:] = 255 img = img.transpose(1,0) img3 = Image(img) show(img3, mode="image", bg=(0.4,0.5,0.6), axes=1).close() vedo-2025.5.3/examples/volumetric/image_to_mesh.py000066400000000000000000000013321474667405700221110ustar00rootroot00000000000000# Transform a image into a mesh from vedo import Image, dataurl, show import numpy as np img = Image(dataurl+"images/dog.jpg").smooth(5) msh = img.tomesh() # make a quad-mesh out of it # build a scalar array with intensities rgb = msh.pointdata["RGBA"] intensity = np.sum(rgb, axis=1) intensityz = np.zeros_like(rgb) intensityz[:,2] = intensity / 10 # set the new vertex points msh.points += intensityz # more cosmetics msh.triangulate().smooth() msh.lighting("default").cmap("bone", "RGBA") msht = img.clone().threshold(100) show([[img, "A normal jpg image.."], [msh, "..becomes a polygonal Mesh"], [msht, "Thresholding also generates a Mesh"] ], N=3, axes=1, zoom=1.1, elevation=-20, bg='black').close() vedo-2025.5.3/examples/volumetric/interpolate_volume.py000066400000000000000000000027071474667405700232350ustar00rootroot00000000000000"""Generate a Volume by interpolating a scalar which is only known on a scattered set of points or mesh. The blue layer is the result of thresholding the volume between 0.3 and 0.4 and assigning it the new value 0.9 (blue)""" from vedo import Points, show from vedo.pyplot import CornerHistogram import numpy as np npts = 500 # nr. of points where the scalar value is known coords = np.random.rand(npts, 3) # range is [0, 1] scals = coords[:, 2] # let the scalar be the z of the point itself pts = Points(coords) pts.pointdata["scals"] = scals # Now interpolate the values at these points to the full Volume # available interpolation kernels are: shepard, gaussian, voronoi, linear. vol = pts.tovolume(kernel='shepard', n=4, dims=(90,90,90)) vol.cmap(["maroon","g","b"]) # set color transfer function vol.alpha([0.3, 0.9]) # set opacity transfer function #vol.alpha([(0.3,0.3), (0.9,0.9)]) # alternative way, by specifying (xscalar, alpha) vol.alpha_unit(0.5) # make the whole object less transparent (default is 1) # replace voxels of specific range with a new value vol.threshold(above=0.3, below=0.4, replace=0.9) # Note that scalar range now has changed (you may want to reapply vol.c().alpha()) ch = CornerHistogram(vol, pos="bottom-left") vol.add_scalarbar3d('Height is the voxel scalar', size=[None,1]) vol.scalarbar.rotate_x(90).pos(0,1,0) show(pts, vol, ch, __doc__, axes=1, elevation=-90).close() vedo-2025.5.3/examples/volumetric/isosurfaces1.py000066400000000000000000000006261474667405700217250ustar00rootroot00000000000000"""Interactively cut a set of isosurfaces from a volumetric dataset""" from vedo import dataurl, show, BoxCutter, Volume # generate an isosurface the volume for each value values = [0.1, 0.25, 0.4, 0.6, 0.75, 0.9] isos = Volume(dataurl+'quadric.vti').isosurface(values) # Mesh plt = show(isos, __doc__, axes=1, interactive=False) cutter = BoxCutter(isos) plt.add(cutter) plt.interactive() plt.close() vedo-2025.5.3/examples/volumetric/isosurfaces2.py000066400000000000000000000024131474667405700217220ustar00rootroot00000000000000"""Isosurface extraction from a volume dataset with discrete values (labels).""" from vedo import * settings.default_font = "Antares" lut = build_lut( [ [0, "lightyellow"], [1, "red8"], [2, "blue"], [3, "yellow"], [4, "orange"], [5, "cyan"], [6, "magenta"], [7, "white"], [8, "pink"], [9, "brown"], [10, "lightblue"], [11, "lightgreen"], [12, "red4"], ], interpolate=False, ) # This dataset is a 3D volume of 64x64x64 voxels containing 12 "blobs" blobs = Volume(dataurl + "blobs.vti") box = blobs.box() isovalues = list(range(1, 13)) iso_discrete = blobs.isosurface_discrete( isovalues, background_label=0, internal_boundaries=True, nsmooth=10, ) iso_discrete.cmap(lut) separate_blobs = [] txt_vols = [] for i in isovalues: b = iso_discrete.clone().threshold(0, i - 0.5, i + 0.5, on="cells") b.cap().clean().compute_normals() b.color(i).alpha(0.1).wireframe().lighting("off") v = b.volume() / 1e3 cm = b.center_of_mass() txt = Text3D(f"blob {i}\nvol={v:.2f}", c=i, justify="center", pos=cm) txt_vols.append(txt) separate_blobs.append(b) show([[iso_discrete, box, __doc__], [separate_blobs, txt_vols, box]], N=2, axes=1) vedo-2025.5.3/examples/volumetric/legosurface.py000066400000000000000000000007031474667405700216110ustar00rootroot00000000000000"""Represent a volume as lego blocks (voxels). Colors correspond to the volume's scalar. Try also: > vedo --lego data/embryo.tif""" from vedo import * vol = Volume(dataurl+'embryo.tif') vol.crop(back=0.50) # crop 50% from neg. y # show lego blocks whose value is between vmin and vmax lego = vol.legosurface(vmin=20, vmax=None, boundary=False) lego.cmap('seismic', vmin=0, vmax=127).add_scalarbar() show(lego, __doc__, axes=1, viewup='z').close() vedo-2025.5.3/examples/volumetric/lowpassfilter.py000066400000000000000000000011621474667405700222100ustar00rootroot00000000000000from vedo import * # mode = 1 is maximum projection (default is 0=composite) t1 = Text2D('Original volume', c='lg') v1 = Volume(dataurl+'embryo.tif').mode(1) v1.add_scalarbar3d(c='w') v1.scalarbar = v1.scalarbar.clone2d("top-right", 0.08) # cutoff range is roughly in the range of 1 / size of object t2 = Text2D('High freqs in the FFT are cut off', c='lb') v2 = v1.clone().frequency_pass_filter(high_cutoff=.001, order=1).mode(1) v2.add_scalarbar3d(c='w') v2.scalarbar = v2.scalarbar.clone2d("top-right", 0.08) show([(v1,t1), (v2,t2)], N=2, bg='bb', zoom=1.5, axes=dict(digits=2)).close() #write(v2, 'embryo_filtered.vti') vedo-2025.5.3/examples/volumetric/mesh2volume.py000066400000000000000000000006731474667405700215660ustar00rootroot00000000000000"""Build a volume from a mesh where the foreground voxels are set to 255 and the background voxels are 0""" from vedo import Mesh, dataurl, Plotter surf = Mesh(dataurl+"bunny.obj").normalize().wireframe() vol = surf.binarize() vol.alpha([0,0.75]).cmap('blue5') iso = vol.isosurface().color("blue5") plt = Plotter(N=2, axes=9) plt.at(0).show(vol, surf, __doc__) plt.at(1).show("..the volume is isosurfaced:", iso) plt.interactive().close() vedo-2025.5.3/examples/volumetric/multiscalars.py000066400000000000000000000022621474667405700220170ustar00rootroot00000000000000"""A Volume can have multiple scalars associated to each voxel""" from vedo import dataurl, Volume, printc, show import numpy as np vol = Volume(dataurl+'vase.vti') nx, ny, nz = vol.dimensions() r0,r1 = vol.scalar_range() vol.add_scalarbar3d('original voxel scalars') # create a set of scalars and add it to the Volume vol.pointdata["myscalars1"] = np.linspace(r0,r1, num=nx*ny*nz) # create another set of scalars and add it to the Volume vol.pointdata["myscalars2"] = np.random.randint(-100,+100, nx*ny*nz) # make SLCImage scalars the active array (can set 0, to pick the first): printc('Arrays in Volume are:', vol.pointdata.keys(), invert=True) vol.pointdata.select("SLCImage") # select the first data array as the active one # Build the isosurface of the active scalars, # but use testscals1 to colorize this isosurface, and then smooth it iso1 = vol.isosurface().cmap('rainbow', 'myscalars1').smooth() iso1.add_scalarbar3d('myscalars1') iso2 = vol.isosurface().cmap('viridis', 'myscalars2') iso2.add_scalarbar3d('myscalars2') show([(vol, __doc__), (iso1,"Colorize isosurface using\nmyscalars1"), (iso2,"Colorize isosurface using\nmyscalars2"), ], N=3, axes=1 ).close() vedo-2025.5.3/examples/volumetric/numpy2volume0.py000066400000000000000000000004001474667405700220460ustar00rootroot00000000000000"""Modify a Volume in-place from a numpy array""" from vedo import Volume, dataurl, show vol = Volume(dataurl+"embryo.tif") arr = vol.tonumpy() arr[:] = arr/5 + 15 # modify the array in-place with [:] vol.modified() show(vol, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/numpy2volume1.py000066400000000000000000000011561474667405700220600ustar00rootroot00000000000000"""Create a Volume from a numpy.mgrid""" import numpy as np from vedo import Volume, Text2D, show X, Y, Z = np.mgrid[:30, :30, :30] # Distance from the center at (15, 15, 15) scalar_field = ((X-15)**2 + (Y-15)**2 + (Z-15)**2) /225 vol = Volume(scalar_field).crop(0.3) vol.add_scalarbar3d() print('numpy array from Volume:', vol.tonumpy().shape) lego = vol.legosurface(vmin=1.1, vmax=2) lego.cmap('hot_r', vmin=1.1, vmax=2).add_scalarbar3d() text1 = Text2D(__doc__, c='blue') text2 = Text2D('..and its lego isosurface representation\nvmin=1, vmax=2', c='dr') show([(vol,text1), (lego,text2)], N=2, azimuth=10).close() vedo-2025.5.3/examples/volumetric/numpy2volume2.py000066400000000000000000000005721474667405700220620ustar00rootroot00000000000000"""Create a Volume from a numpy array""" import numpy as np from vedo import Volume, show data_matrix = np.zeros([70, 80, 90], dtype=np.uint8) data_matrix[ 0:30, 0:30, 0:30] = 1 data_matrix[30:50, 30:60, 30:70] = 2 data_matrix[50:70, 60:80, 70:90] = 3 vol = Volume(data_matrix) vol.cmap(['white','b','g','r']).mode(1) vol.add_scalarbar() show(vol, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/numpy_imread.py000066400000000000000000000010111474667405700217740ustar00rootroot00000000000000"""Create a Volume from a numpy object using imread""" from vedo import * from skimage.io import imread f = dataurl+'embryo.tif' voriginal = Volume(f) printc('voxel size is', voriginal.spacing(), c='cyan') raw = imread(f) narray = np.transpose(raw, axes=[2, 1, 0]) vraw = Volume(narray, spacing=(104,104,104)) # Compare loading the volume directly with the numpy volume: # they should be the same show( [(voriginal, __doc__), (vraw,"From imread\n(should be same as left)")], N=2, axes=1, ).close() vedo-2025.5.3/examples/volumetric/off_furniture.py000066400000000000000000000234431474667405700221750ustar00rootroot00000000000000# Pure vtk stuff. # Create the furniture objects for the office.py example import vtk def furniture(): # generate a whole bunch of planes which correspond to # the geometry in the analysis; tables, bookshelves and so on. from vedo import download reader = vtk.vtkStructuredGridReader() fpath = download('https://vedo.embl.es/examples/data/office.binary.vtk', verbose=0) reader.SetFileName(fpath) reader.Update() sgrid = reader.GetOutput() table1 = vtk.vtkStructuredGridGeometryFilter() table1.SetInputData(sgrid) table1.SetExtent(11, 15, 7, 9, 8, 8) mapTable1 = vtk.vtkPolyDataMapper() mapTable1.SetInputConnection(table1.GetOutputPort()) mapTable1.ScalarVisibilityOff() table1Actor = vtk.vtkActor() table1Actor.SetMapper(mapTable1) table1Actor.GetProperty().SetColor(.59, .427, .392) table2 = vtk.vtkStructuredGridGeometryFilter() table2.SetInputData(sgrid) table2.SetExtent(11, 15, 10, 12, 8, 8) mapTable2 = vtk.vtkPolyDataMapper() mapTable2.SetInputConnection(table2.GetOutputPort()) mapTable2.ScalarVisibilityOff() table2Actor = vtk.vtkActor() table2Actor.SetMapper(mapTable2) table2Actor.GetProperty().SetColor(.59, .427, .392) FilingCabinet1 = vtk.vtkStructuredGridGeometryFilter() FilingCabinet1.SetInputData(sgrid) FilingCabinet1.SetExtent(15, 15, 7, 9, 0, 8) mapFilingCabinet1 = vtk.vtkPolyDataMapper() mapFilingCabinet1.SetInputConnection(FilingCabinet1.GetOutputPort()) mapFilingCabinet1.ScalarVisibilityOff() FilingCabinet1Actor = vtk.vtkActor() FilingCabinet1Actor.SetMapper(mapFilingCabinet1) FilingCabinet1Actor.GetProperty().SetColor(.8, .8, .6) FilingCabinet2 = vtk.vtkStructuredGridGeometryFilter() FilingCabinet2.SetInputData(sgrid) FilingCabinet2.SetExtent(15, 15, 10, 12, 0, 8) mapFilingCabinet2 = vtk.vtkPolyDataMapper() mapFilingCabinet2.SetInputConnection(FilingCabinet2.GetOutputPort()) mapFilingCabinet2.ScalarVisibilityOff() FilingCabinet2Actor = vtk.vtkActor() FilingCabinet2Actor.SetMapper(mapFilingCabinet2) FilingCabinet2Actor.GetProperty().SetColor(.8, .8, .6) bookshelf1Top = vtk.vtkStructuredGridGeometryFilter() bookshelf1Top.SetInputData(sgrid) bookshelf1Top.SetExtent(13, 13, 0, 4, 0, 11) mapBookshelf1Top = vtk.vtkPolyDataMapper() mapBookshelf1Top.SetInputConnection(bookshelf1Top.GetOutputPort()) mapBookshelf1Top.ScalarVisibilityOff() bookshelf1TopActor = vtk.vtkActor() bookshelf1TopActor.SetMapper(mapBookshelf1Top) bookshelf1TopActor.GetProperty().SetColor(.8, .8, .6) bookshelf1Bottom = vtk.vtkStructuredGridGeometryFilter() bookshelf1Bottom.SetInputData(sgrid) bookshelf1Bottom.SetExtent(20, 20, 0, 4, 0, 11) mapBookshelf1Bottom = vtk.vtkPolyDataMapper() mapBookshelf1Bottom.SetInputConnection(bookshelf1Bottom.GetOutputPort()) mapBookshelf1Bottom.ScalarVisibilityOff() bookshelf1BottomActor = vtk.vtkActor() bookshelf1BottomActor.SetMapper(mapBookshelf1Bottom) bookshelf1BottomActor.GetProperty().SetColor(.8, .8, .6) bookshelf1Front = vtk.vtkStructuredGridGeometryFilter() bookshelf1Front.SetInputData(sgrid) bookshelf1Front.SetExtent(13, 20, 0, 0, 0, 11) mapBookshelf1Front = vtk.vtkPolyDataMapper() mapBookshelf1Front.SetInputConnection(bookshelf1Front.GetOutputPort()) mapBookshelf1Front.ScalarVisibilityOff() bookshelf1FrontActor = vtk.vtkActor() bookshelf1FrontActor.SetMapper(mapBookshelf1Front) bookshelf1FrontActor.GetProperty().SetColor(.8, .8, .6) bookshelf1Back = vtk.vtkStructuredGridGeometryFilter() bookshelf1Back.SetInputData(sgrid) bookshelf1Back.SetExtent(13, 20, 4, 4, 0, 11) mapBookshelf1Back = vtk.vtkPolyDataMapper() mapBookshelf1Back.SetInputConnection(bookshelf1Back.GetOutputPort()) mapBookshelf1Back.ScalarVisibilityOff() bookshelf1BackActor = vtk.vtkActor() bookshelf1BackActor.SetMapper(mapBookshelf1Back) bookshelf1BackActor.GetProperty().SetColor(.8, .8, .6) bookshelf1LHS = vtk.vtkStructuredGridGeometryFilter() bookshelf1LHS.SetInputData(sgrid) bookshelf1LHS.SetExtent(13, 20, 0, 4, 0, 0) mapBookshelf1LHS = vtk.vtkPolyDataMapper() mapBookshelf1LHS.SetInputConnection(bookshelf1LHS.GetOutputPort()) mapBookshelf1LHS.ScalarVisibilityOff() bookshelf1LHSActor = vtk.vtkActor() bookshelf1LHSActor.SetMapper(mapBookshelf1LHS) bookshelf1LHSActor.GetProperty().SetColor(.8, .8, .6) bookshelf1RHS = vtk.vtkStructuredGridGeometryFilter() bookshelf1RHS.SetInputData(sgrid) bookshelf1RHS.SetExtent(13, 20, 0, 4, 11, 11) mapBookshelf1RHS = vtk.vtkPolyDataMapper() mapBookshelf1RHS.SetInputConnection(bookshelf1RHS.GetOutputPort()) mapBookshelf1RHS.ScalarVisibilityOff() bookshelf1RHSActor = vtk.vtkActor() bookshelf1RHSActor.SetMapper(mapBookshelf1RHS) bookshelf1RHSActor.GetProperty().SetColor(.8, .8, .6) bookshelf2Top = vtk.vtkStructuredGridGeometryFilter() bookshelf2Top.SetInputData(sgrid) bookshelf2Top.SetExtent(13, 13, 15, 19, 0, 11) mapBookshelf2Top = vtk.vtkPolyDataMapper() mapBookshelf2Top.SetInputConnection(bookshelf2Top.GetOutputPort()) mapBookshelf2Top.ScalarVisibilityOff() bookshelf2TopActor = vtk.vtkActor() bookshelf2TopActor.SetMapper(mapBookshelf2Top) bookshelf2TopActor.GetProperty().SetColor(.8, .8, .6) bookshelf2Bottom = vtk.vtkStructuredGridGeometryFilter() bookshelf2Bottom.SetInputData(sgrid) bookshelf2Bottom.SetExtent(20, 20, 15, 19, 0, 11) mapBookshelf2Bottom = vtk.vtkPolyDataMapper() mapBookshelf2Bottom.SetInputConnection(bookshelf2Bottom.GetOutputPort()) mapBookshelf2Bottom.ScalarVisibilityOff() bookshelf2BottomActor = vtk.vtkActor() bookshelf2BottomActor.SetMapper(mapBookshelf2Bottom) bookshelf2BottomActor.GetProperty().SetColor(.8, .8, .6) bookshelf2Front = vtk.vtkStructuredGridGeometryFilter() bookshelf2Front.SetInputData(sgrid) bookshelf2Front.SetExtent(13, 20, 15, 15, 0, 11) mapBookshelf2Front = vtk.vtkPolyDataMapper() mapBookshelf2Front.SetInputConnection(bookshelf2Front.GetOutputPort()) mapBookshelf2Front.ScalarVisibilityOff() bookshelf2FrontActor = vtk.vtkActor() bookshelf2FrontActor.SetMapper(mapBookshelf2Front) bookshelf2FrontActor.GetProperty().SetColor(.8, .8, .6) bookshelf2Back = vtk.vtkStructuredGridGeometryFilter() bookshelf2Back.SetInputData(sgrid) bookshelf2Back.SetExtent(13, 20, 19, 19, 0, 11) mapBookshelf2Back = vtk.vtkPolyDataMapper() mapBookshelf2Back.SetInputConnection(bookshelf2Back.GetOutputPort()) mapBookshelf2Back.ScalarVisibilityOff() bookshelf2BackActor = vtk.vtkActor() bookshelf2BackActor.SetMapper(mapBookshelf2Back) bookshelf2BackActor.GetProperty().SetColor(.8, .8, .6) bookshelf2LHS = vtk.vtkStructuredGridGeometryFilter() bookshelf2LHS.SetInputData(sgrid) bookshelf2LHS.SetExtent(13, 20, 15, 19, 0, 0) mapBookshelf2LHS = vtk.vtkPolyDataMapper() mapBookshelf2LHS.SetInputConnection(bookshelf2LHS.GetOutputPort()) mapBookshelf2LHS.ScalarVisibilityOff() bookshelf2LHSActor = vtk.vtkActor() bookshelf2LHSActor.SetMapper(mapBookshelf2LHS) bookshelf2LHSActor.GetProperty().SetColor(.8, .8, .6) bookshelf2RHS = vtk.vtkStructuredGridGeometryFilter() bookshelf2RHS.SetInputData(sgrid) bookshelf2RHS.SetExtent(13, 20, 15, 19, 11, 11) mapBookshelf2RHS = vtk.vtkPolyDataMapper() mapBookshelf2RHS.SetInputConnection(bookshelf2RHS.GetOutputPort()) mapBookshelf2RHS.ScalarVisibilityOff() bookshelf2RHSActor = vtk.vtkActor() bookshelf2RHSActor.SetMapper(mapBookshelf2RHS) bookshelf2RHSActor.GetProperty().SetColor(.8, .8, .6) window = vtk.vtkStructuredGridGeometryFilter() window.SetInputData(sgrid) window.SetExtent(20, 20, 6, 13, 10, 13) mapWindow = vtk.vtkPolyDataMapper() mapWindow.SetInputConnection(window.GetOutputPort()) mapWindow.ScalarVisibilityOff() windowActor = vtk.vtkActor() windowActor.SetMapper(mapWindow) windowActor.GetProperty().SetColor(.3, .3, .5) outlet = vtk.vtkStructuredGridGeometryFilter() outlet.SetInputData(sgrid) outlet.SetExtent(0, 0, 9, 10, 14, 16) mapOutlet = vtk.vtkPolyDataMapper() mapOutlet.SetInputConnection(outlet.GetOutputPort()) mapOutlet.ScalarVisibilityOff() outletActor = vtk.vtkActor() outletActor.SetMapper(mapOutlet) outletActor.GetProperty().SetColor(1, 1, 1) inlet = vtk.vtkStructuredGridGeometryFilter() inlet.SetInputData(sgrid) inlet.SetExtent(0, 0, 9, 10, 0, 6) mapInlet = vtk.vtkPolyDataMapper() mapInlet.SetInputConnection(inlet.GetOutputPort()) mapInlet.ScalarVisibilityOff() inletActor = vtk.vtkActor() inletActor.SetMapper(mapInlet) inletActor.GetProperty().SetColor(1, 1, 1) outline = vtk.vtkStructuredGridOutlineFilter() outline.SetInputData(sgrid) mapOutline = vtk.vtkPolyDataMapper() mapOutline.SetInputConnection(outline.GetOutputPort()) outlineActor = vtk.vtkActor() outlineActor.SetMapper(mapOutline) outlineActor.GetProperty().SetColor(1, 1, 1) acts = [] acts.append(table1Actor) acts.append(table2Actor) acts.append(FilingCabinet1Actor) acts.append(FilingCabinet2Actor) acts.append(bookshelf1TopActor) acts.append(bookshelf1BottomActor) acts.append(bookshelf1FrontActor) acts.append(bookshelf1BackActor) acts.append(bookshelf1LHSActor) acts.append(bookshelf1RHSActor) acts.append(bookshelf2TopActor) acts.append(bookshelf2BottomActor) acts.append(bookshelf2FrontActor) acts.append(bookshelf2BackActor) acts.append(bookshelf2LHSActor) acts.append(bookshelf2RHSActor) acts.append(windowActor) acts.append(outletActor) acts.append(inletActor) acts.append(outlineActor) return acts if __name__ == "__main__": from vedo import show show(furniture()) vedo-2025.5.3/examples/volumetric/office.py000066400000000000000000000014521474667405700205470ustar00rootroot00000000000000"""Stream tubes originating from a probing grid of points. Data is from CFD analysis of airflow in an office with ventilation and a burning cigarette.""" from vedo import * from off_furniture import furniture fpath = download(dataurl + 'office.binary.vtk') sgrid = loadStructuredGrid(fpath) ugrid = UnstructuredGrid(sgrid) # convert to unstructured grid which vedo supports # Create a grid of points and use it as integration seeds seeds = Grid(res=[2,3], c="white").rotate_y(90).pos(2,2,1) streamlines = ugrid.compute_streamlines(seeds, initial_step_size=0.01, max_propagation=15) streamlines.cmap("Reds").add_scalarbar3d(c='white') streamlines.scalarbar = streamlines.scalarbar.clone2d("center-right", size=0.15) print(streamlines) show(streamlines, seeds, furniture(), __doc__, axes=1, bg='bb').close() vedo-2025.5.3/examples/volumetric/probe_line1.py000066400000000000000000000010551474667405700215120ustar00rootroot00000000000000"""Probe a Volume (voxel dataset) with lines""" from vedo import * vol = Volume(dataurl + "embryo.slc") lines = [] for i in range(60): # probe scalars on 60 parallel lines step = (i - 30) * 2 p1 = vol.center() + [-100, step, step] p2 = vol.center() + [ 100, step, step] ln = Line(p1, p2, res=100) lines.append(ln) lines = merge(lines) # Probe the Volume with the lines and add the scalars as pointdata lines.probe(vol) lines.lw(3).cmap('hot', vmin=0, vmax=110).add_scalarbar() print(lines) show(vol, lines, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/probe_line2.py000066400000000000000000000014171474667405700215150ustar00rootroot00000000000000"""Probe a Volume with a line and plot the intensity values""" from vedo import dataurl, Volume, Line, show from vedo.pyplot import plot vol = Volume(dataurl + "embryo.slc") vol.add_scalarbar3d("wild-type mouse embryo", c="k") vol.scalarbar = vol.scalarbar.clone2d("bottom-right", 0.2) p1, p2 = (50, 50, 50), (200, 200, 200) pl = Line(p1, p2, res=100).lw(4) # Probe the Volume with the line pl.probe(vol) # Get the probed values along the line xvals = pl.points[:, 0] yvals = pl.pointdata[0] # Plot the intensity values fig = plot( xvals, yvals, xtitle=" ", ytitle="voxel intensity", aspect=16 / 9, spline=True, lc="r", # line color marker="O", # marker style ) fig = fig.shift(0, 25, 0).clone2d() show(vol, pl, fig, __doc__, axes=14).close() vedo-2025.5.3/examples/volumetric/probe_points.py000066400000000000000000000010441474667405700220140ustar00rootroot00000000000000"""Probe a voxel dataset at specified points and plot a histogram of the values""" from vedo import np, dataurl, Points, Volume, Axes, show from vedo.pyplot import histogram vol = Volume(dataurl + 'embryo.slc') vol_axes = Axes(vol) pts = np.random.rand(5000, 3)*256 mpts = Points(pts).probe(vol).point_size(3) mpts.print() # valid = mpts.pointdata['ValidPointMask'] scalars = mpts.pointdata['SLCImage'] his = histogram(scalars, xtitle='Probed voxel value', xlim=(5,100)) show([(vol, vol_axes, mpts, __doc__), his], N=2, sharecam=False).close() vedo-2025.5.3/examples/volumetric/read_volume1.py000066400000000000000000000011741474667405700217000ustar00rootroot00000000000000from vedo import * from vedo.pyplot import histogram, plot cmap = 'nipy_spectral' alpha = np.array([0, 0, 0.05, 0.2, 0.8, 1]) vol = Volume(dataurl+"embryo.slc") vol.cmap(cmap).alpha(alpha).add_scalarbar3d(c='white') xvals = np.linspace(*vol.scalar_range(), len(alpha)) fig = histogram(vol, logscale=True, c=cmap, ac='white') fig+= plot(xvals, alpha*max(fig.frequencies), '--ow', like=fig).z(1) show([ (vol, Axes(vol, c='w'), f"Original Volume\ncolor map: {cmap}"), (fig.clone2d("center",1.2), "Voxel scalar histogram\nand opacity transfer function") ], N=2, sharecam=False, bg=(82,87,110), zoom=1.1, ).close() vedo-2025.5.3/examples/volumetric/read_volume2.py000066400000000000000000000023161474667405700217000ustar00rootroot00000000000000"""Load and render a 3D Volume mode=0, composite rendering mode=1, maximum-projection rendering""" from vedo import dataurl, Volume, show vol1 = Volume(dataurl+"vase.vti") # can set colors and transparencies along the scalar range # from minimum to maximum value. In this example voxels with # the smallest value will be completely transparent (and white) # while voxels with highest value of the scalar will get alpha=0.8 # and color will be=(0,0,1) vol1.color(["white", "fuchsia", "dg", (0,0,1)]) #vol1.color('jet') # a matplotlib colormap name is also accepted vol1.alpha([0.0, 0.2, 0.3, 0.8]) # a transparency for the GRADIENT of the scalar can also be set: # in this case when the scalar is ~constant the gradient is ~zero # and the voxel are made transparent: vol1.alpha_gradient([0.0, 0.5, 0.9]) vol1.add_scalarbar3d('composite shade') vol1.scalarbar = vol1.scalarbar.clone2d("center-right", size=0.2) # mode = 1 is maximum-projection volume rendering vol2 = Volume(dataurl+"vase.vti").mode(1) vol2.add_scalarbar3d('maximum-projection') vol2.scalarbar = vol2.scalarbar.clone2d("center-right", size=0.2) # show command creates and returns an instance of class Plotter show([[vol1, __doc__], vol2], N=2, axes=1).close() vedo-2025.5.3/examples/volumetric/read_volume3.py000066400000000000000000000005171474667405700217020ustar00rootroot00000000000000from vedo import Volume, dataurl from vedo.applications import Slicer2DPlotter vol = Volume(dataurl+"embryo.slc") plt = Slicer2DPlotter(vol) # use cmap("bw") to have black and white color scale # no argument will grab the existing cmap in vol (or use build_lut()) # plt.cmap('bw').lighting(window=120, level=25) plt.show().close() vedo-2025.5.3/examples/volumetric/rectl_grid1.py000066400000000000000000000012061474667405700215100ustar00rootroot00000000000000"""A RectilinearGrid is a dataset where edges are parallel to the coordinate axes. It can be thought of as a tessellation of a box in 3D space, similar to a Volume except that the cells are not necessarily cubes, but they can have different lengths along each axis.""" from vedo import * xcoords = 7 + np.sqrt(np.arange(0,900,25)) ycoords = np.arange(0, 20) zcoords = np.arange(0, 20) rgrid = RectilinearGrid([xcoords, ycoords, zcoords]) print(rgrid) # print(rgrid.x_coordinates().shape) # print(rgrid.has_blank_points()) # print(rgrid.compute_structured_coords([20,10,11])) msh = rgrid.tomesh().lw(1) show(msh, __doc__, axes=1, viewup="z") vedo-2025.5.3/examples/volumetric/run_all.sh000077500000000000000000000004311474667405700207310ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo for f in *.py do echo "Processing $f script.." python3 "$f" done vedo-2025.5.3/examples/volumetric/slab_vol.py000066400000000000000000000012671474667405700211210ustar00rootroot00000000000000"""Use slab() to extract a "thick" 2D slice from a 3D volume""" from vedo import Axes, Volume, Box, dataurl, settings, show from vedo.pyplot import histogram settings.default_font = "Calco" vol = Volume(dataurl + "embryo.tif") vaxes = Axes(vol, xygrid=False) slab = vol.slab([45,55], axis='z', operation='mean') slab.cmap('Set1_r', vmin=10, vmax=80).add_scalarbar("intensity") # histogram(slab).show().close() # quickly inspect it bbox = slab.metadata["slab_bounding_box"] slab.z(-bbox[5] + vol.zbounds()[0]) # move slab to the bottom # create a box around the slab for reference slab_box = Box(bbox).wireframe().c("black") show(__doc__, vol, slab, slab_box, vaxes, axes=14, viewup='z') vedo-2025.5.3/examples/volumetric/slice_mesh.py000066400000000000000000000006161474667405700214300ustar00rootroot00000000000000"""Probe a Volume with a Mesh""" from vedo import * # Load a Volume vol = Volume(dataurl + 'embryo.slc') vol.cmap('bone').mode(1) # Create a Mesh (can be any mesh) msh = Paraboloid(res=200).scale(200).pos([100,100,200]) # Probe the Volume with the Mesh # and colorize it with the probed values msh.probe(vol) msh.cmap('Spectral').add_scalarbar().print() show(vol, msh, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/slice_plane1.py000066400000000000000000000021511474667405700216500ustar00rootroot00000000000000"""Slice a Volume with an arbitrary plane hover the plane to get the scalar values""" from vedo import dataurl, precision, Sphere, Volume, Plotter def func(evt): if not evt.object: return pid = evt.object.closest_point(evt.picked3d, return_point_id=True) txt = f"Probing:\n{precision(evt.object.picked3d, 3)}\nvalue = {arr[pid]}" pts = evt.object.points sph = Sphere(pts[pid]).c('orange7').pickable(False) fp = sph.flagpole(txt, s=7, offset=(-150,15), font=2).follow_camera() # remove old and add the two new objects plt.remove('Sphere', 'FlagPole').add(sph, fp).render() vol = Volume(dataurl+'embryo.slc') vol.cmap('white').alpha([0,0,0.8]).pickable(False) vslice = vol.slice_plane(vol.center(), [0,1,1]) vslice.cmap('Purples_r').add_scalarbar('Slice', c='w') arr = vslice.pointdata[0] # retrieve vertex array data print("slice shape :", vslice.metadata["shape"]) print("slice bounds:", vslice.metadata["original_bounds"]) plt = Plotter(axes=9, bg='k', bg2='bb') plt.add_callback('as my mouse moves please call', func) # be kind to vedo ;) plt.show(vol, vslice, __doc__) plt.close() vedo-2025.5.3/examples/volumetric/slice_plane2.py000066400000000000000000000013121474667405700216470ustar00rootroot00000000000000"""Slice a Volume with multiple planes Make low values of the scalar completely transparent""" from vedo import * vol = Volume(dataurl+'embryo.slc') vol.cmap('bone').alpha([0,0,0.5]) slices = [] for i in range(4): sl = vol.slice_plane(origin=[150,150,i*50+50], normal=(0,-1,1)) slices.append(sl) amap = [0, 1, 1, 1, 1] # hide low value points giving them alpha 0 mslices = merge(slices) # merge all slices into a single Mesh mslices.cmap('hot_r', alpha=amap).lighting('off') # Add a 3d scalarbar to the scene mslices.add_scalarbar3d() # make 2d copy of it and move it to the center-right mslices.scalarbar = mslices.scalarbar.clone2d("center-right", 0.15) show(vol, mslices, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/slice_plane3.py000066400000000000000000000014771474667405700216640ustar00rootroot00000000000000"""Interactively slice a Volume along a plane. Middle button + drag to slide the plane along the arrow""" from vedo import * normal = [0, 0, 1] cmap = "gist_stern_r" def func(w, _): c, n = pcutter.origin, pcutter.normal vslice = vol.slice_plane(c, n, autocrop=True).cmap(cmap) vslice.name = "Slice" plt.at(1).remove("Slice").add(vslice) vol = Volume(dataurl + "embryo.slc").cmap(cmap) vslice = vol.slice_plane(vol.center(), normal).cmap(cmap) vslice.name = "Slice" plt = Plotter(axes=0, N=2, bg="k", bg2="bb", interactive=False) plt.at(0).show(vol, __doc__, zoom=1.5) pcutter = PlaneCutter( vslice, normal=normal, alpha=0, c="white", padding=0, can_translate=False, can_scale=False, ) pcutter.add_observer("interaction", func) plt.at(1).add(pcutter) plt.interactive() plt.close() vedo-2025.5.3/examples/volumetric/slicer1.py000066400000000000000000000007261474667405700206610ustar00rootroot00000000000000"""Use sliders to slice a Volume (click button to change colormap)""" from vedo import dataurl, Volume, Text2D from vedo.applications import Slicer3DPlotter vol = Volume(dataurl + "embryo.slc") plt = Slicer3DPlotter( vol, cmaps=("gist_ncar_r", "jet", "Spectral_r", "hot_r", "bone_r"), use_slider3d=False, bg="white", bg2="blue9", ) # Can now add any other vedo object to the Plotter scene: plt += Text2D(__doc__) plt.show(viewup='z') plt.close() vedo-2025.5.3/examples/volumetric/slicer2.py000066400000000000000000000024751474667405700206650ustar00rootroot00000000000000"""Slice multiple datasets""" from vedo import Plotter, Text2D, load, dataurl, ScalarBar3D volumes = [dataurl+'vase.vti', dataurl+'embryo.slc', dataurl+'head.vti'] volumes = load(volumes) cmaps = ['hot_r', 'gist_ncar_r', 'bone_r'] ######################################################################## def initfunc(iren, vol): vol.mode(1).cmap('k').alpha([0, 0, 0.15, 0, 0]) txt = Text2D(data.filename[-20:], font='Calco') plt.at(iren).show(vol, vol.box(), txt) def func(widget, event): zs = int(widget.value) widget.title = f"z-slice = {zs}" msh = vol.zslice(zs) msh.cmap(cmaps[iren]).lighting("off") msh.name = "slice" sb = ScalarBar3D(msh, c='k') # sb = sb.clone2d("bottom-right", 0.08) plt.renderer = widget.renderer # make it the current renderer plt.remove("slice", "ScalarBar3D").add(msh, sb) return func # this is the actual function returned! ######################################################################## plt = Plotter(shape=(1, len(volumes)), sharecam=False, bg2='lightcyan') for iren, data in enumerate(volumes): plt.add_slider( initfunc(iren, data), #func 0, data.dimensions()[2], value=0, show_value=False, pos=[(0.1,0.1), (0.25,0.1)], ) plt.interactive().close() vedo-2025.5.3/examples/volumetric/streamlines1.py000066400000000000000000000025031474667405700217210ustar00rootroot00000000000000"""Streamlines originating from a set of seed points in space subjected to a vectorial field defined on a small set of points.""" from vedo import * import pandas as pd data = "https://raw.githubusercontent.com/plotly/datasets/master/vortex.csv" df = pd.read_csv(data) pts = np.c_[df['x'], df['y'], df['z']] wind = np.c_[df['u'], df['v'], df['w']] vpts = Points(pts, r=10) vpts.pointdata["Wind"] = wind # Convert points to a volume to create a domain for the streamlines vol = vpts.tovolume(kernel='shepard', n=4, dims=(20,20,20)) vol_pts = vol.coordinates iwind = vol.pointdata["Wind"] # interpolated wind arrs = Arrows(vol_pts, vol_pts + iwind*0.5, alpha=0.2) # Subsample the points to use as seed points seeds = vpts.clone().subsample(0.2) # Compute stream lines with Runge-Kutta integration # vol.pointdata.select("Wind") # in case there are other vectors streamlines = vol.compute_streamlines(seeds.points) streamlines.pointdata["wind_intensity"] = mag(streamlines.pointdata["Wind"]) streamlines.cmap("Reds").add_scalarbar() print(streamlines) show(seeds, arrs, streamlines, __doc__, axes=1, viewup='z').close() # Create a tube around the streamlines streamtubes = Tubes(streamlines, r=0.01, vary_radius_by_scalar=True) streamtubes.cmap("Reds").add_scalarbar() print(streamtubes) show(streamtubes, __doc__, axes=1, viewup='z').close() vedo-2025.5.3/examples/volumetric/streamlines2.py000066400000000000000000000016201474667405700217210ustar00rootroot00000000000000"""Load an existing dataset and draw the streamlines of the velocity field""" from vedo import * ######################## vtk import vtk # Read the data and specify which scalars and vectors to read. pl3d = vtk.vtkMultiBlockPLOT3DReader() fpath = download(dataurl+"combxyz.bin") pl3d.SetXYZFileName(fpath) fpath = download(dataurl+"combq.bin") pl3d.SetQFileName(fpath) pl3d.SetScalarFunctionNumber(100) pl3d.SetVectorFunctionNumber(202) pl3d.Update() # this vtkStructuredGridData already has a vector field: sdata = pl3d.GetOutput().GetBlock(0) ######################## vedo domain = UnstructuredGrid(sdata).alpha(0.1).c('white') probe = Grid(s=[5,5], res=[6,6], c='white').rotate_y(90).pos(5,0,29) streamlines = domain.compute_streamlines(probe) streamlines.celldata.select("SeedIds") streamlines.cmap("Set1", on='cells') print(streamlines) show(domain, streamlines, probe, __doc__, axes=7, bg='bb').close() vedo-2025.5.3/examples/volumetric/streamlines3.py000066400000000000000000000012221474667405700217200ustar00rootroot00000000000000"""Draw streamlines for the cavity case from OpenFOAM tutorial""" from vedo import * # Load an UnStructuredGrid ugrid = UnstructuredGrid(dataurl+"cavity.vtk").alpha(0.1) # Make a grid of points to probe as type Mesh probe = Grid(s=[0.1,0.01], res=[20,4], c='k') probe.rotate_x(90).pos(0.05,0.08,0.005) # Compute stream lines with Runge-Kutta4, return a Mesh ugrid.pointdata.select('U') # select active vector print(ugrid) coords = ugrid.vertices vects = ugrid.pointdata['U']/200 arrows = Arrows(coords-vects, coords+vects, c='jet_r') # use colormap stream = ugrid.compute_streamlines(probe) show(stream, arrows, ugrid, probe, __doc__, axes=5).close() vedo-2025.5.3/examples/volumetric/streamlines4.py000066400000000000000000000012171474667405700217250ustar00rootroot00000000000000from vedo import * f = download('https://github.com/marcomusy/vedo/files/4602353/domain_unstruct.vtk.gz') ug = UnstructuredGrid(gunzip(f)) # make up some custom vector field pts = ug.vertices x,y,z = pts.T windx = np.ones_like(x)*4 windy = np.exp(-(x+18)**2/100) * np.sign(y)/(abs(y)+8)*20 wind = np.c_[windx, windy, np.zeros_like(windy)] ug.pointdata["wind"] = wind # add the vectors to the mesh ars = Arrows(pts-wind/10, pts+wind/10, c='hot') ypr = np.linspace(-15,15, num=25) xpr = np.zeros_like(ypr)-40 probes = np.c_[xpr, ypr] lines = ug.compute_streamlines(probes, max_propagation=80).c("red4") show(ars, lines, zoom=8, bg2='lb').close() vedo-2025.5.3/examples/volumetric/struc_grid1.py000066400000000000000000000017421474667405700215440ustar00rootroot00000000000000# A StructuredGrid is a dataset where edges of the hexahedrons are # not necessarily parallel to the coordinate axes. # It can be thought of as a tessellation of a block of 3D space, # similar to a `RectilinearGrid` # except that the cells are not necessarily cubes, they can have different # orientations but are connected in the same way as a `RectilinearGrid`. from vedo import * # a noisy geometry cx = np.sqrt(np.linspace(100, 400, 10)) cy = np.linspace(30, 40, 20) cz = np.linspace(40, 50, 30) x, y, z = np.meshgrid(cx, cy, cz) + np.random.normal(0, 0.01, (20, 10, 30)) # sgrid1 = StructuredGrid(dataurl + "structgrid.vts") sgrid1 = StructuredGrid([x, y, z]) sgrid1.cmap("viridis", sgrid1.vertices[:, 0]+np.sin(sgrid1.vertices[:, 1])) print(sgrid1) sgrid2 = sgrid1.clone().cut_with_plane(normal=(-1,1,1), origin=[14,34,44]) msh2 = sgrid2.tomesh(shrink=0.9).linewidth(1).cmap("viridis") show( [["StructuredGrid", sgrid1], ["Shrinked Mesh", msh2]], N=2, axes=1, viewup="z", ) vedo-2025.5.3/examples/volumetric/tensors.py000066400000000000000000000013061474667405700210070ustar00rootroot00000000000000"""Visualize stress tensors as ellipsoids""" import vtk from vedo import * # Create a test volume with tensors pl = vtk.vtkPointLoad() pl.SetLoadValue(50) pl.SetSampleDimensions(6,6,6) pl.ComputeEffectiveStressOn() pl.SetPoissonsRatio(0.2) pl.SetModelBounds(-10,10,-10,10,-10,10) pl.Update() vol = Volume(pl.GetOutput()).mode(1) print(vol) # Extract a slice of the volume data at index 3 zsl = vol.zslice(3) # Generate tensor ellipsoids tens1 = Tensors(vol, source='ellipse', scale=10).cmap("Reds") print(tens1) tens2 = Tensors(zsl, source='ellipse', scale=20).cmap("Greens") print(tens2) show([(vol, __doc__), tens1], N=2, axes=9, viewup='z').close() show(vol, tens2, zsl, axes=9, viewup='z').close() vedo-2025.5.3/examples/volumetric/tet_astyle.py000066400000000000000000000010631474667405700214670ustar00rootroot00000000000000"""Load a tetrahedral mesh and show it in different styles.""" from vedo import TetMesh, show, dataurl # Load a tetrahedral mesh from file tetm = TetMesh(dataurl + 'limb.vtu') tetm.compute_cell_size() print(tetm) # Assign a color to each tetrahedron based on the value of "chem_0" tetm.celldata.select('chem_0').cmap("Blues_r").add_scalarbar() # Make a copy of tetm and shrink the tets msh = tetm.clone().shrink(0.5).tomesh().add_scalarbar() # Show the two meshes side by side with comments show([(tetm, __doc__), (msh, "..shrunk tetrahedra")], N=2).close() vedo-2025.5.3/examples/volumetric/tet_build.py000066400000000000000000000020211474667405700212600ustar00rootroot00000000000000"""Build a TetMesh (tetrahedral mesh) by manually defining vertices and cells""" from vedo import * points = [ (0, 0, 0), # first tet (1, 0, 0), (1, 1, 0), (0, 1, 2), (3, 3, 3), # second tet (4, 3, 3), (4, 4, 3), (3, 4, 4), (2, 5, 3), # third tet (3, 5, 3), (3, 6, 3), (2, 5, 5), ] # Cells are defined by a list of 4 vertex indices # note that "cells" and "tetrahedrons" are the same thing tets = [[0,1,2,3], [4,5,6,7], [8,9,10,11]] # Define a scalar value for each cell we have created values = np.array([10.0, 20.0, 30.0]) # Create the TeTMesh object and assign any number of data arrays to it tm = TetMesh([points, tets]) tm.celldata["myscalar1"] = values tm.celldata["myscalar2"] = -values / 10 tm.pointdata["myvector"] = np.random.rand(tm.npoints) # ... print(tm) tm.celldata.select("myscalar2").cmap('jet').add_scalarbar() # tm.color('green') # or set a single color # Create labels for the vertices labels = tm.labels2d('id', scale=2) show(tm, labels, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/tet_cut1.py000066400000000000000000000006331474667405700210440ustar00rootroot00000000000000"""Cut a TetMesh with an arbitrary polygonal Mesh""" from vedo import * sphere = Sphere(r=500).x(400) sphere.color('green5', 0.2).wireframe() tmesh = TetMesh(dataurl + 'limb.vtu') print(tmesh) ugrid = tmesh.cut_with_mesh(sphere, invert=True).cmap("Reds_r") print(ugrid) # We may cast the output to a new TetMesh: # tmesh_cut = TetMesh(ugrid) # print(tmesh_cut) show(ugrid, sphere, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/tet_cut2.py000066400000000000000000000021751474667405700210500ustar00rootroot00000000000000"""Cut a TetMesh with a Mesh to generate an UnstructuredGrid""" from vedo import * settings.default_font = 'Calco' sphere = Sphere(r=500).x(400).c('green', 0.1) tetm1 = TetMesh(dataurl+'limb.vtu') tetm1.cmap('jet', tetm1.vertices[:, 2], name="ProximoDistal") # Clone and cut the TetMesh, this returns a UnstructuredGrid: ugrid1 = tetm1.clone().cut_with_mesh(sphere, invert=True) ugrid1.cmap("Purples_r", "SignedDistance") print(ugrid1) # Cut tetm, but the output will keep only the whole tets (NOT the polygonal boundary!): ugrid2 = tetm1.clone().cut_with_mesh(sphere, invert=True, whole_cells=True) tetm2 = TetMesh(ugrid2).cmap("Greens_r", "ProximoDistal") print(tetm2) # Cut tetm, but the output will keep only the tets on the boundary: ugrid3 = tetm1.clone().cut_with_mesh(sphere, on_boundary=True) tetm3 = TetMesh(ugrid3) tetm3.celldata.select("chem_0").cmap("Reds") print(tetm3) show([ (ugrid1,sphere, __doc__), (tetm2, sphere, "Keep only tets that lie\ncompletely outside of the Sphere"), (tetm3, sphere, "Keep only tets that lie\nexactly on the Sphere"), ], N=3, axes=dict(xtitle='x in :mum'), ).close() vedo-2025.5.3/examples/volumetric/tet_explode.py000066400000000000000000000021761474667405700216340ustar00rootroot00000000000000"""Segment a TetMesh with a custom scalar. Press q to make it explode""" from vedo import TetMesh, Plotter, Text2D, dataurl n = 20000 f1 = 0.005 # control the tetras resolution f2 = 0.15 # control the nr of seeds tmesh = TetMesh(dataurl + "limb.vtu") surf = tmesh.tomesh(fill=False) txt = Text2D(__doc__, font="Brachium") # pick points on the surface and use subsample to make them uniform seeds = surf.clone().subsample(f2).ps(10).c("black") # assign to each tetrahedron the id of the closest seed point cids = [] for p in tmesh.cell_centers().coordinates: cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragment"] = cids pieces = [] for i in range(seeds.npoints): tc = tmesh.clone().threshold(name="fragment", above=i-0.1, below=i+0.1) mc = tc.tomesh(fill=False).color(i) pieces.append(mc) ############### animate plt = Plotter(size=(1200, 800), axes=1) plt.show(txt, pieces) for i in range(20): for pc in pieces: cm = pc.center_of_mass() pc.shift(cm / 25) txt.text(f"{__doc__}\n\nNr. of pieces = {seeds.npoints}") plt.render() plt.interactive().close() vedo-2025.5.3/examples/volumetric/tet_isos_slice.py000066400000000000000000000010601474667405700223170ustar00rootroot00000000000000# Thresholding and slicing a TetMesh from vedo import TetMesh, dataurl, show tmsh = TetMesh(dataurl+'limb.vtu') tmsh.celldata.select('chem_0').cmap('hot') tmsh.add_scalarbar3d('chem_0 expression', c='k') vals = [0.2, 0.3, 0.8] tmsh.map_cells_to_points(["chem_0"]) isos = tmsh.pointdata.select("chem_0").isosurface(vals).flat() slce = tmsh.slice(normal=(1,1,1)).lighting("off").lw(1) print(tmsh) show([ (tmsh, "A TetMesh"), (isos, "Isosurfaces for values:\n"+str(vals)), (slce, "Slice TetMesh with plane"), ], N=3, axes=1).close() vedo-2025.5.3/examples/volumetric/tet_threshold.py000066400000000000000000000007401474667405700221630ustar00rootroot00000000000000"""Threshold a TetMesh with a scalar array""" from vedo import * tetm = TetMesh(dataurl + "limb.vtu") # Threshold the tetrahedral mesh for values in the range: tetm.threshold(above=0.9, below=1) tetm.celldata.select("chem_0").cmap("Accent") tetm.add_scalarbar3d("chem_0 expression levels", c="k", italic=1) # Make a 2D clone of the 3D scalarbar and place it to the right: tetm.scalarbar = tetm.scalarbar.clone2d("center-right", size=0.2) show(tetm, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/tetralize_surface.py000066400000000000000000000016301474667405700230250ustar00rootroot00000000000000"""Tetralize a closed surface mesh Click on the mesh and press ↓ or x to toggle a piece""" from vedo import dataurl, Sphere, TessellatedBox, settings, Mesh, show settings.use_depth_peeling = True # surf = Sphere(quads=True, res=15) # surf = TessellatedBox() # surf = Mesh(dataurl+'290_closed.vtk') surf = Mesh(dataurl+'bunny.obj', c='g3').fill_holes().cap().smooth() tmesh = surf.tetralize(side=0.015, debug=True) #tmesh.write('mytetmesh.vtk') # save to disk! # Assign an id to each tetrahedron to visualize regions seeds = surf.clone().subsample(0.3) cids = [] for p in tmesh.cell_centers().coordinates: cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragments"] = cids pieces = [] for i in range(seeds.npoints): tc = tmesh.clone().threshold("fragments", above=i-0.1, below=i+0.1) mc = tc.shrink(0.95).tomesh().color(i) pieces.append(mc) show(__doc__, pieces, axes=1) vedo-2025.5.3/examples/volumetric/ugrid1.py000066400000000000000000000004101474667405700205000ustar00rootroot00000000000000"""Cut an UnstructuredGrid with a Mesh""" from vedo import * ug1 = UnstructuredGrid(dataurl+'ugrid.vtk') print(ug1) cyl = Cylinder(r=3, height=7).x(3).wireframe() ug2 = ug1.clone().cut_with_mesh(cyl) ug1.wireframe() show(ug1, ug2, cyl, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/ugrid2.py000066400000000000000000000006151474667405700205100ustar00rootroot00000000000000"""Cut an UnstructuredGrid with a plane""" from vedo import UnstructuredGrid, dataurl, show ug = UnstructuredGrid(dataurl+'ugrid.vtk').cmap("jet") ug = ug.cut_with_plane(origin=(5,0,1), normal=(1,1,5)) show(repr(ug), ug, axes=1, viewup='z').close() # Shrink the UnstructuredGrid and create a Mesh msh = ug.shrink(0.9).tomesh().color('gold', 0.2) show(repr(msh), msh, axes=1, viewup='z').close() vedo-2025.5.3/examples/volumetric/vol2points.py000066400000000000000000000004351474667405700214330ustar00rootroot00000000000000"""Extract all image voxels as points""" from vedo import * v = Volume(dataurl+'vase.vti') pts = v.topoints().print() # returns Points scalars = pts.pointdata[0] pts.cmap('afmhot_r', scalars).point_size(1) show([(v,__doc__), pts], N=2, viewup='z', bg2='lightblue', axes=1).close() vedo-2025.5.3/examples/volumetric/volume_from_mesh.py000066400000000000000000000006461474667405700226660ustar00rootroot00000000000000"""Generate a Volume with the signed distance from a Mesh, then generate the isosurface at distance -0.5""" from vedo import * mesh = Mesh(dataurl+"beethoven.ply").subdivide() mesh.color('k').point_size(3) # render mesh as points # Generate signed distance volume vol = mesh.signed_distance(dims=(40,40,40)) # Generate an isosurface at distance -0.5 iso = vol.isosurface(-0.5) show(mesh, iso, __doc__, axes=1).close() vedo-2025.5.3/examples/volumetric/volume_operations.py000066400000000000000000000040011474667405700230570ustar00rootroot00000000000000""" Perform other simple mathematical operation between 3D Volumes. Possible operations are: +, -, /, 1/x, sin, cos, exp, log, abs, **2, sqrt, min, max, atan, atan2, median, mag, dot, gradient, divergence, laplacian. Alphas defines the opacity transfer function in the scalar range. """ from vedo import * printc(__doc__) plt = Plotter(N=4) v0 = Volume(dataurl+'embryo.slc').cmap(0).add_scalarbar3d() v0.scalarbar = v0.scalarbar.clone2d("center-right", 0.1) # substitute to a 2d scalarbar plt.at(0).show("original", v0) v1 = v0.clone().operation("gradient").operation("mag").add_scalarbar3d() v1.scalarbar = v1.scalarbar.clone2d("center-right", 0.1) plt.at(1).show("gradient", v1) v2 = v0.clone().operation("median").cmap(4).add_scalarbar3d() v2.scalarbar = v2.scalarbar.clone2d("center-right", 0.1) plt.at(2).show("median", v2) v3 = v0.clone().operation("dot", v0).cmap(7).add_scalarbar3d() v3.scalarbar = v3.scalarbar.clone2d("center-right", 0.1) plt.at(3).show("dot(v0,v0)", v3, zoom=1.3) plt.interactive().close() #################################################################################### #Start with creating a masked Volume then compute its gradient and probe 2 points msh = Ellipsoid() vol = msh.signed_distance(dims=[20, 20, 20]) vol.threshold(above=0.0, replace=0.0) # replacing all values outside to 0 vol.cmap("blue").alpha([0.9, 0.0]).alpha_unit(0.1).add_scalarbar3d() vol.scalarbar = vol.scalarbar.clone2d("center-right", 0.15) vgrad = vol.operation("gradient") printc(vgrad.pointdata, c='g') grd = vgrad.pointdata['ImageScalarsGradient'] pts = vol.points # coords as numpy array arrs = Arrows(pts, pts + grd*0.1, c="jet") pts_probes = [[0.2,0.5,0.5], [0.2,0.3,0.4]] vpts_probes = Points(pts_probes).probe(vgrad) vects = vpts_probes.pointdata['ImageScalarsGradient'] arrs_pts_probe = Arrows(pts_probes, pts_probes + vects, c='black') plt = Plotter(axes=1, N=2) plt.at(0).show("A masked Volume", vol) plt.at(1).show("..compute its gradient and probe 2 points", arrs, arrs_pts_probe) plt.interactive().close() vedo-2025.5.3/examples/volumetric/volume_sharemap.py000066400000000000000000000011211474667405700224740ustar00rootroot00000000000000"""Share the same color and transparency mapping across different volumes""" from vedo import Volume, show import numpy as np arr = np.zeros(shape=(50,60,70)) for i in range(50): for j in range(60): for k in range(70): arr[i,j,k] = k vol1 = Volume(arr ).mode(1).cmap('jet', alpha=[0,1], vmin=0, vmax=80).add_scalarbar("vol1") vol2 = Volume(arr+30).mode(1).cmap('jet', alpha=[0,1], vmin=0, vmax=80).add_scalarbar("vol2") # or equivalently, to set transparency: # vol1.alpha([0,1], vmin=0, vmax=70) show([(vol2, __doc__), vol1], shape=(2,1), axes=1, elevation=-25) vedo-2025.5.3/examples/volumetric/warp_scalars.py000066400000000000000000000005611474667405700217750ustar00rootroot00000000000000"""Warp scalars inside of a Volumetric dataset""" from vedo import Volume, Cube, Arrows, show, dataurl vol = Volume(dataurl+"embryo.tif") source = Cube().scale(3000) target = Cube().scale([4000,5000,6000]).rotate_x(20).wireframe() arrs = Arrows(source, target, c='k') vol.warp(source, target, fit=True) show(vol, arrs, source, target, __doc__, axes=1, viewup='z') vedo-2025.5.3/pyproject.toml000066400000000000000000000047321474667405700156530ustar00rootroot00000000000000[build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "vedo" dynamic = ["version"] description = "A python module for scientific visualization, analysis of 3D objects and point clouds." authors = [ {name = "Marco Musy", email = "marco.musy@embl.es"} ] maintainers = [ {name = "Marco Musy", email = "marco.musy@embl.es"} ] readme = "README.md" requires-python = ">=3.7" license = {file = "LICENSE"} keywords = ["vtk", "numpy", "3d", "visualization", "mesh", "volume", "point-cloud"] classifiers = [ "Intended Audience :: Science/Research", "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Topic :: Scientific/Engineering :: Visualization", "Topic :: Scientific/Engineering :: Physics", "Topic :: Scientific/Engineering :: Medical Science Apps." ] dependencies = [ "vtk", "numpy", "typing-extensions", "Pygments" ] [project.optional-dependencies] all = [ "scipy" ] [project.urls] Homepage = "https://github.com/marcomusy/vedo" Documentation = "https://vedo.embl.es" Repository = "https://github.com/marcomusy/vedo" Changelog = "https://github.com/marcomusy/vedo/blob/master/docs/changes.md" [tool.setuptools] packages = [ "vedo", "vedo.fonts", "vedo.examples.basic", "vedo.examples.advanced", "vedo.examples.pyplot", "vedo.examples.simulations", "vedo.examples.volumetric", "vedo.examples.other", "vedo.examples.other.dolfin", "vedo.examples.other.trimesh" ] include-package-data = true license-files = ["LICENSE", "FONT.LICENSE"] [tool.setuptools.package-data] vedo = [ "*", "fonts/*", ] [tool.setuptools.package-dir] vedo = "vedo" "vedo.examples.basic" = "examples/basic" "vedo.examples.advanced" = "examples/advanced" "vedo.examples.pyplot" = "examples/pyplot" "vedo.examples.simulations" = "examples/simulations" "vedo.examples.volumetric" = "examples/volumetric" "vedo.examples.other" = "examples/other" "vedo.examples.other.dolfin" = "examples/other/dolfin" "vedo.examples.other.trimesh" = "examples/other/trimesh" [tool.setuptools.dynamic] version = {attr = "vedo.version._version"} [project.scripts] vedo = "vedo.cli:main" vedo-2025.5.3/tests/000077500000000000000000000000001474667405700140735ustar00rootroot00000000000000vedo-2025.5.3/tests/common/000077500000000000000000000000001474667405700153635ustar00rootroot00000000000000vedo-2025.5.3/tests/common/run_all.sh000077500000000000000000000002541474667405700173570ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # set -e for f in test_*.py do echo "Processing $f script.." python3 "$f" done echo '---------' echo "All good." echo '---------' vedo-2025.5.3/tests/common/test_0_imports.py000066400000000000000000000003111474667405700207030ustar00rootroot00000000000000 print("IMPORTING vtkclasses") try: import vedo.vtkclasses except: assert False exit(1) print("importing vtkclasses success") import numpy as np print("NUMPY Version:", np.__version__) vedo-2025.5.3/tests/common/test_core1.py000066400000000000000000000253261474667405700200150ustar00rootroot00000000000000import numpy as np from vedo import Cone, Sphere, merge, Volume, dataurl, utils import vtk print('\n\n---------------------------------') print('vtkVersion', vtk.vtkVersion().GetVTKVersion()) print('---------------------------------') ##################################### cone = Cone(res=48) sphere = Sphere(res=24) carr = cone.cell_centers().coordinates[:, 2] parr = cone.vertices[:, 0] cone.pointdata["parr"] = parr cone.celldata["carr"] = carr carr = sphere.cell_centers().coordinates[:, 2] parr = sphere.vertices[:, 0] sphere.pointdata["parr"] = parr sphere.celldata["carr"] = carr sphere.pointdata["pvectors"] = np.sin(sphere.vertices) sphere.compute_elevation() cone.compute_normals() sphere.compute_normals() ###################################### test clone() c2 = cone.clone() print('clone()', cone.npoints, c2.npoints) assert cone.npoints == c2.npoints print('clone()', cone.ncells, c2.ncells) assert cone.ncells == c2.ncells ###################################### test merge() m = merge(sphere, cone) print('merge()', m.npoints, cone.npoints + sphere.npoints) assert m.npoints == cone.npoints + sphere.npoints print('merge()', m.ncells, cone.ncells + sphere.ncells) assert m.ncells == cone.ncells + sphere.ncells ###################################### inputdata print('dataset', [cone.dataset], "vtk.vtkPolyData") assert isinstance(cone.dataset, vtk.vtkPolyData) ###################################### mapper print('mapper', [cone.mapper], "vtk.vtkPolyDataMapper") assert isinstance(cone.mapper, vtk.vtkPolyDataMapper) ###################################### pickable cone.pickable(False) cone.pickable(True) print('pickable', cone.pickable(), True) assert cone.pickable() ###################################### pos cone.pos(1,2,3) print('pos', [1,2,3], cone.pos()) assert np.allclose([1,2,3], cone.pos()) cone.pos(5,6) print('pos',[5,6,0], cone.pos()) assert np.allclose([5,6,0], cone.pos()) ###################################### shift cone.pos(5,6,7).shift(3,0,0) print('shift',[8,6,7], cone.pos()) assert np.allclose([8,6,7], cone.pos(), atol=0.001) ###################################### x y z cone.pos(10,11,12) cone.x(1.1) print('x y z',[1.1,11,12], cone.pos()) assert np.allclose([1.1,11,12], cone.pos(), atol=0.001) cone.y(1.2) print('x y z',[1.1,1.2,12], cone.pos()) assert np.allclose([1.1,1.2,12], cone.pos(), atol=0.001) cone.z(1.3) print('x y z',[1.1,1.2,1.3], cone.pos()) assert np.allclose([1.1,1.2,1.3], cone.pos(), atol=0.001) ###################################### rotate cr = cone.pos(0,0,0).clone().rotate(90, axis=(0, 1, 0)) print('rotate', np.max(cr.vertices[:,2]) ,'<', 1.01) assert np.max(cr.vertices[:,2]) < 1.01 ###################################### orientation cr = cone.pos(0,0,0).clone().reorient([0,0,1], (1, 1, 0)) print('orientation',np.max(cr.vertices[:,2]) ,'<', 1.01) assert np.max(cr.vertices[:,2]) < 1.01 ####################################### scale cr.scale(5) print('scale',np.max(cr.vertices[:,2]) ,'>', 4.98) assert np.max(cr.vertices[:,2]) > 4.98 ###################################### box bx = cone.box() print('box',bx.npoints, 24) assert bx.npoints == 24 print('box',bx.clean().npoints , 8) assert bx.clean().npoints == 8 ###################################### transform ct = cone.clone().rotate_x(10).rotate_y(10).rotate_z(10) print('transform', [ct.transform.T], [vtk.vtkTransform]) assert isinstance(ct.transform.T, vtk.vtkTransform) print('ntransforms',ct.transform.T.GetNumberOfConcatenatedTransforms()) assert ct.transform.T.GetNumberOfConcatenatedTransforms() ###################################### pointdata and celldata arrnames = cone.pointdata.keys() print('pointdata', arrnames, 'parr') assert 'parr' in arrnames arrnames = cone.celldata.keys() print('celldata.keys', arrnames, 'carr') assert 'carr' in arrnames ###################################### Get Point Data arr = sphere.pointdata['parr'] print('pointdata',len(arr)) assert len(arr) print('pointdata',np.max(arr) ,'>', .99) assert np.max(arr) > .99 arr = sphere.celldata['carr'] print('celldata',[arr]) assert len(arr) print('celldata',np.max(arr) ,'>', .99) assert np.max(arr) > .99 ######################################__add__ print('__add__', [cone+sphere], [vtk.vtkAssembly]) assert isinstance(cone+sphere, vtk.vtkAssembly) ###################################### vertices s2 = sphere.clone() pts = sphere.vertices pts2 = pts + [1,2,3] s2.vertices = pts2 pts3 = s2.vertices print('vertices',sum(pts3-pts2)) assert np.allclose(pts2, pts3, atol=0.001) ###################################### cells print('cells') assert np.array(sphere.cells).shape == (2112, 3) ###################################### texture st = sphere.clone().texture(dataurl+'textures/wood2.jpg') print('texture test') assert isinstance(st.actor.GetTexture(), vtk.vtkTexture) ###################################### delete_cells_by_point_index sd = sphere.clone().delete_cells_by_point_index(range(100)) print('delete_cells_by_point_index',sd.npoints , sphere.npoints) assert sd.npoints == sphere.npoints print('delete_cells_by_point_index',sd.ncells ,'<', sphere.ncells) assert sd.ncells < sphere.ncells ###################################### reverse # this fails on some archs (see issue #185) # lets comment it out temporarily # sr = sphere.clone().reverse().cut_with_plane() # print('DISABLED: reverse test', sr.npoints, 576) # rev = vtk.vtkReverseSense() # rev.SetInputData(sr.polydata()) # rev.Update() # print('DISABLED: reverse vtk nr.pts, nr.cells') # print(rev.GetOutput().GetNumberOfPoints(),sr.polydata().GetNumberOfPoints(), # rev.GetOutput().GetNumberOfCells(), sr.polydata().GetNumberOfCells()) # assert sr.npoints == 576 ###################################### quantize sq = sphere.clone().quantize(0.1) print('quantize',sq.npoints , 834) assert sq.npoints == 834 ###################################### bounds ss = sphere.clone().scale([1,2,3]) print('bounds',ss.xbounds()) assert np.allclose(ss.xbounds(), [-1,1], atol=0.01) print('bounds',ss.ybounds()) assert np.allclose(ss.ybounds(), [-2,2], atol=0.01) print('bounds',ss.zbounds()) assert np.allclose(ss.zbounds(), [-3,3], atol=0.01) ###################################### average_size print('average_size', Sphere().scale(10).pos(1,3,7).average_size()) assert 9.9 < Sphere().scale(10).pos(1,3,7).average_size() < 10.1 print('diagonal_size',sphere.diagonal_size()) assert 3.3 < sphere.diagonal_size() < 3.5 print('center_of_mass',sphere.center_of_mass()) assert np.allclose(sphere.center_of_mass(), [0,0,0], atol=0.001) print('volume',sphere.volume()) assert 4.1 < sphere.volume() < 4.2 print('area',sphere.area()) assert 12.5 < sphere.area() < 12.6 ###################################### closest_point pt = [12,34,52] print('closest_point',sphere.closest_point(pt), [0.19883616, 0.48003298, 0.85441941]) assert np.allclose(sphere.closest_point(pt), [0.19883616, 0.48003298, 0.85441941], atol=0.001) ###################################### find_cells_in_bounds ics = sphere.find_cells_in_bounds(xbounds=(-0.5, 0.5)) print('find_cells_in',len(ics) , 1404) assert len(ics) == 1576 ######################################transformMesh T = cone.clone().pos(35,67,87).transform s3 = Sphere().apply_transform(T) print('transformMesh',s3.center_of_mass(), (35,67,87)) assert np.allclose(s3.center_of_mass(), (35,67,87), atol=0.001) ######################################normalize s3 = sphere.clone().pos(10,20,30).scale([7,8,9]).normalize() print('normalize',s3.center_of_mass(), (10,20,30)) assert np.allclose(s3.center_of_mass(), (10,20,30), atol=0.001) print('normalize',s3.average_size()) assert 0.9 < s3.average_size() < 1.1 ###################################### crop c2 = cone.clone().crop(left=0.5) print('crop',np.min(c2.vertices[:,0]), '>', -0.001) assert np.min(c2.vertices[:,0]) > -0.001 ###################################### subdivide s2 = sphere.clone().subdivide(4) print('subdivide',s2.npoints , 270338) assert s2.npoints == 270338 ###################################### decimate s2 = sphere.clone().decimate(0.2) print('decimate',s2.npoints , 213) assert s2.npoints == 213 ###################################### vertex_normals print('vertex_normals',sphere.vertex_normals[12], [9.97668684e-01, 1.01513637e-04, 6.82437494e-02]) assert np.allclose(sphere.vertex_normals[12], [9.97668684e-01, 1.01513637e-04, 6.82437494e-02], atol=0.001) ###################################### contains print('is_inside',sphere.contains([0.1,0.2,0.3])) assert Sphere().contains([0.1,0.2,0.3]) ###################################### intersectWithLine (fails vtk7..) # pts = sphere.intersectWithLine([-2,-2,-2], [2,3,4]) # print('intersectWithLine',pts[0]) # assert np.allclose(pts[0], [-0.8179885149002075, -0.522485613822937, -0.2269827425479889], atol=0.001) # print('intersectWithLine',pts[1]) # assert np.allclose(pts[1], [-0.06572723388671875, 0.41784095764160156, 0.9014091491699219], atol=0.001) ############################################################################ ############################################################################ Assembly asse = cone+sphere ###################################### print('unpack',len(asse.unpack()) , 2) assert len(asse.unpack()) ==2 print('unpack', asse.unpack(0).name) assert asse.unpack(0) == cone print('unpack',asse.unpack(1).name) assert asse.unpack(1) == sphere print('unpack',asse.diagonal_size(), 4.15) assert 4.1 < asse.diagonal_size() < 4.2 ############################################################################ Volume X, Y, Z = np.mgrid[:30, :30, :30] scalar_field = ((X-15)**2 + (Y-15)**2 + (Z-15)**2)/225 print('Test Volume, scalar min, max =', np.min(scalar_field), np.max(scalar_field)) vol = Volume(scalar_field) volarr = vol.pointdata[0] print('Volume',volarr.shape[0] , 27000) assert volarr.shape[0] == 27000 print('Volume',np.max(volarr) , 3) assert np.max(volarr) == 3 print('Volume',np.min(volarr) , 0) assert np.min(volarr) == 0 ###################################### isosurface iso = vol.isosurface(1.0) print('isosurface', iso.area()) assert 2540 < iso.area() < 3000 ###################################### utils change of coords from vedo import transformations q = [5,2,3] q = transformations.cart2spher(*q) q = transformations.spher2cart(*q) print("cart2spher spher2cart", q) assert np.allclose(q, [5,2,3], atol=0.001) q = transformations.cart2cyl(*q) q = transformations.cyl2cart(*q) print("cart2cyl cyl2cart", q) assert np.allclose(q, [5,2,3], atol=0.001) q = transformations.cart2cyl(*q) q = transformations.cyl2spher(*q) q = transformations.spher2cart(*q) print("cart2cyl cyl2spher spher2cart", q) assert np.allclose(q, [5,2,3], atol=0.001) q = transformations.cart2spher(*q) q = transformations.spher2cyl(*q) q = transformations.cyl2cart(*q) print("cart2spher spher2cyl cyl2cart", q) assert np.allclose(q, [5,2,3], atol=0.001) ###################################### print("OK with test_actors") vedo-2025.5.3/tests/common/test_core2.py000066400000000000000000000125711474667405700200140ustar00rootroot00000000000000from vedo import * line = Line([0,0,0], [1,1,1], res=100) seeds = Points([[10,10,10], [100,100,100]]) ################################################ vol = Volume(dataurl+'embryo.tif') tm = TetMesh(dataurl+'limb.vtu') rg = RectilinearGrid(dataurl+'RectilinearGrid.vtr') ################################################ print("\n -- TEST METHOD add_ids() -------------------") print(vol.add_ids()) print(tm.add_ids()) print(rg.add_ids()) print("\n -- TEST METHOD average_size() -------------------") print(vol.average_size()) print(tm.average_size()) print(rg.average_size()) print("\n--- TEST METHOD bounds() -------------------") print(vol.bounds()) print(tm.bounds()) print(rg.bounds()) print("\n -- TEST METHOD cell_centers() -------------------") print(vol.cell_centers().coordinates) print(tm.cell_centers().coordinates) print(rg.cell_centers().coordinates) print("\n -- TEST METHOD cells() -------------------") print(vol.cells) # NORMALLY THIS GIVES WARNING print(tm.cells) print(rg.cells) # NORMALLY THIS GIVES WARNING print("\n -- TEST METHOD center_of_mass() -------------------") print(vol.center_of_mass()) print(tm.center_of_mass()) print(rg.center_of_mass()) print("\n--- TEST METHOD compute_cell_size() -------------------") print(vol.compute_cell_size()) print(tm.compute_cell_size()) print(rg.compute_cell_size()) # print("\n--- TEST METHOD compute_streamlines() -------------------") # print(vol.compute_streamlines(seeds)) # print(tm.compute_streamlines([[100,0,0], [1000,100,1]])) # print(rg.compute_streamlines([[0,0,0], [1,1,1]])) print("\n--- TEST METHOD copy_data_from() -------------------") print(vol.clone().copy_data_from(vol)) print(tm.clone().copy_data_from(tm)) print(rg.clone().copy_data_from(rg)) # print("\n--- TEST METHOD divergence() -------------------") # print(vol.divergence()) # print(tm.divergence()) # print(rg.divergence()) print("\n--- TEST METHOD find_cells_along_line() -------------------") print(vol.find_cells_along_line([0,0,0], [1000,1000,1000])) print(tm.find_cells_along_line([0,0,0], [100,1,1])) print(rg.find_cells_along_line([0,0,0], [10,1,1])) print("\n--- TEST METHOD find_cells_in_bounds() -------------------") print(vol.find_cells_in_bounds(Sphere().bounds())) print(tm.find_cells_in_bounds(Sphere().bounds())) print(rg.find_cells_in_bounds(Sphere().bounds())) print("\n--- TEST METHOD integrate_data() -------------------") print(vol.integrate_data()) print(tm.integrate_data()) print(rg.integrate_data()) print("\n--- TEST METHOD interpolate_data_from() -------------------") print(vol.interpolate_data_from(vol, n=1)) print(tm.interpolate_data_from(vol, n=1)) print(rg.interpolate_data_from(vol, n=1)) print("\n--- TEST METHOD map_cells_to_points() -------------------") print(vol.clone().map_cells_to_points()) print(tm.clone().map_cells_to_points()) print(rg.clone().map_cells_to_points()) print("\n--- TEST METHOD map_points_to_cells() -------------------") print(vol.clone().map_points_to_cells()) print(tm.clone().map_points_to_cells()) print(rg.clone().map_points_to_cells()) print("\n--- TEST METHOD lines() -------------------") print(vol.lines) print(tm.lines) print(rg.lines) print("\n--- TEST METHOD lines_as_flat_array() -------------------") print(vol.lines_as_flat_array) print(tm.lines_as_flat_array) print(rg.lines_as_flat_array) print("\n--- TEST METHOD mark_boundaries() -------------------") print(vol.mark_boundaries()) print(tm.mark_boundaries()) print(rg.mark_boundaries()) print("\n--- TEST METHOD memory_address() -------------------") print(vol.memory_address()) print(tm.memory_address()) print(rg.memory_address()) print("\n--- TEST METHOD memory_size() -------------------") print(vol.memory_size()) print(tm.memory_size()) print(rg.memory_size()) print("\n--- TEST METHOD modified() -------------------") print(vol.modified()) print(tm.modified()) print(rg.modified()) print("\n--- TEST METHOD npoints() -------------------") print(vol.npoints) print(tm.npoints) print(rg.npoints) print("\n--- TEST METHOD ncells() -------------------") print(vol.ncells) print(tm.ncells) print(rg.ncells) print("\n--- TEST METHOD probe() -------------------") print(line.probe(vol)) print(line.probe(tm)) print(line.probe(rg)) print("\n--- TEST METHOD resample_data_from() -------------------") print(vol.clone().resample_data_from(vol)) print(tm.clone().resample_data_from(tm)) print(rg.clone().resample_data_from(rg)) print("\n--- TEST METHOD smooth_data() -------------------") print(vol.smooth_data()) print(tm.smooth_data()) print(rg.smooth_data()) print("\n--- TEST METHOD shrink() -------------------") print(tm.shrink()) print("\n--- TEST METHOD to_mesh() -------------------") print(vol.tomesh()) print(tm.tomesh()) print(rg.tomesh()) print("\n--- TEST METHOD write() -------------------") print(vol.write("test.vti")) print(tm.write("test.vtu")) print(rg.write("test.vtr")) print("\n--- TEST METHOD cut_with_mesh() -------------------") print(tm.cut_with_mesh(Ellipsoid().scale(5))) print(rg.cut_with_mesh(Ellipsoid().scale(5))) print("\n--- TEST METHOD cut_with_plane() -------------------") print(tm.cut_with_plane(normal=(1,1,0), origin=(500,0,0))) print(rg.cut_with_plane(normal=(1,1,0), origin=(0,0,0))) print("\n--- TEST METHOD extract_cells_by_type() -------------------") print(tm.extract_cells_by_type("tetra")) print("\n--- TEST METHOD isosurface() -------------------") print(vol.isosurface(flying_edges=False)) print(tm.isosurface()) print(rg.isosurface()) vedo-2025.5.3/tests/common/test_pyplot.py000066400000000000000000000050551474667405700203300ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- from vedo import shapes, show, dataurl, settings from vedo import Image, Mesh, Points, Point from vedo.pyplot import Figure, pie_chart settings.use_parallel_projection = True fig = Figure([-1,12], [-2,14], aspect=16/9, padding=0, title="Lorem Ipsum Neque porro quisquam", xtitle="test x-axis should always align", ytitle="y-axis (zeros should match)", grid=True, ) print(f"yscale = {fig.yscale}") man = Mesh(dataurl+'man.vtk').scale(1.4).pos(7,4).rotate_x(-90, around=[7,4,0]) fig += man pic = Image("https://vedo.embl.es/examples/data/textures/bricks.jpg") fig += pic.scale(0.005).pos(2,10) fig += Points([[8,1],[10,3]], r=15) fig += pie_chart([0.1, 0.2, 0.3, 0.1, 0.3], c=[1,2,3,4,'w']).scale(1).pos(1,6,.2) fig += Point([2,3]) fig += Point([4,5]) fig += shapes.Circle([4,5]) fig += shapes.Circle([0,0], r=3) fig += shapes.Circle([0,12], r=3).c("r6") fig += shapes.Circle([11,12], r=3).c("p5") fig += shapes.Circle([11,0], r=3).c("o5") fig += shapes.Arrow([2,3], [4,5]).z(.05) fig += shapes.Line( [2,3], [4,5]).z(.1).lw(2) fig += shapes.Line([2,2], [4,4], c='k', lw=6).z(.1) fig += shapes.DashedLine([8,3],[10,5], spacing=0.5, c='r') fig += shapes.Tube([[8,2,0],[10,4,0]], r=.1).lighting('ambient') fig+= shapes.Marker('.').pos(5,5).scale(12) fig+= shapes.Star3D().pos(5,7).scale(0.5) fig+= shapes.Cross3D().pos(5,3).scale(0.5) fig += shapes.Glyph([[5,9]], shapes.Sphere(r=0.5)) fig += shapes.Spline([[4,0],[5,2],[6,0],[7,0.5]]).c('r4') fig += shapes.CSpline([[4,0],[5,2],[6,0],[7,0.5]]).c('r6') fig += shapes.KSpline([[4,0],[5,2],[6,0],[7,0.5]]).c('r8') fig += shapes.Bezier([[4,-1],[5,1],[6,-1],[7,-1.5]]) fig += shapes.Brace([2,1], [4,3],comment='Brace', padding1=0, italic=3).z(0.1) ## BUGGED fig+= shapes.Ribbon(shapes.Spline([[4,0],[5,2],[6,0],[7,0.5]]), shapes.Bezier([[4,-1],[5,1],[6,-1],[7,-1.5]])) fig+= shapes.Star([8,6]) fig+= shapes.Sphere([8,9,0]) fig+= shapes.Spheres([[8,10,0],[9,10,0]], r=0.2, c='g') fig += shapes.Ellipsoid().pos(9,11) fig += shapes.Grid().scale(2).pos(7,11) fig += shapes.Rectangle([2,6], [4,8], radius=0.1).c('b5') fig += shapes.Cone().scale(2).pos(10,6).rotate_y(90, around=[10,6,0]) fig += shapes.Text3D("MyTest3D", c='k', justify='center', font="Quikhand")\ .pos(5,11).scale(0.5).rotate_z(20, around=[5,11,0]) fig += shapes.Latex('sin(x^2)', res=150).scale(3).pos(10,0) fig2 = Figure([-2.5, 14],[-5,14], padding=0, title='Test Embedding Figure') fig2.insert(fig) import sys if len(sys.argv)>1: show(fig2, size=(1600, 1100), zoom='tight').close() vedo-2025.5.3/tests/common/test_shapes.py000066400000000000000000000006011474667405700202540ustar00rootroot00000000000000 from vedo import Arc, vtk_version import numpy as np print('-----------------------------------------------------') print('VTK Version', vtk_version, "test_shapes.py") print('-----------------------------------------------------') ##################################### arc = Arc(center=None, point1=(1, 1, 1), point2=None, normal=(0, 0, 1), angle=np.pi) assert isinstance(arc, Arc) vedo-2025.5.3/tests/common/test_utils.py000066400000000000000000000027651474667405700201460ustar00rootroot00000000000000import numpy as np from vedo.utils import make3d print('----------------------------------8') print(make3d([])) assert str(make3d([])) == '[]' print('----------------------------------9') print(make3d([0,1])) assert str(make3d([0,1])) == '[0 1 0]' print('----------------------------------11') print(make3d([[0,1],[9,8]])) assert str(make3d([[0,1],[9,8]])) == '[[0 1 0]\n [9 8 0]]' print('----------------------------------7') print(make3d([[0,1], [6,7], [6,7], [6,7]])) assert str(make3d([[0,1], [6,7], [6,7], [6,7]])) == '[[0 1 0]\n [6 7 0]\n [6 7 0]\n [6 7 0]]' print('----------------------------------10') print(make3d([0,1,2])) assert str(make3d([0,1,2])) == '[0 1 2]' print('----------------------------------4') print(make3d([[0,1,2]])) assert str(make3d([[0,1,2]])) == '[[0 1 2]]' print('----------------------------------5') print(make3d([[0,1,2], [6,7,8]])) assert str(make3d([[0,1,2], [6,7,8]])) == '[[0 1 2]\n [6 7 8]]' print('----------------------------------3') print(make3d([ [0,1,2], [6,7,8], [6,7,9] ])) assert str(make3d([ [0,1,2], [6,7,8], [6,7,9] ])) == '[[0 1 2]\n [6 7 8]\n [6 7 9]]' print('----------------------------------6') print(make3d([[0,1,2], [6,7,8], [6,7,8], [6,7,4]])) assert str(make3d([[0,1,2], [6,7,8], [6,7,8], [6,7,4]])) == '[[0 1 2]\n [6 7 8]\n [6 7 8]\n [6 7 4]]' # print(make3d([[0,1,2,3], [6,7,8,9]])# will CORRECTLY raise error) # print(make3d([ [0,1,2,3], [6,7,8,9], [6,7,8,8] ]))# will CORRECTLY raise error # print(make3d([0,1,2,3])) # will CORRECTLY raise error vedo-2025.5.3/tests/issues/000077500000000000000000000000001474667405700154065ustar00rootroot00000000000000vedo-2025.5.3/tests/issues/discussion_1190.py000066400000000000000000000021601474667405700206140ustar00rootroot00000000000000from vedo import * import matplotlib.colors as colors import matplotlib.pyplot as plt settings.default_font = "Antares" man = Mesh(dataurl + "man.vtk") h_knees = -0.5 over_limit = 1.5 under_limit = -1.4 # let the scalar be the z coordinate of the mesh vertices scals = man.vertices[:, 2] # build a complicated colour map c1 = plt.cm.viridis(np.linspace(0.0, 0.7, 128)) c2 = plt.cm.terrain(np.linspace(0.5, 0.8, 128)) c = np.vstack((c1, c2)) cmap = colors.LinearSegmentedColormap.from_list("heights", c) cmap.set_over(color="red") cmap.set_under(color="orange") norm = colors.TwoSlopeNorm(h_knees, vmin=under_limit, vmax=over_limit) mapper = plt.cm.ScalarMappable(norm=norm, cmap=cmap) # build look up table lut = build_lut( [(v, mapper.to_rgba(v)[:3]) for v in np.linspace(under_limit, over_limit, 128)], above_color=cmap.get_over()[:3], below_color=cmap.get_under()[:3], vmin=under_limit, vmax=over_limit, ) man.cmap(lut, scals) man.add_scalarbar3d(above_text="Above Eyes", below_text="Below Heels") man.scalarbar = man.scalarbar.clone2d("center-left", size=0.3) # make it 2D show(man, axes=1, viewup="z") vedo-2025.5.3/tests/issues/discussion_527.py000066400000000000000000000017701474667405700205450ustar00rootroot00000000000000from vedo import * settings.immediate_rendering = False # faster for multi-renderers # (0,0) is the bottom-left corner of the window, (1,1) the top-right # the order in the list defines the priority when overlapping custom_shape = [ dict(bottomleft=(0.0, 0.0), topright=(0.5, 1), bg="wheat", bg2="w"), # ren0 dict(bottomleft=(0.5, 0.0), topright=(1, 1), bg="blue3", bg2="lb"), # ren1 dict(bottomleft=(0.2, 0.05), topright=(0.8, 0.1), bg="white"), # ren2 ] plt = Plotter(shape=custom_shape, size=(1600, 900)) s0 = ParametricShape(0) s1 = ParametricShape(1) plt.at(0).add(s0, "renderer0") plt.at(1).add(s1, "renderer1") def slider1(widget, event): value = widget.value s0.rotate_y(value) s1.rotate_y(-value) opts = dict( slider_length=0.06, slider_width=0.6, end_cap_length=0.02, end_cap_width=0.5, tube_width=0.1, title_height=0.15, ) plt.at(2).add_slider(slider1, -5, 5, value=0, pos=([0.05, 0.02], [0.55, 0.02]), **opts) plt.show(interactive=True).close()vedo-2025.5.3/tests/issues/discussion_716.py000066400000000000000000000004531474667405700205420ustar00rootroot00000000000000 from vedo import * msh = Polygon(nsides=5) pts = utils.pack_spheres(msh, radius=0.1) # optionally add some noise: jitter = np.random.randn(len(pts),3)/1000 jitter[:,2] = 0 pts += jitter pts = Points(pts) pts.cut_with_line(msh.vertices) # needs an ordered set of points show(msh, pts, axes=1) vedo-2025.5.3/tests/issues/discussion_751.py000066400000000000000000000011211474667405700205320ustar00rootroot00000000000000from vedo import * def callb(evt): msh = evt.object if not msh: return pt = evt.picked3d idcell = msh.closest_point(pt, return_cell_id=True) # msh.cellcolors[idcell] = [255,0,0,255] # red, opaque cols = msh.cellcolors.copy() cols[idcell] = [0,255,0,255] # green, opaque msh.cellcolors = cols plt.render() m = Mesh(dataurl + "290.vtk") m.decimate().smooth().compute_normals() m.compute_quality().cmap("Blues", on="cells") print(m.cellcolors) plt = Plotter() plt.add_callback("mouse click", callb) plt.show(m, m.labels("cellid")) plt.close() vedo-2025.5.3/tests/issues/discussion_784.py000066400000000000000000000004531474667405700205470ustar00rootroot00000000000000 from vedo import * s = Sphere(quads=True, res=10) # some test points in space pts = s.vertices vpts = Points(pts) vpts.compute_normals_with_pca(invert=True) vpts.print() normals = vpts.pointdata["Normals"] arrows = Arrows(pts, pts + normals/10).c('red5') show(vpts, arrows, axes=True).close() vedo-2025.5.3/tests/issues/discussion_800.py000066400000000000000000000016621474667405700205370ustar00rootroot00000000000000 from vedo import * def make_cap(t1, t2): newpoints = t1.vertices.tolist() + t2.vertices.tolist() newfaces = [] for i in range(n-1): newfaces.append([i, i+1, i+n]) newfaces.append([i+n, i+1, i+n+1]) newfaces.append([2*n-1, 0, n]) newfaces.append([2*n-1, n-1, 0]) capm = Mesh([newpoints, newfaces]) return capm pts = [[sin(x), cos(x), x/3] for x in np.arange(0.1, 3, 0.3)] vline = Line(pts, lw=3) t1 = Tube(pts, r=0.2, cap=False) t2 = Tube(pts, r=0.3, cap=False) tc1a, tc1b = t1.boundaries().split() tc2a, tc2b = t2.boundaries().split() n = tc1b.npoints tc1b.join(reset=True).clean() # needed because indices are flipped tc2b.join(reset=True).clean() capa = make_cap(tc1a, tc2a) capb = make_cap(tc1b, tc2b) # show(vline, t1, t2, tc1a, tc1b, tc2a, tc2b, capa, capb, axes=1).close() thick_tube = merge(t1, t2, capa, capb).lw(1)#.clean() show("thick_tube", vline, thick_tube, axes=1).close()vedo-2025.5.3/tests/issues/discussion_942.py000066400000000000000000000031211474667405700205360ustar00rootroot00000000000000from vedo import * def scroll_left(obj, ename): global index i = (index - 1) % len(meshes) txt.text(meshes[i].name).c("k") plt.remove(meshes[index]).add(meshes[i]) plt.reset_camera() index = i def scroll_right(obj, ename): global index i = (index + 1) % len(meshes) txt.text(meshes[i].name).c("k") plt.remove(meshes[index]).add(meshes[i]) plt.reset_camera() index = i def flag(obj, ename): global index txt.text("Flag Button Pressed!").c("r") plt.reset_camera() # load some meshes m1 = Mesh(dataurl + "bunny.obj").c("green5") m2 = Mesh(dataurl + "apple.ply").c("red5") m3 = Mesh(dataurl + "beethoven.ply").c("blue5") m1.name = "a bunny" m2.name = "an apple" m3.name = "mr. beethoven" meshes = [m1, m2, m3] txt = Text2D(meshes[0].name, font="Courier", pos="top-center", s=1.5) plt = Plotter() bu = plt.add_button( scroll_right, pos=(0.8, 0.06), # x,y fraction from bottom left corner states=[">"], # text for each state c=["w"], # font color for each state bc=["k5"], # background color for each state size=40, # font size ) bu = plt.add_button( scroll_left, pos=(0.2, 0.06), # x,y fraction from bottom left corner states=["<"], # text for each state c=["w"], # font color for each state bc=["k5"], # background color for each state size=40, # font size ) bu = plt.add_button( flag, pos=(0.5, 0.06), states=["Flag"], c=["w"], bc=["r"], size=40, ) index = 0 # init global index plt += txt plt.show(meshes[0]).close()vedo-2025.5.3/tests/issues/discussion_978.py000066400000000000000000000031521474667405700205530ustar00rootroot00000000000000from skimage import measure from vedo import * settings.use_parallel_projection = True # Create Ellipsoid ellipsoid = Ellipsoid(axis1=(1,0,0), axis2=(0,2,0), axis3=(0,0,3)) ellipsoid.rotate_z(45).rotate_x(20).pos(30,40,50) s = 0.1 vol = ellipsoid.binarize(spacing=(s,s,s)).print() np_vol = vol.tonumpy() labels = measure.label(np_vol, connectivity=2) properties = measure.regionprops(labels) centroid = properties[0].centroid inertia_tensor = properties[0].inertia_tensor * 0.1 eigenvalues, eigenvectors = np.linalg.eig(inertia_tensor) e0 = eigenvectors[:,0]*eigenvalues[0] e1 = eigenvectors[:,1]*eigenvalues[1] e2 = eigenvectors[:,2]*eigenvalues[2] # Construct Ellipsoid With Inertia Tensor transform = LinearTransform(inertia_tensor) transform.rotate(90, e1) transform.shift(centroid) tens = Sphere(res=24).apply_transform(transform) tens.color('w').alpha(0.25).lw(1) line0 = Line([0,0,0], [1,0,0]).apply_transform(transform).color('r').lw(4) line1 = Line([0,0,0], [0,1,0]).apply_transform(transform).color('g').lw(4) line2 = Line([0,0,0], [0,0,1]).apply_transform(transform).color('b').lw(4) evector0 = Arrow(end_pt=e0, c='r').rotate(90, e1).shift(centroid) evector1 = Arrow(end_pt=e1, c='g').rotate(90, e1).shift(centroid) evector2 = Arrow(end_pt=e2, c='b').rotate(90, e1).shift(centroid) # print("eigenvectors\n", eigenvectors) # print("eigenvalues ", eigenvalues) # print(transform) # print("inertia_tensor\n", inertia_tensor) show( ellipsoid.scale(10).pos(centroid).wireframe(), # should roughly match the tensor tens, line0, line1, line2, evector0, evector1, evector2, axes=1, bg2='lightblue', viewup='z', )vedo-2025.5.3/tests/issues/issue_1025.py000066400000000000000000000016271474667405700175650ustar00rootroot00000000000000from vedo import * colors = [ "black", "lightgreen", "orange", "yellow", "green", "lightblue", "pink", "red", "cyan", "yellow", "blue", "tomato", "violet", "brown", ] n = len(colors) x = np.linspace(0, n, n+1) # x = np.sqrt(np.linspace(0, n, n+1)) vals = x.copy()[1:] print(vals) xyz = np.concatenate((x[:, None], np.ones((n+1, 2))), axis=-1) xyz_segments = np.stack((xyz[:-1, :], xyz[1:, :]), axis=1) lines0 = Lines(xyz_segments, lw=8) lines0.cmap(colors, vals, on="cells") lines1 = Lines(xyz_segments, lw=8).shift(0,-0.2) table = [(x, color) for x, color in zip(vals, colors)] clut = build_lut(table, vmin=vals[0], interpolate=0) print("table:", table) lines1.cmap(clut, vals, on="cells") pts = Points(xyz, c='black', r=8) plt = Plotter() plt += [pts, pts.labels2d('id'), lines0, lines1] plt.show("Colors must match", size=(1200,300), zoom=3.5).close() vedo-2025.5.3/tests/issues/issue_1077.py000066400000000000000000000006161474667405700175710ustar00rootroot00000000000000from vedo import * aline = Line(Circle().coordinates) spline = Spline([(0,0,0), (1,1,1), (2,3,3), (1,1,4), (0,1,5)]) spline.lw(5) pts = spline.coordinates surfs = [] for i in range(1, len(pts)): p0, p1 = pts[i-1:i+1] surf = aline.sweep(p1 - p0) surfs.append(surf) surface = merge(surfs, flag=True) surface.c("gold").lw(0.1).pickable(True) show(spline, surface, aline, axes=1).close()vedo-2025.5.3/tests/issues/issue_1109.py000066400000000000000000000023411474667405700175620ustar00rootroot00000000000000import numpy as np from vedo import Volume, show # make up some fake data X, Y, Z = np.mgrid[:4, :4, :2] scalar_field = (X - 2) ** 2 + (Y - 2) ** 2 + (Z - 2) ** 2 vol = Volume(scalar_field.astype(int)) spacing = vol.spacing() # get the voxel size # print("spacing", spacing) # print('numpy array from Volume:', vol.pointdata) # print('input_scalars', vol.pointdata['input_scalars']) # extract a z-slice at index k=1 zslice = vol.zslice(k=1) zslice.cmap("hot_r").lw(1).alpha(0.9).add_scalarbar3d() # print("input_scalars", zslice.pointdata["input_scalars"]) # create a set of points at the cell centers and associate the scalar value # corresponding to the bottom left corner of each voxel cc = zslice.cell_centers().shift([-spacing[0] / 2, -spacing[1] / 2, 0]) cc.resample_data_from(zslice) zslice.compute_normals() zslice2 = zslice.clone() zslice2.celldata["pixel_value"] = cc.pointdata["input_scalars"] print(zslice2.celldata["pixel_value"]) lego = vol.legosurface(vmin=0, vmax=10).wireframe() show( [ (vol, lego, vol.cell_centers()), ( lego, cc, zslice, zslice.labels("id"), zslice.labels("cellid"), ), zslice2, ], N=3, axes=1, ) vedo-2025.5.3/tests/issues/issue_1118.py000066400000000000000000000121131474667405700175600ustar00rootroot00000000000000from vedo import * class SubMesh: """ Cut out a submesh and glue it back, possibly with updated vertices, to the original mesh. The number and ordering of vertices in the resultant mesh are preserved. Class properties: * original_mesh * submesh: sub-mesh cut from original_mesh * mesh: the resultant mesh with submesh glued back * old_pids: indices of the submesh vertices which are also the mesh vertices * new_pids: indices of the new vertices added to submesh along the cut lines * cut: the pointcloud of the new vertices * dist2cut: distances from the original vertices in the submesh (old_pids) to the cut """ def __init__(self, msh: Mesh, cut_fn_name: str, **kwargs): """ :param msh: a Mesh :param cut_fn_name: Mesh method name to cut the Mesh :param kwargs: keyworded arguments to the cut meshod """ self.original_mesh = msh self.mesh = msh.clone() self.mesh.pointdata['pids'] = np.arange(self.mesh.nvertices) self.submesh = getattr(self.mesh.clone(), cut_fn_name)(**kwargs) verts = Points(self.mesh.vertices) self.old_pids = [] self.new_pids = [] for i, v in enumerate(self.submesh.vertices): if Point(v).distance_to(verts) < 1e-3: self.old_pids.append(i) else: self.new_pids.append(i) self.cut = Points(self.submesh.vertices[self.new_pids]) self.dist2cut = dict() def glue_(self, radius, align): """ Glue submesh with possibly modified vertex positions back to the original mesh. :param radius: smoothing radius. The vertices of submesh which were originally at the distance smaller than radius, are interpolated between the original and new positions proportionally to the distance :param align: align the cut of submesh to the cut of the original mesh before gluing :return: mesh with submesh glued back """ sm = self.submesh.clone() if align: sm.align_with_landmarks(self.submesh.vertices[self.new_pids], self.cut.vertices, rigid=True) if radius > 0: if len(self.dist2cut) == 0: # pre-compute the distances for interactive gluing for i in self.old_pids: pos = self.original_mesh.vertices[self.submesh.pointdata['pids'][i]] self.dist2cut[i] = Point(pos).distance_to(self.cut).item() for i in self.old_pids: d = min(self.dist2cut[i] / radius, 1.) self.mesh.vertices[self.submesh.pointdata['pids'][i]] = ( d * sm.vertices[i] + (1-d) * self.original_mesh.vertices[self.submesh.pointdata['pids'][i]]) else: for i in self.old_pids: self.mesh.vertices[self.submesh.pointdata['pids'][i]] = sm.vertices[i] self.mesh.pointdata.remove('pids') def glue(self, radius: float=0, mesh_col="wheat", align=False, interactive=False): """ Glue submesh with possibly modified vertex positions back to the original mesh. :param radius: smoothing radius. The vertices of submesh which were originally at the distance smaller than radius, are interpolated between the original and new positions proportionally to the distance :param mesh_col: colour of the mesh in the plot :param align: align the cut of submesh to the cut of the original mesh before gluing :param interactive: open an interactive plot to adjust the smoothing radius :return: mesh with submesh glued back """ self.glue_(radius=radius, align=align) if not interactive: return else: if len(self.dist2cut) == 0: # pre-compute the distances for interactive gluing for i in self.old_pids: pos = self.original_mesh.vertices[self.submesh.pointdata['pids'][i]] self.dist2cut[i] = Point(pos).distance_to(self.cut).item() self.plt = Plotter() self.plt += self.mesh.c(mesh_col) def stitch(widget, event): self.glue_(radius=widget.value**2, align=align) self.plt -= self.mesh self.plt += self.mesh.c(mesh_col) self.plt.add_slider( stitch, value=radius, xmin=0, xmax=np.array(list(self.dist2cut.values())).max()**0.5 *2, pos="bottom", title="Smoothing radius", ) self.plt.show(interactive=True).close() S = Sphere(r=1, res=50).lw(1).flat() box = Cube(side=1.5).wireframe() cups = SubMesh(S, 'cut_with_box', bounds=box, invert=True) cups.submesh.scale(1.2) # alter the submesh cups.glue(radius=0.2, mesh_col="coral", interactive=True) man = Mesh(dataurl+"man.vtk").rotate_x(-90) man.color('w').lw(1).flat() cut_height = 1.20 head = SubMesh(man, 'cut_with_plane', origin=(0, cut_height, 0), normal=(0, 1, 0)) # modify the head: head.submesh.scale(1.2, origin=(0,cut_height,0)).shift((0, 0.05, 0)) head.glue(interactive=True)vedo-2025.5.3/tests/issues/issue_1146.py000066400000000000000000000024111474667405700175610ustar00rootroot00000000000000 from vedo import * from vedo.pyplot import histogram def set_mask_by_thresholds(thresholds): vol_arrc = np.zeros_like(vol_arr, dtype=np.uint8) vol_arrc[(vol_arr > thresholds[0]) & (vol_arr < thresholds[1])] = 1 vol.mask(vol_arrc) def slider1(w, e): if slid1.value > slid2.value: slid1.value = slid2.value set_mask_by_thresholds([slid1.value, slid2.value]) def slider2(w, e): if slid2.value < slid1.value: slid2.value = slid1.value set_mask_by_thresholds([slid1.value, slid2.value]) vol = Volume(dataurl+"embryo.slc") vol.mapper = "gpu" vol.cmap("rainbow").alpha([0, 0.1, 0.2, 0.3, 0.4, 0.8, 1]) vol_arr = vol.tonumpy() histo = histogram(vol, bins=25, c="rainbow", logscale=True, ytitle="") histo = histo.clone2d(size=0.5) plt = Plotter(axes=7) rng = vol.scalar_range() slid2 = plt.add_slider( slider2, xmin=rng[0], xmax=rng[1], value=rng[1], slider_length=0.02, slider_width=0.06, alpha=0.75, c="red2", delayed=True, # update only when mouse is released ) slid1 = plt.add_slider( slider1, xmin=rng[0], xmax=rng[1], value=rng[0], slider_length=0.01, slider_width=0.05, alpha=0.75, tube_width=0.0015, c="blue2", delayed=True, ) plt.show(vol, histo) plt.close()vedo-2025.5.3/tests/issues/issue_1218.py000066400000000000000000000044241474667405700175670ustar00rootroot00000000000000from vedo import * def render_slice(vslice, name): vslice.cut_with_scalar(rmin, "input_scalars", invert=True) vslice.triangulate() vslice.cmap(cmap_slicer, vmin=rmin, vmax=rmax).lighting("off") isos = vslice.isolines(vmin=rmin, vmax=rmax, n=12).c("black") vslice.name = name isos.name = name plt.remove(name).add(vslice, isos) def slider_function_x(widget, event): i = int(widget.value) if i == widget.previous_value: return widget.previous_value = i render_slice(vol.xslice(i), "XSlice") def slider_function_y(widget, event): j = int(widget.value) if j == widget.previous_value: return widget.previous_value = j render_slice(vol.yslice(j), "YSlice") def slider_function_z(widget, event): k = int(widget.value) if k == widget.previous_value: return widget.previous_value = k render_slice(vol.zslice(k), "ZSlice") if __name__ == "__main__": settings.default_font = "Roboto" cmap_slicer = "RdBu" datapath = download(dataurl+"geo_dataset.npy") dataset = np.load(datapath) min_value = np.nanmin(dataset) max_value = np.nanmax(dataset) rmin = np.nanquantile(dataset, q=0.30) rmax = np.nanquantile(dataset, q=0.95) # replace NaNs with a value to mask them in the rendered window nan_ind = np.isnan(dataset) dataset[nan_ind] = 0 vol = Volume(dataset, spacing=[15, 15, 2]) dims = vol.dimensions() iso = vol.isosurface(rmin).smooth() iso.cmap(cmap_slicer, vmin=min_value, vmax=max_value) iso.add_scalarbar3d(c="black", title="scalar value") iso.scalarbar = iso.scalarbar.clone2d("center-right", size=0.2) iso.c("k5").alpha(0.1).lighting("off").wireframe().pickable(False).backface_culling() plt = Plotter(size=(1400, 1200)) plt.add_slider( slider_function_x, 0, dims[0], pos=[(0.7, 0.12), (0.95, 0.12)], show_value=False, c="dr", ) plt.add_slider( slider_function_y, 0, dims[1], pos=[(0.7, 0.08), (0.95, 0.08)], show_value=False, c="dg", ) plt.add_slider( slider_function_z, 0, dims[2], pos=[(0.7, 0.04), (0.95, 0.04)], show_value=False, c="db", ) plt.show(iso, viewup="z", axes=1).close() vedo-2025.5.3/tests/issues/issue_656.py000066400000000000000000000003141474667405700175060ustar00rootroot00000000000000 from vedo import * one = Mesh(dataurl+"bunny.obj", c="green") two = Mesh(dataurl+"bunny.obj", c="red").shift(0.3,0,0) one.add_shadow("z", -0.1) two.add_shadow("z", -0.1) show(one, two, axes=1).close()vedo-2025.5.3/tests/issues/issue_805.py000066400000000000000000000006221474667405700175040ustar00rootroot00000000000000from vedo import * grid = Grid().wireframe(False) square = Rectangle().extrude(0.5).scale(0.4).rotate_z(20).shift(0,0,-.1) square.alpha(0.3) centers = grid.cell_centers().coordinates ids = square.inside_points(centers, return_ids=True) arr = np.zeros(centers.shape[0]).astype(np.uint8) arr[ids] = 1 grid.celldata["myflag"] = arr grid.cmap("rainbow", "myflag", on='cells') show(grid, square, axes=8)vedo-2025.5.3/tests/issues/issue_851.py000066400000000000000000000004271474667405700175100ustar00rootroot00000000000000from vedo import * x=[5]*20 y=[24]*20 z=range(20) c=range(20) cols = color_map(c, "viridis", vmin=0, vmax=25) tube1 = Tube(list(zip(x,y,z)), c=c, res=30, r=5) tube2 = Tube(list(zip(x,y,z)), c=cols, res=30, r=5).pos(15,0,0) show(tube1, tube2, bg='black', bg2='bb', axes=True) vedo-2025.5.3/tests/issues/issue_854.py000066400000000000000000000005721474667405700175140ustar00rootroot00000000000000from vedo import * msh = ParametricShape("RandomHills").scale(2) spline = Spline([[1,1,-1], [0,2,0], [1,3,3]]).lw(3) pts = spline.vertices cpts = [] for i in range(spline.npoints-1): p = pts[i] q = pts[i+1] ipts = msh.intersect_with_line(p, q) if len(ipts): cpts.append(ipts[0]) cpts = Points(cpts, r=12) show(msh, spline, cpts, axes=1, viewup="z") vedo-2025.5.3/tests/issues/issue_856.py000066400000000000000000000005551474667405700175170ustar00rootroot00000000000000from vedo import * def func(widget, e): x = widget.value m = msh.clone() ids = m.find_cells_in_bounds(xbounds=(-10,x)) m.delete_cells(ids) plt.remove("frog").add(m).render() msh = Mesh("data/frog.obj").texture("data/frog.jpg") msh.name = "frog" plt = Plotter(axes=1) plt.add_slider(func, xmin=-6, xmax=3, value=-6) plt.show(msh) plt.close()vedo-2025.5.3/tests/issues/issue_871a.py000066400000000000000000000056121474667405700176540ustar00rootroot00000000000000import numpy as np from vedo import settings, Plotter, Arrow, screenshot, \ ScalarBar3D, Axes, mag, color_map, Assembly, Line settings.default_font = 'Theemim' settings.multi_samples=8 filename = 'data/obs_xyz.dat' xyz = np.loadtxt(filename, dtype=np.float64) xyz = xyz[1:, :] - np.array([0, 20, 0]) n_obs, n_col = xyz.shape # Read in the data num_field = np.loadtxt('data/tmp_field.txt', dtype=np.float64) amp = mag(num_field) # We need to create a few slices from the original arrays # First create a mask array to mark all receiver points with x = -10, 0, 10 x_mark = [-19.5, -9.236842110, 1.026315790, 11.289473680, 19.5] y_mark = [-4.5, 4.5] mask = np.zeros(n_obs, dtype=bool) # We need to create a mask array to mark all receiver points with x being # any of x_mark and y being any of y_marko for x_m in x_mark: mask_local = np.abs(xyz[:, 0] - x_m) < 1e-6 mask = np.logical_or(mask, mask_local) # Create an Arrows object for all the receivers where mask is True start = xyz[mask, :] orientation = num_field[mask, :] orientation = orientation / mag(orientation)[:, None] # normalize amp_mask = amp[mask] vrange = np.array([amp_mask.min(), amp_mask.max()]) arrs = [] for i in range(start.shape[0]): arr = Arrow(start[i], start[i] + orientation[i] * 4) color = color_map( amp_mask[i], "jet", vmin=vrange[0], vmax=vrange[1], ) arr.color(color).lighting('off') arrs.append(arr) arrows = Assembly(arrs) # create a 2D scalarbar # scalarbar = ScalarBar( # vrange, # title='E (V/m)', # c="jet", # font_size=22, # pos=(0.7, 0.25), # size=(60,600), # ) # create a dummy line to use as a 3D scalarbar pos = (-10, -14, -32) line = Line([0, 0], [1, 0]).cmap("jet", vrange * 1e6) scalarbar = ScalarBar3D( line, # c="white", title="E (:muV/m)", title_size=3, label_rotation=90, label_offset=.5, label_size=2, pos=pos, size=(1, 20), nlabels=5, ) scalarbar.rotate_z(-90) size = (3920, 2160) plt = Plotter() axes = Axes( arrows, xtitle='Easting (m)', ytitle='Northing (m)', ztitle='Elevation (m)', xtitle_position=0.60, xlabel_size=0.018, xtitle_offset=0.15, ytitle_position=0.85, ylabel_rotation=-90, ylabel_size=0.02, ytitle_rotation=180, y_values_and_labels=[(-5, "-5"), (0, "0"), (5, "5")], axes_linewidth=4, xrange=arrows.xbounds(), yrange=arrows.ybounds(), zxgrid2=True, zshift_along_y=1, zaxis_rotation=-70, ztitle_size=0.02, ztitle_position=0.68, xyframe_line=True, grid_linewidth=2, ) cam = dict( position=(-58.8911, -54.5234, 8.63461), focal_point=(-5.25549, -0.0457020, -23.8989), viewup=(0.248841, 0.304150, 0.919549), distance=83.0844, clipping_range=(34.8493, 143.093), ) fig_name = 'data/electric_field.png' plt.show(arrows, axes, scalarbar, interactive=0, camera=cam) # screenshot(fig_name) plt.interactive().close()vedo-2025.5.3/tests/issues/issue_871b.py000066400000000000000000000016471474667405700176610ustar00rootroot00000000000000from vedo import * settings.default_font = "Theemim" pts = [(0, 0), (1, 0), (1, 1), (0, 1), (0, 0.5)] data = [1, 10, 100, 1000, 10000] scalarbar = None line = Line(pts, c="k", lw=10) line.pointdata["mydata"] = data line.cmap("jet", "mydata", logscale=True) # automatic add scalarbar # line.add_scalarbar(title="mydata", size=(100,800)) # line.add_scalarbar3d(title="mydata", nlabels=4) # # Or manual add scalarbar # scalarbar = ScalarBar(line, title="mydata", size=(100,800)) scalarbar = ScalarBar3D(line, title="mydata", c='black', nlabels=4, label_format=":.1e") # modify the text of the scalarbar for e in scalarbar.unpack(): if isinstance(e, Text3D): txt = e.text().replace(".0e+0", " x10^") if "x10" in txt: # skip the title e.text(txt) # update new text e.scale(0.02) plt = Plotter() plt += [line, line.labels("mydata", scale=.02), scalarbar] plt.show()vedo-2025.5.3/tests/issues/issue_893.py000066400000000000000000000017061474667405700175170ustar00rootroot00000000000000import numpy as np import vedo N = np.arange(24).reshape([2, 3, 4]) cubes = [] texts = [] positions = [] xs, ys, zs = N.shape for x in range(xs): for y in range(ys): for z in range(zs): pos = (x, y, z) val = N[x, y, z] cubes.append(vedo.Cube(pos=pos, side=0.6, alpha=0.1)) positions.append(pos) pts = vedo.Points(positions) labs= pts.labels2d(font='Quikhand', scale=2, justify="top-center", c="red4") vedo.show(cubes, labs, axes=4).close() ################################################################### (BUG) texts = [] xs, ys, zs = [2, 1, 2] for x in range(xs): for y in range(ys): for z in range(zs): pos = (x, y, z) txt = vedo.Text3D(f"{pos}", pos, s=0.05, justify='centered', c='r5') txt.rotate_x(0.00001) txt.shift(0.00001, 0.00001, 0.00001) # same as rotate_x texts.append(txt.follow_camera()) vedo.show(texts, axes=1) vedo-2025.5.3/tests/issues/issue_905.py000066400000000000000000000037051474667405700175120ustar00rootroot00000000000000import sys from PyQt5 import Qt from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Cone, printc, settings class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create renderer and add the vedo objects and callbacks self.plt = Plotter(qt_widget=self.vtkWidget) self.plt += Cone().rotate_x(20) self.button = self.plt.add_button( self.buttonfunc, pos=(0.7, 0.05), # x,y fraction from bottom left corner states=["click to green"], # text for each state c=["w"], # font color for each state bc=["dg"], # background color for each state font="courier", # font type size=25, # font size bold=True, # bold font italic=False, # non-italic font style ) self.plt.show() # <--- show the vedo rendering # Set-up the rest of the Qt window button = Qt.QPushButton("My Button makes the cone red") button.setToolTip("This is an example button") button.clicked.connect(self.onClick) self.layout.addWidget(self.vtkWidget) self.layout.addWidget(button) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.show() # <--- show the Qt Window def buttonfunc(self, obj, ename): print("btn is clicked...") self.plt.objects[0].color("green5").rotate_z(40) @Qt.pyqtSlot() def onClick(self): printc("..calling onClick") self.plt.objects[0].color("red5").rotate_z(40) self.plt.render() if __name__ == "__main__": if settings.dry_run_mode: sys.exit() app = Qt.QApplication(sys.argv) window = MainWindow() app.exec_()vedo-2025.5.3/tests/issues/issue_908.py000066400000000000000000000017421474667405700175140ustar00rootroot00000000000000"""Colorize a mesh cell by clicking on it""" from vedo import Mesh, Plotter, dataurl # Define the callback function to change the color of the clicked cell to red def func(evt): msh = evt.object if not msh: return pt = evt.picked3d idcell = msh.closest_point(pt, return_cell_id=True) idpoint = msh.closest_point(pt,return_point_id=True) #This works always # m.cellcolors[idcell] = [255,0,0,255] #RGBA #Points need to have the array removed first (BUG) m.pointdata.remove("PointsRGBA") m.pointcolors[idpoint] = [255,0,0,255] # Load a 3D mesh of a panther from a file and set its color to blue m = Mesh(dataurl + "panther.stl").c("blue7") # Make the mesh opaque and set its line width to 1 # m.force_opaque().linewidth(1) # Create a Plotter object and add the callback function to it plt = Plotter() plt.add_callback("mouse click", func) # Display the mesh with the Plotter object and the docstring plt.show(m, __doc__, axes=1).close()vedo-2025.5.3/tests/issues/issue_939.py000066400000000000000000000002131474667405700175100ustar00rootroot00000000000000from vedo import * # cloning generates the same object type (not Mesh) print(type(Plane().clone())) print(type(Line([0,0],[1,1]).clone())) vedo-2025.5.3/tests/issues/issue_946.py000066400000000000000000000035051474667405700175150ustar00rootroot00000000000000import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QFrame, QVBoxLayout from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import dataurl, Volume, settings from vedo.applications import Slicer3DPlotter class MainWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.frame = QFrame() self.layout = QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create renderer and add the vedo objects and callbacks self.vol = Volume(dataurl + "embryo.slc") self.plt = Slicer3DPlotter( volume=self.vol, cmaps=("gist_ncar_r", "jet", "Spectral_r", "hot_r", "bone_r"), use_slider3d=True, bg="blue1", bg2="blue9", qt_widget=self.vtkWidget, ) self.cid1 = self.plt.add_callback("mouse click", self._trigger) self.plt.show() # Set-up the rest of the Qt window self.layout.addWidget(self.vtkWidget) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.show() def _trigger(self, evt): # print("You have clicked your mouse button. Event info:\n", evt) i = int(self.plt.xslider.value) j = int(self.plt.yslider.value) k = int(self.plt.zslider.value) print(i,j,k, type(self.vol.xslice(i))) def onClose(self): # Disable the interactor before closing to prevent it # from trying to act on already deleted items print("CLOSING") self.vtkWidget.close() if __name__ == "__main__": if settings.dry_run_mode: exit() app = QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) window.show() sys.exit(app.exec())vedo-2025.5.3/tests/issues/issue_948.py000066400000000000000000000020371474667405700175160ustar00rootroot00000000000000from vedo import * settings.default_font = "VictorMono" r = 0.2 points_2d = np.random.rand(10000, 2) - 0.5 values = np.random.rand(10000) vmin, vmax = values.min(), values.max() pcloud1 = Points(points_2d, c='k', r=5).rotate_x(30) pcloud2 = pcloud1.clone().cut_with_cylinder(r=r, invert=True) cyl = Cylinder(r=r, height=1, res=360).alpha(0.2) dists = pcloud1.distance_to(cyl, signed=True) mask = dists < 0 print("The boolean mask is", mask) pcloud1.pointdata['values'] = values pcloud1.pointdata['MASK'] = mask pts1 = pcloud1.clone().point_size(5) pts1.cut_with_scalar(0.5, 'MASK') pts1.cmap('bwr', 'values', vmin=vmin, vmax=vmax).add_scalarbar3d(title='values') # pts1.cmap('RdYlBu', 'MASK').add_scalarbar3d(title='MASK') pts1.scalarbar.rotate_x(90) grid = Grid(res=[100,100]).rotate_x(30) grid.interpolate_data_from(pcloud1, n=3) grid.cut_with_cylinder(r=r, invert=True) grid.cmap('bwr', 'values', vmin=vmin, vmax=vmax).wireframe(False).lw(0) grid.add_scalarbar3d(title='interpolated values').scalarbar.rotate_x(90) show(cyl, grid, axes=True) vedo-2025.5.3/tests/issues/issue_950.py000066400000000000000000000005631474667405700175110ustar00rootroot00000000000000from vedo import * np.random.seed(1) # generate a random set of points in 3D space pts1 = np.random.randn(100, 3) pts2 = np.random.randn(100, 3) lines = [] for i in range(100): # generate a line between two points lines.append(Line(pts1[i], pts2[i]).color(i)) # create a new line from the lines list newline = Lines(lines) show([lines, newline], N=2, axes=1)vedo-2025.5.3/tests/issues/issue_953.py000066400000000000000000000022211474667405700175050ustar00rootroot00000000000000import numpy as np from colorcet import bmy from vedo import Points, Grid, show def add_reconst(name, i=2): p = Points(np_pts) bb = list(p.bounds()) if bb[0] == bb[1]: bb[1] += 1 bb[0] -= 1 if bb[2] == bb[3]: bb[3] += 1 bb[2] -= 1 if bb[4] == bb[5]: bb[5] += 1 bb[4] -= 1 m = p.reconstruct_surface(bounds=bb) m.cmap(bmy, m.vertices[:, i]).add_scalarbar() names.append(name) pts.append(p) mesh.append(m) names = [] pts = [] mesh = [] grid = Grid(res=(20, 20)) # grid with constant z=0 np_pts = grid.clone().vertices add_reconst("z=0") # grid with constant z=1 np_pts = grid.clone().z(1).vertices add_reconst("z=1") # grid with varying z np_pts = grid.clone().vertices np_pts[:, 2] = np.sin(np_pts[:, 0]) add_reconst("sin z") # constant y np_pts = grid.clone().rotate_x(90).vertices add_reconst("y=0", 1) # constant x np_pts = grid.clone().rotate_y(90).vertices add_reconst("x=0", 0) # rotated plan np_pts = grid.clone().rotate_x(90).rotate_y(40).rotate_z(60).vertices add_reconst("tilted") show([t for t in zip(names, pts, mesh)], N=len(mesh), sharecam=False, axes=1) vedo-2025.5.3/tests/issues/issue_968.py000066400000000000000000000004061474667405700175160ustar00rootroot00000000000000from vedo import * letter = Text3D("A") #can be any Mesh letter.pointdata["mydata"] = range(letter.npoints) letter.cmap("Set1") eletter = letter.clone().extrude(0.1) eletter.cmap("Set1") eletter.print() show(letter, eletter, N=2, axes=1, viewup='z').close() vedo-2025.5.3/tests/issues/run_all.sh000077500000000000000000000003561474667405700174050ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo Press Esc at anytime to skip example, F1 to interrupt for f in *.py do echo "----------------------------------------" echo "Processing $f script.." python "$f" done vedo-2025.5.3/tests/issues/test_force_anim.py000066400000000000000000000047211474667405700211250ustar00rootroot00000000000000 # @ Author: Giovanni Dalmasso # @ Create Time: 09-02-2024 17:02:07 # @ Modified by: M. Musy import numpy as np from vedo import Arrow2D, Latex, Line, Mesh, Plotter, Text3D, dataurl # Define the forces and initial angle FB = 800 # Newton FA = 750 # Newton theta = 48 # Initial angle in degrees # Calculate the initial components of FA and Fx theta_rad = np.radians(theta) FA_x = FA * np.sin(theta_rad) FA_y = FA * np.cos(theta_rad) Fx = FB * np.cos(np.radians(30)) + FA * np.sin(theta_rad) # Initialize the text object for Fx with its initial value arrow_Fx = Arrow2D([0, 0, 0], (Fx, 0, 0), c="green4") label_Fx = Text3D(f"F_x : {Fx:.0f}~N", pos=(Fx, 0, 0), c="green4", s=80) # Create arrows for forces arrow_FA = Arrow2D([0, 0, 0], (FA_x, FA_y, 0), c="red4") label_FA = Text3D(f"F_A : {FA:.0f}~N", (FA_x, FA_y, 0), c="red4", s=80) arrow_FB = Arrow2D( [0, 0, 0], [FB * np.cos(np.radians(30)), -FB * np.sin(np.radians(30)), 0], c="blue4", ) arrow_FB.name = "ArrowFixed" label_FB = Text3D( f"F_B : {FB:.0f}~N", pos=(FB * np.cos(np.radians(30)), -FB * np.sin(np.radians(30)), 0), c="blue4", s=80, ) label_FB.name = "LabelFixed" # Vertical line to represent the reference direction for theta vertical_line = Line([0, 0, 0], [0, FA_y, 0], c="black", lw=10) theta_txt = Latex(r"\vartheta", s=400).pos([0, FA_y / 3, 0]) deg = Latex(r"30^\circ", s=400).pos([400, -300]) gio = Text3D("Giovanni D.", s=50, c="blue4", italic=True).pos(-600, -300, 0) car = Mesh(dataurl + "porsche.ply").c("k8").lighting("metallic").phong() car.scale(50).pos(-300, 0, 0).rotate(90) def update_scene(widget, event): """Update the forces FA and Fx based on the angle theta.""" # Recalculate components of FA and Fx theta = np.radians(widget.value) FA_x, FA_y = FA * np.sin(theta), FA * np.cos(theta) Fx = FB * np.cos(np.radians(30)) + FA * np.sin(theta) arrow_FA = Arrow2D([0, 0, 0], (FA_x, FA_y, 0), c="red4").z(0.1) arrow_Fx = Arrow2D([0, 0, 0], (Fx, 0, 0), c="green4") label_FA.pos(FA_x, FA_y, 0.1).text(f"F_A : {FA:.0f}~N") label_Fx.pos(Fx, 0, 0).text(f"F_x : {Fx:.0f}~N") plt.remove("Arrow2D").add([arrow_FA, arrow_Fx]) # Create the plotter and a slider to adjust the angle theta plt = Plotter(bg2="lightblue", size=(1200, 800)) plt.add(car, vertical_line, theta_txt, deg, gio) plt.add(arrow_FA, arrow_FB, arrow_Fx, label_FA, label_FB, label_Fx) plt.add_slider(update_scene, 0, 90, value=theta, title="Theta Angle") plt.show(zoom=1.3).close() vedo-2025.5.3/tests/issues/test_fxy_bessel1.py000066400000000000000000000017151474667405700212470ustar00rootroot00000000000000import numpy as np from scipy import special from scipy.special import jn_zeros from vedo import show from vedo.pyplot import plot Nr = 2 Nθ = 3 def f(x, y): d2 = x ** 2 + y ** 2 if d2 > 1: return np.nan else: r = np.sqrt(d2) θ = np.arctan2(y, x) kr = jn_zeros(Nθ, 4)[Nr] return special.jn(Nθ, kr * r) * np.cos(Nθ * θ) p = plot( f, xlim=[-1, 1], ylim=[-1, 1], zlim=[-1, 1], show_nan=False, bins=(100, 100), ) # Unpack the plot objects to customize them objs = p.unpack() # objs[1].off() # turn off the horizontal levels # objs[0].lw(1) # set line width objs[0].lighting('off') # style of mesh lighting "glossy", "plastic".. zvals = objs[0].vertices[:, 2] # get the z values objs[0].cmap("RdBu", zvals, vmin=-0.0, vmax=0.4) # apply the color map sc = objs[0].add_scalarbar3d(title="Bessel Function").scalarbar print("range:", zvals.min(), zvals.max()) show(p, sc, viewup="z").close() vedo-2025.5.3/tests/issues/test_remove_objects.py000066400000000000000000000016031474667405700220250ustar00rootroot00000000000000from vedo import * from vedo.pyplot import matrix def func(event): if not event.object: return if event.object.name == "Sphere": sph = Sphere() arr = np.random.rand(sph.npoints)*np.random.rand() sph.cmap("Blues", arr) # sph.add_scalarbar(title="Elevation", c="k") sph.add_scalarbar3d(title="Elevation", c="k") plt.remove("Sphere").add(sph).render() if event.object.name == "Matrix": arr = np.eye(n, m)/2 + np.random.randn(n, m)*0.1 mat = matrix(arr, scale=0.15).scale(2).y(2) plt.remove("Matrix").add(mat).render() sph = Sphere() n, m = (6, 5) mat = matrix( np.eye(n, m)/2 + np.random.randn(n, m)*0.1, scale=0.15, # size of bin labels; set it to 0 to remove labels ).scale(2).y(2) plt = Plotter() plt.add_callback("mouse left click", func) plt.show(sph, mat, 'click to change random data') vedo-2025.5.3/tests/issues/test_sph_harm2.py000066400000000000000000000057171474667405700207140ustar00rootroot00000000000000""" Morph one shape into another using spherical harmonics package shtools. In this example we morph a sphere into a octahedron and vice-versa. """ import numpy as np from vedo import settings, Plotter, Points, Sphere, cos, dataurl, mag, sin, Mesh try: import pyshtools print(__doc__) except ModuleNotFoundError: print("Please install pyshtools to run this example") print("Follow instructions at https://shtools.oca.eu/shtools") exit(0) ########################################################## N = 100 # number of sample points on the unit sphere lmax = 15 # maximum degree of the sph. harm. expansion rbias = 0.5 # subtract a constant average value x0 = [0, 0, 0] # set object at this position ########################################################## def makeGrid(shape, N): rmax = 2.0 # line length agrid, pts = [], [] for th in np.linspace(0, np.pi, N, endpoint=True): lats = [] for ph in np.linspace(0, 2 * np.pi, N, endpoint=True): p = np.array([sin(th) * cos(ph), sin(th) * sin(ph), cos(th)]) * rmax intersections = shape.intersect_with_line([0, 0, 0], p) if len(intersections): value = mag(intersections[0]) lats.append(value - rbias) pts.append(intersections[0]) else: lats.append(rmax - rbias) pts.append(p) agrid.append(lats) agrid = np.array(agrid) actor = Points(pts, c="k", alpha=0.4, r=1) return agrid, actor def morph(clm1, clm2, t, lmax): """Interpolate linearly the two sets of sph harm. coeeficients.""" clm = (1 - t) * clm1 + t * clm2 grid_reco = clm.expand(lmax=lmax) # cut "high frequency" components agrid_reco = grid_reco.to_array() pts = [] for i, longs in enumerate(agrid_reco): ilat = grid_reco.lats()[i] for j, value in enumerate(longs): ilong = grid_reco.lons()[j] th = np.deg2rad(90 - ilat) ph = np.deg2rad(ilong) r = value + rbias p = np.array([sin(th) * cos(ph), sin(th) * sin(ph), cos(th)]) * r pts.append(p) return pts settings.use_depth_peeling = True plt = Plotter(shape=[2, 2], axes=3, interactive=0) shape1 = Sphere(alpha=0.2) shape2 = Mesh(dataurl + "icosahedron.vtk").normalize().linewidth(1) plt += shape2 agrid1, actorpts1 = makeGrid(shape1, N) plt.at(0).show(shape1, actorpts1) agrid2, actorpts2 = makeGrid(shape2, N) plt.at(1).show(shape2, actorpts2) plt.camera.Zoom(1.2) clm1 = pyshtools.SHGrid.from_array(agrid1).expand() clm2 = pyshtools.SHGrid.from_array(agrid2).expand() # clm1.plot_spectrum2d() # plot the value of the sph harm. coefficients # clm2.plot_spectrum2d() for t in np.arange(0, 1, 0.005): act21 = Points(morph(clm2, clm1, t, lmax), c="r", r=4) act12 = Points(morph(clm1, clm2, t, lmax), c="g", r=4) plt.at(2).show(act21, resetcam=False) plt.at(3).show(act12) plt.azimuth(2) plt.interactive().close() vedo-2025.5.3/tests/pipeline.txt000066400000000000000000000136521474667405700164500ustar00rootroot00000000000000# TEST PIPELINE ############################################################## - Internal use only ############################################################################## # INSTALL #################################################################### export VEDODIR=$HOME/Projects/vedo export VEDOLOGFILE=$VEDODIR/output_vedo_test.txt cd $VEDODIR pip install -q -e . pip install treelib pip install colorcet pip install scikit-image pip install scikit-learn pip install nevergrad -U pip install pyefd -U pip install iminuit -U pip install meshio -U pip install morphomatics -U pip install pygeodesic -U pip install pygmsh -U pip install pymeshlab -U pip install pymadcad -U pip install pyshtools -U pip install rtree pip install trimesh -U pip install -q trame==2.5.2 pip install qtpy pip install magic-class -U pip install tetgenpy -U pip install gustaf -U pip install fast-simplification -U #pip install pyacvd -U #pip install pymeshfix -U # ENABLE/DISABLE DRY RUN ########################################################### sed -i "s/dry_run_mode = 0/dry_run_mode = 2/g" $VEDODIR/vedo/settings.py #->DISABLE sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" $VEDODIR/vedo/settings.py #->ENABLE #################################################################################### pytest tests cd $VEDODIR/tests/common && ./run_all.sh cd $VEDODIR/tests/issues && ./run_all.sh cd $VEDODIR/tests/snippets && ./run_all.sh # EXAMPLES ########################################################################## cd $VEDODIR/examples && time ./run_all.sh 2>&1 | tee $VEDOLOGFILE && alert "scan done." grep -aA 1 "Error" $VEDOLOGFILE grep -aA 3 "Trace" $VEDOLOGFILE grep -aA 3 "ailure" $VEDOLOGFILE grep -aA 3 "invalid" $VEDOLOGFILE code $VEDOLOGFILE #### inspect logfile # (Try normal run too with visualization to make sure all is ok) # TUTORIALS ################################################################## cd ~/Projects/server/vedo-embo-course/scripts && ./run_all.sh cd ~/Projects/server/vedo-bias-course/scripts && ./run_all.sh cd ~/Projects/server/vedo-epug-tutorial/scripts && ./run_all.sh # TRIMESH ##################################################################### cd $VEDODIR/examples/other/trimesh && ./run_all.sh # DOLFIN ##################################################################### # conda create -n fenics -c conda-forge fenics # conda activate fenics # conda install conda-forge::mshr cd $VEDODIR conda activate fenics pip install -qe . cd $VEDODIR/examples/other/dolfin && ./run_all.sh conda deactivate # OTHERS ##################################################################### cd $VEDODIR python ~/Dropbox/documents/Medical/RESONANCIA.py vedo https://vedo.embl.es/examples/data/panther.stl.gz vedo https://vedo.embl.es/examples/geo_scene.npz vedo --convert data/290.vtk --to ply && vedo data/290.ply # NOTEBOOKS ################################################################### cd $VEDODIR/examples/notebooks/ jupyter notebook > /dev/null 2>&1 ########################## # Check on OSX and Windows # VEDO PROJECTS ############################################################### cd $VEDODIR pip install . cd ~/Projects/server/trackviewer ./main_test.py ################ cd ~/Projects/clonal_analysis/clone_viewer3 ./clone_viewer_gio3d.py ################ cd ~/Projects/server/rio_organoid python main4.py python piv_read_fw2_C3.py ################ cd ~/Projects/server/cell_density analyse_density.py test_image.png test_image_gfp.png edu_histogram.py test_image.png ################ cd ~/Projects/new_yalla/limb_opti_here python result_viz3.py ################ cd ~/Projects/server/welsh_embryo_stager python stager.py pics/E14.5_L3-03_HL2.5X.jpg ################ cd ~/Projects/oocytes python step5.py ################ cd ~/Projects/umap_viewer3d python main6.py ################ cd ~/Projects/napari-vedo-bridge # conda create -y -n napari-env -c conda-forge python=3.9 # conda activate napari-env # python -m pip install "napari[all]" conda activate napari-env cd $VEDODIR && pip install -q . && cd - pip install -e . python $VEDODIR/examples/other/napari1.py # then open plugins ... conda deactivate ################ cd ~/Projects/server/brainrender/examples python cell_density.py python streamlines.py python volumetric_data.py ################ cd ~/Projects/clonal_analysis python -m analysis_plots2d python tc_morph11_2d.py ################ cd ~/Projects/server/gustaf git pull pip install -e . cd examples python run_all_examples.py ################ cd ~/Projects/server/splinepy git pull pip install -e . cd examples python run_all_examples.py ################ cd ~/Projects/server/tetgenpy/examples python plc_to_tets.py ################ cd ~/Projects/4d-gene-reconstruction/useful_scripts python plc_to_tets.py ################ cd ~/Projects/abm_playground/ python cell_sim.py # DOCUMENTATION ############################################################### mount_staging pip install pdoc cd $VEDODIR/docs/pdoc ./build_html.py # check web page examples cd $VEDODIR code docs/examples_db.js cp docs/examples_db.js www/examples_db.js code www/index.html # RELEASE ##################################################################### cd $VEDODIR # check version and status code vedo/version.py git status git commit -am 'release' git push # (optionally) python -m pip install -U packaging # upload to pypi (add in ~/.pypirc): # [pypi] # username = __token__ # password = your-pypi-token rm -rf dist/ python -m build python -m twine upload dist/* # make github release cd $VEDODIR code CHANGELOG.md code vedo/version.py # edit to add +dev0 https://repology.org/project/vedo/badges rm $VEDOLOGFILE # SITES ###################################################################### https://vedo.embl.es/ https://vedo.embl.es/docs https://vedo.embl.es/fonts https://github.com/marcomusy/vedo https://forum.image.sc/search?q=vedo%20order%3Alatest vedo-2025.5.3/tests/snippets/000077500000000000000000000000001474667405700157405ustar00rootroot00000000000000vedo-2025.5.3/tests/snippets/run_all.sh000077500000000000000000000003561474667405700177370ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo Press Esc at anytime to skip example, F1 to interrupt for f in *.py do echo "----------------------------------------" echo "Processing $f script.." python "$f" done vedo-2025.5.3/tests/snippets/test_cell_types.py000066400000000000000000000112701474667405700215150ustar00rootroot00000000000000from vedo import UnstructuredGrid, Points, show, settings, utils ##################################### def makeTetrahedron(): """A tetrahedron""" pts = [ (0, 0, 0), (1, 0, 0), (1, 1, 0), (0, 1, 1), ] cells = [[0, 1, 2, 3]] cellstypes = [10] ug = UnstructuredGrid([pts, cells, cellstypes]) ug.c('w', 0.25).lw(2).lighting("off") return ug ##################################### def makeHexahedron(): """A regular hexagon (cube) with all faces square and three squares around each vertex is created below. Setup the coordinates of eight points (the two faces must be in counter clockwise order as viewed from the outside). """ pts = [ (0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (1.0, 1.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0), (1.0, 0.0, 1.0), (1.0, 1.0, 1.0), (0.0, 1.0, 1.0), ] cells = [[0, 1, 2, 3, 4, 5, 6, 7]] cellstypes = [12] ug = UnstructuredGrid([pts, cells, cellstypes]) ug.c('w', 0.25).lw(2).lighting("off") return ug ##################################### def makePyramid(): """Make a regular square pyramid""" pts = [ [1.0, 1.0, 0.0], [-1.0, 1.0, 0.0], [-1.0, -1.0, 0.0], [1.0, -1.0, 0.0], [0.0, 0.0, 1.0], ] cells = [[0, 1, 2, 3, 4]] cellstypes = [14] ug = UnstructuredGrid([pts, cells, cellstypes]) ug.c('w', 0.25).lw(2).lighting("off") return ug ##################################### def makeWedge(): """A wedge consists of two triangular ends and three rectangular faces""" pts = [ (0, 1, 0), (0, 0, 0), (0, 0.25, 0.25), (1, 1, 0), (1, 0.0, 0.0), (1, 0.25, 0.25), ] cells = [[0, 1, 2, 3, 4, 5]] cellstypes = [13] ug = UnstructuredGrid([pts, cells, cellstypes]) ug.c('w', 0.25).lw(2).lighting("off") return ug ##################################### def makeHexagonalPrism(): """Hexagonal prism: a wedge with an hexagonal base. Be careful, the base face ordering is different from wedge. """ pts = [ (0.0, 0.0, 1.0), (1.0, 0.0, 1.0), (1.5, 0.5, 1.0), (1.0, 1.0, 1.0), (0.0, 1.0, 1.0), (-0.5, 0.5, 1.0), #### (0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (1.5, 0.5, 0.0), (1.0, 1.0, 0.0), (0.0, 1.0, 0.0), (-0.5, 0.5, 0.0), ] cells = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]] cellstypes = [16] ug = UnstructuredGrid([pts, cells, cellstypes]) ug.c('w', 0.25).lw(2).lighting("off") return ug ##################################### def makePentagonalPrism(): """A 3D pentagonal prism: a wedge with an pentagonal base.""" pts = [ (11, 10, 10), (13, 10, 10), (14, 12, 10), (12, 14, 10), (10, 12, 10), (11, 10, 14), (13, 10, 14), (14, 12, 14), (12, 14, 14), (10, 12, 14), ] cells = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]] cellstypes = [15] ug = UnstructuredGrid([pts, cells, cellstypes]) ug.c('w', 0.25).lw(2).lighting("off") return ug def makeQuadraticTetra(): import vtk print(utils.vtkVersionIsAtLeast(9)) aTetra = vtk.vtkQuadraticTetra() points = vtk.vtkPoints() pcoords = aTetra.GetParametricCoords() rng = vtk.vtkMinimalStandardRandomSequence() points.SetNumberOfPoints(aTetra.GetNumberOfPoints()) rng.SetSeed(5070) # for testing for i in range(0, aTetra.GetNumberOfPoints()): perturbation = [0.0] * 3 for j in range(0, 3): rng.Next() perturbation[j] = rng.GetRangeValue(-0.1, 0.1) aTetra.GetPointIds().SetId(i, i) points.SetPoint(i, [pcoords[3 * i], pcoords[3 * i + 1], pcoords[3 * i + 2]]) ug = vtk.vtkUnstructuredGrid() ug.SetPoints(points) ug.InsertNextCell(aTetra.GetCellType(), aTetra.GetPointIds()) return UnstructuredGrid(ug) ##################################### tetr = makeTetrahedron() hexa = makeHexahedron() pirm = makePyramid() wedg = makeWedge() hexp = makeHexagonalPrism() penp = makePentagonalPrism() # qtetr= makeQuadraticTetra() settings.immediate_rendering = False # faster for multi-renderers show( [ ["Tetrahedron", tetr, Points(tetr.vertices, r=15, c="o")], ["Hexahedron", hexa, Points(hexa.vertices, r=15, c="o")], ["Pyramid", pirm, Points(pirm.vertices, r=15, c="o")], ["Wedge", wedg, Points(wedg.vertices, r=15, c="o")], ["HexagonalPrism", hexp, Points(hexp.vertices, r=15, c="o")], ["PentagonalPrism", penp, Points(penp.vertices, r=15, c="o")], ], N=6, bg="blue3", sharecam=False, axes=1, ).close() vedo-2025.5.3/tests/snippets/test_closewindow.py000066400000000000000000000024371474667405700217140ustar00rootroot00000000000000"""Closing the Rendering Window Press q: Control returns to terminal, window will not close but become unresponsive""" from vedo import * mesh = Paraboloid() plt1 = show(mesh, __doc__, title='First Plotter instance') # Now press 'q' to exit the window interaction, # windows stays open but not reactive anymore. # You can go back to interaction mode by simply calling: #plt1.interactive() printc('\nControl returned to terminal shell:', c='tomato', invert=1) # ask('window is now unresponsive (press Enter here)', c='tomato', invert=1) plt1.close() # window should now close, the Plotter instance becomes unusable # but mesh objects still exist in it: printc("Objects in first Plotter:", len(plt1.objects), '\nPress q again') # plt1.show() # error here: window does not exist anymore. Cannot reopen. # ################################################################## # Can now create a brand new Plotter and show the old object in it plt2 = Plotter(title='Second Plotter instance', pos=(500,0)) plt2.show(plt1.objects[0].color('red')) ################################################################## # Create a third new Plotter and then close the second plt3 = Plotter(title='Third Plotter instance') plt2.close() printc('plt2.close() called') plt3.show(Hyperboloid()).close() printc('done.') vedo-2025.5.3/tests/snippets/test_compare_fit1.py000066400000000000000000000041701474667405700217240ustar00rootroot00000000000000import numpy as np from scipy.optimize import curve_fit ############################################# Define fit function def fit_function(x, A, beta, B, mu, sigma): return A * np.exp(-x / beta) + B * np.exp(-((x - mu) ** 2) / (2 * sigma**2)) # Generate exponential and gaussian data data1 = np.random.exponential(scale=2.0, size=4000) data2 = np.random.normal(loc=3.0, scale=0.3, size=1000) # Fit the function to the histogram data bins = np.linspace(0, 6, 61) data_entries_1, bins_1 = np.histogram(data1, bins=bins) data_entries_2, bins_2 = np.histogram(data2, bins=bins) data_entries = data_entries_1 + data_entries_2 # sum the two sets binscenters = np.array([0.5 * (bins[i] + bins[i + 1]) for i in range(len(bins) - 1)]) popt, pcov = curve_fit( fit_function, xdata=binscenters, ydata=data_entries, p0=[200, 2.0, 200, 3.0, 0.3] ) # Generate enough x values to make the curves look smooth. xspace = np.linspace(0, 6, 100) ############################################# vedo # Plot the histogram and the fitted function. from vedo import settings from vedo.pyplot import histogram, plot settings.default_font = "ComicMono" settings.remember_last_figure_format = True h = histogram( data1.tolist() + data2.tolist(), xlim=(0, 6), bins=60, title="Exponential decay with gaussian peak", xtitle="x axis", ytitle="Number of entries", label="Histogram entries", c='green3', ) h += plot( xspace, fit_function(xspace, *popt), lc="darkorange", lw=3, label="Fit function", ) h.add_legend() h.show(zoom="tight", interactive=False) if settings.dry_run_mode: exit(0) ############################################# matplotlib # Plot the histogram and the fitted function. import matplotlib.pyplot as plt plt.bar( binscenters, data_entries, width=bins[1] - bins[0], color="g", label=r"Histogram entries", ) plt.plot( xspace, fit_function(xspace, *popt), color="darkorange", linewidth=2.5, label=r"Fit function", ) plt.xlim(0, 6) plt.xlabel(r"x axis") plt.ylabel(r"Number of entries") plt.title(r"Exponential decay with gaussian peak") plt.legend(loc="best") plt.show() vedo-2025.5.3/tests/snippets/test_discourse_1956.py000066400000000000000000000004131474667405700220330ustar00rootroot00000000000000from vedo import * lines = load("https://discourse.vtk.org/uploads/short-url/nC2RjJgTerpHKR0jD02Na6BRHVl.vtp") for k in lines.pointdata.keys(): print("array:", k, lines.pointdata[k].dtype) lines.cmap("rainbow", "cluster_idx") show(lines, axes=1, bg='blackboard')vedo-2025.5.3/tests/snippets/test_docs_sniplets.py000066400000000000000000000235151474667405700222300ustar00rootroot00000000000000## This contains the script snippets that come with the documetation for testing import numpy as np from vedo import * from vedo.pyplot import plot import vedo doshow = 1 ##################################################################### addons.py box = Box(pos=(1,2,3), length=8, width=9, height=7).alpha(0.1) axs = Axes(box, c='k') # returns Assembly object for a in axs.unpack(): print(a.name) if doshow: show(box, axs).close() ###################################################### print("Test 1") b = Box(pos=(0, 0, 0), length=80, width=90, height=70).alpha(0.1) if doshow: show( b, axes={ "xtitle": "Some long variable [a.u.]", "number_of_divisions": 4, # ... }, ).close() ##################################################################### base.py print("Test 2") c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 v = vector(0.2,1,0) p = vector(1,0,0) # axis passes through this point c2.rotate(90, axis=v, point=p) l = Line(-v+p, v+p).lw(3).c('red') if doshow: show(c1, l, c2, axes=1).close() ###################################################### print("Test 3") objs = [] for i in range(-5, 5): p = [i/3, i/2, i] v = vector(i/10, i/20, 1) c = Circle(r=i/5+1.2).pos(p).lw(3) objs += [c, Arrow(p,p+v)] if doshow: show(objs, axes=1).close() ###################################################### print("Test 4") c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 v = vector(0.2,1,0) p = vector(1,0,0) # axis passes through this point c2.rotate(90, axis=v, point=p) # get the inverse of the current transformation T = c2.transform.compute_inverse() c2.apply_transform(T) # put back c2 in place l = Line(p-v, p+v).lw(3).c('red') if doshow: show(c1.wireframe().lw(3), l, c2, axes=1).close() ###################################################### print("Test 5") tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') tetmesh.color('rainbow') cu = Cube(side=500).x(500) # any Mesh works tetmesh.cut_with_box(cu) if doshow: show(axes=1).close() ##################################################################### mesh.py print("Test 6") s = Sphere().crop(right=0.3, left=0.1) if doshow: show(s).close() ###################################################### print("Test 7") c1 = Cylinder(pos=(0,0,0), r=2, height=3, axis=(1,.0,0), alpha=.1).triangulate() c2 = Cylinder(pos=(0,0,2), r=1, height=2, axis=(0,.3,1), alpha=.1).triangulate() intersect = c1.intersect_with(c2).join(reset=True) spline = Spline(intersect).c('blue').lw(5) if doshow: show(c1, c2, spline, intersect.labels('id'), axes=1).close() ###################################################### print("Test 8") grid = Grid()#.triangulate() circle = Circle(r=0.3, res=24).pos(0.11,0.12) line = Line(circle, closed=True, lw=4, c='r4') # grid.imprint(line) if doshow: show(grid, line, axes=1).close() ##################################################################### Image.py print("Test 9") if doshow: pic = Image(dataurl+'dog.jpg').pad() pic.append([pic,pic,pic], axis='y') pic.append([pic,pic,pic,pic], axis='x') pic.show(axes=1).close() ###################################################### print("Test 10") if doshow: p = vedo.Image(vedo.dataurl+'images/dog.jpg').bw() pe = p.clone().enhance() show(p, pe, N=2, mode='image', zoom='tight').close() ###################################################### print("Test 11") if doshow: pic1 = Image("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") pic2 = pic1.clone().invert() pic3 = pic1.clone().binarize() show(pic1, pic2, pic3, N=3, bg="blue9").close() ###################################################### print("Test 12") if doshow: pic = vedo.Image(vedo.dataurl+"images/dog.jpg") pic.add_rectangle([100,300], [100,200], c='green4', alpha=0.7) pic.add_line([100,100],[400,500], lw=2, alpha=1) pic.add_triangle([250,300], [100,300], [200,400]) show(pic, axes=1).close() ##################################################################### plotter.py print("Test 13") cone = Cone() if doshow: cone.show(axes=1).fly_to([1,0,0]) cone.show().close() ###################################################### print("Test 14") settings.use_parallel_projection = True # or else it doesnt make sense! cube = Cube().alpha(0.2) plt = Plotter(size=(900,600), axes=dict(xtitle='x (um)')) if doshow: plt.add_scale_indicator(units='um', c='blue4') plt.show(cube, "Scale indicator with units").close() settings.use_parallel_projection = False ###################################################### print("Test 15") def func(evt): # called every time the mouse moves # evt is a dotted dictionary if not evt.actor: return # no hit, return print("point coords =", evt.picked3d) elli = Ellipsoid() plt = Plotter(axes=1) plt.add_callback('mouse hovering', func) if doshow: plt.show(elli).close() ##################################################################### pointcloud.py # print("Test 16") # s = Ellipsoid().rotate_y(30) # #Camera options: pos, focal_point, viewup, distance, # # clippingRange, parallelScale, thickness, viewAngle # camopts = dict(pos=(0,0,25), focal_point=(0,0,0)) # if doshow: # show(s, camera=camopts, offscreen=True).close() # m = s.visible_points() # #print('visible pts:', m.points()) # numpy array # show(m, new=True, axes=1).close() # optionally draw result on a new window ###################################################### print("Test 17") def fibonacci_sphere(n): s = np.linspace(0, n, num=n, endpoint=False) theta = s * 2.399963229728653 y = 1 - s * (2/(n-1)) r = np.sqrt(1 - y * y) x = np.cos(theta) * r z = np.sin(theta) * r return [x,y,z] # print(np.c_[fibonacci_sphere(10)].T) fpoints = Points(np.c_[fibonacci_sphere(1000)].T) if doshow: fpoints.show(axes=1).close() ###################################################### print("Test 18") s = Sphere(res=10).linewidth(1).c("orange").compute_normals() point_ids = s.labels('id', on="points").c('green') cell_ids = s.labels('id', on="cells").c('black') if doshow: show(s, point_ids, cell_ids).close() ###################################################### print("Test 19") sph = Sphere(quads=True, res=4).compute_normals().wireframe() sph.celldata["zvals"] = sph.cell_centers().coordinates[:,2] l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') if doshow: show(sph, l2d, axes=1).close() ###################################################### print("Test 20") c1 = Cube().rotate_z(5).x(2).y(1) print("cube1 position", c1.pos()) T = c1.transform # rotate by 5 degrees, sum 2 to x and 1 to y c2 = Cube().c('r4') c2.apply_transform(T) c2.apply_transform(T) c2.apply_transform(T) print("cube2 position", c2.pos()) if doshow: show(c1, c2, axes=1).close() ###################################################### print("Test 21") disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_cylinder([0,0,2], r=0.4, axis='y', invert=True) if doshow: show(mesh, axes=1) ###################################################### print("Test 22") disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_sphere([1,-0.7,2], r=1.5, invert=True) if doshow: show(mesh, axes=1).close() ###################################################### print("Test 23") arr = np.random.randn(100000, 3)/2 pts = Points(arr).c('red3').pos(5,0,0) cube = Cube().pos(4,0.5,0) assem = pts.cut_with_mesh(cube, keep=True) if doshow: show(assem.unpack(), axes=1).close() ##################################################################### shapes.py print("Test 24") pts = [[1, 0, 0], [5, 2, 0], [3, 3, 1]] ln = Line(pts, c='r', lw=5).pattern('- -', repeats=10) if doshow: ln.show(axes=1).close() ###################################################### print("Test 25") if doshow: shape = Assembly(dataurl+"timecourse1d.npy")[58] pts = shape.rotate_x(30).coordinates tangents = Line(pts).tangents() arrs = Arrows(pts, pts+tangents, c='blue9') show(shape.c('red5').lw(5), arrs, bg='bb', axes=1).close() ###################################################### print("Test 26") if doshow: shape = Assembly(dataurl+"timecourse1d.npy")[55] curvs = Line(shape.coordinates).curvature() shape.cmap('coolwarm', curvs, vmin=-2,vmax=2).add_scalarbar3d(c='w') shape.render_lines_as_tubes().lw(12) pp = plot(curvs, ac='white', lc='yellow5') show(shape, pp, N=2, bg='bb', sharecam=False).close() ###################################################### print("Test 27") aline = Line([(0,0,0),(1,3,0),(2,4,0)]) surf1 = aline.sweep((1,0.2,0), res=3) surf2 = aline.sweep((0.2,0,1)) aline.color('r').linewidth(4) if doshow: show(surf1, surf2, aline, axes=1).close() ###################################################### print("Test 28") pts = [(-4,-3),(1,1),(2,4),(4,1),(3,-1),(2,-5),(9,-3)] ln = Line(pts, c='r', lw=2).z(0.01) rl = RoundedLine(pts, 0.6) if doshow: show(Points(pts), ln, rl, axes=1).close() ###################################################### print("Test 29") pts = np.random.randn(25,3) for i,p in enumerate(pts): p += [5*i, 15*sin(i/2), i*i*i/200] if doshow: show(Points(pts), Bezier(pts), axes=1).close() ###################################################### print("Test 30") xcoords = np.arange(0, 2, 0.2) ycoords = np.arange(0, 1, 0.2) sqrtx = sqrt(xcoords) grid = Grid(s=(sqrtx, ycoords)) if doshow: grid.show(axes=8) # can also create a grid from np.mgrid: X, Y = np.mgrid[-12:12:1000*1j, 0:15:1000*1j] vgrid = Grid(s=(X[:,0], Y[0])) if doshow: vgrid.show(axes=8).close() ###################################################### print("Test 31") settings.immediate_rendering = False plt = Plotter(N=18) for i in range(18): ps = ParametricShape(i).color(i) if doshow: plt.at(i).show(ps, ps.name) if doshow: plt.interactive() vedo-2025.5.3/tests/snippets/test_elastic_pendulum.py000066400000000000000000000043741474667405700227160ustar00rootroot00000000000000"""Simulate an elastic pendulum. The trail is colored according to the velocity.""" import numpy as np from scipy.integrate import solve_ivp import matplotlib.pyplot as plt from vedo import Plotter, Axes, Sphere, Spring, Image, mag, sin, cos from vedo.addons import ProgressBarWidget a = 2.0 # length of the pendulum m = 0.5 # mass k = 10.0 # constant of the spring g = 9.81 # gravitational constant # Define the system of ODEs def system(t, z): x, dx_dt, y, dy_dt = z # z = [x, x', y, y'] dxdot_dt = (a+x) * dy_dt**2 - k/m * x + g * cos(y) dydot_dt = -2/(a+x) * dx_dt * dy_dt - g/(a+x) * sin(y) return [dx_dt, dxdot_dt, dy_dt, dydot_dt] # Initial conditions: x(0), x'(0), y(0), y'(0) initial_conditions = [0.0, 0.0, 0.4, 0.0] # Time span for the solution t_span = (0, 12) t_eval = np.linspace(t_span[0], t_span[1], 500) # range to evaluate solution # Solve the system numerically solution = solve_ivp(system, t_span, initial_conditions, t_eval=t_eval) t_values = solution.t elong_values = solution.y[0] theta_values = solution.y[2] # Plot the results using matplotlib as a graph fig = plt.figure() plt.plot(t_values, elong_values, label="elongation(t)") plt.plot(t_values, theta_values, label="angle(t)") plt.xlabel("Time") plt.legend() # Animate the system using the solution of the ODE plotter = Plotter(bg="blackboard", bg2="blue1", interactive=False) pbw = ProgressBarWidget(len(t_values)) axes = Axes(xrange=[-2, 2], yrange=[-a*2, 1], xygrid=0, xyframe_line=0, c="w") img = Image(fig).clone2d("top-right", size=0.5) sphere = Sphere(r=0.3, c="red5").add_trail(c="k5", lw=4) plotter.show(axes, sphere, img, pbw, __doc__) for elong, theta in zip(elong_values, theta_values): x = (a + elong) * sin(theta) y = -(a + elong) * cos(theta) spring = Spring([0, 0], [x, y]) sphere.pos([x, y]).update_trail() # color the trail according to the lenght of each segment v = sphere.trail.vertices lenghts1 = np.array(v[1:]) lenghts2 = np.array(v[:-1]) lenghts = mag(lenghts1 - lenghts2) # lenght of each segment lenghts = np.append(lenghts, lenghts[-1]) sphere.trail.cmap("Blues_r", lenghts, vmin=0, vmax=0.1) plotter.remove("Spring").add(spring).render() pbw.update() # update progress bar plotter.interactive() vedo-2025.5.3/tests/snippets/test_ellipsoid_main_axes.py000066400000000000000000000014151474667405700233620ustar00rootroot00000000000000"""Compute main axes of a transformation matrix""" from vedo import * settings.default_font = "Calco" M = np.random.rand(3,3) - 0.5 A = LinearTransform(M) print(A) print(M) p = [1, 2, 3] pt = Point(p) print("---------- All these should be equal:") print("M @ [1,2,3] =", M @ p) print("A([1,2,3]) =", A(p)) print("A(pt).vertices =", A(pt).vertices[0]) maxes = A.compute_main_axes() arr1 = Arrow([0,0,0], maxes[0]).c('r', 0.5) arr2 = Arrow([0,0,0], maxes[1]).c('g', 0.5) arr3 = Arrow([0,0,0], maxes[2]).c('b', 0.5) sphere1 = Sphere().wireframe().lighting('off').alpha(0.2) sphere1.cmap('hot', sphere1.vertices[:,2]) sphere2 = sphere1.clone().apply_transform(A) show([[sphere1, __doc__], [sphere2, arr1, arr2, arr3, str(M)]], N=2, axes=1, bg='bb').close() vedo-2025.5.3/tests/snippets/test_fit_shapiro.py000066400000000000000000000027541474667405700216700ustar00rootroot00000000000000# https://www.youtube.com/watch?v=yJCSupnOv8w import numpy as np from scipy.optimize import curve_fit from scipy.stats import shapiro from vedo.pyplot import histogram, plot from vedo import settings settings.default_font = "ComicMono" settings.use_parallel_projection = True settings.remember_last_figure_format = True data = [ 196, 193, 186, 154, 151, 147, 141, 138, 125, 110, 109, 80, 67, 32, 12, -103, -108, -143, ] # Perform the Shapiro-Wilk test to check for normality statistic, p_value = shapiro(data) fig = histogram( data, title=( "Shapiro-Wilk test\n" "on cheating chess players\n" f"(p-value = {p_value*100:.3f}%)" ), xtitle="ELO score variation", gap=0.02, label="Data", xlim=(-300, 300), ) # Fit the data with a double gaussian def func(x, a0, sigma0, a1, mean1, sigma1): g0 = a0 * np.exp(-(x )**2 /2 /sigma0**2) # background g1 = a1 * np.exp(-(x - mean1)**2 /2 /sigma1**2) # signal return g0 + g1 xdata = fig.centers ydata = fig.frequencies fit_params, pcov = curve_fit(func, xdata, ydata, p0=[2,100,2,150,50]) ydata_fit = func(xdata, *fit_params) ydata_fit_background = func(xdata, fit_params[0], fit_params[1], 0, 0, 1) fig += plot(xdata, ydata_fit, "-r 0", lw=4, label="Fit") fig += plot(xdata, ydata_fit_background, "-b", lw=2, label="Bkg") fig.add_legend() print("# of cheaters:", np.sum(ydata_fit - ydata_fit_background)) fig.show(zoom="tight") vedo-2025.5.3/tests/snippets/test_interactive_plotxy1.py000066400000000000000000000014211474667405700233640ustar00rootroot00000000000000"""Interactive plot with a slider to change the k value of a sigmoid function.""" import numpy as np from vedo import Plotter, settings from vedo.pyplot import plot kinit = 0.75 n = 3 x = np.linspace(-1, 1, 100) def update_plot(widget=None, event=""): k = widget.value if widget else kinit # y = 1/(1 + (k/x)**n) # hill function # y = np.abs(k*x)**n *np.sign(k*x) # power law y = (2 / (1 + np.exp(-np.abs(n*k*x))) - 1) *np.sign(k*x) # sigmoid p = plot(x, y, c='red5', lw=4, xlim=(-1,1), ylim=(-1,1), aspect=1) plt.remove("PlotXY").add(p) settings.default_font = "Roboto" plt = Plotter(size=(900, 1050)) plt.add_slider(update_plot, -1, 1, value=kinit, title="k value", c="red3") update_plot() plt.show(__doc__, mode="2d", zoom='tight') vedo-2025.5.3/tests/snippets/test_interactive_plotxy2.py000066400000000000000000000043711474667405700233740ustar00rootroot00000000000000"""Create an interactive plot that allows the user to control a parameter using a slider, The plot shows the solution to a system of equations for y given x and a constant C. The user can change the value of C using a slider, and the plot will update the y-range.""" import numpy as np from scipy.optimize import fsolve from vedo import Plotter, settings from vedo.pyplot import plot # Initial values C_init = 0 xdata = np.linspace(-3, 3, 50) # Function to solve for y given x and C (from your first script) def solve_for_y(x, C): y_vals = [] for sign in [1, -1]: # Solve for positive and negative y def equation(y): return 0.5 * y**2 + np.log(np.abs(y)) - 0.5 * x**2 - C y_initial_guess = sign * np.exp(-0.5 * x**2 - C) root = fsolve(equation, y_initial_guess)[0] if equation(root) < 1e-5: # Only accept the root if it's a valid solution y_vals.append(root) return y_vals # Generate the y values for plotting (positive and negative y) def generate_y_values(x_values, C): y_positive = [] y_negative = [] for x in x_values: y_vals = solve_for_y(x, C) if len(y_vals) > 0: y_positive.append(max(y_vals)) # Choose the largest root as positive y_negative.append(min(y_vals)) # Choose the smallest root as negative else: y_positive.append(np.nan) # Use NaN for missing values y_negative.append(np.nan) return y_positive, y_negative # Function to update the plot when the slider changes def update_plot(widget=None, event=""): C_value = C_init if widget is None else widget.value y_positive, y_negative = generate_y_values(xdata, C_value) m = max(max(y_positive), abs(min(y_negative))) p = plot(xdata, y_positive, c='red5', lw=4, ylim=(-m, m)) p += plot(xdata, y_negative, c='blue5', lw=4, like=p) plt.remove("PlotXY").add(p) # Create Plotter and the slider to control the value of C settings.default_font = "Brachium" plt = Plotter(size=(1200, 760), title="Exercise") slider = plt.add_slider(update_plot, -10.0, 10.0, value=C_init, title="C value", c="green3") update_plot() # Initial plot plt.show(__doc__, mode="2d", zoom=1.35) vedo-2025.5.3/vedo.desktop000066400000000000000000000011121474667405700152540ustar00rootroot00000000000000 # In linux systems, place this file in directory: # /usr/share/applications/ # sudo chmod o+r /usr/share/applications/vedo.desktop # # then right-click a file # choose Properties # choose Open With ... vedo [Desktop Entry] Type=Application Name=vedo GenericName=vedo Comment=Scientific 3D Viewer Comment[it]=Visualizzatore di modelli 3D in vari formati Exec=vedo -n %F Categories=Science;Graphics;3DGraphics; Icon=python Terminal=true StartupNotify=false MimeType=text/x-python;application/x-wavefront-obj;application/x-collada; X-AppStream-Ignore=True Keywords=browser;vtk;collada; vedo-2025.5.3/vedo/000077500000000000000000000000001474667405700136665ustar00rootroot00000000000000vedo-2025.5.3/vedo/__init__.py000066400000000000000000000071631474667405700160060ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ##### To generate documentation # cd ~/Projects/vedo/docs/pdoc # ./build_html.py ############################### """ .. include:: ../docs/documentation.md """ ######################################################################## imports import os import sys import logging import numpy as np from numpy import sin, cos, sqrt, exp, log, dot, cross # just because handy try: from vtkmodules.vtkCommonCore import vtkVersion except ModuleNotFoundError: print("Cannot find VTK installation. Please install it with:") print("pip install vtk") sys.exit(1) ################################################# from vedo.version import _version as __version__ from vedo.settings import Settings settings = Settings() from vedo.colors import * from vedo.transformations import * from vedo.utils import * from vedo.core import * from vedo.shapes import * from vedo.file_io import * from vedo.assembly import * from vedo.pointcloud import * from vedo.mesh import * from vedo.image import * from vedo.volume import * from vedo.grids import * from vedo.addons import * from vedo.plotter import * from vedo.visual import * from vedo import applications from vedo import interactor_modes try: import platform sys_platform = platform.system() except (ModuleNotFoundError, AttributeError) as e: sys_platform = "" ######################################################################### GLOBALS __author__ = "Marco Musy" __license__ = "MIT" __maintainer__ = "M. Musy" __email__ = "marco.musy@embl.es" __website__ = "https://github.com/marcomusy/vedo" ########################################################################## vtk_version = ( int(vtkVersion().GetVTKMajorVersion()), int(vtkVersion().GetVTKMinorVersion()), int(vtkVersion().GetVTKBuildVersion()), ) installdir = os.path.dirname(__file__) dataurl = "https://vedo.embl.es/examples/data/" plotter_instance = None notebook_plotter = None notebook_backend = None ## fonts fonts_path = os.path.join(installdir, "fonts/") # Note: # a fatal error occurs when compiling to exe, # developer needs to copy the fonts folder to the same location as the exe file # to solve this problem if not os.path.exists(fonts_path): fonts_path = "fonts/" fonts = [_f.split(".")[0] for _f in os.listdir(fonts_path) if '.npz' not in _f] fonts = list(sorted(fonts)) # pyplot module to remember last figure format last_figure = None ######################################################################### LOGGING class _LoggingCustomFormatter(logging.Formatter): logformat = "[vedo.%(filename)s:%(lineno)d] %(levelname)s: %(message)s" white = "\x1b[1m" grey = "\x1b[2m\x1b[1m\x1b[38;20m" yellow = "\x1b[1m\x1b[33;20m" red = "\x1b[1m\x1b[31;20m" inv_red = "\x1b[7m\x1b[1m\x1b[31;1m" reset = "\x1b[0m" FORMATS = { logging.DEBUG: grey + logformat + reset, logging.INFO: white + logformat + reset, logging.WARNING: yellow + logformat + reset, logging.ERROR: red + logformat + reset, logging.CRITICAL: inv_red + logformat + reset, } def format(self, record): log_fmt = self.FORMATS.get(record.levelno) formatter = logging.Formatter(log_fmt) return formatter.format(record).replace(".py", "") logger = logging.getLogger("vedo") _chsh = logging.StreamHandler() if sys.stdout is None: sys.stdout = open(os.devnull, "w") if sys.stderr is None: sys.stderr = open(os.devnull, "w") _chsh.flush = sys.stdout.flush _chsh.setLevel(logging.DEBUG) _chsh.setFormatter(_LoggingCustomFormatter()) logger.addHandler(_chsh) logger.setLevel(logging.INFO) vedo-2025.5.3/vedo/addons.py000066400000000000000000005171141474667405700155210ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np from typing import Union from typing_extensions import Self import vedo.vtkclasses as vtki # a wrapper for lazy imports import vedo from vedo import settings from vedo import utils from vedo import shapes from vedo.transformations import LinearTransform from vedo.assembly import Assembly, Group from vedo.colors import get_color, build_lut, color_map, printc from vedo.mesh import Mesh from vedo.pointcloud import Points, Point, merge from vedo.grids import TetMesh from vedo.volume import Volume __docformat__ = "google" __doc__ = """ Create additional objects like axes, legends, lights, etc. ![](https://vedo.embl.es/images/pyplot/customAxes2.png) """ __all__ = [ "ScalarBar", "ScalarBar3D", "Slider2D", "Slider3D", "Icon", "LegendBox", "Light", "Axes", "RendererFrame", "Ruler2D", "Ruler3D", "RulerAxes", "DistanceTool", "SplineTool", "DrawingWidget", "Goniometer", "Button", "ButtonWidget", "Flagpost", "ProgressBarWidget", "BoxCutter", "PlaneCutter", "SphereCutter", ] ######################################################################################## class Flagpost(vtki.vtkFlagpoleLabel): """ Create a flag post style element to describe an object. """ def __init__( self, txt="", base=(0, 0, 0), top=(0, 0, 1), s=1, c="k9", bc="k1", alpha=1, lw=0, font="Calco", justify="center-left", vspacing=1, ): """ Create a flag post style element to describe an object. Arguments: txt : (str) Text to display. The default is the filename or the object name. base : (list) position of the flag anchor point. top : (list) a 3D displacement or offset. s : (float) size of the text to be shown c : (list) color of text and line bc : (list) color of the flag background alpha : (float) opacity of text and box. lw : (int) line with of box frame. The default is 0. font : (str) font name. Use a monospace font for better rendering. The default is "Calco". Type `vedo -r fonts` for a font demo. Check [available fonts here](https://vedo.embl.es/fonts). justify : (str) internal text justification. The default is "center-left". vspacing : (float) vertical spacing between lines. Examples: - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/other/flag_labels2.py) ![](https://vedo.embl.es/images/other/flag_labels2.png) """ super().__init__() base = utils.make3d(base) top = utils.make3d(top) self.SetBasePosition(*base) self.SetTopPosition(*top) self.SetFlagSize(s) self.SetInput(txt) self.PickableOff() self.GetProperty().LightingOff() self.GetProperty().SetLineWidth(lw + 1) prop = self.GetTextProperty() if bc is not None: prop.SetBackgroundColor(get_color(bc)) prop.SetOpacity(alpha) prop.SetBackgroundOpacity(alpha) if bc is not None and len(bc) == 4: prop.SetBackgroundRGBA(alpha) c = get_color(c) prop.SetColor(c) self.GetProperty().SetColor(c) prop.SetFrame(bool(lw)) prop.SetFrameWidth(lw) prop.SetFrameColor(prop.GetColor()) prop.SetFontFamily(vtki.VTK_FONT_FILE) fl = utils.get_font_path(font) prop.SetFontFile(fl) prop.ShadowOff() prop.BoldOff() prop.SetOpacity(alpha) prop.SetJustificationToLeft() if "top" in justify: prop.SetVerticalJustificationToTop() if "bottom" in justify: prop.SetVerticalJustificationToBottom() if "cent" in justify: prop.SetVerticalJustificationToCentered() prop.SetJustificationToCentered() if "left" in justify: prop.SetJustificationToLeft() if "right" in justify: prop.SetJustificationToRight() prop.SetLineSpacing(vspacing * 1.2) self.SetUseBounds(False) def text(self, value: str) -> Self: self.SetInput(value) return self def on(self) -> Self: self.VisibilityOn() return self def off(self) -> Self: self.VisibilityOff() return self def toggle(self) -> Self: self.SetVisibility(not self.GetVisibility()) return self def use_bounds(self, value=True) -> Self: self.SetUseBounds(value) return self def color(self, c) -> Self: c = get_color(c) self.GetTextProperty().SetColor(c) self.GetProperty().SetColor(c) return self def pos(self, p) -> Self: p = np.asarray(p) self.top = self.top - self.base + p self.base = p return self @property def base(self) -> np.ndarray: return np.array(self.GetBasePosition()) @base.setter def base(self, value): self.SetBasePosition(*value) @property def top(self) -> np.ndarray: return np.array(self.GetTopPosition()) @top.setter def top(self, value): self.SetTopPosition(*value) ########################################################################################### class LegendBox(shapes.TextBase, vtki.vtkLegendBoxActor): """ Create a 2D legend box. """ def __init__( self, entries=(), nmax=12, c=None, font="", width=0.18, height=None, padding=2, bg="k8", alpha=0.25, pos="top-right", markers=None, ): """ Create a 2D legend box for the list of specified objects. Arguments: nmax : (int) max number of legend entries c : (color) text color, leave as None to pick the mesh color automatically font : (str) Check [available fonts here](https://vedo.embl.es/fonts) width : (float) width of the box as fraction of the window width height : (float) height of the box as fraction of the window height padding : (int) padding space in units of pixels bg : (color) background color of the box alpha: (float) opacity of the box pos : (str, list) position of the box, can be either a string or a (x,y) screen position in range [0,1] Examples: - [legendbox.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/legendbox.py) - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) ![](https://vedo.embl.es/images/other/flag_labels.png) """ super().__init__() self.name = "LegendBox" self.entries = entries[:nmax] self.properties = self.GetEntryTextProperty() n = 0 texts = [] for e in self.entries: ename = e.name if "legend" in e.info.keys(): if not e.info["legend"]: ename = "" else: ename = str(e.info["legend"]) if ename: n += 1 texts.append(ename) self.SetNumberOfEntries(n) if not n: return self.ScalarVisibilityOff() self.PickableOff() self.SetPadding(padding) self.properties.ShadowOff() self.properties.BoldOff() # self.properties.SetJustificationToLeft() # no effect # self.properties.SetVerticalJustificationToTop() if not font: font = settings.default_font self.font(font) n = 0 for i in range(len(self.entries)): ti = texts[i] if not ti: continue e = entries[i] if c is None: col = e.properties.GetColor() if col == (1, 1, 1): col = (0.2, 0.2, 0.2) else: col = get_color(c) if markers is None: # default poly = e.dataset else: marker = markers[i] if utils.is_sequence(markers) else markers if isinstance(marker, Points): poly = marker.clone(deep=False).normalize().shift(0, 1, 0).dataset else: # assume string marker poly = vedo.shapes.Marker(marker, s=1).shift(0, 1, 0).dataset self.SetEntry(n, poly, ti, col) n += 1 self.SetWidth(width) if height is None: self.SetHeight(width / 3.0 * n) else: self.SetHeight(height) self.pos(pos) if alpha: self.UseBackgroundOn() self.SetBackgroundColor(get_color(bg)) self.SetBackgroundOpacity(alpha) else: self.UseBackgroundOff() self.LockBorderOn() @property def width(self): """Return the width of the legend box.""" return self.GetWidth() @property def height(self): """Return the height of the legend box.""" return self.GetHeight() def pos(self, pos): """Set the position of the legend box.""" sx, sy = 1 - self.GetWidth(), 1 - self.GetHeight() if pos == 1 or ("top" in pos and "left" in pos): self.GetPositionCoordinate().SetValue(0, sy) elif pos == 2 or ("top" in pos and "right" in pos): self.GetPositionCoordinate().SetValue(sx, sy) elif pos == 3 or ("bottom" in pos and "left" in pos): self.GetPositionCoordinate().SetValue(0, 0) elif pos == 4 or ("bottom" in pos and "right" in pos): self.GetPositionCoordinate().SetValue(sx, 0) elif "cent" in pos and "right" in pos: self.GetPositionCoordinate().SetValue(sx, sy - 0.25) elif "cent" in pos and "left" in pos: self.GetPositionCoordinate().SetValue(0, sy - 0.25) elif "cent" in pos and "bottom" in pos: self.GetPositionCoordinate().SetValue(sx - 0.25, 0) elif "cent" in pos and "top" in pos: self.GetPositionCoordinate().SetValue(sx - 0.25, sy) elif utils.is_sequence(pos): self.GetPositionCoordinate().SetValue(pos[0], pos[1]) else: vedo.logger.error("LegendBox: pos must be in range [1-4] or a [x,y] list") return self class ButtonWidget: """ Create a button widget. """ def __init__( self, function, states=(), c=("white"), bc=("green4"), alpha=1.0, font="Calco", size=100, plotter=None, ): """ Create a button widget. States can be either text strings or images. Arguments: function : (function) external function to be called by the widget states : (list) the list of possible states, eg. ['On', 'Off'] c : (list) the list of colors for each state eg. ['red3', 'green5'] bc : (list) the list of background colors for each state alpha : (float) opacity level font : (str) font type size : (int) size of button font plotter : (Plotter) the plotter object to which the widget is added Example: ```py from vedo import * def button_func(widget, evtname): print("button_func called") cone.color(button.state) def on_mouse_click(event): if event.object: print("on_mouse_click", event) cone.color(button.state) # Create a cone cone = Cone().color(0) # Create a plotter plt = Plotter(bg='bb', axes=1) plt.add_callback('mouse click', on_mouse_click) plt.add(cone) # Create a button widget img0 = Image("play-button.png") img1 = Image("power-on.png") button = ButtonWidget( button_func, # states=["State 0", "State 1"], states=[img0, img1], c=["red4", "blue4"], bc=("k9", "k5"), size=100, plotter=plt, ) button.pos([0,0]).enable() plt.show() ``` """ self.widget = vtki.new("ButtonWidget") self.function = function self.states = states self.colors = c self.background_colors = bc self.plotter = plotter self.size = size assert len(states) == len(c), "states and colors must have the same length" assert len(states) == len(bc), "states and background colors must have the same length" self.interactor = None if plotter is not None: self.interactor = plotter.interactor self.widget.SetInteractor(plotter.interactor) else: if vedo.plotter_instance: self.interactor = vedo.plotter_instance.interactor self.widget.SetInteractor(self.interactor) self.representation = vtki.new("TexturedButtonRepresentation2D") self.representation.SetNumberOfStates(len(states)) for i, state in enumerate(states): if isinstance(state, vedo.Image): state = state.dataset elif isinstance(state, str): txt = state tp = vtki.vtkTextProperty() tp.BoldOff() tp.FrameOff() col = c[i] tp.SetColor(vedo.get_color(col)) tp.ShadowOff() tp.ItalicOff() col = bc[i] tp.SetBackgroundColor(vedo.get_color(col)) tp.SetBackgroundOpacity(alpha) tp.UseTightBoundingBoxOff() # tp.SetJustificationToLeft() # tp.SetVerticalJustificationToCentered() # tp.SetJustificationToCentered() width, height = 100 * len(txt), 1000 fpath = vedo.utils.get_font_path(font) tp.SetFontFamily(vtki.VTK_FONT_FILE) tp.SetFontFile(fpath) tr = vtki.new("TextRenderer") fs = tr.GetConstrainedFontSize(txt, tp, width, height, 500) tp.SetFontSize(fs) img = vtki.vtkImageData() tr.RenderString(tp, txt, img, [width, height], 500) state = img self.representation.SetButtonTexture(i, state) self.widget.SetRepresentation(self.representation) self.widget.AddObserver("StateChangedEvent", function) def __del__(self): self.widget.Off() self.widget.SetInteractor(None) self.widget.SetRepresentation(None) self.representation = None self.interactor = None self.function = None self.states = () self.widget = None self.plotter = None def pos(self, pos): assert len(pos) == 2, "pos must be a 2D position" if not self.plotter: vedo.logger.warning("ButtonWidget: pos() can only be used if a Plotter is provided") return self coords = vtki.vtkCoordinate() coords.SetCoordinateSystemToNormalizedDisplay() coords.SetValue(pos[0], pos[1]) sz = self.size ren = self.plotter.renderer p = coords.GetComputedDisplayValue(ren) bds = [0, 0, 0, 0, 0, 0] bds[0] = p[0] - sz bds[1] = bds[0] + sz bds[2] = p[1] - sz bds[3] = bds[2] + sz self.representation.SetPlaceFactor(1) self.representation.PlaceWidget(bds) return self def enable(self): self.widget.On() return self def disable(self): self.widget.Off() return self def next_state(self): self.representation.NextState() return self @property def state(self): return self.representation.GetState() @state.setter def state(self, i): self.representation.SetState(i) class Button(vedo.shapes.Text2D): """ Build a Button object. """ def __init__( self, fnc=None, states=("Button"), c=("white"), bc=("green4"), pos=(0.7, 0.1), size=24, font="Courier", bold=True, italic=False, alpha=1, angle=0, ): """ Build a Button object to be shown in the rendering window. Arguments: fnc : (function) external function to be called by the widget states : (list) the list of possible states, eg. ['On', 'Off'] c : (list) the list of colors for each state eg. ['red3', 'green5'] bc : (list) the list of background colors for each state pos : (list, str) 2D position in pixels from left-bottom corner size : (int) size of button font font : (str) font type bold : (bool) set bold font face italic : (bool) italic font face alpha : (float) opacity level angle : (float) anticlockwise rotation in degrees Examples: - [buttons1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/buttons1.py) - [buttons2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/buttons2.py) ![](https://user-images.githubusercontent.com/32848391/50738870-c0fe2500-11d8-11e9-9b78-92754f5c5968.jpg) - [timer_callback2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/timer_callback2.py) ![](https://vedo.embl.es/images/advanced/timer_callback1.jpg) """ super().__init__() self.status_idx = 0 self.spacer = " " self.states = states if not utils.is_sequence(c): c = [c] self.colors = c if not utils.is_sequence(bc): bc = [bc] self.bcolors = bc assert len(c) == len(bc), "in Button color number mismatch!" self.function = fnc self.function_id = None self.status(0) if font == "courier": font = font.capitalize() self.font(font).bold(bold).italic(italic) self.alpha(alpha).angle(angle) self.size(size / 20) self.pos(pos, "center") self.PickableOn() def status(self, s=None) -> "Button": """ Set/Get the status of the button. """ if s is None: return self.states[self.status_idx] if isinstance(s, str): s = self.states.index(s) self.status_idx = s self.text(self.spacer + self.states[s] + self.spacer) s = s % len(self.bcolors) self.color(self.colors[s]) self.background(self.bcolors[s]) return self def switch(self) -> "Button": """ Change/cycle button status to the next defined status in states list. """ self.status_idx = (self.status_idx + 1) % len(self.states) self.status(self.status_idx) return self ##################################################################### class SplineTool(vtki.vtkContourWidget): """ Spline tool, draw a spline through a set of points interactively. """ def __init__( self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, alpha=1, closed=False, ontop=True, can_add_nodes=True, ): """ Spline tool, draw a spline through a set of points interactively. Arguments: points : (list), Points initial set of points. pc : (str) point color. ps : (int) point size. lc : (str) line color. ac : (str) active point color. lw : (int) line width. alpha : (float) line transparency level. closed : (bool) spline is closed or open. ontop : (bool) show it always on top of other objects. can_add_nodes : (bool) allow to add (or remove) new nodes interactively. Examples: - [spline_tool.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/spline_tool.py) ![](https://vedo.embl.es/images/basic/spline_tool.png) """ super().__init__() self.representation = self.GetRepresentation() self.representation.SetAlwaysOnTop(ontop) self.SetAllowNodePicking(can_add_nodes) self.representation.GetLinesProperty().SetColor(get_color(lc)) self.representation.GetLinesProperty().SetLineWidth(lw) self.representation.GetLinesProperty().SetOpacity(alpha) if lw == 0 or alpha == 0: self.representation.GetLinesProperty().SetOpacity(0) self.representation.GetActiveProperty().SetLineWidth(lw + 1) self.representation.GetActiveProperty().SetColor(get_color(ac)) self.representation.GetProperty().SetColor(get_color(pc)) self.representation.GetProperty().SetPointSize(ps) self.representation.GetProperty().RenderPointsAsSpheresOn() # self.representation.BuildRepresentation() # crashes self.SetRepresentation(self.representation) if utils.is_sequence(points): self.points = Points(points) else: self.points = points self.closed = closed @property def interactor(self): """Return the current interactor.""" return self.GetInteractor() @interactor.setter def interactor(self, iren): """Set the current interactor.""" self.SetInteractor(iren) def add(self, pt) -> "SplineTool": """ Add one point at a specified position in space if 3D, or 2D screen-display position if 2D. """ if len(pt) == 2: self.representation.AddNodeAtDisplayPosition(int(pt[0]), int(pt[1])) else: self.representation.AddNodeAtWorldPosition(pt) return self def add_observer(self, event, func, priority=1) -> int: """Add an observer to the widget.""" event = utils.get_vtk_name_event(event) cid = self.AddObserver(event, func, priority) return cid def remove(self, i: int) -> "SplineTool": """Remove specific node by its index""" self.representation.DeleteNthNode(i) return self def on(self) -> "SplineTool": """Activate/Enable the tool""" self.On() self.Render() return self def off(self) -> "SplineTool": """Disactivate/Disable the tool""" self.Off() self.Render() return self def render(self) -> "SplineTool": """Render the spline""" self.Render() return self # def bounds(self) -> np.ndarray: # """Retrieve the bounding box of the spline as [x0,x1, y0,y1, z0,z1]""" # return np.array(self.GetBounds()) def spline(self) -> vedo.Line: """Return the vedo.Spline object.""" self.representation.SetClosedLoop(self.closed) self.representation.BuildRepresentation() pd = self.representation.GetContourRepresentationAsPolyData() ln = vedo.Line(pd, lw=2, c="k") return ln def nodes(self, onscreen=False) -> np.ndarray: """Return the current position in space (or on 2D screen-display) of the spline nodes.""" n = self.representation.GetNumberOfNodes() pts = [] for i in range(n): p = [0.0, 0.0, 0.0] if onscreen: self.representation.GetNthNodeDisplayPosition(i, p) else: self.representation.GetNthNodeWorldPosition(i, p) pts.append(p) return np.array(pts) class DrawingWidget: def __init__(self, obj, c="green5", lw=4, closed=False, snap_to_image=False): """ 3D widget for tracing on planar props. This is primarily designed for manually tracing over image data. - Any object can be input rather than just 2D images - The widget fires pick events at the input prop to decide where to move its handles - The widget has 2D glyphs for handles instead of 3D spheres. The button actions and key modifiers are as follows for controlling the widget: 1) left button click over the image, hold and drag draws a free hand line. 2) left button click and release erases the widget line, if it exists, and repositions the first handle. 3) middle button click starts a snap drawn line. The line is terminated by clicking the middle button while ressing the ctrl key. 4) when tracing a continuous or snap drawn line, if the last cursor position is within a specified tolerance to the first handle, the widget line will form a closed loop. 5) right button clicking and holding on any handle that is part of a snap drawn line allows handle dragging: existing line segments are updated accordingly. If the path is open and closing_radius is set, the path can be closed by repositioning the first and last points over one another. 6) Ctrl + right button down on any handle will erase it: existing snap drawn line segments are updated accordingly. If the line was formed by continuous tracing, the line is deleted leaving one handle. 7) Shift + right button down on any snap drawn line segment will insert a handle at the cursor position. The line segment is split accordingly. Arguments: obj : vtkProp The prop to trace on. c : str, optional The color of the line. The default is "green5". lw : int, optional The line width. The default is 4. closed : bool, optional Whether to close the line. The default is False. snap_to_image : bool, optional Whether to snap to the image. The default is False. Example: - [spline_draw2.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/spline_draw2.py) """ self.widget = vtki.new("ImageTracerWidget") self.line = None self.line_properties = self.widget.GetLineProperty() self.line_properties.SetColor(vedo.get_color(c)) self.line_properties.SetLineWidth(lw) self.callback_id = None self.event_name = "EndInteractionEvent" if vedo.plotter_instance: self.widget.SetInteractor(vedo.plotter_instance.interactor) if vedo.plotter_instance.renderer: self.widget.SetDefaultRenderer(vedo.plotter_instance.renderer) try: self.widget.SetViewProp(obj.actor) except AttributeError: self.widget.SetViewProp(obj) if closed: closing_radius = 1e10 self.widget.SetAutoClose(1) self.widget.SetCaptureRadius(closing_radius) self.widget.SetProjectToPlane(0) self.widget.SetProjectionNormal(2) # XY plane self.widget.SetProjectionPosition(0) self.widget.SetSnapToImage(snap_to_image) def callback(self, widget, eventId) -> None: path = vtki.vtkPolyData() widget.GetPath(path) self.line = vedo.shapes.Line(path, c=self.line_properties.GetColor()) # print(f"There are {path.GetNumberOfPoints()} points in the line.") def add_observer(self, event, func, priority=1) -> int: """Add an observer to the widget.""" event = utils.get_vtk_name_event(event) cid = self.widget.AddObserver(event, func, priority) return cid @property def interactor(self): return self.widget.GetInteractor() @interactor.setter def interactor(self, value): self.widget.SetInteractor(value) @property def renderer(self): return self.widget.GetDefaultRenderer() @renderer.setter def renderer(self, value): self.widget.SetDefaultRenderer(value) def on(self) -> Self: self.widget.On() ev_name = vedo.utils.get_vtk_name_event(self.event_name) self.callback_id = self.widget.AddObserver(ev_name, self.callback, 1000) return self def off(self) -> None: self.widget.Off() self.widget.RemoveObserver(self.callback_id) def freeze(self, value=True) -> Self: self.widget.SetInteraction(not value) return self def remove(self) -> None: self.widget.Off() self.widget.RemoveObserver(self.callback_id) self.widget.SetInteractor(None) self.line = None self.line_properties = None self.callback_id = None self.widget = None ##################################################################### class SliderWidget(vtki.vtkSliderWidget): """Helper class for `vtkSliderWidget`""" def __init__(self): super().__init__() self.previous_value = None @property def interactor(self): return self.GetInteractor() @interactor.setter def interactor(self, iren): self.SetInteractor(iren) @property def representation(self): return self.GetRepresentation() @property def value(self): val = self.GetRepresentation().GetValue() # self.previous_value = val return val @value.setter def value(self, val): self.GetRepresentation().SetValue(val) @property def renderer(self): return self.GetCurrentRenderer() @renderer.setter def renderer(self, ren): self.SetCurrentRenderer(ren) @property def title(self): self.GetRepresentation().GetTitleText() @title.setter def title(self, txt): self.GetRepresentation().SetTitleText(str(txt)) @property def range(self): xmin = self.GetRepresentation().GetMinimumValue() xmax = self.GetRepresentation().GetMaximumValue() return [xmin, xmax] @range.setter def range(self, vals): if vals[0] is not None: self.GetRepresentation().SetMinimumValue(vals[0]) if vals[1] is not None: self.GetRepresentation().SetMaximumValue(vals[1]) def on(self) -> Self: self.EnabledOn() return self def off(self) -> Self: self.EnabledOff() return self def toggle(self) -> Self: self.SetEnabled(not self.GetEnabled()) return self def add_observer(self, event, func, priority=1) -> int: """Add an observer to the widget.""" event = utils.get_vtk_name_event(event) cid = self.AddObserver(event, func, priority) return cid ##################################################################### def Goniometer( p1, p2, p3, font="", arc_size=0.4, s=1, italic=0, rotation=0, prefix="", lc="k2", c="white", alpha=1, lw=2, precision=3, ): """ Build a graphical goniometer to measure the angle formed by 3 points in space. Arguments: p1 : (list) first point 3D coordinates. p2 : (list) the vertex point. p3 : (list) the last point defining the angle. font : (str) Font face. Check [available fonts here](https://vedo.embl.es/fonts). arc_size : (float) dimension of the arc wrt the smallest axis. s : (float) size of the text. italic : (float, bool) italic text. rotation : (float) rotation of text in degrees. prefix : (str) append this string to the numeric value of the angle. lc : (list) color of the goniometer lines. c : (str) color of the goniometer angle filling. Set alpha=0 to remove it. alpha : (float) transparency level. lw : (float) line width. precision : (int) number of significant digits. Examples: - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) ![](https://vedo.embl.es/images/pyplot/goniometer.png) """ if isinstance(p1, Points): p1 = p1.pos() if isinstance(p2, Points): p2 = p2.pos() if isinstance(p3, Points): p3 = p3.pos() if len(p1)==2: p1=[p1[0], p1[1], 0.0] if len(p2)==2: p2=[p2[0], p2[1], 0.0] if len(p3)==2: p3=[p3[0], p3[1], 0.0] p1, p2, p3 = np.array(p1), np.array(p2), np.array(p3) acts = [] ln = shapes.Line([p1, p2, p3], lw=lw, c=lc) acts.append(ln) va = utils.versor(p1 - p2) vb = utils.versor(p3 - p2) r = min(utils.mag(p3 - p2), utils.mag(p1 - p2)) * arc_size ptsarc = [] res = 120 imed = int(res / 2) for i in range(res + 1): vi = utils.versor(vb * i / res + va * (res - i) / res) if i == imed: vc = np.array(vi) ptsarc.append(p2 + vi * r) arc = shapes.Line(ptsarc).lw(lw).c(lc) acts.append(arc) angle = np.arccos(np.dot(va, vb)) * 180 / np.pi lb = shapes.Text3D( prefix + utils.precision(angle, precision) + "º", s=r / 12 * s, font=font, italic=italic, justify="center", ) cr = np.cross(va, vb) lb.reorient([0, 0, 1], cr * np.sign(cr[2]), rotation=rotation, xyplane=False) lb.pos(p2 + vc * r / 1.75) lb.c(c).bc("tomato").lighting("off") acts.append(lb) if alpha > 0: pts = [p2] + arc.coordinates.tolist() + [p2] msh = Mesh([pts, [list(range(arc.npoints + 2))]], c=lc, alpha=alpha) msh.lighting("off") msh.triangulate() msh.shift(0, 0, -r / 10000) # to resolve 2d conflicts.. acts.append(msh) asse = Assembly(acts) asse.name = "Goniometer" return asse def Light(pos, focal_point=(0, 0, 0), angle=180, c=None, intensity=1): """ Generate a source of light placed at `pos` and directed to `focal point`. Returns a `vtkLight` object. Arguments: focal_point : (list) focal point, if a `vedo` object is passed then will grab its position. angle : (float) aperture angle of the light source, in degrees c : (color) set the light color intensity : (float) intensity value between 0 and 1. Check also: `plotter.Plotter.remove_lights()` Examples: - [light_sources.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/light_sources.py) ![](https://vedo.embl.es/images/basic/lights.png) """ if c is None: try: c = pos.color() except AttributeError: c = "white" try: pos = pos.pos() except AttributeError: pass try: focal_point = focal_point.pos() except AttributeError: pass light = vtki.vtkLight() light.SetLightTypeToSceneLight() light.SetPosition(pos) light.SetConeAngle(angle) light.SetFocalPoint(focal_point) light.SetIntensity(intensity) light.SetColor(get_color(c)) return light ##################################################################### def ScalarBar( obj, title="", pos=(), size=(80, 400), font_size=14, title_yoffset=20, nlabels=None, c="k", horizontal=False, use_alpha=True, label_format=":6.3g", ) -> Union[vtki.vtkScalarBarActor, None]: """ A 2D scalar bar for the specified object. Arguments: title : (str) scalar bar title pos : (list) position coordinates of the bottom left corner. Can also be a pair of (x,y) values in the range [0,1] to indicate the position of the bottom-left and top-right corners. size : (float,float) size of the scalarbar in number of pixels (width, height) font_size : (float) size of font for title and numeric labels title_yoffset : (float) vertical space offset between title and color scalarbar nlabels : (int) number of numeric labels c : (list) color of the scalar bar text horizontal : (bool) lay the scalarbar horizontally use_alpha : (bool) render transparency in the color bar itself label_format : (str) c-style format string for numeric labels Examples: - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) ![](https://user-images.githubusercontent.com/32848391/62940174-4bdc7900-bdd3-11e9-9713-e4f3e2fdab63.png) """ if isinstance(obj, (Points, TetMesh, vedo.UnstructuredGrid)): vtkscalars = obj.dataset.GetPointData().GetScalars() if vtkscalars is None: vtkscalars = obj.dataset.GetCellData().GetScalars() if not vtkscalars: return None lut = vtkscalars.GetLookupTable() if not lut: lut = obj.mapper.GetLookupTable() if not lut: return None elif isinstance(obj, Volume): lut = utils.ctf2lut(obj) elif utils.is_sequence(obj) and len(obj) == 2: x = np.linspace(obj[0], obj[1], 256) data = [] for i in range(256): rgb = color_map(i, c, 0, 256) data.append([x[i], rgb]) lut = build_lut(data) elif not hasattr(obj, "mapper"): vedo.logger.error(f"in add_scalarbar(): input is invalid {type(obj)}. Skip.") return None else: return None c = get_color(c) sb = vtki.vtkScalarBarActor() # print("GetLabelFormat", sb.GetLabelFormat()) label_format = label_format.replace(":", "%-#") sb.SetLabelFormat(label_format) sb.SetLookupTable(lut) sb.SetUseOpacity(use_alpha) sb.SetDrawFrame(0) sb.SetDrawBackground(0) if lut.GetUseBelowRangeColor(): sb.DrawBelowRangeSwatchOn() sb.SetBelowRangeAnnotation("") if lut.GetUseAboveRangeColor(): sb.DrawAboveRangeSwatchOn() sb.SetAboveRangeAnnotation("") if lut.GetNanColor() != (0.5, 0.0, 0.0, 1.0): sb.DrawNanAnnotationOn() sb.SetNanAnnotation("nan") if title: if "\\" in repr(title): for r in shapes._reps: title = title.replace(r[0], r[1]) titprop = sb.GetTitleTextProperty() titprop.BoldOn() titprop.ItalicOff() titprop.ShadowOff() titprop.SetColor(c) titprop.SetVerticalJustificationToTop() titprop.SetFontSize(font_size) titprop.SetFontFamily(vtki.VTK_FONT_FILE) titprop.SetFontFile(utils.get_font_path(vedo.settings.default_font)) sb.SetTitle(title) sb.SetVerticalTitleSeparation(title_yoffset) sb.SetTitleTextProperty(titprop) sb.SetTextPad(0) sb.UnconstrainedFontSizeOn() sb.DrawAnnotationsOn() sb.DrawTickLabelsOn() sb.SetMaximumNumberOfColors(256) if nlabels is not None: sb.SetNumberOfLabels(nlabels) if len(pos) == 0 or utils.is_sequence(pos[0]): if len(pos) == 0: pos = ((0.87, 0.05), (0.97, 0.5)) if horizontal: pos = ((0.5, 0.05), (0.97, 0.15)) sb.SetTextPositionToPrecedeScalarBar() if horizontal: if not nlabels: sb.SetNumberOfLabels(3) sb.SetOrientationToHorizontal() sb.SetTextPositionToSucceedScalarBar() sb.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() sb.GetPosition2Coordinate().SetCoordinateSystemToNormalizedViewport() s = np.array(pos[1]) - np.array(pos[0]) sb.GetPositionCoordinate().SetValue(pos[0][0], pos[0][1]) sb.GetPosition2Coordinate().SetValue(s[0], s[1]) # size !!?? else: if horizontal: size = (size[1], size[0]) # swap size sb.SetPosition(pos[0]-0.7, pos[1]) if not nlabels: sb.SetNumberOfLabels(3) sb.SetOrientationToHorizontal() sb.SetTextPositionToSucceedScalarBar() else: sb.SetPosition(pos[0], pos[1]) if not nlabels: sb.SetNumberOfLabels(7) sb.SetTextPositionToPrecedeScalarBar() sb.SetHeight(1) sb.SetWidth(1) if size[0] is not None: sb.SetMaximumWidthInPixels(size[0]) if size[1] is not None: sb.SetMaximumHeightInPixels(size[1]) sctxt = sb.GetLabelTextProperty() sctxt.SetFontFamily(vtki.VTK_FONT_FILE) sctxt.SetFontFile(utils.get_font_path(vedo.settings.default_font)) sctxt.SetColor(c) sctxt.SetShadow(0) sctxt.SetFontSize(font_size) sb.SetAnnotationTextProperty(sctxt) sb.PickableOff() return sb ##################################################################### def ScalarBar3D( obj, title="", pos=None, size=(0, 0), title_font="", title_xoffset=-1.2, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, nlabels=8, label_font="", label_size=1, label_offset=0.375, label_rotation=0, label_format="", italic=0, c="k", draw_box=True, above_text=None, below_text=None, nan_text="NaN", categories=None, ) -> Union[Assembly, None]: """ Create a 3D scalar bar for the specified object. Input `obj` input can be: - a look-up-table, - a Mesh already containing a set of scalars associated to vertices or cells, - if None the last object in the list of actors will be used. Arguments: size : (list) (thickness, length) of scalarbar title : (str) scalar bar title title_xoffset : (float) horizontal space btw title and color scalarbar title_yoffset : (float) vertical space offset title_size : (float) size of title wrt numeric labels title_rotation : (float) title rotation in degrees nlabels : (int) number of numeric labels label_font : (str) font type for labels label_size : (float) label scale factor label_offset : (float) space btw numeric labels and scale label_rotation : (float) label rotation in degrees draw_box : (bool) draw a box around the colorbar categories : (list) make a categorical scalarbar, the input list will have the format [value, color, alpha, textlabel] Examples: - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) - [plot_fxy2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy2.py) """ if isinstance(obj, (Points, TetMesh, vedo.UnstructuredGrid)): lut = obj.mapper.GetLookupTable() if not lut or lut.GetTable().GetNumberOfTuples() == 0: # create the most similar to the default obj.cmap("jet_r") lut = obj.mapper.GetLookupTable() vmin, vmax = lut.GetRange() elif isinstance(obj, Volume): lut = utils.ctf2lut(obj) vmin, vmax = lut.GetRange() elif isinstance(obj, vtki.vtkLookupTable): lut = obj vmin, vmax = lut.GetRange() else: vedo.logger.error("in ScalarBar3D(): input must be a vedo object with bounds.") return None bns = obj.bounds() sx, sy = size if sy == 0 or sy is None: sy = bns[3] - bns[2] if sx == 0 or sx is None: sx = sy / 18 if categories is not None: ################################ ncats = len(categories) scale = shapes.Grid([-float(sx) * label_offset, 0, 0], c=c, alpha=1, s=(sx, sy), res=(1, ncats)) cols, alphas = [], [] ticks_pos, ticks_txt = [0.0], [""] for i, cat in enumerate(categories): cl = get_color(cat[1]) cols.append(cl) if len(cat) > 2: alphas.append(cat[2]) else: alphas.append(1) if len(cat) > 3: ticks_txt.append(cat[3]) else: ticks_txt.append("") ticks_pos.append((i + 0.5) / ncats) ticks_pos.append(1.0) ticks_txt.append("") rgba = np.c_[np.array(cols) * 255, np.array(alphas) * 255] scale.cellcolors = rgba else: ######################################################## # build the color scale part scale = shapes.Grid( [-float(sx) * label_offset, 0, 0], c=c, s=(sx, sy), res=(1, lut.GetTable().GetNumberOfTuples()), ) cscals = np.linspace(vmin, vmax, lut.GetTable().GetNumberOfTuples(), endpoint=True) if lut.GetScale(): # logarithmic scale lut10 = vtki.vtkLookupTable() lut10.DeepCopy(lut) lut10.SetScaleToLinear() lut10.Build() scale.cmap(lut10, cscals, on="cells") tk = utils.make_ticks(vmin, vmax, nlabels, logscale=True, useformat=label_format) else: # for i in range(lut.GetTable().GetNumberOfTuples()): # print("LUT i=", i, lut.GetTableValue(i)) scale.cmap(lut, cscals, on="cells") tk = utils.make_ticks(vmin, vmax, nlabels, logscale=False, useformat=label_format) ticks_pos, ticks_txt = tk scale.lw(0).wireframe(False).lighting("off") scales = [scale] xbns = scale.xbounds() lsize = sy / 60 * label_size tacts = [] for i, p in enumerate(ticks_pos): tx = ticks_txt[i] if i and tx: # build numeric text y = (p - 0.5) * sy if label_rotation: a = shapes.Text3D( tx, s=lsize, justify="center-top", c=c, italic=italic, font=label_font, ) a.rotate_z(label_rotation) a.pos(sx * label_offset, y, 0) else: a = shapes.Text3D( tx, pos=[sx * label_offset, y, 0], s=lsize, justify="center-left", c=c, italic=italic, font=label_font, ) tacts.append(a) # build ticks tic = shapes.Line([xbns[1], y, 0], [xbns[1] + sx * label_offset / 4, y, 0], lw=2, c=c) tacts.append(tic) # build title if title: t = shapes.Text3D( title, pos=(0, 0, 0), s=sy / 50 * title_size, c=c, justify="centered-bottom", italic=italic, font=title_font, ) t.rotate_z(90 + title_rotation) t.pos(sx * title_xoffset, title_yoffset, 0) tacts.append(t) if pos is None: tsize = 0 if title: bbt = t.bounds() tsize = bbt[1] - bbt[0] pos = (bns[1] + tsize + sx * 1.5, (bns[2] + bns[3]) / 2, bns[4]) # build below scale if lut.GetUseBelowRangeColor(): r, g, b, alfa = lut.GetBelowRangeColor() sx = float(sx) sy = float(sy) brect = shapes.Rectangle( [-sx * label_offset - sx / 2, -sy / 2 - sx - sx * 0.1, 0], [-sx * label_offset + sx / 2, -sy / 2 - sx * 0.1, 0], c=(r, g, b), alpha=alfa, ) brect.lw(1).lc(c).lighting("off") scales += [brect] if below_text is None: below_text = " <" + str(vmin) if below_text: if label_rotation: btx = shapes.Text3D( below_text, pos=(0, 0, 0), s=lsize, c=c, justify="center-top", italic=italic, font=label_font, ) btx.rotate_z(label_rotation) else: btx = shapes.Text3D( below_text, pos=(0, 0, 0), s=lsize, c=c, justify="center-left", italic=italic, font=label_font, ) btx.pos(sx * label_offset, -sy / 2 - sx * 0.66, 0) tacts.append(btx) # build above scale if lut.GetUseAboveRangeColor(): r, g, b, alfa = lut.GetAboveRangeColor() arect = shapes.Rectangle( [-sx * label_offset - sx / 2, sy / 2 + sx * 0.1, 0], [-sx * label_offset + sx / 2, sy / 2 + sx + sx * 0.1, 0], c=(r, g, b), alpha=alfa, ) arect.lw(1).lc(c).lighting("off") scales += [arect] if above_text is None: above_text = " >" + str(vmax) if above_text: if label_rotation: atx = shapes.Text3D( above_text, pos=(0, 0, 0), s=lsize, c=c, justify="center-top", italic=italic, font=label_font, ) atx.rotate_z(label_rotation) else: atx = shapes.Text3D( above_text, pos=(0, 0, 0), s=lsize, c=c, justify="center-left", italic=italic, font=label_font, ) atx.pos(sx * label_offset, sy / 2 + sx * 0.66, 0) tacts.append(atx) # build NaN scale if lut.GetNanColor() != (0.5, 0.0, 0.0, 1.0): nanshift = sx * 0.1 if brect: nanshift += sx r, g, b, alfa = lut.GetNanColor() nanrect = shapes.Rectangle( [-sx * label_offset - sx / 2, -sy / 2 - sx - sx * 0.1 - nanshift, 0], [-sx * label_offset + sx / 2, -sy / 2 - sx * 0.1 - nanshift, 0], c=(r, g, b), alpha=alfa, ) nanrect.lw(1).lc(c).lighting("off") scales += [nanrect] if label_rotation: nantx = shapes.Text3D( nan_text, pos=(0, 0, 0), s=lsize, c=c, justify="center-left", italic=italic, font=label_font, ) nantx.rotate_z(label_rotation) else: nantx = shapes.Text3D( nan_text, pos=(0, 0, 0), s=lsize, c=c, justify="center-left", italic=italic, font=label_font, ) nantx.pos(sx * label_offset, -sy / 2 - sx * 0.66 - nanshift, 0) tacts.append(nantx) if draw_box: tacts.append(scale.box().lw(1).c(c)) for m in tacts + scales: m.shift(pos) m.actor.PickableOff() m.properties.LightingOff() asse = Assembly(scales + tacts) # asse.transform = LinearTransform().shift(pos) bb = asse.GetBounds() # print("ScalarBar3D pos",pos, bb) # asse.SetOrigin(pos) asse.SetOrigin(bb[0], bb[2], bb[4]) # asse.SetOrigin(bb[0],0,0) #in pyplot line 1312 asse.PickableOff() asse.UseBoundsOff() asse.name = "ScalarBar3D" return asse ##################################################################### class Slider2D(SliderWidget): """ Add a slider which can call an external custom function. """ def __init__( self, sliderfunc, xmin, xmax, value=None, pos=4, title="", font="Calco", title_size=1, c="k", alpha=1, show_value=True, delayed=False, **options, ): """ Add a slider which can call an external custom function. Set any value as float to increase the number of significant digits above the slider. Use `play()` to start an animation between the current slider value and the last value. Arguments: sliderfunc : (function) external function to be called by the widget xmin : (float) lower value of the slider xmax : (float) upper value value : (float) current value pos : (list, str) position corner number: horizontal [1-5] or vertical [11-15] it can also be specified by corners coordinates [(x1,y1), (x2,y2)] and also by a string descriptor (eg. "bottom-left") title : (str) title text font : (str) title font face. Check [available fonts here](https://vedo.embl.es/fonts). title_size : (float) title text scale [1.0] show_value : (bool) if True current value is shown delayed : (bool) if True the callback is delayed until when the mouse button is released alpha : (float) opacity of the scalar bar texts slider_length : (float) slider length slider_width : (float) slider width end_cap_length : (float) length of the end cap end_cap_width : (float) width of the end cap tube_width : (float) width of the tube title_height : (float) height of the title tformat : (str) format of the title Examples: - [sliders1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders1.py) - [sliders2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders2.py) ![](https://user-images.githubusercontent.com/32848391/50738848-be033480-11d8-11e9-9b1a-c13105423a79.jpg) """ slider_length = options.pop("slider_length", 0.015) slider_width = options.pop("slider_width", 0.025) end_cap_length= options.pop("end_cap_length", 0.0015) end_cap_width = options.pop("end_cap_width", 0.0125) tube_width = options.pop("tube_width", 0.0075) title_height = options.pop("title_height", 0.025) tformat = options.pop("tformat", None) if options: vedo.logger.warning(f"in Slider2D unknown option(s): {options}") c = get_color(c) if value is None or value < xmin: value = xmin slider_rep = vtki.new("SliderRepresentation2D") slider_rep.SetMinimumValue(xmin) slider_rep.SetMaximumValue(xmax) slider_rep.SetValue(value) slider_rep.SetSliderLength(slider_length) slider_rep.SetSliderWidth(slider_width) slider_rep.SetEndCapLength(end_cap_length) slider_rep.SetEndCapWidth(end_cap_width) slider_rep.SetTubeWidth(tube_width) slider_rep.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay() slider_rep.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay() if isinstance(pos, str): if "top" in pos: if "left" in pos: if "vert" in pos: pos = 11 else: pos = 1 elif "right" in pos: if "vert" in pos: pos = 12 else: pos = 2 elif "bott" in pos: if "left" in pos: if "vert" in pos: pos = 13 else: pos = 3 elif "right" in pos: if "vert" in pos: if "span" in pos: pos = 15 else: pos = 14 else: pos = 4 elif "span" in pos: pos = 5 if utils.is_sequence(pos): slider_rep.GetPoint1Coordinate().SetValue(pos[0][0], pos[0][1]) slider_rep.GetPoint2Coordinate().SetValue(pos[1][0], pos[1][1]) elif pos == 1: # top-left horizontal slider_rep.GetPoint1Coordinate().SetValue(0.04, 0.93) slider_rep.GetPoint2Coordinate().SetValue(0.45, 0.93) elif pos == 2: slider_rep.GetPoint1Coordinate().SetValue(0.55, 0.93) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.93) elif pos == 3: slider_rep.GetPoint1Coordinate().SetValue(0.05, 0.06) slider_rep.GetPoint2Coordinate().SetValue(0.45, 0.06) elif pos == 4: # bottom-right slider_rep.GetPoint1Coordinate().SetValue(0.55, 0.06) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.06) elif pos == 5: # bottom span horizontal slider_rep.GetPoint1Coordinate().SetValue(0.04, 0.06) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.06) elif pos == 11: # top-left vertical slider_rep.GetPoint1Coordinate().SetValue(0.065, 0.54) slider_rep.GetPoint2Coordinate().SetValue(0.065, 0.9) elif pos == 12: slider_rep.GetPoint1Coordinate().SetValue(0.94, 0.54) slider_rep.GetPoint2Coordinate().SetValue(0.94, 0.9) elif pos == 13: slider_rep.GetPoint1Coordinate().SetValue(0.065, 0.1) slider_rep.GetPoint2Coordinate().SetValue(0.065, 0.54) elif pos == 14: # bottom-right vertical slider_rep.GetPoint1Coordinate().SetValue(0.94, 0.1) slider_rep.GetPoint2Coordinate().SetValue(0.94, 0.54) elif pos == 15: # right margin vertical slider_rep.GetPoint1Coordinate().SetValue(0.95, 0.1) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.9) else: # bottom-right slider_rep.GetPoint1Coordinate().SetValue(0.55, 0.06) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.06) if show_value: if tformat is None: if isinstance(xmin, int) and isinstance(xmax, int) and isinstance(value, int): tformat = "%0.0f" else: tformat = "%0.2f" slider_rep.SetLabelFormat(tformat) # default is '%0.3g' slider_rep.GetLabelProperty().SetShadow(0) slider_rep.GetLabelProperty().SetBold(0) slider_rep.GetLabelProperty().SetOpacity(alpha) slider_rep.GetLabelProperty().SetColor(c) if isinstance(pos, int) and pos > 10: slider_rep.GetLabelProperty().SetOrientation(90) else: slider_rep.ShowSliderLabelOff() slider_rep.GetTubeProperty().SetColor(c) slider_rep.GetTubeProperty().SetOpacity(0.75) slider_rep.GetSliderProperty().SetColor(c) slider_rep.GetSelectedProperty().SetColor(np.sqrt(np.array(c))) slider_rep.GetCapProperty().SetColor(c) slider_rep.SetTitleHeight(title_height * title_size) slider_rep.GetTitleProperty().SetShadow(0) slider_rep.GetTitleProperty().SetColor(c) slider_rep.GetTitleProperty().SetOpacity(alpha) slider_rep.GetTitleProperty().SetBold(0) if font.lower() == "courier": slider_rep.GetTitleProperty().SetFontFamilyToCourier() elif font.lower() == "times": slider_rep.GetTitleProperty().SetFontFamilyToTimes() elif font.lower() == "arial": slider_rep.GetTitleProperty().SetFontFamilyToArial() else: if font == "": font = utils.get_font_path(settings.default_font) else: font = utils.get_font_path(font) slider_rep.GetTitleProperty().SetFontFamily(vtki.VTK_FONT_FILE) slider_rep.GetLabelProperty().SetFontFamily(vtki.VTK_FONT_FILE) slider_rep.GetTitleProperty().SetFontFile(font) slider_rep.GetLabelProperty().SetFontFile(font) if title: slider_rep.SetTitleText(title) if not utils.is_sequence(pos): if isinstance(pos, int) and pos > 10: slider_rep.GetTitleProperty().SetOrientation(90) else: if abs(pos[0][0] - pos[1][0]) < 0.1: slider_rep.GetTitleProperty().SetOrientation(90) super().__init__() self.SetAnimationModeToJump() self.SetRepresentation(slider_rep) if delayed: self.AddObserver("EndInteractionEvent", sliderfunc) else: self.AddObserver("InteractionEvent", sliderfunc) ##################################################################### class Slider3D(SliderWidget): """ Add a 3D slider which can call an external custom function. """ def __init__( self, sliderfunc, pos1, pos2, xmin, xmax, value=None, s=0.03, t=1, title="", rotation=0, c=None, show_value=True, ): """ Add a 3D slider which can call an external custom function. Arguments: sliderfunc : (function) external function to be called by the widget pos1 : (list) first position 3D coordinates pos2 : (list) second position 3D coordinates xmin : (float) lower value xmax : (float) upper value value : (float) initial value s : (float) label scaling factor t : (float) tube scaling factor title : (str) title text c : (color) slider color rotation : (float) title rotation around slider axis show_value : (bool) if True current value is shown on top of the slider Examples: - [sliders3d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders3d.py) """ c = get_color(c) if value is None or value < xmin: value = xmin slider_rep = vtki.new("SliderRepresentation3D") slider_rep.SetMinimumValue(xmin) slider_rep.SetMaximumValue(xmax) slider_rep.SetValue(value) slider_rep.GetPoint1Coordinate().SetCoordinateSystemToWorld() slider_rep.GetPoint2Coordinate().SetCoordinateSystemToWorld() slider_rep.GetPoint1Coordinate().SetValue(pos2) slider_rep.GetPoint2Coordinate().SetValue(pos1) # slider_rep.SetPoint1InWorldCoordinates(pos2[0], pos2[1], pos2[2]) # slider_rep.SetPoint2InWorldCoordinates(pos1[0], pos1[1], pos1[2]) slider_rep.SetSliderWidth(0.03 * t) slider_rep.SetTubeWidth(0.01 * t) slider_rep.SetSliderLength(0.04 * t) slider_rep.SetSliderShapeToCylinder() slider_rep.GetSelectedProperty().SetColor(np.sqrt(np.array(c))) slider_rep.GetSliderProperty().SetColor(np.array(c) / 1.5) slider_rep.GetCapProperty().SetOpacity(0) slider_rep.SetRotation(rotation) if not show_value: slider_rep.ShowSliderLabelOff() slider_rep.SetTitleText(title) slider_rep.SetTitleHeight(s * t) slider_rep.SetLabelHeight(s * t * 0.85) slider_rep.GetTubeProperty().SetColor(c) super().__init__() self.SetRepresentation(slider_rep) self.SetAnimationModeToJump() self.AddObserver("InteractionEvent", sliderfunc) class BaseCutter: """ Base class for Cutter widgets. """ def __init__(self): self._implicit_func = None self.widget = None self.clipper = None self.cutter = None self.mesh = None self.remnant = None self._alpha = 0.5 self._keypress_id = None def invert(self) -> Self: """Invert selection.""" self.clipper.SetInsideOut(not self.clipper.GetInsideOut()) return self def bounds(self, value=None) -> Union[Self, np.ndarray]: """Set or get the bounding box.""" if value is None: return self.cutter.GetBounds() else: self._implicit_func.SetBounds(value) return self def on(self) -> Self: """Switch the widget on or off.""" self.widget.On() return self def off(self) -> Self: """Switch the widget on or off.""" self.widget.Off() return self def add_to(self, plt) -> Self: """Assign the widget to the provided `Plotter` instance.""" self.widget.SetInteractor(plt.interactor) self.widget.SetCurrentRenderer(plt.renderer) if self.widget not in plt.widgets: plt.widgets.append(self.widget) cpoly = self.clipper.GetOutput() self.mesh._update(cpoly) out = self.clipper.GetClippedOutputPort() if self._alpha: self.remnant.mapper.SetInputConnection(out) self.remnant.alpha(self._alpha).color((0.5, 0.5, 0.5)) self.remnant.lighting("off").wireframe() plt.add(self.mesh, self.remnant) else: plt.add(self.mesh) self._keypress_id = plt.interactor.AddObserver( "KeyPressEvent", self._keypress ) if plt.interactor and plt.interactor.GetInitialized(): self.widget.On() self._select_polygons(self.widget, "InteractionEvent") plt.interactor.Render() return self def remove_from(self, plt) -> Self: """Remove the widget to the provided `Plotter` instance.""" self.widget.Off() self.widget.RemoveAllObservers() ### NOT SURE plt.remove(self.remnant) if self.widget in plt.widgets: plt.widgets.remove(self.widget) if self._keypress_id: plt.interactor.RemoveObserver(self._keypress_id) return self def add_observer(self, event, func, priority=1) -> int: """Add an observer to the widget.""" event = utils.get_vtk_name_event(event) cid = self.widget.AddObserver(event, func, priority) return cid class PlaneCutter(vtki.vtkPlaneWidget, BaseCutter): """ Create a box widget to cut away parts of a Mesh. """ def __init__( self, mesh, invert=False, can_translate=True, can_scale=True, origin=(), normal=(), padding=0.05, delayed=False, c=(0.25, 0.25, 0.25), alpha=0.05, ): """ Create a box widget to cut away parts of a `Mesh`. Arguments: mesh : (Mesh) the input mesh invert : (bool) invert the clipping plane can_translate : (bool) enable translation of the widget can_scale : (bool) enable scaling of the widget origin : (list) origin of the plane normal : (list) normal to the plane padding : (float) padding around the input mesh delayed : (bool) if True the callback is delayed until when the mouse button is released (useful for large meshes) c : (color) color of the box cutter widget alpha : (float) transparency of the cut-off part of the input mesh Examples: - [slice_plane3.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane3.py) """ super().__init__() self.mesh = mesh self.remnant = Mesh() self.remnant.name = mesh.name + "Remnant" self.remnant.pickable(False) self._alpha = alpha self._keypress_id = None self._implicit_func = vtki.new("Plane") poly = mesh.dataset self.clipper = vtki.new("ClipPolyData") self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) self.clipper.SetInsideOut(invert) self.clipper.GenerateClippedOutputOn() self.clipper.Update() self.widget = vtki.new("ImplicitPlaneWidget") # self.widget.KeyPressActivationOff() # self.widget.SetKeyPressActivationValue('i') self.widget.SetOriginTranslation(can_translate) self.widget.SetOutlineTranslation(can_translate) self.widget.SetScaleEnabled(can_scale) self.widget.GetOutlineProperty().SetColor(get_color(c)) self.widget.GetOutlineProperty().SetOpacity(0.25) self.widget.GetOutlineProperty().SetLineWidth(1) self.widget.GetOutlineProperty().LightingOff() self.widget.GetSelectedOutlineProperty().SetColor(get_color("red3")) self.widget.SetTubing(0) self.widget.SetDrawPlane(bool(alpha)) self.widget.GetPlaneProperty().LightingOff() self.widget.GetPlaneProperty().SetOpacity(alpha) self.widget.GetSelectedPlaneProperty().SetColor(get_color("red5")) self.widget.GetSelectedPlaneProperty().LightingOff() self.widget.SetPlaceFactor(1.0 + padding) self.widget.SetInputData(poly) self.widget.PlaceWidget() if delayed: self.widget.AddObserver("EndInteractionEvent", self._select_polygons) else: self.widget.AddObserver("InteractionEvent", self._select_polygons) if len(origin) == 3: self.widget.SetOrigin(origin) else: self.widget.SetOrigin(mesh.center_of_mass()) if len(normal) == 3: self.widget.SetNormal(normal) else: self.widget.SetNormal((1, 0, 0)) @property def origin(self): """Get the origin of the plane.""" return np.array(self.widget.GetOrigin()) @origin.setter def origin(self, value): """Set the origin of the plane.""" self.widget.SetOrigin(value) @property def normal(self): """Get the normal of the plane.""" return np.array(self.widget.GetNormal()) @normal.setter def normal(self, value): """Set the normal of the plane.""" self.widget.SetNormal(value) def _select_polygons(self, vobj, event) -> None: vobj.GetPlane(self._implicit_func) def _keypress(self, vobj, event): if vobj.GetKeySym() == "r": # reset planes self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "u": # invert cut self.invert() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "x": # set normal along x self.widget.SetNormal((1, 0, 0)) self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "y": # set normal along y self.widget.SetNormal((0, 1, 0)) self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "z": # set normal along z self.widget.SetNormal((0, 0, 1)) self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): self.mesh.write("vedo_clipped.vtk") printc(":save: saved mesh to vedo_clipped.vtk") class BoxCutter(vtki.vtkBoxWidget, BaseCutter): """ Create a box widget to cut away parts of a Mesh. """ def __init__( self, mesh, invert=False, can_rotate=True, can_translate=True, can_scale=True, initial_bounds=(), padding=0.025, delayed=False, c=(0.25, 0.25, 0.25), alpha=0.05, ): """ Create a box widget to cut away parts of a Mesh. Arguments: mesh : (Mesh) the input mesh invert : (bool) invert the clipping plane can_rotate : (bool) enable rotation of the widget can_translate : (bool) enable translation of the widget can_scale : (bool) enable scaling of the widget initial_bounds : (list) initial bounds of the box widget padding : (float) padding space around the input mesh delayed : (bool) if True the callback is delayed until when the mouse button is released (useful for large meshes) c : (color) color of the box cutter widget alpha : (float) transparency of the cut-off part of the input mesh """ super().__init__() self.mesh = mesh self.remnant = Mesh() self.remnant.name = mesh.name + "Remnant" self.remnant.pickable(False) self._alpha = alpha self._keypress_id = None self._init_bounds = initial_bounds if len(self._init_bounds) == 0: self._init_bounds = mesh.bounds() else: self._init_bounds = initial_bounds self._implicit_func = vtki.new("Planes") self._implicit_func.SetBounds(self._init_bounds) poly = mesh.dataset self.clipper = vtki.new("ClipPolyData") self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) self.clipper.SetInsideOut(not invert) self.clipper.GenerateClippedOutputOn() self.clipper.Update() self.widget = vtki.vtkBoxWidget() self.widget.SetRotationEnabled(can_rotate) self.widget.SetTranslationEnabled(can_translate) self.widget.SetScalingEnabled(can_scale) self.widget.OutlineCursorWiresOn() self.widget.GetSelectedOutlineProperty().SetColor(get_color("red3")) self.widget.GetSelectedHandleProperty().SetColor(get_color("red5")) self.widget.GetOutlineProperty().SetColor(c) self.widget.GetOutlineProperty().SetOpacity(1) self.widget.GetOutlineProperty().SetLineWidth(1) self.widget.GetOutlineProperty().LightingOff() self.widget.GetSelectedFaceProperty().LightingOff() self.widget.GetSelectedFaceProperty().SetOpacity(0.1) self.widget.SetPlaceFactor(1.0 + padding) self.widget.SetInputData(poly) self.widget.PlaceWidget() if delayed: self.widget.AddObserver("EndInteractionEvent", self._select_polygons) else: self.widget.AddObserver("InteractionEvent", self._select_polygons) def _select_polygons(self, vobj, event): vobj.GetPlanes(self._implicit_func) def _keypress(self, vobj, event): if vobj.GetKeySym() == "r": # reset planes self._implicit_func.SetBounds(self._init_bounds) self.widget.GetPlanes(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "u": self.invert() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): self.mesh.write("vedo_clipped.vtk") printc(":save: saved mesh to vedo_clipped.vtk") class SphereCutter(vtki.vtkSphereWidget, BaseCutter): """ Create a box widget to cut away parts of a Mesh. """ def __init__( self, mesh, invert=False, can_translate=True, can_scale=True, origin=(), radius=0, res=60, delayed=False, c="white", alpha=0.05, ): """ Create a box widget to cut away parts of a Mesh. Arguments: mesh : Mesh the input mesh invert : bool invert the clipping can_translate : bool enable translation of the widget can_scale : bool enable scaling of the widget origin : list initial position of the sphere widget radius : float initial radius of the sphere widget res : int resolution of the sphere widget delayed : bool if True the cutting callback is delayed until when the mouse button is released (useful for large meshes) c : color color of the box cutter widget alpha : float transparency of the cut-off part of the input mesh """ super().__init__() self.mesh = mesh self.remnant = Mesh() self.remnant.name = mesh.name + "Remnant" self.remnant.pickable(False) self._alpha = alpha self._keypress_id = None self._implicit_func = vtki.new("Sphere") if len(origin) == 3: self._implicit_func.SetCenter(origin) else: origin = mesh.center_of_mass() self._implicit_func.SetCenter(origin) if radius > 0: self._implicit_func.SetRadius(radius) else: radius = mesh.average_size() * 2 self._implicit_func.SetRadius(radius) poly = mesh.dataset self.clipper = vtki.new("ClipPolyData") self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) self.clipper.SetInsideOut(not invert) self.clipper.GenerateClippedOutputOn() self.clipper.Update() self.widget = vtki.vtkSphereWidget() self.widget.SetThetaResolution(res * 2) self.widget.SetPhiResolution(res) self.widget.SetRadius(radius) self.widget.SetCenter(origin) self.widget.SetRepresentation(2) self.widget.HandleVisibilityOff() self.widget.SetTranslation(can_translate) self.widget.SetScale(can_scale) self.widget.HandleVisibilityOff() self.widget.GetSphereProperty().SetColor(get_color(c)) self.widget.GetSphereProperty().SetOpacity(0.2) self.widget.GetSelectedSphereProperty().SetColor(get_color("red5")) self.widget.GetSelectedSphereProperty().SetOpacity(0.2) self.widget.SetPlaceFactor(1.0) self.widget.SetInputData(poly) self.widget.PlaceWidget() if delayed: self.widget.AddObserver("EndInteractionEvent", self._select_polygons) else: self.widget.AddObserver("InteractionEvent", self._select_polygons) def _select_polygons(self, vobj, event): vobj.GetSphere(self._implicit_func) def _keypress(self, vobj, event): if vobj.GetKeySym() == "r": # reset planes self._implicit_func.SetBounds(self._init_bounds) self.widget.GetPlanes(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "u": self.invert() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): self.mesh.write("vedo_clipped.vtk") printc(":save: saved mesh to vedo_clipped.vtk") @property def center(self): """Get the center of the sphere.""" return np.array(self.widget.GetCenter()) @center.setter def center(self, value): """Set the center of the sphere.""" self.widget.SetCenter(value) @property def radius(self): """Get the radius of the sphere.""" return self.widget.GetRadius() @radius.setter def radius(self, value): """Set the radius of the sphere.""" self.widget.SetRadius(value) ##################################################################### class RendererFrame(vtki.vtkActor2D): """ Add a line around the renderer subwindow. """ def __init__(self, c="k", alpha=None, lw=None, padding=None): """ Add a line around the renderer subwindow. Arguments: c : (color) color of the line. alpha : (float) opacity. lw : (int) line width in pixels. padding : (int) padding in pixel units. """ if lw is None: lw = settings.renderer_frame_width if lw == 0: return None if alpha is None: alpha = settings.renderer_frame_alpha if padding is None: padding = settings.renderer_frame_padding c = get_color(c) ppoints = vtki.vtkPoints() # Generate the polyline xy = 1 - padding psqr = [ [padding, padding], [padding, xy], [xy, xy], [xy, padding], [padding, padding], ] for i, pt in enumerate(psqr): ppoints.InsertPoint(i, pt[0], pt[1], 0) lines = vtki.vtkCellArray() lines.InsertNextCell(len(psqr)) for i in range(len(psqr)): lines.InsertCellPoint(i) pd = vtki.vtkPolyData() pd.SetPoints(ppoints) pd.SetLines(lines) mapper = vtki.new("PolyDataMapper2D") mapper.SetInputData(pd) cs = vtki.new("Coordinate") cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) super().__init__() self.GetPositionCoordinate().SetValue(0, 0) self.GetPosition2Coordinate().SetValue(1, 1) self.SetMapper(mapper) self.GetProperty().SetColor(c) self.GetProperty().SetOpacity(alpha) self.GetProperty().SetLineWidth(lw) ##################################################################### class ProgressBarWidget(vtki.vtkActor2D): """ Add a progress bar in the rendering window. """ def __init__(self, n=None, c="blue5", alpha=0.8, lw=10, autohide=True): """ Add a progress bar window. Arguments: n : (int) number of iterations. If None, you need to call `update(fraction)` manually. c : (color) color of the line. alpha : (float) opacity of the line. lw : (int) line width in pixels. autohide : (bool) if True, hide the progress bar when completed. """ self.n = 0 self.iterations = n self.autohide = autohide ppoints = vtki.vtkPoints() # Generate the line psqr = [[0, 0, 0], [1, 0, 0]] for i, pt in enumerate(psqr): ppoints.InsertPoint(i, *pt) lines = vtki.vtkCellArray() lines.InsertNextCell(len(psqr)) for i in range(len(psqr)): lines.InsertCellPoint(i) pd = vtki.vtkPolyData() pd.SetPoints(ppoints) pd.SetLines(lines) self.dataset = pd mapper = vtki.new("PolyDataMapper2D") mapper.SetInputData(pd) cs = vtki.vtkCoordinate() cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) super().__init__() self.SetMapper(mapper) self.GetProperty().SetOpacity(alpha) self.GetProperty().SetColor(get_color(c)) self.GetProperty().SetLineWidth(lw * 2) def lw(self, value: int) -> Self: """Set width.""" self.GetProperty().SetLineWidth(value * 2) return self def c(self, color) -> Self: """Set color.""" c = get_color(color) self.GetProperty().SetColor(c) return self def alpha(self, value) -> Self: """Set opacity.""" self.GetProperty().SetOpacity(value) return self def update(self, fraction=None) -> Self: """Update progress bar to fraction of the window width.""" if fraction is None: if self.iterations is None: vedo.printc("Error in ProgressBarWindow: must specify iterations", c='r') return self self.n += 1 fraction = self.n / self.iterations if fraction >= 1 and self.autohide: fraction = 0 psqr = [[0, 0, 0], [fraction, 0, 0]] vpts = utils.numpy2vtk(psqr, dtype=np.float32) self.dataset.GetPoints().SetData(vpts) return self def reset(self): """Reset progress bar.""" self.n = 0 self.update(0) return self ##################################################################### class Icon(vtki.vtkOrientationMarkerWidget): """ Add an inset icon mesh into the renderer. """ def __init__(self, mesh, pos=3, size=0.08): """ Arguments: pos : (list, int) icon position in the range [1-4] indicating one of the 4 corners, or it can be a tuple (x,y) as a fraction of the renderer size. size : (float) size of the icon space as fraction of the window size. Examples: - [icon.py](https://github.com/marcomusy/vedo/tree/master/examples/other/icon.py) """ super().__init__() try: self.SetOrientationMarker(mesh.actor) except AttributeError: self.SetOrientationMarker(mesh) if utils.is_sequence(pos): self.SetViewport(pos[0] - size, pos[1] - size, pos[0] + size, pos[1] + size) else: if pos < 2: self.SetViewport(0, 1 - 2 * size, size * 2, 1) elif pos == 2: self.SetViewport(1 - 2 * size, 1 - 2 * size, 1, 1) elif pos == 3: self.SetViewport(0, 0, size * 2, size * 2) elif pos == 4: self.SetViewport(1 - 2 * size, 0, 1, size * 2) ##################################################################### def compute_visible_bounds(objs=None) -> list: """Calculate max objects bounds and sizes.""" bns = [] if objs is None and vedo.plotter_instance: objs = vedo.plotter_instance.actors elif not utils.is_sequence(objs): objs = [objs] actors = [ob.actor for ob in objs if hasattr(ob, "actor") and ob.actor] try: # this block fails for VolumeSlice as vtkImageSlice.GetBounds() returns a pointer.. # in any case we dont need axes for that one. for a in actors: if a and a.GetUseBounds(): b = a.GetBounds() if b: bns.append(b) if bns: max_bns = np.max(bns, axis=0) min_bns = np.min(bns, axis=0) vbb = [min_bns[0], max_bns[1], min_bns[2], max_bns[3], min_bns[4], max_bns[5]] elif vedo.plotter_instance: vbb = list(vedo.plotter_instance.renderer.ComputeVisiblePropBounds()) max_bns = vbb min_bns = vbb sizes = np.array( [max_bns[1] - min_bns[0], max_bns[3] - min_bns[2], max_bns[5] - min_bns[4]] ) return [vbb, sizes, min_bns, max_bns] except: return [[0, 0, 0, 0, 0, 0], [0, 0, 0], 0, 0] ##################################################################### def Ruler3D( p1, p2, units_scale=1, label="", s=None, font=None, italic=0, prefix="", units="", # eg.'μm' c=(0.2, 0.1, 0.1), alpha=1, lw=1, precision=3, label_rotation=0, axis_rotation=0, tick_angle=90, ) -> Mesh: """ Build a 3D ruler to indicate the distance of two points p1 and p2. Arguments: label : (str) alternative fixed label to be shown units_scale : (float) factor to scale units (e.g. μm to mm) s : (float) size of the label font : (str) font face. Check [available fonts here](https://vedo.embl.es/fonts). italic : (float) italicness of the font in the range [0,1] units : (str) string to be appended to the numeric value lw : (int) line width in pixel units precision : (int) nr of significant digits to be shown label_rotation : (float) initial rotation of the label around the z-axis axis_rotation : (float) initial rotation of the line around the main axis tick_angle : (float) initial rotation of the line around the main axis Examples: - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) ![](https://vedo.embl.es/images/pyplot/goniometer.png) """ if units_scale != 1.0 and units == "": raise ValueError( "When setting 'units_scale' to a value other than 1, " + "a 'units' arguments must be specified." ) try: p1 = p1.pos() except AttributeError: pass try: p2 = p2.pos() except AttributeError: pass if len(p1) == 2: p1 = [p1[0], p1[1], 0.0] if len(p2) == 2: p2 = [p2[0], p2[1], 0.0] p1, p2 = np.asarray(p1), np.asarray(p2) q1, q2 = [0, 0, 0], [utils.mag(p2 - p1), 0, 0] q1, q2 = np.array(q1), np.array(q2) v = q2 - q1 d = utils.mag(v) * units_scale pos = np.array(p1) p1 = p1 - pos p2 = p2 - pos if s is None: s = d * 0.02 * (1 / units_scale) if not label: label = str(d) if precision: label = utils.precision(d, precision) if prefix: label = prefix + "~" + label if units: label += "~" + units lb = shapes.Text3D(label, s=s, font=font, italic=italic, justify="center") if label_rotation: lb.rotate_z(label_rotation) lb.pos((q1 + q2) / 2) x0, x1 = lb.xbounds() gap = [(x1 - x0) / 2, 0, 0] pc1 = (v / 2 - gap) * 0.9 + q1 pc2 = q2 - (v / 2 - gap) * 0.9 lc1 = shapes.Line(q1 - v / 50, pc1).lw(lw) lc2 = shapes.Line(q2 + v / 50, pc2).lw(lw) zs = np.array([0, d / 50 * (1 / units_scale), 0]) ml1 = shapes.Line(-zs, zs).lw(lw) ml2 = shapes.Line(-zs, zs).lw(lw) ml1.rotate_z(tick_angle - 90).pos(q1) ml2.rotate_z(tick_angle - 90).pos(q2) c1 = shapes.Circle(q1, r=d / 180 * (1 / units_scale), res=24) c2 = shapes.Circle(q2, r=d / 180 * (1 / units_scale), res=24) macts = merge(lb, lc1, lc2, c1, c2, ml1, ml2) macts.c(c).alpha(alpha) macts.properties.SetLineWidth(lw) macts.properties.LightingOff() macts.actor.UseBoundsOff() macts.rotate_x(axis_rotation) macts.reorient(q2 - q1, p2 - p1) macts.pos(pos) macts.bc("tomato").pickable(False) return macts def RulerAxes( inputobj, xtitle="", ytitle="", ztitle="", xlabel="", ylabel="", zlabel="", xpadding=0.05, ypadding=0.04, zpadding=0, font="Normografo", s=None, italic=0, units="", c=(0.2, 0, 0), alpha=1, lw=1, precision=3, label_rotation=0, xaxis_rotation=0, yaxis_rotation=0, zaxis_rotation=0, xycross=True, ) -> Union[Mesh, None]: """ A 3D ruler axes to indicate the sizes of the input scene or object. Arguments: xtitle : (str) name of the axis or title xlabel : (str) alternative fixed label to be shown instead of the distance s : (float) size of the label font : (str) font face. Check [available fonts here](https://vedo.embl.es/fonts). italic : (float) italicness of the font in the range [0,1] units : (str) string to be appended to the numeric value lw : (int) line width in pixel units precision : (int) nr of significant digits to be shown label_rotation : (float) initial rotation of the label around the z-axis [x,y,z]axis_rotation : (float) initial rotation of the line around the main axis in degrees xycross : (bool) show two back crossing lines in the xy plane Examples: - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) """ if utils.is_sequence(inputobj): x0, x1, y0, y1, z0, z1 = inputobj else: x0, x1, y0, y1, z0, z1 = inputobj.bounds() dx, dy, dz = (y1 - y0) * xpadding, (x1 - x0) * ypadding, (y1 - y0) * zpadding d = np.sqrt((y1 - y0) ** 2 + (x1 - x0) ** 2 + (z1 - z0) ** 2) if not d: return None if s is None: s = d / 75 acts, rx, ry = [], None, None if xtitle is not None and (x1 - x0) / d > 0.1: rx = Ruler3D( [x0, y0 - dx, z0], [x1, y0 - dx, z0], s=s, font=font, precision=precision, label_rotation=label_rotation, axis_rotation=xaxis_rotation, lw=lw, italic=italic, prefix=xtitle, label=xlabel, units=units, ) acts.append(rx) if ytitle is not None and (y1 - y0) / d > 0.1: ry = Ruler3D( [x1 + dy, y0, z0], [x1 + dy, y1, z0], s=s, font=font, precision=precision, label_rotation=label_rotation, axis_rotation=yaxis_rotation, lw=lw, italic=italic, prefix=ytitle, label=ylabel, units=units, ) acts.append(ry) if ztitle is not None and (z1 - z0) / d > 0.1: rz = Ruler3D( [x0 - dy, y0 + dz, z0], [x0 - dy, y0 + dz, z1], s=s, font=font, precision=precision, label_rotation=label_rotation, axis_rotation=zaxis_rotation + 90, lw=lw, italic=italic, prefix=ztitle, label=zlabel, units=units, ) acts.append(rz) if xycross and rx and ry: lx = shapes.Line([x0, y0, z0], [x0, y1 + dx, z0]) ly = shapes.Line([x0 - dy, y1, z0], [x1, y1, z0]) d = min((x1 - x0), (y1 - y0)) / 200 cxy = shapes.Circle([x0, y1, z0], r=d, res=15) acts.extend([lx, ly, cxy]) macts = merge(acts) if not macts: return None macts.c(c).alpha(alpha).bc("t") macts.actor.UseBoundsOff() macts.actor.PickableOff() return macts ##################################################################### class Ruler2D(vtki.vtkAxisActor2D): """ Create a ruler with tick marks, labels and a title. """ def __init__( self, lw=2, ticks=True, labels=False, c="k", alpha=1, title="", font="Calco", font_size=24, bc=None, ): """ Create a ruler with tick marks, labels and a title. Ruler2D is a 2D actor; that is, it is drawn on the overlay plane and is not occluded by 3D geometry. To use this class, specify two points defining the start and end with update_points() as 3D points. This class decides decides how to create reasonable tick marks and labels. Labels are drawn on the "right" side of the axis. The "right" side is the side of the axis on the right. The way the labels and title line up with the axis and tick marks depends on whether the line is considered horizontal or vertical. Arguments: lw : (int) width of the line in pixel units ticks : (bool) control if drawing the tick marks labels : (bool) control if drawing the numeric labels c : (color) color of the object alpha : (float) opacity of the object title : (str) title of the ruler font : (str) font face name. Check [available fonts here](https://vedo.embl.es/fonts). font_size : (int) font size bc : (color) background color of the title Example: ```python from vedo import * plt = Plotter(axes=1, interactive=False) plt.show(Cube()) rul = Ruler2D() rul.set_points([0,0,0], [0.5,0.5,0.5]) plt.add(rul) plt.interactive().close() ``` ![](https://vedo.embl.es/images/feats/dist_tool.png) """ super().__init__() plt = vedo.plotter_instance if not plt: vedo.logger.error("Ruler2D need to initialize Plotter first.") raise RuntimeError() self.p0 = [0, 0, 0] self.p1 = [0, 0, 0] self.distance = 0 self.title = title prop = self.GetProperty() tprop = self.GetTitleTextProperty() self.SetTitle(title) self.SetNumberOfLabels(9) if not font: font = settings.default_font if font.lower() == "courier": tprop.SetFontFamilyToCourier() elif font.lower() == "times": tprop.SetFontFamilyToTimes() elif font.lower() == "arial": tprop.SetFontFamilyToArial() else: tprop.SetFontFamily(vtki.VTK_FONT_FILE) tprop.SetFontFile(utils.get_font_path(font)) tprop.SetFontSize(font_size) tprop.BoldOff() tprop.ItalicOff() tprop.ShadowOff() tprop.SetColor(get_color(c)) tprop.SetOpacity(alpha) if bc is not None: bc = get_color(bc) tprop.SetBackgroundColor(bc) tprop.SetBackgroundOpacity(alpha) lprop = vtki.vtkTextProperty() lprop.ShallowCopy(tprop) self.SetLabelTextProperty(lprop) self.SetLabelFormat("%0.3g") self.SetTickVisibility(ticks) self.SetLabelVisibility(labels) prop.SetLineWidth(lw) prop.SetColor(get_color(c)) self.renderer = plt.renderer self.cid = plt.interactor.AddObserver("RenderEvent", self._update_viz, 1.0) def color(self, c) -> Self: """Assign a new color.""" c = get_color(c) self.GetTitleTextProperty().SetColor(c) self.GetLabelTextProperty().SetColor(c) self.GetProperty().SetColor(c) return self def off(self) -> None: """Switch off the ruler completely.""" self.renderer.RemoveObserver(self.cid) self.renderer.RemoveActor(self) def set_points(self, p0, p1) -> Self: """Set new values for the ruler start and end points.""" self.p0 = np.asarray(p0) self.p1 = np.asarray(p1) self._update_viz(0, 0) return self def _update_viz(self, evt, name) -> None: ren = self.renderer view_size = np.array(ren.GetSize()) ren.SetWorldPoint(*self.p0, 1) ren.WorldToDisplay() disp_point1 = ren.GetDisplayPoint()[:2] disp_point1 = np.array(disp_point1) / view_size ren.SetWorldPoint(*self.p1, 1) ren.WorldToDisplay() disp_point2 = ren.GetDisplayPoint()[:2] disp_point2 = np.array(disp_point2) / view_size self.SetPoint1(*disp_point1) self.SetPoint2(*disp_point2) self.distance = np.linalg.norm(self.p1 - self.p0) self.SetRange(0.0, float(self.distance)) if not self.title: self.SetTitle(utils.precision(self.distance, 3)) ##################################################################### class DistanceTool(Group): """ Create a tool to measure the distance between two clicked points. """ def __init__(self, plotter=None, c="k", lw=2): """ Create a tool to measure the distance between two clicked points. Example: ```python from vedo import * mesh = ParametricShape("RandomHills").c("red5") plt = Plotter(axes=1) dtool = DistanceTool() dtool.on() plt.show(mesh, dtool) dtool.off() ``` ![](https://vedo.embl.es/images/feats/dist_tool.png) """ super().__init__() self.p0 = [0, 0, 0] self.p1 = [0, 0, 0] self.distance = 0 if plotter is None: plotter = vedo.plotter_instance self.plotter = plotter self.callback = None self.cid = None self.color = c self.linewidth = lw self.toggle = True self.ruler = None self.title = "" def on(self) -> Self: """Switch tool on.""" self.cid = self.plotter.add_callback("click", self._onclick) self.VisibilityOn() self.plotter.render() return self def off(self) -> None: """Switch tool off.""" self.plotter.remove_callback(self.cid) self.VisibilityOff() self.ruler.off() self.plotter.render() def _onclick(self, event): if not event.actor: return self.clear() acts = [] if self.toggle: self.p0 = event.picked3d acts.append(Point(self.p0, c=self.color)) else: self.p1 = event.picked3d self.distance = np.linalg.norm(self.p1 - self.p0) acts.append(Point(self.p0, c=self.color)) acts.append(Point(self.p1, c=self.color)) self.ruler = Ruler2D(c=self.color) self.ruler.set_points(self.p0, self.p1) acts.append(self.ruler) if self.callback is not None: self.callback(event) for a in acts: try: self += a.actor except AttributeError: self += a self.toggle = not self.toggle ##################################################################### def Axes( obj=None, xtitle='x', ytitle='y', ztitle='z', xrange=None, yrange=None, zrange=None, c=None, number_of_divisions=None, digits=None, limit_ratio=0.04, title_depth=0, title_font="", # grab settings.default_font text_scale=1.0, x_values_and_labels=None, y_values_and_labels=None, z_values_and_labels=None, htitle="", htitle_size=0.03, htitle_font=None, htitle_italic=False, htitle_color=None, htitle_backface_color=None, htitle_justify='bottom-left', htitle_rotation=0, htitle_offset=(0, 0.01, 0), xtitle_position=0.95, ytitle_position=0.95, ztitle_position=0.95, # xtitle_offset can be a list (dx,dy,dz) xtitle_offset=0.025, ytitle_offset=0.0275, ztitle_offset=0.02, xtitle_justify=None, ytitle_justify=None, ztitle_justify=None, # xtitle_rotation can be a list (rx,ry,rz) xtitle_rotation=0, ytitle_rotation=0, ztitle_rotation=0, xtitle_box=False, ytitle_box=False, xtitle_size=0.025, ytitle_size=0.025, ztitle_size=0.025, xtitle_color=None, ytitle_color=None, ztitle_color=None, xtitle_backface_color=None, ytitle_backface_color=None, ztitle_backface_color=None, xtitle_italic=0, ytitle_italic=0, ztitle_italic=0, grid_linewidth=1, xygrid=True, yzgrid=False, zxgrid=False, xygrid2=False, yzgrid2=False, zxgrid2=False, xygrid_transparent=False, yzgrid_transparent=False, zxgrid_transparent=False, xygrid2_transparent=False, yzgrid2_transparent=False, zxgrid2_transparent=False, xyplane_color=None, yzplane_color=None, zxplane_color=None, xygrid_color=None, yzgrid_color=None, zxgrid_color=None, xyalpha=0.075, yzalpha=0.075, zxalpha=0.075, xyframe_line=None, yzframe_line=None, zxframe_line=None, xyframe_color=None, yzframe_color=None, zxframe_color=None, axes_linewidth=1, xline_color=None, yline_color=None, zline_color=None, xhighlight_zero=False, yhighlight_zero=False, zhighlight_zero=False, xhighlight_zero_color='red4', yhighlight_zero_color='green4', zhighlight_zero_color='blue4', show_ticks=True, xtick_length=0.015, ytick_length=0.015, ztick_length=0.015, xtick_thickness=0.0025, ytick_thickness=0.0025, ztick_thickness=0.0025, xminor_ticks=1, yminor_ticks=1, zminor_ticks=1, tip_size=None, label_font="", # grab settings.default_font xlabel_color=None, ylabel_color=None, zlabel_color=None, xlabel_backface_color=None, ylabel_backface_color=None, zlabel_backface_color=None, xlabel_size=0.016, ylabel_size=0.016, zlabel_size=0.016, xlabel_offset=0.8, ylabel_offset=0.8, zlabel_offset=0.8, # each can be a list (dx,dy,dz) xlabel_justify=None, ylabel_justify=None, zlabel_justify=None, xlabel_rotation=0, ylabel_rotation=0, zlabel_rotation=0, # each can be a list (rx,ry,rz) xaxis_rotation=0, yaxis_rotation=0, zaxis_rotation=0, # rotate all elements around axis xyshift=0, yzshift=0, zxshift=0, xshift_along_y=0, xshift_along_z=0, yshift_along_x=0, yshift_along_z=0, zshift_along_x=0, zshift_along_y=0, x_use_bounds=True, y_use_bounds=True, z_use_bounds=False, x_inverted=False, y_inverted=False, z_inverted=False, use_global=False, tol=0.001, ) -> Union[Assembly, None]: """ Draw axes for the input object. Check [available fonts here](https://vedo.embl.es/fonts). Returns an `vedo.Assembly` object. Parameters ---------- - `xtitle`, ['x'], x-axis title text - `xrange`, [None], x-axis range in format (xmin, ymin), default is automatic. - `number_of_divisions`, [None], approximate number of divisions on the longest axis - `axes_linewidth`, [1], width of the axes lines - `grid_linewidth`, [1], width of the grid lines - `title_depth`, [0], extrusion fractional depth of title text - `x_values_and_labels` [], assign custom tick positions and labels [(pos1, label1), ...] - `xygrid`, [True], show a gridded wall on plane xy - `yzgrid`, [True], show a gridded wall on plane yz - `zxgrid`, [True], show a gridded wall on plane zx - `yzgrid2`, [False], show yz plane on opposite side of the bounding box - `zxgrid2`, [False], show zx plane on opposite side of the bounding box - `xygrid_transparent` [False], make grid plane completely transparent - `xygrid2_transparent` [False], make grid plane completely transparent on opposite side box - `xyplane_color`, ['None'], color of the plane - `xygrid_color`, ['None'], grid line color - `xyalpha`, [0.15], grid plane opacity - `xyframe_line`, [0], add a frame for the plane, use value as the thickness - `xyframe_color`, [None], color for the frame of the plane - `show_ticks`, [True], show major ticks - `digits`, [None], use this number of significant digits in scientific notation - `title_font`, [''], font for axes titles - `label_font`, [''], font for numeric labels - `text_scale`, [1.0], global scaling factor for all text elements (titles, labels) - `htitle`, [''], header title - `htitle_size`, [0.03], header title size - `htitle_font`, [None], header font (defaults to `title_font`) - `htitle_italic`, [True], header font is italic - `htitle_color`, [None], header title color (defaults to `xtitle_color`) - `htitle_backface_color`, [None], header title color on its backface - `htitle_justify`, ['bottom-center'], origin of the title justification - `htitle_offset`, [(0,0.01,0)], control offsets of header title in x, y and z - `xtitle_position`, [0.32], title fractional positions along axis - `xtitle_offset`, [0.05], title fractional offset distance from axis line, can be a list - `xtitle_justify`, [None], choose the origin of the bounding box of title - `xtitle_rotation`, [0], add a rotation of the axis title, can be a list (rx,ry,rz) - `xtitle_box`, [False], add a box around title text - `xline_color`, [automatic], color of the x-axis - `xtitle_color`, [automatic], color of the axis title - `xtitle_backface_color`, [None], color of axis title on its backface - `xtitle_size`, [0.025], size of the axis title - `xtitle_italic`, [0], a bool or float to make the font italic - `xhighlight_zero`, [True], draw a line highlighting zero position if in range - `xhighlight_zero_color`, [auto], color of the line highlighting the zero position - `xtick_length`, [0.005], radius of the major ticks - `xtick_thickness`, [0.0025], thickness of the major ticks along their axis - `xminor_ticks`, [1], number of minor ticks between two major ticks - `xlabel_color`, [automatic], color of numeric labels and ticks - `xlabel_backface_color`, [auto], back face color of numeric labels and ticks - `xlabel_size`, [0.015], size of the numeric labels along axis - `xlabel_rotation`, [0,list], numeric labels rotation (can be a list of 3 rotations) - `xlabel_offset`, [0.8,list], offset of the numeric labels (can be a list of 3 offsets) - `xlabel_justify`, [None], choose the origin of the bounding box of labels - `xaxis_rotation`, [0], rotate the X axis elements (ticks and labels) around this same axis - `xyshift` [0.0], slide the xy-plane along z (the range is [0,1]) - `xshift_along_y` [0.0], slide x-axis along the y-axis (the range is [0,1]) - `tip_size`, [0.01], size of the arrow tip as a fraction of the bounding box diagonal - `limit_ratio`, [0.04], below this ratio don't plot smaller axis - `x_use_bounds`, [True], keep into account space occupied by labels when setting camera - `x_inverted`, [False], invert labels order and direction (only visually!) - `use_global`, [False], try to compute the global bounding box of visible actors Example: ```python from vedo import Axes, Box, show box = Box(pos=(1,2,3), length=8, width=9, height=7).alpha(0.1) axs = Axes(box, c='k') # returns an Assembly object for a in axs.unpack(): print(a.name) show(box, axs).close() ``` ![](https://vedo.embl.es/images/feats/axes1.png) Examples: - [custom_axes1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes1.py) - [custom_axes2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes2.py) - [custom_axes3.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes3.py) - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) ![](https://vedo.embl.es/images/pyplot/customAxes3.png) """ if not title_font: title_font = vedo.settings.default_font if not label_font: label_font = vedo.settings.default_font if c is None: # automatic black or white c = (0.1, 0.1, 0.1) plt = vedo.plotter_instance if plt and plt.renderer: bgcol = plt.renderer.GetBackground() else: bgcol = (1, 1, 1) if np.sum(bgcol) < 1.5: c = (0.9, 0.9, 0.9) else: c = get_color(c) # Check if obj has bounds, if so use those if obj is not None: try: bb = obj.bounds() except AttributeError: try: bb = obj.GetBounds() if xrange is None: xrange = (bb[0], bb[1]) if yrange is None: yrange = (bb[2], bb[3]) if zrange is None: zrange = (bb[4], bb[5]) obj = None # dont need it anymore except AttributeError: pass if utils.is_sequence(obj) and len(obj) == 6 and utils.is_number(obj[0]): # passing a list of numeric bounds if xrange is None: xrange = (obj[0], obj[1]) if yrange is None: yrange = (obj[2], obj[3]) if zrange is None: zrange = (obj[4], obj[5]) if use_global: vbb, drange, min_bns, max_bns = compute_visible_bounds() else: if obj is not None: vbb, drange, min_bns, max_bns = compute_visible_bounds(obj) else: vbb = np.zeros(6) drange = np.zeros(3) if zrange is None: zrange = (0, 0) if xrange is None or yrange is None: vedo.logger.error("in Axes() must specify axes ranges!") return None ########################################### if xrange is not None: if xrange[1] < xrange[0]: x_inverted = True xrange = [xrange[1], xrange[0]] vbb[0], vbb[1] = xrange drange[0] = vbb[1] - vbb[0] min_bns = vbb max_bns = vbb if yrange is not None: if yrange[1] < yrange[0]: y_inverted = True yrange = [yrange[1], yrange[0]] vbb[2], vbb[3] = yrange drange[1] = vbb[3] - vbb[2] min_bns = vbb max_bns = vbb if zrange is not None: if zrange[1] < zrange[0]: z_inverted = True zrange = [zrange[1], zrange[0]] vbb[4], vbb[5] = zrange drange[2] = vbb[5] - vbb[4] min_bns = vbb max_bns = vbb drangemax = max(drange) if not drangemax: return None if drange[0] / drangemax < limit_ratio: drange[0] = 0 xtitle = "" if drange[1] / drangemax < limit_ratio: drange[1] = 0 ytitle = "" if drange[2] / drangemax < limit_ratio: drange[2] = 0 ztitle = "" x0, x1, y0, y1, z0, z1 = vbb dx, dy, dz = drange gscale = np.sqrt(dx * dx + dy * dy + dz * dz) * 0.75 if not xyplane_color: xyplane_color = c if not yzplane_color: yzplane_color = c if not zxplane_color: zxplane_color = c if not xygrid_color: xygrid_color = c if not yzgrid_color: yzgrid_color = c if not zxgrid_color: zxgrid_color = c if not xtitle_color: xtitle_color = c if not ytitle_color: ytitle_color = c if not ztitle_color: ztitle_color = c if not xline_color: xline_color = c if not yline_color: yline_color = c if not zline_color: zline_color = c if not xlabel_color: xlabel_color = xline_color if not ylabel_color: ylabel_color = yline_color if not zlabel_color: zlabel_color = zline_color if tip_size is None: tip_size = 0.005 * gscale if not ztitle: tip_size = 0 # switch off in xy 2d ndiv = 4 if not ztitle or not ytitle or not xtitle: # make more default ticks if 2D ndiv = 6 if not ztitle: if xyframe_line is None: xyframe_line = True if tip_size is None: tip_size = False if utils.is_sequence(number_of_divisions): rx, ry, rz = number_of_divisions else: if not number_of_divisions: number_of_divisions = ndiv if not drangemax or np.any(np.isnan(drange)): rx, ry, rz = 1, 1, 1 else: rx, ry, rz = np.ceil(drange / drangemax * number_of_divisions).astype(int) if xtitle: xticks_float, xticks_str = utils.make_ticks(x0, x1, rx, x_values_and_labels, digits) xticks_float = xticks_float * dx if x_inverted: xticks_float = np.flip(-(xticks_float - xticks_float[-1])) xticks_str = list(reversed(xticks_str)) xticks_str[-1] = "" xhighlight_zero = False if ytitle: yticks_float, yticks_str = utils.make_ticks(y0, y1, ry, y_values_and_labels, digits) yticks_float = yticks_float * dy if y_inverted: yticks_float = np.flip(-(yticks_float - yticks_float[-1])) yticks_str = list(reversed(yticks_str)) yticks_str[-1] = "" yhighlight_zero = False if ztitle: zticks_float, zticks_str = utils.make_ticks(z0, z1, rz, z_values_and_labels, digits) zticks_float = zticks_float * dz if z_inverted: zticks_float = np.flip(-(zticks_float - zticks_float[-1])) zticks_str = list(reversed(zticks_str)) zticks_str[-1] = "" zhighlight_zero = False ################################################ axes lines lines = [] if xtitle: axlinex = shapes.Line([0,0,0], [dx,0,0], c=xline_color, lw=axes_linewidth) axlinex.shift([0, zxshift*dy + xshift_along_y*dy, xyshift*dz + xshift_along_z*dz]) axlinex.name = 'xAxis' lines.append(axlinex) if ytitle: axliney = shapes.Line([0,0,0], [0,dy,0], c=yline_color, lw=axes_linewidth) axliney.shift([yzshift*dx + yshift_along_x*dx, 0, xyshift*dz + yshift_along_z*dz]) axliney.name = 'yAxis' lines.append(axliney) if ztitle: axlinez = shapes.Line([0,0,0], [0,0,dz], c=zline_color, lw=axes_linewidth) axlinez.shift([yzshift*dx + zshift_along_x*dx, zxshift*dy + zshift_along_y*dy, 0]) axlinez.name = 'zAxis' lines.append(axlinez) ################################################ grid planes # all shapes have a name to keep track of them in the Assembly # if user wants to unpack it grids = [] if xygrid and xtitle and ytitle: if not xygrid_transparent: gxy = shapes.Grid(s=(xticks_float, yticks_float)) gxy.alpha(xyalpha).c(xyplane_color).lw(0) if xyshift: gxy.shift([0,0,xyshift*dz]) elif tol: gxy.shift([0,0,-tol*gscale]) gxy.name = "xyGrid" grids.append(gxy) if grid_linewidth: gxy_lines = shapes.Grid(s=(xticks_float, yticks_float)) gxy_lines.c(xyplane_color).lw(grid_linewidth).alpha(xyalpha) if xyshift: gxy_lines.shift([0,0,xyshift*dz]) elif tol: gxy_lines.shift([0,0,-tol*gscale]) gxy_lines.name = "xyGridLines" grids.append(gxy_lines) if yzgrid and ytitle and ztitle: if not yzgrid_transparent: gyz = shapes.Grid(s=(zticks_float, yticks_float)) gyz.alpha(yzalpha).c(yzplane_color).lw(0).rotate_y(-90) if yzshift: gyz.shift([yzshift*dx,0,0]) elif tol: gyz.shift([-tol*gscale,0,0]) gyz.name = "yzGrid" grids.append(gyz) if grid_linewidth: gyz_lines = shapes.Grid(s=(zticks_float, yticks_float)) gyz_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).rotate_y(-90) if yzshift: gyz_lines.shift([yzshift*dx,0,0]) elif tol: gyz_lines.shift([-tol*gscale,0,0]) gyz_lines.name = "yzGridLines" grids.append(gyz_lines) if zxgrid and ztitle and xtitle: if not zxgrid_transparent: gzx = shapes.Grid(s=(xticks_float, zticks_float)) gzx.alpha(zxalpha).c(zxplane_color).lw(0).rotate_x(90) if zxshift: gzx.shift([0,zxshift*dy,0]) elif tol: gzx.shift([0,-tol*gscale,0]) gzx.name = "zxGrid" grids.append(gzx) if grid_linewidth: gzx_lines = shapes.Grid(s=(xticks_float, zticks_float)) gzx_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).rotate_x(90) if zxshift: gzx_lines.shift([0,zxshift*dy,0]) elif tol: gzx_lines.shift([0,-tol*gscale,0]) gzx_lines.name = "zxGridLines" grids.append(gzx_lines) # Grid2 if xygrid2 and xtitle and ytitle: if not xygrid2_transparent: gxy2 = shapes.Grid(s=(xticks_float, yticks_float)).z(dz) gxy2.alpha(xyalpha).c(xyplane_color).lw(0) gxy2.shift([0, tol * gscale, 0]) gxy2.name = "xyGrid2" grids.append(gxy2) if grid_linewidth: gxy2_lines = shapes.Grid(s=(xticks_float, yticks_float)).z(dz) gxy2_lines.c(xyplane_color).lw(grid_linewidth).alpha(xyalpha) gxy2_lines.shift([0, tol * gscale, 0]) gxy2_lines.name = "xygrid2Lines" grids.append(gxy2_lines) if yzgrid2 and ytitle and ztitle: if not yzgrid2_transparent: gyz2 = shapes.Grid(s=(zticks_float, yticks_float)) gyz2.alpha(yzalpha).c(yzplane_color).lw(0) gyz2.rotate_y(-90).x(dx).shift([tol * gscale, 0, 0]) gyz2.name = "yzGrid2" grids.append(gyz2) if grid_linewidth: gyz2_lines = shapes.Grid(s=(zticks_float, yticks_float)) gyz2_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha) gyz2_lines.rotate_y(-90).x(dx).shift([tol * gscale, 0, 0]) gyz2_lines.name = "yzGrid2Lines" grids.append(gyz2_lines) if zxgrid2 and ztitle and xtitle: if not zxgrid2_transparent: gzx2 = shapes.Grid(s=(xticks_float, zticks_float)) gzx2.alpha(zxalpha).c(zxplane_color).lw(0) gzx2.rotate_x(90).y(dy).shift([0, tol * gscale, 0]) gzx2.name = "zxGrid2" grids.append(gzx2) if grid_linewidth: gzx2_lines = shapes.Grid(s=(xticks_float, zticks_float)) gzx2_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha) gzx2_lines.rotate_x(90).y(dy).shift([0, tol * gscale, 0]) gzx2_lines.name = "zxGrid2Lines" grids.append(gzx2_lines) ################################################ frame lines framelines = [] if xyframe_line and xtitle and ytitle: if not xyframe_color: xyframe_color = xygrid_color frxy = shapes.Line( [[0, dy, 0], [dx, dy, 0], [dx, 0, 0], [0, 0, 0], [0, dy, 0]], c=xyframe_color, lw=xyframe_line, ) frxy.shift([0, 0, xyshift * dz]) frxy.name = "xyFrameLine" framelines.append(frxy) if yzframe_line and ytitle and ztitle: if not yzframe_color: yzframe_color = yzgrid_color fryz = shapes.Line( [[0, 0, dz], [0, dy, dz], [0, dy, 0], [0, 0, 0], [0, 0, dz]], c=yzframe_color, lw=yzframe_line, ) fryz.shift([yzshift * dx, 0, 0]) fryz.name = "yzFrameLine" framelines.append(fryz) if zxframe_line and ztitle and xtitle: if not zxframe_color: zxframe_color = zxgrid_color frzx = shapes.Line( [[0, 0, dz], [dx, 0, dz], [dx, 0, 0], [0, 0, 0], [0, 0, dz]], c=zxframe_color, lw=zxframe_line, ) frzx.shift([0, zxshift * dy, 0]) frzx.name = "zxFrameLine" framelines.append(frzx) ################################################ zero lines highlights highlights = [] if xygrid and xtitle and ytitle: if xhighlight_zero and min_bns[0] <= 0 and max_bns[1] > 0: xhl = -min_bns[0] hxy = shapes.Line([xhl, 0, 0], [xhl, dy, 0], c=xhighlight_zero_color) hxy.alpha(np.sqrt(xyalpha)).lw(grid_linewidth * 2) hxy.shift([0, 0, xyshift * dz]) hxy.name = "xyHighlightZero" highlights.append(hxy) if yhighlight_zero and min_bns[2] <= 0 and max_bns[3] > 0: yhl = -min_bns[2] hyx = shapes.Line([0, yhl, 0], [dx, yhl, 0], c=yhighlight_zero_color) hyx.alpha(np.sqrt(yzalpha)).lw(grid_linewidth * 2) hyx.shift([0, 0, xyshift * dz]) hyx.name = "yxHighlightZero" highlights.append(hyx) if yzgrid and ytitle and ztitle: if yhighlight_zero and min_bns[2] <= 0 and max_bns[3] > 0: yhl = -min_bns[2] hyz = shapes.Line([0, yhl, 0], [0, yhl, dz], c=yhighlight_zero_color) hyz.alpha(np.sqrt(yzalpha)).lw(grid_linewidth * 2) hyz.shift([yzshift * dx, 0, 0]) hyz.name = "yzHighlightZero" highlights.append(hyz) if zhighlight_zero and min_bns[4] <= 0 and max_bns[5] > 0: zhl = -min_bns[4] hzy = shapes.Line([0, 0, zhl], [0, dy, zhl], c=zhighlight_zero_color) hzy.alpha(np.sqrt(yzalpha)).lw(grid_linewidth * 2) hzy.shift([yzshift * dx, 0, 0]) hzy.name = "zyHighlightZero" highlights.append(hzy) if zxgrid and ztitle and xtitle: if zhighlight_zero and min_bns[4] <= 0 and max_bns[5] > 0: zhl = -min_bns[4] hzx = shapes.Line([0, 0, zhl], [dx, 0, zhl], c=zhighlight_zero_color) hzx.alpha(np.sqrt(zxalpha)).lw(grid_linewidth * 2) hzx.shift([0, zxshift * dy, 0]) hzx.name = "zxHighlightZero" highlights.append(hzx) if xhighlight_zero and min_bns[0] <= 0 and max_bns[1] > 0: xhl = -min_bns[0] hxz = shapes.Line([xhl, 0, 0], [xhl, 0, dz], c=xhighlight_zero_color) hxz.alpha(np.sqrt(zxalpha)).lw(grid_linewidth * 2) hxz.shift([0, zxshift * dy, 0]) hxz.name = "xzHighlightZero" highlights.append(hxz) ################################################ arrow cone cones = [] if tip_size: if xtitle: if x_inverted: cx = shapes.Cone( r=tip_size, height=tip_size * 2, axis=(-1, 0, 0), c=xline_color, res=12, ) else: cx = shapes.Cone( (dx, 0, 0), r=tip_size, height=tip_size * 2, axis=(1, 0, 0), c=xline_color, res=12, ) T = LinearTransform() T.translate( [ 0, zxshift * dy + xshift_along_y * dy, xyshift * dz + xshift_along_z * dz, ] ) cx.apply_transform(T) cx.name = "xTipCone" cones.append(cx) if ytitle: if y_inverted: cy = shapes.Cone( r=tip_size, height=tip_size * 2, axis=(0, -1, 0), c=yline_color, res=12, ) else: cy = shapes.Cone( (0, dy, 0), r=tip_size, height=tip_size * 2, axis=(0, 1, 0), c=yline_color, res=12, ) T = LinearTransform() T.translate( [ yzshift * dx + yshift_along_x * dx, 0, xyshift * dz + yshift_along_z * dz, ] ) cy.apply_transform(T) cy.name = "yTipCone" cones.append(cy) if ztitle: if z_inverted: cz = shapes.Cone( r=tip_size, height=tip_size * 2, axis=(0, 0, -1), c=zline_color, res=12, ) else: cz = shapes.Cone( (0, 0, dz), r=tip_size, height=tip_size * 2, axis=(0, 0, 1), c=zline_color, res=12, ) T = LinearTransform() T.translate( [ yzshift * dx + zshift_along_x * dx, zxshift * dy + zshift_along_y * dy, 0, ] ) cz.apply_transform(T) cz.name = "zTipCone" cones.append(cz) ################################################################# MAJOR ticks majorticks, minorticks = [], [] xticks, yticks, zticks = [], [], [] if show_ticks: if xtitle: tick_thickness = xtick_thickness * gscale / 2 tick_length = xtick_length * gscale / 2 for i in range(1, len(xticks_float) - 1): v1 = (xticks_float[i] - tick_thickness, -tick_length, 0) v2 = (xticks_float[i] + tick_thickness, tick_length, 0) xticks.append(shapes.Rectangle(v1, v2)) if len(xticks) > 1: xmajticks = merge(xticks).c(xlabel_color) T = LinearTransform() T.rotate_x(xaxis_rotation) T.translate([0, zxshift*dy + xshift_along_y*dy, xyshift*dz + xshift_along_z*dz]) xmajticks.apply_transform(T) xmajticks.name = "xMajorTicks" majorticks.append(xmajticks) if ytitle: tick_thickness = ytick_thickness * gscale / 2 tick_length = ytick_length * gscale / 2 for i in range(1, len(yticks_float) - 1): v1 = (-tick_length, yticks_float[i] - tick_thickness, 0) v2 = (tick_length, yticks_float[i] + tick_thickness, 0) yticks.append(shapes.Rectangle(v1, v2)) if len(yticks) > 1: ymajticks = merge(yticks).c(ylabel_color) T = LinearTransform() T.rotate_y(yaxis_rotation) T.translate([yzshift*dx + yshift_along_x*dx, 0, xyshift*dz + yshift_along_z*dz]) ymajticks.apply_transform(T) ymajticks.name = "yMajorTicks" majorticks.append(ymajticks) if ztitle: tick_thickness = ztick_thickness * gscale / 2 tick_length = ztick_length * gscale / 2.85 for i in range(1, len(zticks_float) - 1): v1 = (zticks_float[i] - tick_thickness, -tick_length, 0) v2 = (zticks_float[i] + tick_thickness, tick_length, 0) zticks.append(shapes.Rectangle(v1, v2)) if len(zticks) > 1: zmajticks = merge(zticks).c(zlabel_color) T = LinearTransform() T.rotate_y(-90).rotate_z(-45 + zaxis_rotation) T.translate([yzshift*dx + zshift_along_x*dx, zxshift*dy + zshift_along_y*dy, 0]) zmajticks.apply_transform(T) zmajticks.name = "zMajorTicks" majorticks.append(zmajticks) ############################################################# MINOR ticks if xtitle and xminor_ticks and len(xticks) > 1: tick_thickness = xtick_thickness * gscale / 4 tick_length = xtick_length * gscale / 4 xminor_ticks += 1 ticks = [] for i in range(1, len(xticks)): t0, t1 = xticks[i - 1].pos(), xticks[i].pos() dt = t1 - t0 for j in range(1, xminor_ticks): mt = dt * (j / xminor_ticks) + t0 v1 = (mt[0] - tick_thickness, -tick_length, 0) v2 = (mt[0] + tick_thickness, tick_length, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the fist lower range from start to first tick t0, t1 = xticks[0].pos(), xticks[1].pos() dt = t1 - t0 for j in range(1, xminor_ticks): mt = t0 - dt * (j / xminor_ticks) if mt[0] < 0: break v1 = (mt[0] - tick_thickness, -tick_length, 0) v2 = (mt[0] + tick_thickness, tick_length, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the last upper range from last tick to end t0, t1 = xticks[-2].pos(), xticks[-1].pos() dt = t1 - t0 for j in range(1, xminor_ticks): mt = t1 + dt * (j / xminor_ticks) if mt[0] > dx: break v1 = (mt[0] - tick_thickness, -tick_length, 0) v2 = (mt[0] + tick_thickness, tick_length, 0) ticks.append(shapes.Rectangle(v1, v2)) if ticks: xminticks = merge(ticks).c(xlabel_color) T = LinearTransform() T.rotate_x(xaxis_rotation) T.translate([0, zxshift*dy + xshift_along_y*dy, xyshift*dz + xshift_along_z*dz]) xminticks.apply_transform(T) xminticks.name = "xMinorTicks" minorticks.append(xminticks) if ytitle and yminor_ticks and len(yticks) > 1: ##### y tick_thickness = ytick_thickness * gscale / 4 tick_length = ytick_length * gscale / 4 yminor_ticks += 1 ticks = [] for i in range(1, len(yticks)): t0, t1 = yticks[i - 1].pos(), yticks[i].pos() dt = t1 - t0 for j in range(1, yminor_ticks): mt = dt * (j / yminor_ticks) + t0 v1 = (-tick_length, mt[1] - tick_thickness, 0) v2 = (tick_length, mt[1] + tick_thickness, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the fist lower range from start to first tick t0, t1 = yticks[0].pos(), yticks[1].pos() dt = t1 - t0 for j in range(1, yminor_ticks): mt = t0 - dt * (j / yminor_ticks) if mt[1] < 0: break v1 = (-tick_length, mt[1] - tick_thickness, 0) v2 = (tick_length, mt[1] + tick_thickness, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the last upper range from last tick to end t0, t1 = yticks[-2].pos(), yticks[-1].pos() dt = t1 - t0 for j in range(1, yminor_ticks): mt = t1 + dt * (j / yminor_ticks) if mt[1] > dy: break v1 = (-tick_length, mt[1] - tick_thickness, 0) v2 = (tick_length, mt[1] + tick_thickness, 0) ticks.append(shapes.Rectangle(v1, v2)) if ticks: yminticks = merge(ticks).c(ylabel_color) T = LinearTransform() T.rotate_y(yaxis_rotation) T.translate([yzshift*dx + yshift_along_x*dx, 0, xyshift*dz + yshift_along_z*dz]) yminticks.apply_transform(T) yminticks.name = "yMinorTicks" minorticks.append(yminticks) if ztitle and zminor_ticks and len(zticks) > 1: ##### z tick_thickness = ztick_thickness * gscale / 4 tick_length = ztick_length * gscale / 5 zminor_ticks += 1 ticks = [] for i in range(1, len(zticks)): t0, t1 = zticks[i - 1].pos(), zticks[i].pos() dt = t1 - t0 for j in range(1, zminor_ticks): mt = dt * (j / zminor_ticks) + t0 v1 = (mt[0] - tick_thickness, -tick_length, 0) v2 = (mt[0] + tick_thickness, tick_length, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the fist lower range from start to first tick t0, t1 = zticks[0].pos(), zticks[1].pos() dt = t1 - t0 for j in range(1, zminor_ticks): mt = t0 - dt * (j / zminor_ticks) if mt[0] < 0: break v1 = (mt[0] - tick_thickness, -tick_length, 0) v2 = (mt[0] + tick_thickness, tick_length, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the last upper range from last tick to end t0, t1 = zticks[-2].pos(), zticks[-1].pos() dt = t1 - t0 for j in range(1, zminor_ticks): mt = t1 + dt * (j / zminor_ticks) if mt[0] > dz: break v1 = (mt[0] - tick_thickness, -tick_length, 0) v2 = (mt[0] + tick_thickness, tick_length, 0) ticks.append(shapes.Rectangle(v1, v2)) if ticks: zminticks = merge(ticks).c(zlabel_color) T = LinearTransform() T.rotate_y(-90).rotate_z(-45 + zaxis_rotation) T.translate([yzshift*dx + zshift_along_x*dx, zxshift*dy + zshift_along_y*dy, 0]) zminticks.apply_transform(T) zminticks.name = "zMinorTicks" minorticks.append(zminticks) ################################################ axes NUMERIC text labels labels = [] xlab, ylab, zlab = None, None, None if xlabel_size and xtitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(xlabel_rotation): # unpck 3 rotations zRot, xRot, yRot = xlabel_rotation else: zRot = xlabel_rotation if zRot < 0: # deal with negative angles zRot += 360 jus = "center-top" if zRot: if zRot > 24: jus = "top-right" if zRot > 67: jus = "center-right" if zRot > 112: jus = "right-bottom" if zRot > 157: jus = "center-bottom" if zRot > 202: jus = "bottom-left" if zRot > 247: jus = "center-left" if zRot > 292: jus = "top-left" if zRot > 337: jus = "top-center" if xlabel_justify is not None: jus = xlabel_justify for i in range(1, len(xticks_str)): t = xticks_str[i] if not t: continue if utils.is_sequence(xlabel_offset): xoffs, yoffs, zoffs = xlabel_offset else: xoffs, yoffs, zoffs = 0, xlabel_offset, 0 xlab = shapes.Text3D( t, s=xlabel_size * text_scale * gscale, font=label_font, justify=jus ) tb = xlab.ybounds() # must be ybounds: height of char v = (xticks_float[i], 0, 0) offs = -np.array([xoffs, yoffs, zoffs]) * (tb[1] - tb[0]) T = LinearTransform() T.rotate_x(xaxis_rotation).rotate_y(yRot).rotate_x(xRot).rotate_z(zRot) T.translate(v + offs) T.translate([0, zxshift*dy + xshift_along_y*dy, xyshift*dz + xshift_along_z*dz]) xlab.apply_transform(T) xlab.use_bounds(x_use_bounds) xlab.c(xlabel_color) if xlabel_backface_color is None: bfc = 1 - np.array(get_color(xlabel_color)) xlab.backcolor(bfc) xlab.name = f"xNumericLabel {i}" labels.append(xlab) if ylabel_size and ytitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(ylabel_rotation): # unpck 3 rotations zRot, yRot, xRot = ylabel_rotation else: zRot = ylabel_rotation if zRot < 0: zRot += 360 # deal with negative angles jus = "center-right" if zRot: if zRot > 24: jus = "bottom-right" if zRot > 67: jus = "center-bottom" if zRot > 112: jus = "left-bottom" if zRot > 157: jus = "center-left" if zRot > 202: jus = "top-left" if zRot > 247: jus = "center-top" if zRot > 292: jus = "top-right" if zRot > 337: jus = "right-center" if ylabel_justify is not None: jus = ylabel_justify for i in range(1, len(yticks_str)): t = yticks_str[i] if not t: continue if utils.is_sequence(ylabel_offset): xoffs, yoffs, zoffs = ylabel_offset else: xoffs, yoffs, zoffs = ylabel_offset, 0, 0 ylab = shapes.Text3D( t, s=ylabel_size * text_scale * gscale, font=label_font, justify=jus ) tb = ylab.ybounds() # must be ybounds: height of char v = (0, yticks_float[i], 0) offs = -np.array([xoffs, yoffs, zoffs]) * (tb[1] - tb[0]) T = LinearTransform() T.rotate_y(yaxis_rotation).rotate_x(xRot).rotate_y(yRot).rotate_z(zRot) T.translate(v + offs) T.translate([yzshift*dx + yshift_along_x*dx, 0, xyshift*dz + yshift_along_z*dz]) ylab.apply_transform(T) ylab.use_bounds(y_use_bounds) ylab.c(ylabel_color) if ylabel_backface_color is None: bfc = 1 - np.array(get_color(ylabel_color)) ylab.backcolor(bfc) ylab.name = f"yNumericLabel {i}" labels.append(ylab) if zlabel_size and ztitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(zlabel_rotation): # unpck 3 rotations xRot, yRot, zRot = zlabel_rotation else: xRot = zlabel_rotation if xRot < 0: xRot += 360 # deal with negative angles jus = "center-right" if xRot: if xRot > 24: jus = "bottom-right" if xRot > 67: jus = "center-bottom" if xRot > 112: jus = "left-bottom" if xRot > 157: jus = "center-left" if xRot > 202: jus = "top-left" if xRot > 247: jus = "center-top" if xRot > 292: jus = "top-right" if xRot > 337: jus = "right-center" if zlabel_justify is not None: jus = zlabel_justify for i in range(1, len(zticks_str)): t = zticks_str[i] if not t: continue if utils.is_sequence(zlabel_offset): xoffs, yoffs, zoffs = zlabel_offset else: xoffs, yoffs, zoffs = zlabel_offset, zlabel_offset, 0 zlab = shapes.Text3D(t, s=zlabel_size*text_scale*gscale, font=label_font, justify=jus) tb = zlab.ybounds() # must be ybounds: height of char v = (0, 0, zticks_float[i]) offs = -np.array([xoffs, yoffs, zoffs]) * (tb[1] - tb[0]) / 1.5 angle = np.arctan2(dy, dx) * 57.3 T = LinearTransform() T.rotate_x(90 + zRot).rotate_y(-xRot).rotate_z(angle + yRot + zaxis_rotation) T.translate(v + offs) T.translate([yzshift*dx + zshift_along_x*dx, zxshift*dy + zshift_along_y*dy, 0]) zlab.apply_transform(T) zlab.use_bounds(z_use_bounds) zlab.c(zlabel_color) if zlabel_backface_color is None: bfc = 1 - np.array(get_color(zlabel_color)) zlab.backcolor(bfc) zlab.name = f"zNumericLabel {i}" labels.append(zlab) ################################################ axes titles titles = [] if xtitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(xtitle_rotation): # unpack 3 rotations zRot, xRot, yRot = xtitle_rotation else: zRot = xtitle_rotation if zRot < 0: # deal with negative angles zRot += 360 if utils.is_sequence(xtitle_offset): xoffs, yoffs, zoffs = xtitle_offset else: xoffs, yoffs, zoffs = 0, xtitle_offset, 0 if xtitle_justify is not None: jus = xtitle_justify else: # find best justfication for given rotation(s) jus = "right-top" if zRot: if zRot > 24: jus = "center-right" if zRot > 67: jus = "right-bottom" if zRot > 157: jus = "bottom-left" if zRot > 202: jus = "center-left" if zRot > 247: jus = "top-left" if zRot > 337: jus = "top-right" xt = shapes.Text3D( xtitle, s=xtitle_size * text_scale * gscale, font=title_font, c=xtitle_color, justify=jus, depth=title_depth, italic=xtitle_italic, ) if xtitle_backface_color is None: xtitle_backface_color = 1 - np.array(get_color(xtitle_color)) xt.backcolor(xtitle_backface_color) shift = 0 if xlab: # xlab is the last created numeric text label.. lt0, lt1 = xlab.bounds()[2:4] shift = lt1 - lt0 T = LinearTransform() T.rotate_x(xRot).rotate_y(yRot).rotate_z(zRot) T.set_position( [(xoffs + xtitle_position) * dx, -(yoffs + xtick_length / 2) * dy - shift, zoffs * dz] ) T.rotate_x(xaxis_rotation) T.translate([0, xshift_along_y * dy, xyshift * dz + xshift_along_z * dz]) xt.apply_transform(T) xt.use_bounds(x_use_bounds) if xtitle == " ": xt.use_bounds(False) xt.name = "xtitle" titles.append(xt) if xtitle_box: titles.append(xt.box(scale=1.1).use_bounds(x_use_bounds)) if ytitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(ytitle_rotation): # unpck 3 rotations zRot, yRot, xRot = ytitle_rotation else: zRot = ytitle_rotation if len(ytitle) > 3: zRot += 90 ytitle_position *= 0.975 if zRot < 0: zRot += 360 # deal with negative angles if utils.is_sequence(ytitle_offset): xoffs, yoffs, zoffs = ytitle_offset else: xoffs, yoffs, zoffs = ytitle_offset, 0, 0 if ytitle_justify is not None: jus = ytitle_justify else: jus = "center-right" if zRot: if zRot > 24: jus = "bottom-right" if zRot > 112: jus = "left-bottom" if zRot > 157: jus = "center-left" if zRot > 202: jus = "top-left" if zRot > 292: jus = "top-right" if zRot > 337: jus = "right-center" yt = shapes.Text3D( ytitle, s=ytitle_size * text_scale * gscale, font=title_font, c=ytitle_color, justify=jus, depth=title_depth, italic=ytitle_italic, ) if ytitle_backface_color is None: ytitle_backface_color = 1 - np.array(get_color(ytitle_color)) yt.backcolor(ytitle_backface_color) shift = 0 if ylab: # this is the last created num label.. lt0, lt1 = ylab.bounds()[0:2] shift = lt1 - lt0 T = LinearTransform() T.rotate_x(xRot).rotate_y(yRot).rotate_z(zRot) T.set_position( [-(xoffs + ytick_length / 2) * dx - shift, (yoffs + ytitle_position) * dy, zoffs * dz] ) T.rotate_y(yaxis_rotation) T.translate([yshift_along_x * dx, 0, xyshift * dz + yshift_along_z * dz]) yt.apply_transform(T) yt.use_bounds(y_use_bounds) if ytitle == " ": yt.use_bounds(False) yt.name = "ytitle" titles.append(yt) if ytitle_box: titles.append(yt.box(scale=1.1).use_bounds(y_use_bounds)) if ztitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(ztitle_rotation): # unpck 3 rotations xRot, yRot, zRot = ztitle_rotation else: xRot = ztitle_rotation if len(ztitle) > 3: xRot += 90 ztitle_position *= 0.975 if xRot < 0: xRot += 360 # deal with negative angles if ztitle_justify is not None: jus = ztitle_justify else: jus = "center-right" if xRot: if xRot > 24: jus = "bottom-right" if xRot > 112: jus = "left-bottom" if xRot > 157: jus = "center-left" if xRot > 202: jus = "top-left" if xRot > 292: jus = "top-right" if xRot > 337: jus = "right-center" zt = shapes.Text3D( ztitle, s=ztitle_size * text_scale * gscale, font=title_font, c=ztitle_color, justify=jus, depth=title_depth, italic=ztitle_italic, ) if ztitle_backface_color is None: ztitle_backface_color = 1 - np.array(get_color(ztitle_color)) zt.backcolor(ztitle_backface_color) angle = np.arctan2(dy, dx) * 57.3 shift = 0 if zlab: # this is the last created one.. lt0, lt1 = zlab.bounds()[0:2] shift = lt1 - lt0 T = LinearTransform() T.rotate_x(90 + zRot).rotate_y(-xRot).rotate_z(angle + yRot) T.set_position([ -(ztitle_offset + ztick_length / 5) * dx - shift, -(ztitle_offset + ztick_length / 5) * dy - shift, ztitle_position * dz] ) T.rotate_z(zaxis_rotation) T.translate([zshift_along_x * dx, zxshift * dy + zshift_along_y * dy, 0]) zt.apply_transform(T) zt.use_bounds(z_use_bounds) if ztitle == " ": zt.use_bounds(False) zt.name = "ztitle" titles.append(zt) ################################################### header title if htitle: if htitle_font is None: htitle_font = title_font if htitle_color is None: htitle_color = xtitle_color htit = shapes.Text3D( htitle, s=htitle_size * gscale * text_scale, font=htitle_font, c=htitle_color, justify=htitle_justify, depth=title_depth, italic=htitle_italic, ) if htitle_backface_color is None: htitle_backface_color = 1 - np.array(get_color(htitle_color)) htit.backcolor(htitle_backface_color) htit.rotate_x(htitle_rotation) wpos = [htitle_offset[0]*dx, (1 + htitle_offset[1])*dy, htitle_offset[2]*dz] htit.shift(np.array(wpos) + [0, 0, xyshift*dz]) htit.name = "htitle" titles.append(htit) ###### acts = titles + lines + labels + grids + framelines acts += highlights + majorticks + minorticks + cones orig = (min_bns[0], min_bns[2], min_bns[4]) for a in acts: a.shift(orig) a.actor.PickableOff() a.properties.LightingOff() asse = Assembly(acts) asse.PickableOff() asse.name = "Axes" return asse def add_global_axes(axtype=None, c=None, bounds=()) -> None: """ Draw axes on scene. Available axes types are Parameters ---------- axtype : (int) - 0, no axes, - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the `vtkCubeAxesActor` object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane (use with zoom=8) - 12, show polar axes - 13, draw a simple ruler at the bottom of the window - 14, show the vtk default `vtkCameraOrientationWidget` object Axis type-1 can be fully customized by passing a dictionary `axes=dict()`, see `vedo.Axes` for the complete list of options. Example ------- .. code-block:: python from vedo import Box, show b = Box(pos=(0, 0, 0), length=80, width=90, height=70).alpha(0.1) show( b, axes={ "xtitle": "Some long variable [a.u.]", "number_of_divisions": 4, # ... }, ) """ plt = vedo.plotter_instance if plt is None: return if axtype is not None: plt.axes = axtype # override r = plt.renderers.index(plt.renderer) if not plt.axes: return if c is None: # automatic black or white c = (0.9, 0.9, 0.9) if np.sum(plt.renderer.GetBackground()) > 1.5: c = (0.1, 0.1, 0.1) else: c = get_color(c) # for speed if not plt.renderer: return if plt.axes_instances[r]: return ############################################################ # custom grid walls if plt.axes == 1 or plt.axes is True or isinstance(plt.axes, dict): if len(bounds) == 6: bnds = bounds xrange = (bnds[0], bnds[1]) yrange = (bnds[2], bnds[3]) zrange = (bnds[4], bnds[5]) else: xrange = None yrange = None zrange = None if isinstance(plt.axes, dict): plt.axes.update({"use_global": True}) # protect from invalid camelCase options from vedo<=2.3 for k in plt.axes: if k.lower() != k: return if "xrange" in plt.axes: xrange = plt.axes.pop("xrange") if "yrange" in plt.axes: yrange = plt.axes.pop("yrange") if "zrange" in plt.axes: zrange = plt.axes.pop("zrange") asse = Axes(**plt.axes, xrange=xrange, yrange=yrange, zrange=zrange) else: asse = Axes(xrange=xrange, yrange=yrange, zrange=zrange) plt.add(asse) plt.axes_instances[r] = asse elif plt.axes in (2, 3): x0, x1, y0, y1, z0, z1 = plt.renderer.ComputeVisiblePropBounds() xcol, ycol, zcol = "dr", "dg", "db" s = 1 alpha = 1 centered = False dx, dy, dz = x1 - x0, y1 - y0, z1 - z0 aves = np.sqrt(dx * dx + dy * dy + dz * dz) / 2 x0, x1 = min(x0, 0), max(x1, 0) y0, y1 = min(y0, 0), max(y1, 0) z0, z1 = min(z0, 0), max(z1, 0) if plt.axes == 3: if x1 > 0: x0 = 0 if y1 > 0: y0 = 0 if z1 > 0: z0 = 0 dx, dy, dz = x1 - x0, y1 - y0, z1 - z0 acts = [] if x0 * x1 <= 0 or y0 * z1 <= 0 or z0 * z1 <= 0: # some ranges contain origin zero = shapes.Sphere(r=aves / 120 * s, c="k", alpha=alpha, res=10) acts += [zero] if dx > aves / 100: xl = shapes.Cylinder([[x0, 0, 0], [x1, 0, 0]], r=aves / 250 * s, c=xcol, alpha=alpha) xc = shapes.Cone( pos=[x1, 0, 0], c=xcol, alpha=alpha, r=aves / 100 * s, height=aves / 25 * s, axis=[1, 0, 0], res=10, ) wpos = [x1, -aves / 25 * s, 0] # aligned to arrow tip if centered: wpos = [(x0 + x1) / 2, -aves / 25 * s, 0] xt = shapes.Text3D("x", pos=wpos, s=aves / 40 * s, c=xcol) acts += [xl, xc, xt] if dy > aves / 100: yl = shapes.Cylinder([[0, y0, 0], [0, y1, 0]], r=aves / 250 * s, c=ycol, alpha=alpha) yc = shapes.Cone( pos=[0, y1, 0], c=ycol, alpha=alpha, r=aves / 100 * s, height=aves / 25 * s, axis=[0, 1, 0], res=10, ) wpos = [-aves / 40 * s, y1, 0] if centered: wpos = [-aves / 40 * s, (y0 + y1) / 2, 0] yt = shapes.Text3D("y", pos=(0, 0, 0), s=aves / 40 * s, c=ycol) yt.rotate_z(90) yt.pos(wpos) acts += [yl, yc, yt] if dz > aves / 100: zl = shapes.Cylinder([[0, 0, z0], [0, 0, z1]], r=aves / 250 * s, c=zcol, alpha=alpha) zc = shapes.Cone( pos=[0, 0, z1], c=zcol, alpha=alpha, r=aves / 100 * s, height=aves / 25 * s, axis=[0, 0, 1], res=10, ) wpos = [-aves / 50 * s, -aves / 50 * s, z1] if centered: wpos = [-aves / 50 * s, -aves / 50 * s, (z0 + z1) / 2] zt = shapes.Text3D("z", pos=(0, 0, 0), s=aves / 40 * s, c=zcol) zt.rotate_z(45) zt.rotate_x(90) zt.pos(wpos) acts += [zl, zc, zt] for a in acts: a.actor.PickableOff() asse = Assembly(acts) asse.actor.PickableOff() plt.add(asse) plt.axes_instances[r] = asse elif plt.axes == 4: axact = vtki.vtkAxesActor() axact.SetShaftTypeToCylinder() axact.SetCylinderRadius(0.03) axact.SetXAxisLabelText("x") axact.SetYAxisLabelText("y") axact.SetZAxisLabelText("z") axact.GetXAxisShaftProperty().SetColor(1, 0, 0) axact.GetYAxisShaftProperty().SetColor(0, 1, 0) axact.GetZAxisShaftProperty().SetColor(0, 0, 1) axact.GetXAxisTipProperty().SetColor(1, 0, 0) axact.GetYAxisTipProperty().SetColor(0, 1, 0) axact.GetZAxisTipProperty().SetColor(0, 0, 1) bc = np.array(plt.renderer.GetBackground()) if np.sum(bc) < 1.5: lc = (1, 1, 1) else: lc = (0, 0, 0) axact.GetXAxisCaptionActor2D().GetCaptionTextProperty().BoldOff() axact.GetYAxisCaptionActor2D().GetCaptionTextProperty().BoldOff() axact.GetZAxisCaptionActor2D().GetCaptionTextProperty().BoldOff() axact.GetXAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff() axact.GetYAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff() axact.GetZAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff() axact.GetXAxisCaptionActor2D().GetCaptionTextProperty().ShadowOff() axact.GetYAxisCaptionActor2D().GetCaptionTextProperty().ShadowOff() axact.GetZAxisCaptionActor2D().GetCaptionTextProperty().ShadowOff() axact.GetXAxisCaptionActor2D().GetCaptionTextProperty().SetColor(lc) axact.GetYAxisCaptionActor2D().GetCaptionTextProperty().SetColor(lc) axact.GetZAxisCaptionActor2D().GetCaptionTextProperty().SetColor(lc) axact.PickableOff() icn = Icon(axact, size=0.1) plt.axes_instances[r] = icn icn.SetInteractor(plt.interactor) icn.EnabledOn() icn.InteractiveOff() plt.widgets.append(icn) elif plt.axes == 5: axact = vtki.new("AnnotatedCubeActor") axact.GetCubeProperty().SetColor(get_color(settings.annotated_cube_color)) axact.SetTextEdgesVisibility(0) axact.SetFaceTextScale(settings.annotated_cube_text_scale) axact.SetXPlusFaceText(settings.annotated_cube_texts[0]) # XPlus axact.SetXMinusFaceText(settings.annotated_cube_texts[1]) # XMinus axact.SetYPlusFaceText(settings.annotated_cube_texts[2]) # YPlus axact.SetYMinusFaceText(settings.annotated_cube_texts[3]) # YMinus axact.SetZPlusFaceText(settings.annotated_cube_texts[4]) # ZPlus axact.SetZMinusFaceText(settings.annotated_cube_texts[5]) # ZMinus axact.SetZFaceTextRotation(90) if settings.annotated_cube_text_color is None: # use default axact.GetXPlusFaceProperty().SetColor(get_color("r")) axact.GetXMinusFaceProperty().SetColor(get_color("dr")) axact.GetYPlusFaceProperty().SetColor(get_color("g")) axact.GetYMinusFaceProperty().SetColor(get_color("dg")) axact.GetZPlusFaceProperty().SetColor(get_color("b")) axact.GetZMinusFaceProperty().SetColor(get_color("db")) else: # use single user color ac = get_color(settings.annotated_cube_text_color) axact.GetXPlusFaceProperty().SetColor(ac) axact.GetXMinusFaceProperty().SetColor(ac) axact.GetYPlusFaceProperty().SetColor(ac) axact.GetYMinusFaceProperty().SetColor(ac) axact.GetZPlusFaceProperty().SetColor(ac) axact.GetZMinusFaceProperty().SetColor(ac) axact.PickableOff() icn = Icon(axact, size=0.06) plt.axes_instances[r] = icn icn.SetInteractor(plt.interactor) icn.EnabledOn() icn.InteractiveOff() plt.widgets.append(icn) elif plt.axes == 6: ocf = vtki.new("OutlineCornerFilter") ocf.SetCornerFactor(0.1) largestact, sz = None, -1 for a in plt.objects: try: if a.pickable(): b = a.bounds() if b is None: return d = max(b[1] - b[0], b[3] - b[2], b[5] - b[4]) if sz < d: largestact = a sz = d except AttributeError: pass try: ocf.SetInputData(largestact) except TypeError: try: ocf.SetInputData(largestact.dataset) except (TypeError, AttributeError): return ocf.Update() oc_mapper = vtki.new("HierarchicalPolyDataMapper") oc_mapper.SetInputConnection(0, ocf.GetOutputPort(0)) oc_actor = vtki.vtkActor() oc_actor.SetMapper(oc_mapper) bc = np.array(plt.renderer.GetBackground()) if np.sum(bc) < 1.5: lc = (1, 1, 1) else: lc = (0, 0, 0) oc_actor.GetProperty().SetColor(lc) oc_actor.PickableOff() oc_actor.UseBoundsOn() plt.axes_instances[r] = oc_actor plt.add(oc_actor) elif plt.axes == 7: vbb = compute_visible_bounds()[0] rulax = RulerAxes(vbb, c=c, xtitle="x - ", ytitle="y - ", ztitle="z - ") plt.axes_instances[r] = rulax if not rulax: return rulax.actor.UseBoundsOn() rulax.actor.PickableOff() plt.add(rulax) elif plt.axes == 8: vbb = compute_visible_bounds()[0] ca = vtki.new("CubeAxesActor") ca.SetBounds(vbb) ca.SetCamera(plt.renderer.GetActiveCamera()) ca.GetXAxesLinesProperty().SetColor(c) ca.GetYAxesLinesProperty().SetColor(c) ca.GetZAxesLinesProperty().SetColor(c) for i in range(3): ca.GetLabelTextProperty(i).SetColor(c) ca.GetTitleTextProperty(i).SetColor(c) ca.SetTitleOffset(5) ca.SetFlyMode(3) ca.SetXTitle("x") ca.SetYTitle("y") ca.SetZTitle("z") ca.PickableOff() ca.UseBoundsOff() plt.axes_instances[r] = ca plt.renderer.AddActor(ca) elif plt.axes == 9: vbb = compute_visible_bounds()[0] src = vtki.new("CubeSource") src.SetXLength(vbb[1] - vbb[0]) src.SetYLength(vbb[3] - vbb[2]) src.SetZLength(vbb[5] - vbb[4]) src.Update() ca = Mesh(src.GetOutput(), c, 0.5).wireframe(True) ca.pos((vbb[0] + vbb[1]) / 2, (vbb[3] + vbb[2]) / 2, (vbb[5] + vbb[4]) / 2) ca.actor.PickableOff() ca.actor.UseBoundsOff() plt.axes_instances[r] = ca plt.add(ca) elif plt.axes == 10: vbb = compute_visible_bounds()[0] x0 = (vbb[0] + vbb[1]) / 2, (vbb[3] + vbb[2]) / 2, (vbb[5] + vbb[4]) / 2 rx, ry, rz = (vbb[1] - vbb[0]) / 2, (vbb[3] - vbb[2]) / 2, (vbb[5] - vbb[4]) / 2 # compute diagonal length of the bounding box rm = np.sqrt(rx ** 2 + ry ** 2 + rz ** 2) d = 0.005 * rm xc = shapes.Disc(x0, r1=rm, r2=rm+d, c="lr", res=(1, 120)) yc = shapes.Disc(x0, r1=rm, r2=rm+d, c="lg", res=(1, 120)).rotate_x(90) zc = shapes.Disc(x0, r1=rm, r2=rm+d, c="lb", res=(1, 120)).rotate_y(90) xc.pickable(0).lighting("off") yc.pickable(0).lighting("off") zc.pickable(0).lighting("off") ca = xc + yc + zc ca.PickableOff() ca.UseBoundsOff() plt.axes_instances[r] = ca plt.add(ca) elif plt.axes == 11: vbb, ss = compute_visible_bounds()[0:2] xpos, ypos = (vbb[1] + vbb[0]) / 2, (vbb[3] + vbb[2]) / 2 gs = sum(ss) * 3 gr = shapes.Grid((xpos, ypos, vbb[4]), s=(gs, gs), res=(11, 11), c=c, alpha=0.1) gr.lighting("off").actor.PickableOff() gr.actor.UseBoundsOff() plt.axes_instances[r] = gr plt.add(gr) elif plt.axes == 12: polaxes = vtki.new("PolarAxesActor") vbb = compute_visible_bounds()[0] polaxes.SetPolarAxisTitle("radial distance") polaxes.SetPole(0, 0, vbb[4]) rd = max(abs(vbb[0]), abs(vbb[2]), abs(vbb[1]), abs(vbb[3])) polaxes.SetMaximumRadius(rd) polaxes.AutoSubdividePolarAxisOff() polaxes.SetNumberOfPolarAxisTicks(10) polaxes.SetCamera(plt.renderer.GetActiveCamera()) polaxes.SetPolarLabelFormat("%6.1f") polaxes.PolarLabelVisibilityOff() # due to bad overlap of labels polaxes.GetPolarArcsProperty().SetColor(c) polaxes.GetPolarAxisProperty().SetColor(c) polaxes.GetPolarAxisTitleTextProperty().SetColor(c) polaxes.GetPolarAxisLabelTextProperty().SetColor(c) polaxes.GetLastRadialAxisTextProperty().SetColor(c) polaxes.GetSecondaryRadialAxesTextProperty().SetColor(c) polaxes.GetSecondaryRadialAxesProperty().SetColor(c) polaxes.GetSecondaryPolarArcsProperty().SetColor(c) polaxes.SetMinimumAngle(0.0) polaxes.SetMaximumAngle(315.0) polaxes.SetNumberOfPolarAxisTicks(5) polaxes.UseBoundsOn() polaxes.PickableOff() plt.axes_instances[r] = polaxes plt.renderer.AddActor(polaxes) elif plt.axes == 13: # draws a simple ruler at the bottom of the window ls = vtki.new("LegendScaleActor") ls.RightAxisVisibilityOff() ls.TopAxisVisibilityOff() ls.LeftAxisVisibilityOff() ls.LegendVisibilityOff() ls.SetBottomBorderOffset(50) ls.GetBottomAxis().SetNumberOfMinorTicks(1) ls.GetBottomAxis().SetFontFactor(1.1) ls.GetBottomAxis().GetProperty().SetColor(c) ls.GetBottomAxis().GetProperty().SetOpacity(1.0) ls.GetBottomAxis().GetProperty().SetLineWidth(2) ls.GetBottomAxis().GetLabelTextProperty().SetColor(c) ls.GetBottomAxis().GetLabelTextProperty().BoldOff() ls.GetBottomAxis().GetLabelTextProperty().ItalicOff() pr = ls.GetBottomAxis().GetLabelTextProperty() pr.SetFontFamily(vtki.VTK_FONT_FILE) pr.SetFontFile(utils.get_font_path(settings.default_font)) ls.PickableOff() # if not plt.renderer.GetActiveCamera().GetParallelProjection(): # vedo.logger.warning("Axes type 13 should be used with parallel projection") plt.axes_instances[r] = ls plt.renderer.AddActor(ls) elif plt.axes == 14: try: cow = vtki.new("CameraOrientationWidget") cow.SetParentRenderer(plt.renderer) cow.On() plt.axes_instances[r] = cow except ImportError: vedo.logger.warning("axes mode 14 is unavailable in this vtk version") else: e = "Keyword axes type must be in range [0-13]." e += "Available axes types are:\n\n" e += "0 = no axes\n" e += "1 = draw three customizable gray grid walls\n" e += "2 = show cartesian axes from (0,0,0)\n" e += "3 = show positive range of cartesian axes from (0,0,0)\n" e += "4 = show a triad at bottom left\n" e += "5 = show a cube at bottom left\n" e += "6 = mark the corners of the bounding box\n" e += "7 = draw a 3D ruler at each side of the cartesian axes\n" e += "8 = show the vtkCubeAxesActor object\n" e += "9 = show the bounding box outline\n" e += "10 = show three circles representing the maximum bounding box\n" e += "11 = show a large grid on the x-y plane (use with zoom=8)\n" e += "12 = show polar axes\n" e += "13 = draw a simple ruler at the bottom of the window\n" e += "14 = show the CameraOrientationWidget object" vedo.logger.warning(e) if not plt.axes_instances[r]: plt.axes_instances[r] = True vedo-2025.5.3/vedo/applications.py000066400000000000000000002566771474667405700167550ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import time import numpy as np from typing import Union import vedo.vtkclasses as vtki import vedo from vedo.colors import color_map, get_color from vedo.utils import is_sequence, lin_interpolate, mag, precision from vedo.plotter import Plotter from vedo.pointcloud import fit_plane, Points from vedo.shapes import Line, Ribbon, Spline, Text2D from vedo.pyplot import CornerHistogram, histogram from vedo.addons import SliderWidget __docformat__ = "google" __doc__ = """ This module contains vedo applications which provide some *ready-to-use* funcionalities """ __all__ = [ "Browser", "IsosurfaceBrowser", "FreeHandCutPlotter", "RayCastPlotter", "Slicer2DPlotter", "Slicer3DPlotter", "Slicer3DTwinPlotter", "MorphPlotter", "SplinePlotter", "AnimationPlayer", ] ################################# class Slicer3DPlotter(Plotter): """ Generate a rendering window with slicing planes for the input Volume. """ def __init__( self, volume: vedo.Volume, cmaps=("gist_ncar_r", "hot_r", "bone", "bone_r", "jet", "Spectral_r"), clamp=True, use_slider3d=False, show_histo=True, show_icon=True, draggable=False, at=0, **kwargs, ): """ Generate a rendering window with slicing planes for the input Volume. Arguments: cmaps : (list) list of color maps names to cycle when clicking button clamp : (bool) clamp scalar range to reduce the effect of tails in color mapping use_slider3d : (bool) show sliders attached along the axes show_histo : (bool) show histogram on bottom left show_icon : (bool) show a small 3D rendering icon of the volume draggable : (bool) make the 3D icon draggable at : (int) subwindow number to plot to **kwargs : (dict) keyword arguments to pass to Plotter. Examples: - [slicer1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slicer1.py) """ ################################ super().__init__(**kwargs) self.at(at) ################################ cx, cy, cz, ch = "dr", "dg", "db", (0.3, 0.3, 0.3) if np.sum(self.renderer.GetBackground()) < 1.5: cx, cy, cz = "lr", "lg", "lb" ch = (0.8, 0.8, 0.8) if len(self.renderers) > 1: # 2d sliders do not work with multiple renderers use_slider3d = True self.volume = volume box = volume.box().alpha(0.2) self.add(box) volume_axes_inset = vedo.addons.Axes( box, xtitle=" ", ytitle=" ", ztitle=" ", yzgrid=False, xlabel_size=0, ylabel_size=0, zlabel_size=0, tip_size=0.08, axes_linewidth=3, xline_color="dr", yline_color="dg", zline_color="db", ) if show_icon: self.add_inset( volume, volume_axes_inset, pos=(0.9, 0.9), size=0.15, c="w", draggable=draggable, ) # inits la, ld = 0.7, 0.3 # ambient, diffuse dims = volume.dimensions() data = volume.pointdata[0] rmin, rmax = volume.scalar_range() if clamp: hdata, edg = np.histogram(data, bins=50) logdata = np.log(hdata + 1) # mean of the logscale plot meanlog = np.sum(np.multiply(edg[:-1], logdata)) / np.sum(logdata) rmax = min(rmax, meanlog + (meanlog - rmin) * 0.9) rmin = max(rmin, meanlog - (rmax - meanlog) * 0.9) # print("scalar range clamped to range: (" # + precision(rmin, 3) + ", " + precision(rmax, 3) + ")") self.cmap_slicer = cmaps[0] self.current_i = None self.current_j = None self.current_k = int(dims[2] / 2) self.xslice = None self.yslice = None self.zslice = None self.zslice = volume.zslice(self.current_k).lighting("", la, ld, 0) self.zslice.name = "ZSlice" self.zslice.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) self.add(self.zslice) self.histogram = None data_reduced = data if show_histo: # try to reduce the number of values to histogram dims = self.volume.dimensions() n = (dims[0] - 1) * (dims[1] - 1) * (dims[2] - 1) n = min(1_000_000, n) if data.ndim == 1: data_reduced = np.random.choice(data, n) self.histogram = histogram( data_reduced, # title=volume.filename, bins=20, logscale=True, c=self.cmap_slicer, bg=ch, alpha=1, axes=dict(text_scale=2), ).clone2d(pos=[-0.925, -0.88], size=0.4) self.add(self.histogram) ################# def slider_function_x(widget, event): i = int(self.xslider.value) if i == self.current_i: return self.current_i = i self.xslice = volume.xslice(i).lighting("", la, ld, 0) self.xslice.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) self.xslice.name = "XSlice" self.remove("XSlice") # removes the old one if 0 < i < dims[0]: self.add(self.xslice) self.render() def slider_function_y(widget, event): j = int(self.yslider.value) if j == self.current_j: return self.current_j = j self.yslice = volume.yslice(j).lighting("", la, ld, 0) self.yslice.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) self.yslice.name = "YSlice" self.remove("YSlice") if 0 < j < dims[1]: self.add(self.yslice) self.render() def slider_function_z(widget, event): k = int(self.zslider.value) if k == self.current_k: return self.current_k = k self.zslice = volume.zslice(k).lighting("", la, ld, 0) self.zslice.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) self.zslice.name = "ZSlice" self.remove("ZSlice") if 0 < k < dims[2]: self.add(self.zslice) self.render() if not use_slider3d: self.xslider = self.add_slider( slider_function_x, 0, dims[0], title="", title_size=0.5, pos=[(0.8, 0.12), (0.95, 0.12)], show_value=False, c=cx, ) self.yslider = self.add_slider( slider_function_y, 0, dims[1], title="", title_size=0.5, pos=[(0.8, 0.08), (0.95, 0.08)], show_value=False, c=cy, ) self.zslider = self.add_slider( slider_function_z, 0, dims[2], title="", title_size=0.6, value=int(dims[2] / 2), pos=[(0.8, 0.04), (0.95, 0.04)], show_value=False, c=cz, ) else: # 3d sliders attached to the axes bounds bs = box.bounds() self.xslider = self.add_slider3d( slider_function_x, pos1=(bs[0], bs[2], bs[4]), pos2=(bs[1], bs[2], bs[4]), xmin=0, xmax=dims[0], t=box.diagonal_size() / mag(box.xbounds()) * 0.6, c=cx, show_value=False, ) self.yslider = self.add_slider3d( slider_function_y, pos1=(bs[1], bs[2], bs[4]), pos2=(bs[1], bs[3], bs[4]), xmin=0, xmax=dims[1], t=box.diagonal_size() / mag(box.ybounds()) * 0.6, c=cy, show_value=False, ) self.zslider = self.add_slider3d( slider_function_z, pos1=(bs[0], bs[2], bs[4]), pos2=(bs[0], bs[2], bs[5]), xmin=0, xmax=dims[2], value=int(dims[2] / 2), t=box.diagonal_size() / mag(box.zbounds()) * 0.6, c=cz, show_value=False, ) ################# def button_func(obj, ename): bu.switch() self.cmap_slicer = bu.status() for m in self.objects: if "Slice" in m.name: m.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) self.remove(self.histogram) if show_histo: self.histogram = histogram( data_reduced, # title=volume.filename, bins=20, logscale=True, c=self.cmap_slicer, bg=ch, alpha=1, axes=dict(text_scale=2), ).clone2d(pos=[-0.925, -0.88], size=0.4) self.add(self.histogram) self.render() if len(cmaps) > 1: bu = self.add_button( button_func, states=cmaps, c=["k9"] * len(cmaps), bc=["k1"] * len(cmaps), # colors of states size=16, bold=True, ) if bu: bu.pos([0.04, 0.01], "bottom-left") #################################################################################### class Slicer3DTwinPlotter(Plotter): """ Create a window with two side-by-side 3D slicers for two Volumes. Arguments: vol1 : (Volume) the first Volume object to be isosurfaced. vol2 : (Volume) the second Volume object to be isosurfaced. clamp : (bool) clamp scalar range to reduce the effect of tails in color mapping **kwargs : (dict) keyword arguments to pass to Plotter. Example: ```python from vedo import * from vedo.applications import Slicer3DTwinPlotter vol1 = Volume(dataurl + "embryo.slc") vol2 = Volume(dataurl + "embryo.slc") plt = Slicer3DTwinPlotter( vol1, vol2, shape=(1, 2), sharecam=True, bg="white", bg2="lightblue", ) plt.at(0).add(Text2D("Volume 1", pos="top-center")) plt.at(1).add(Text2D("Volume 2", pos="top-center")) plt.show(viewup='z') plt.at(0).reset_camera() plt.interactive().close() ``` """ def __init__(self, vol1: vedo.Volume, vol2: vedo.Volume, clamp=True, **kwargs): super().__init__(**kwargs) cmap = "gist_ncar_r" cx, cy, cz = "dr", "dg", "db" # slider colors ambient, diffuse = 0.7, 0.3 # lighting params self.at(0) box1 = vol1.box().alpha(0.1) box2 = vol2.box().alpha(0.1) self.add(box1) self.at(1).add(box2) self.add_inset(vol2, pos=(0.85, 0.15), size=0.15, c="white", draggable=0) dims = vol1.dimensions() data = vol1.pointdata[0] rmin, rmax = vol1.scalar_range() if clamp: hdata, edg = np.histogram(data, bins=50) logdata = np.log(hdata + 1) meanlog = np.sum(np.multiply(edg[:-1], logdata)) / np.sum(logdata) rmax = min(rmax, meanlog + (meanlog - rmin) * 0.9) rmin = max(rmin, meanlog - (rmax - meanlog) * 0.9) def slider_function_x(widget, event): i = int(self.xslider.value) msh1 = vol1.xslice(i).lighting("", ambient, diffuse, 0) msh1.cmap(cmap, vmin=rmin, vmax=rmax) msh1.name = "XSlice" self.at(0).remove("XSlice") # removes the old one msh2 = vol2.xslice(i).lighting("", ambient, diffuse, 0) msh2.cmap(cmap, vmin=rmin, vmax=rmax) msh2.name = "XSlice" self.at(1).remove("XSlice") if 0 < i < dims[0]: self.at(0).add(msh1) self.at(1).add(msh2) def slider_function_y(widget, event): i = int(self.yslider.value) msh1 = vol1.yslice(i).lighting("", ambient, diffuse, 0) msh1.cmap(cmap, vmin=rmin, vmax=rmax) msh1.name = "YSlice" self.at(0).remove("YSlice") msh2 = vol2.yslice(i).lighting("", ambient, diffuse, 0) msh2.cmap(cmap, vmin=rmin, vmax=rmax) msh2.name = "YSlice" self.at(1).remove("YSlice") if 0 < i < dims[1]: self.at(0).add(msh1) self.at(1).add(msh2) def slider_function_z(widget, event): i = int(self.zslider.value) msh1 = vol1.zslice(i).lighting("", ambient, diffuse, 0) msh1.cmap(cmap, vmin=rmin, vmax=rmax) msh1.name = "ZSlice" self.at(0).remove("ZSlice") msh2 = vol2.zslice(i).lighting("", ambient, diffuse, 0) msh2.cmap(cmap, vmin=rmin, vmax=rmax) msh2.name = "ZSlice" self.at(1).remove("ZSlice") if 0 < i < dims[2]: self.at(0).add(msh1) self.at(1).add(msh2) self.at(0) bs = box1.bounds() self.xslider = self.add_slider3d( slider_function_x, pos1=(bs[0], bs[2], bs[4]), pos2=(bs[1], bs[2], bs[4]), xmin=0, xmax=dims[0], t=box1.diagonal_size() / mag(box1.xbounds()) * 0.6, c=cx, show_value=False, ) self.yslider = self.add_slider3d( slider_function_y, pos1=(bs[1], bs[2], bs[4]), pos2=(bs[1], bs[3], bs[4]), xmin=0, xmax=dims[1], t=box1.diagonal_size() / mag(box1.ybounds()) * 0.6, c=cy, show_value=False, ) self.zslider = self.add_slider3d( slider_function_z, pos1=(bs[0], bs[2], bs[4]), pos2=(bs[0], bs[2], bs[5]), xmin=0, xmax=dims[2], value=int(dims[2] / 2), t=box1.diagonal_size() / mag(box1.zbounds()) * 0.6, c=cz, show_value=False, ) ################# hist = CornerHistogram(data, s=0.2, bins=25, logscale=True, c="k") self.add(hist) slider_function_z(0, 0) ## init call ######################################################################################## class MorphPlotter(Plotter): """ A Plotter with 3 renderers to show the source, target and warped meshes. Examples: - [warp4b.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp4b.py) ![](https://vedo.embl.es/images/advanced/warp4b.jpg) """ def __init__(self, source, target, **kwargs): vedo.settings.enable_default_keyboard_callbacks = False vedo.settings.enable_default_mouse_callbacks = False kwargs.update({"N": 3}) kwargs.update({"sharecam": 0}) super().__init__(**kwargs) self.source = source.pickable(True) self.target = target.pickable(False) self.clicked = [] self.sources = [] self.targets = [] self.warped = None self.source_labels = None self.target_labels = None self.automatic_picking_distance = 0.075 self.cmap_name = "coolwarm" self.nbins = 25 self.msg0 = Text2D("Pick a point on the surface", pos="bottom-center", c='white', bg="blue4", alpha=1, font="Calco") self.msg1 = Text2D(pos="bottom-center", c='white', bg="blue4", alpha=1, font="Calco") self.instructions = Text2D(s=0.7, bg="blue4", alpha=0.1, font="Calco") self.instructions.text( " Morphological alignment of 3D surfaces\n\n" "Pick a point on the source surface, then\n" "pick the corresponding point on the target \n" "Pick at least 4 point pairs. Press:\n" "- c to clear all landmarks\n" "- d to delete the last landmark pair\n" "- a to auto-pick additional landmarks\n" "- z to compute and show the residuals\n" "- q to quit and proceed" ) self.at(0).add_renderer_frame() self.add(source, self.msg0, self.instructions).reset_camera() self.at(1).add_renderer_frame() self.add(Text2D(f"Target: {target.filename[-35:]}", bg="blue4", alpha=0.1, font="Calco")) self.add(self.msg1, target) cam1 = self.camera # save camera at 1 self.at(2).background("k9") self.add(target, Text2D("Morphing Output", font="Calco")) self.camera = cam1 # use the same camera of renderer1 self.add_renderer_frame() self.callid1 = self.add_callback("KeyPress", self.on_keypress) self.callid2 = self.add_callback("LeftButtonPress", self.on_click) self._interactive = True ################################################ def update(self): source_pts = Points(self.sources).color("purple5").ps(12) target_pts = Points(self.targets).color("purple5").ps(12) source_pts.name = "source_pts" target_pts.name = "target_pts" self.source_labels = source_pts.labels2d("id", c="purple3") self.target_labels = target_pts.labels2d("id", c="purple3") self.source_labels.name = "source_pts" self.target_labels.name = "target_pts" self.at(0).remove("source_pts").add(source_pts, self.source_labels) self.at(1).remove("target_pts").add(target_pts, self.target_labels) self.render() if len(self.sources) == len(self.targets) and len(self.sources) > 3: self.warped = self.source.clone().warp(self.sources, self.targets) self.warped.name = "warped" self.at(2).remove("warped").add(self.warped) self.render() def on_click(self, evt): if evt.object == self.source: self.sources.append(evt.picked3d) self.source.pickable(False) self.target.pickable(True) self.msg0.text("--->") self.msg1.text("now pick a target point") self.update() elif evt.object == self.target: self.targets.append(evt.picked3d) self.source.pickable(True) self.target.pickable(False) self.msg0.text("now pick a source point") self.msg1.text("<---") self.update() def on_keypress(self, evt): if evt.keypress == "c": self.sources.clear() self.targets.clear() self.at(0).remove("source_pts") self.at(1).remove("target_pts") self.at(2).remove("warped") self.msg0.text("CLEARED! Pick a point here") self.msg1.text("") self.source.pickable(True) self.target.pickable(False) self.update() if evt.keypress == "w": rep = (self.warped.properties.GetRepresentation() == 1) self.warped.wireframe(not rep) self.render() if evt.keypress == "d": n = min(len(self.sources), len(self.targets)) self.sources = self.sources[:n-1] self.targets = self.targets[:n-1] self.msg0.text("Last point deleted! Pick a point here") self.msg1.text("") self.source.pickable(True) self.target.pickable(False) self.update() if evt.keypress == "a": # auto-pick points on the target surface if not self.warped: vedo.printc("At least 4 points are needed.", c="r") return pts = self.target.clone().subsample(self.automatic_picking_distance) if len(self.sources) > len(self.targets): self.sources.pop() d = self.target.diagonal_size() r = d * self.automatic_picking_distance TI = self.warped.transform.compute_inverse() for p in pts.coordinates: pp = vedo.utils.closest(p, self.targets)[1] if vedo.mag(pp - p) < r: continue q = self.warped.closest_point(p) self.sources.append(TI(q)) self.targets.append(p) self.source.pickable(True) self.target.pickable(False) self.update() if evt.keypress == "z" or evt.keypress == "a": dists = self.warped.distance_to(self.target, signed=True) v = np.std(dists) * 2 self.warped.cmap(self.cmap_name, dists, vmin=-v, vmax=+v) h = vedo.pyplot.histogram( dists, bins=self.nbins, title=" ", xtitle=f"STD = {v/2:.2f}", ytitle="", c=self.cmap_name, xlim=(-v, v), aspect=16/9, axes=dict( number_of_divisions=5, text_scale=2, xtitle_offset=0.075, xlabel_justify="top-center"), ) # try to fit a gaussian to the histogram def gauss(x, A, B, sigma): return A + B * np.exp(-x**2 / (2 * sigma**2)) try: from scipy.optimize import curve_fit inits = [0, len(dists)/self.nbins*2.5, v/2] popt, _ = curve_fit(gauss, xdata=h.centers, ydata=h.frequencies, p0=inits) x = np.linspace(-v, v, 300) h += vedo.pyplot.plot(x, gauss(x, *popt), like=h, lw=1, lc="k2") h["Axes"]["xtitle"].text(f":sigma = {abs(popt[2]):.3f}", font="VictorMono") except: pass h = h.clone2d(pos="bottom-left", size=0.575) h.name = "warped" self.at(2).add(h) self.render() if evt.keypress == "q": self.break_interaction() ######################################################################################## class Slicer2DPlotter(Plotter): """ A single slice of a Volume which always faces the camera, but at the same time can be oriented arbitrarily in space. """ def __init__(self, vol: vedo.Volume, levels=(None, None), histo_color="red4", **kwargs): """ A single slice of a Volume which always faces the camera, but at the same time can be oriented arbitrarily in space. Arguments: vol : (Volume) the Volume object to be isosurfaced. levels : (list) window and color levels histo_color : (color) histogram color, use `None` to disable it **kwargs : (dict) keyword arguments to pass to `Plotter`. """ if "shape" not in kwargs: custom_shape = [ # define here the 2 rendering rectangle spaces dict(bottomleft=(0.0, 0.0), topright=(1, 1), bg="k9"), # the full window dict(bottomleft=(0.8, 0.8), topright=(1, 1), bg="k8", bg2="lb"), ] kwargs["shape"] = custom_shape if "interactive" not in kwargs: kwargs["interactive"] = True super().__init__(**kwargs) self.user_mode("image") self.add_callback("KeyPress", self.on_key_press) orig_volume = vol.clone(deep=False) self.volume = vol self.volume.actor = vtki.new("ImageSlice") self.volume.properties = self.volume.actor.GetProperty() self.volume.properties.SetInterpolationTypeToLinear() self.volume.mapper = vtki.new("ImageResliceMapper") self.volume.mapper.SetInputData(self.volume.dataset) self.volume.mapper.SliceFacesCameraOn() self.volume.mapper.SliceAtFocalPointOn() self.volume.mapper.SetAutoAdjustImageQuality(False) self.volume.mapper.BorderOff() # no argument will grab the existing cmap in vol (or use build_lut()) self.lut = None self.cmap() if levels[0] and levels[1]: self.lighting(window=levels[0], level=levels[1]) self.usage_txt = ( "H :rightarrow Toggle this banner on/off\n" "Left click & drag :rightarrow Modify luminosity and contrast\n" "SHIFT-Left click :rightarrow Slice image obliquely\n" "SHIFT-Middle click :rightarrow Slice image perpendicularly\n" "SHIFT-R :rightarrow Fly to closest cartesian view\n" "SHIFT-U :rightarrow Toggle parallel projection" ) self.usage = Text2D( self.usage_txt, font="Calco", pos="top-left", s=0.8, bg="yellow", alpha=0.25 ) hist = None if histo_color is not None: data = self.volume.pointdata[0] arr = data if data.ndim == 1: # try to reduce the number of values to histogram dims = self.volume.dimensions() n = (dims[0] - 1) * (dims[1] - 1) * (dims[2] - 1) n = min(1_000_000, n) arr = np.random.choice(self.volume.pointdata[0], n) hist = vedo.pyplot.histogram( arr, bins=12, logscale=True, c=histo_color, ytitle="log_10 (counts)", axes=dict(text_scale=1.9), ).clone2d(pos="bottom-left", size=0.4) axes = kwargs.pop("axes", 7) axe = None if axes == 7: axe = vedo.addons.RulerAxes( orig_volume, xtitle="x - ", ytitle="y - ", ztitle="z - " ) box = orig_volume.box().alpha(0.25) volume_axes_inset = vedo.addons.Axes( box, yzgrid=False, xlabel_size=0, ylabel_size=0, zlabel_size=0, tip_size=0.08, axes_linewidth=3, xline_color="dr", yline_color="dg", zline_color="db", xtitle_color="dr", ytitle_color="dg", ztitle_color="db", xtitle_size=0.1, ytitle_size=0.1, ztitle_size=0.1, title_font="VictorMono", ) self.at(0).add(self.volume, box, axe, self.usage, hist) self.at(1).add(orig_volume, volume_axes_inset) self.at(0) # set focus at renderer 0 #################################################################### def on_key_press(self, evt): if evt.keypress == "q": self.break_interaction() elif evt.keypress.lower() == "h": t = self.usage if len(t.text()) > 50: self.usage.text("Press H to show help") else: self.usage.text(self.usage_txt) self.render() def cmap(self, lut=None, fix_scalar_range=False) -> "Slicer2DPlotter": """ Assign a LUT (Look Up Table) to colorize the slice, leave it `None` to reuse an existing Volume color map. Use "bw" for automatic black and white. """ if lut is None and self.lut: self.volume.properties.SetLookupTable(self.lut) elif isinstance(lut, vtki.vtkLookupTable): self.volume.properties.SetLookupTable(lut) elif lut == "bw": self.volume.properties.SetLookupTable(None) self.volume.properties.SetUseLookupTableScalarRange(fix_scalar_range) return self def alpha(self, value: float) -> "Slicer2DPlotter": """Set opacity to the slice""" self.volume.properties.SetOpacity(value) return self def auto_adjust_quality(self, value=True) -> "Slicer2DPlotter": """Automatically reduce the rendering quality for greater speed when interacting""" self.volume.mapper.SetAutoAdjustImageQuality(value) return self def slab(self, thickness=0, mode=0, sample_factor=2) -> "Slicer2DPlotter": """ Make a thick slice (slab). Arguments: thickness : (float) set the slab thickness, for thick slicing mode : (int) The slab type: 0 = min 1 = max 2 = mean 3 = sum sample_factor : (float) Set the number of slab samples to use as a factor of the number of input slices within the slab thickness. The default value is 2, but 1 will increase speed with very little loss of quality. """ self.volume.mapper.SetSlabThickness(thickness) self.volume.mapper.SetSlabType(mode) self.volume.mapper.SetSlabSampleFactor(sample_factor) return self def face_camera(self, value=True) -> "Slicer2DPlotter": """Make the slice always face the camera or not.""" self.volume.mapper.SetSliceFacesCameraOn(value) return self def jump_to_nearest_slice(self, value=True) -> "Slicer2DPlotter": """ This causes the slicing to occur at the closest slice to the focal point, instead of the default behavior where a new slice is interpolated between the original slices. Nothing happens if the plane is oblique to the original slices. """ self.volume.mapper.SetJumpToNearestSlice(value) return self def fill_background(self, value=True) -> "Slicer2DPlotter": """ Instead of rendering only to the image border, render out to the viewport boundary with the background color. The background color will be the lowest color on the lookup table that is being used for the image. """ self.volume.mapper.SetBackground(value) return self def lighting(self, window, level, ambient=1.0, diffuse=0.0) -> "Slicer2DPlotter": """Assign the values for window and color level.""" self.volume.properties.SetColorWindow(window) self.volume.properties.SetColorLevel(level) self.volume.properties.SetAmbient(ambient) self.volume.properties.SetDiffuse(diffuse) return self ######################################################################## class RayCastPlotter(Plotter): """ Generate Volume rendering using ray casting. """ def __init__(self, volume, **kwargs): """ Generate a window for Volume rendering using ray casting. Arguments: volume : (Volume) the Volume object to be isosurfaced. **kwargs : (dict) keyword arguments to pass to Plotter. Returns: `vedo.Plotter` object. Examples: - [app_raycaster.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/app_raycaster.py) ![](https://vedo.embl.es/images/advanced/app_raycaster.gif) """ super().__init__(**kwargs) self.alphaslider0 = 0.33 self.alphaslider1 = 0.66 self.alphaslider2 = 1 self.color_scalarbar = None self.properties = volume.properties if volume.dimensions()[2] < 3: vedo.logger.error("RayCastPlotter: not enough z slices.") raise RuntimeError smin, smax = volume.scalar_range() x0alpha = smin + (smax - smin) * 0.25 x1alpha = smin + (smax - smin) * 0.5 x2alpha = smin + (smax - smin) * 1.0 ############################## color map slider # Create transfer mapping scalar value to color cmaps = [ "rainbow", "rainbow_r", "viridis", "viridis_r", "bone", "bone_r", "hot", "hot_r", "plasma", "plasma_r", "gist_earth", "gist_earth_r", "coolwarm", "coolwarm_r", "tab10_r", ] cols_cmaps = [] for cm in cmaps: cols = color_map(range(0, 21), cm, 0, 20) # sample 20 colors cols_cmaps.append(cols) Ncols = len(cmaps) csl = "k9" if sum(get_color(self.background())) > 1.5: csl = "k1" def slider_cmap(widget=None, event=""): if widget: k = int(widget.value) volume.cmap(cmaps[k]) self.remove(self.color_scalarbar) self.color_scalarbar = vedo.addons.ScalarBar( volume, horizontal=True, pos=[(0.8, 0), (0.97, 0.1)], font_size=0 ) self.add(self.color_scalarbar) w1 = self.add_slider( slider_cmap, 0, Ncols - 1, value=0, show_value=False, c=csl, pos=[(0.8, 0.05), (0.965, 0.05)], ) w1.representation.SetTitleHeight(0.018) ############################## alpha sliders # Create transfer mapping scalar value to opacity transfer function def setOTF(): otf = self.properties.GetScalarOpacity() otf.RemoveAllPoints() otf.AddPoint(smin, 0.0) otf.AddPoint(smin + (smax - smin) * 0.1, 0.0) otf.AddPoint(x0alpha, self.alphaslider0) otf.AddPoint(x1alpha, self.alphaslider1) otf.AddPoint(x2alpha, self.alphaslider2) slider_cmap() setOTF() ################ def sliderA0(widget, event): self.alphaslider0 = widget.value setOTF() self.add_slider( sliderA0, 0, 1, value=self.alphaslider0, pos=[(0.84, 0.1), (0.84, 0.26)], c=csl, show_value=0, ) def sliderA1(widget, event): self.alphaslider1 = widget.value setOTF() self.add_slider( sliderA1, 0, 1, value=self.alphaslider1, pos=[(0.89, 0.1), (0.89, 0.26)], c=csl, show_value=0, ) def sliderA2(widget, event): self.alphaslider2 = widget.value setOTF() w2 = self.add_slider( sliderA2, 0, 1, value=self.alphaslider2, pos=[(0.96, 0.1), (0.96, 0.26)], c=csl, show_value=0, title="Opacity Levels", ) w2.GetRepresentation().SetTitleHeight(0.015) # add a button def button_func_mode(_obj, _ename): s = volume.mode() snew = (s + 1) % 2 volume.mode(snew) bum.switch() bum = self.add_button( button_func_mode, pos=(0.89, 0.31), states=[" composite ", "max projection"], c=[ "k3", "k6"], bc=["k6", "k3"], # colors of states font="Calco", size=18, bold=0, italic=False, ) bum.frame(color="k6") bum.status(volume.mode()) slider_cmap() ############# init call to create scalarbar # add histogram of scalar plot = CornerHistogram( volume, bins=25, logscale=1, c='k5', bg='k5', pos=(0.78, 0.065), lines=True, dots=False, nmax=3.1415e06, # subsample otherwise is too slow ) plot.GetPosition2Coordinate().SetValue(0.197, 0.20, 0) plot.GetXAxisActor2D().SetFontFactor(0.7) plot.GetProperty().SetOpacity(0.5) self.add([plot, volume]) ##################################################################################### class IsosurfaceBrowser(Plotter): """ Generate a Volume isosurfacing controlled by a slider. """ def __init__( self, volume: vedo.Volume, isovalue=None, scalar_range=(), c=None, alpha=1, lego=False, res=50, use_gpu=False, precompute=False, cmap="hot", delayed=False, sliderpos=4, **kwargs, ) -> None: """ Generate a `vedo.Plotter` for Volume isosurfacing using a slider. Arguments: volume : (Volume) the Volume object to be isosurfaced. isovalues : (float, list) isosurface value(s) to be displayed. scalar_range : (list) scalar range to be used. c : str, (list) color(s) of the isosurface(s). alpha : (float, list) opacity of the isosurface(s). lego : (bool) if True generate a lego plot instead of a surface. res : (int) resolution of the isosurface. use_gpu : (bool) use GPU acceleration. precompute : (bool) precompute the isosurfaces (so slider browsing will be smoother). cmap : (str) color map name to be used. delayed : (bool) delay the slider update on mouse release. sliderpos : (int) position of the slider. **kwargs : (dict) keyword arguments to pass to Plotter. Examples: - [app_isobrowser.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/app_isobrowser.py) ![](https://vedo.embl.es/images/advanced/app_isobrowser.gif) """ super().__init__(**kwargs) self.slider = None ### GPU ################################ if use_gpu and hasattr(volume.properties, "GetIsoSurfaceValues"): if len(scalar_range) == 2: scrange = scalar_range else: scrange = volume.scalar_range() delta = scrange[1] - scrange[0] if not delta: return if isovalue is None: isovalue = delta / 3.0 + scrange[0] ### isovalue slider callback def slider_isovalue(widget, event): value = widget.GetRepresentation().GetValue() isovals.SetValue(0, value) isovals = volume.properties.GetIsoSurfaceValues() isovals.SetValue(0, isovalue) self.add(volume.mode(5).alpha(alpha).cmap(c)) self.slider = self.add_slider( slider_isovalue, scrange[0] + 0.02 * delta, scrange[1] - 0.02 * delta, value=isovalue, pos=sliderpos, title="scalar value", show_value=True, delayed=delayed, ) ### CPU ################################ else: self._prev_value = 1e30 scrange = volume.scalar_range() delta = scrange[1] - scrange[0] if not delta: return if lego: res = int(res / 2) # because lego is much slower slidertitle = "" else: slidertitle = "scalar value" allowed_vals = np.linspace(scrange[0], scrange[1], num=res) bacts = {} # cache the meshes so we dont need to recompute if precompute: delayed = False # no need to delay the slider in this case for value in allowed_vals: value_name = precision(value, 2) if lego: mesh = volume.legosurface(vmin=value) if mesh.ncells: mesh.cmap(cmap, vmin=scrange[0], vmax=scrange[1], on="cells") else: mesh = volume.isosurface(value).color(c).alpha(alpha) bacts.update({value_name: mesh}) # store it ### isovalue slider callback def slider_isovalue(widget, event): prevact = self.vol_actors[0] if isinstance(widget, float): value = widget else: value = widget.GetRepresentation().GetValue() # snap to the closest idx = (np.abs(allowed_vals - value)).argmin() value = allowed_vals[idx] if abs(value - self._prev_value) / delta < 0.001: return self._prev_value = value value_name = precision(value, 2) if value_name in bacts: # reusing the already existing mesh # print('reusing') mesh = bacts[value_name] else: # else generate it # print('generating', value) if lego: mesh = volume.legosurface(vmin=value) if mesh.ncells: mesh.cmap(cmap, vmin=scrange[0], vmax=scrange[1], on="cells") else: mesh = volume.isosurface(value).color(c).alpha(alpha) bacts.update({value_name: mesh}) # store it self.remove(prevact).add(mesh) self.vol_actors[0] = mesh ################################################ if isovalue is None: isovalue = delta / 3.0 + scrange[0] self.vol_actors = [None] slider_isovalue(isovalue, "") # init call if lego: if self.vol_actors[0]: self.vol_actors[0].add_scalarbar(pos=(0.8, 0.12)) self.slider = self.add_slider( slider_isovalue, scrange[0] + 0.02 * delta, scrange[1] - 0.02 * delta, value=isovalue, pos=sliderpos, title=slidertitle, show_value=True, delayed=delayed, ) ############################################################################## class Browser(Plotter): """Browse a series of vedo objects by using a simple slider.""" def __init__( self, objects=(), sliderpos=((0.50, 0.07), (0.95, 0.07)), c=None, # slider color slider_title="", font="Calco", # slider font resetcam=False, # resetcam while using the slider **kwargs, ): """ Browse a series of vedo objects by using a simple slider. The input object can be a list of objects or a list of lists of objects. Arguments: objects : (list) list of objects to be browsed. sliderpos : (list) position of the slider. c : (str) color of the slider. slider_title : (str) title of the slider. font : (str) font of the slider. resetcam : (bool) resetcam while using the slider. **kwargs : (dict) keyword arguments to pass to Plotter. Examples: ```python from vedo import load, dataurl from vedo.applications import Browser meshes = load(dataurl+'timecourse1d.npy') # python list of Meshes plt = Browser(meshes, bg='k') # vedo.Plotter plt.show(interactive=False, zoom='tight') # show the meshes plt.play(dt=50) # delay in milliseconds plt.close() ``` - [morphomatics_tube.py](https://github.com/marcomusy/vedo/tree/master/examples/other/morphomatics_tube.py) """ kwargs.pop("N", 1) kwargs.pop("shape", []) kwargs.pop("axes", 1) super().__init__(**kwargs) if isinstance(objects, str): objects = vedo.file_io.load(objects) self += objects if len(objects) and is_sequence(objects[0]): nobs = len(objects[0]) for ob in objects: n = len(ob) msg = f"in Browser lists must have the same length but found {n} and {nobs}" assert len(ob) == nobs, msg else: nobs = len(objects) if nobs: objects = [objects] self.slider = None self.timer_callback_id = None self._oldk = None # define the slider func ########################## def slider_function(widget=None, event=None): k = int(self.slider.value) if k == self._oldk: return # no change self._oldk = k n = len(objects) m = len(objects[0]) for i in range(n): for j in range(m): ak = objects[i][j] try: if j == k: ak.on() akon = ak else: ak.off() except AttributeError: pass try: tx = str(k) if slider_title: tx = slider_title + " " + tx elif n == 1 and akon.filename: tx = akon.filename.split("/")[-1] tx = tx.split("\\")[-1] # windows os elif akon.name: tx = ak.name + " " + tx except: pass self.slider.title = tx if resetcam: self.reset_camera() self.render() ################################################## self.slider_function = slider_function self.slider = self.add_slider( slider_function, 0.5, nobs - 0.5, pos=sliderpos, font=font, c=c, show_value=False, ) self.slider.GetRepresentation().SetTitleHeight(0.020) slider_function() # init call def play(self, dt=100): """Start playing the slides at a given speed.""" self.timer_callback_id = self.add_callback("timer", self.slider_function) self.timer_callback("start", dt=dt) self.interactive() ############################################################################################# class FreeHandCutPlotter(Plotter): """A tool to edit meshes interactively.""" # thanks to Jakub Kaminski for the original version of this script def __init__( self, mesh: Union[vedo.Mesh, vedo.Points], splined=True, font="Bongas", alpha=0.9, lw=4, lc="red5", pc="red4", c="green3", tc="k9", tol=0.008, **options, ): """ A `vedo.Plotter` derived class which edits polygonal meshes interactively. Can also be invoked from command line with: ```bash vedo --edit https://vedo.embl.es/examples/data/porsche.ply ``` Usage: - Left-click and hold to rotate - Right-click and move to draw line - Second right-click to stop drawing - Press "c" to clear points - "z/Z" to cut mesh (Z inverts inside-out the selection area) - "L" to keep only the largest connected surface - "s" to save mesh to file (tag `_edited` is appended to filename) - "u" to undo last action - "h" for help, "i" for info Arguments: mesh : (Mesh, Points) The input Mesh or pointcloud. splined : (bool) join points with a spline or a simple line. font : (str) Font name for the instructions. alpha : (float) transparency of the instruction message panel. lw : (str) selection line width. lc : (str) selection line color. pc : (str) selection points color. c : (str) background color of instructions. tc : (str) text color of instructions. tol : (int) tolerance of the point proximity. **kwargs : (dict) keyword arguments to pass to Plotter. Examples: - [cut_freehand.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/cut_freehand.py) ![](https://vedo.embl.es/images/basic/cutFreeHand.gif) """ if not isinstance(mesh, Points): vedo.logger.error("FreeHandCutPlotter input must be Points or Mesh") raise RuntimeError() super().__init__(**options) self.mesh = mesh self.mesh_prev = mesh self.splined = splined self.linecolor = lc self.linewidth = lw self.pointcolor = pc self.color = c self.alpha = alpha self.msg = "Right-click and move to draw line\n" self.msg += "Second right-click to stop drawing\n" self.msg += "Press L to extract largest surface\n" self.msg += " z/Z to cut mesh (s to save)\n" self.msg += " c to clear points, u to undo" self.txt2d = Text2D(self.msg, pos="top-left", font=font, s=0.9) self.txt2d.c(tc).background(c, alpha).frame() self.idkeypress = self.add_callback("KeyPress", self._on_keypress) self.idrightclck = self.add_callback("RightButton", self._on_right_click) self.idmousemove = self.add_callback("MouseMove", self._on_mouse_move) self.drawmode = False self.tol = tol # tolerance of point distance self.cpoints = [] self.points = None self.spline = None self.jline = None self.topline = None self.top_pts = [] def init(self, init_points): """Set an initial number of points to define a region""" if isinstance(init_points, Points): self.cpoints = init_points.coordinates else: self.cpoints = np.array(init_points) self.points = Points(self.cpoints, r=self.linewidth).c(self.pointcolor).pickable(0) if self.splined: self.spline = Spline(self.cpoints, res=len(self.cpoints) * 4) else: self.spline = Line(self.cpoints) self.spline.lw(self.linewidth).c(self.linecolor).pickable(False) self.jline = Line(self.cpoints[0], self.cpoints[-1], lw=1, c=self.linecolor).pickable(0) self.add([self.points, self.spline, self.jline]).render() return self def _on_right_click(self, evt): self.drawmode = not self.drawmode # toggle mode if self.drawmode: self.txt2d.background(self.linecolor, self.alpha) else: self.txt2d.background(self.color, self.alpha) if len(self.cpoints) > 2: self.remove([self.spline, self.jline]) if self.splined: # show the spline closed self.spline = Spline(self.cpoints, closed=True, res=len(self.cpoints) * 4) else: self.spline = Line(self.cpoints, closed=True) self.spline.lw(self.linewidth).c(self.linecolor).pickable(False) self.add(self.spline) self.render() def _on_mouse_move(self, evt): if self.drawmode: cpt = self.compute_world_coordinate(evt.picked2d) # make this 2d-screen point 3d if self.cpoints and mag(cpt - self.cpoints[-1]) < self.mesh.diagonal_size() * self.tol: return # new point is too close to the last one. skip self.cpoints.append(cpt) if len(self.cpoints) > 2: self.remove([self.points, self.spline, self.jline, self.topline]) self.points = Points(self.cpoints, r=self.linewidth).c(self.pointcolor).pickable(0) if self.splined: self.spline = Spline(self.cpoints, res=len(self.cpoints) * 4) # not closed here else: self.spline = Line(self.cpoints) if evt.actor: self.top_pts.append(evt.picked3d) self.topline = Points(self.top_pts, r=self.linewidth) self.topline.c(self.linecolor).pickable(False) self.spline.lw(self.linewidth).c(self.linecolor).pickable(False) self.txt2d.background(self.linecolor) self.jline = Line(self.cpoints[0], self.cpoints[-1], lw=1, c=self.linecolor).pickable(0) self.add([self.points, self.spline, self.jline, self.topline]).render() def _on_keypress(self, evt): if evt.keypress.lower() == "z" and self.spline: # Cut mesh with a ribbon-like surface inv = False if evt.keypress == "Z": inv = True self.txt2d.background("red8").text(" ... working ... ") self.render() self.mesh_prev = self.mesh.clone() tol = self.mesh.diagonal_size() / 2 # size of ribbon (not shown) pts = self.spline.coordinates n = fit_plane(pts, signed=True).normal # compute normal vector to points rb = Ribbon(pts - tol * n, pts + tol * n, closed=True) self.mesh.cut_with_mesh(rb, invert=inv) # CUT self.txt2d.text(self.msg) # put back original message if self.drawmode: self._on_right_click(evt) # toggle mode to normal else: self.txt2d.background(self.color, self.alpha) self.remove([self.spline, self.points, self.jline, self.topline]).render() self.cpoints, self.points, self.spline = [], None, None self.top_pts, self.topline = [], None elif evt.keypress == "L": self.txt2d.background("red8") self.txt2d.text(" ... removing smaller ... \n ... parts of the mesh ... ") self.render() self.remove(self.mesh) self.mesh_prev = self.mesh mcut = self.mesh.extract_largest_region() mcut.filename = self.mesh.filename # copy over various properties mcut.name = self.mesh.name mcut.scalarbar = self.mesh.scalarbar mcut.info = self.mesh.info self.mesh = mcut # discard old mesh by overwriting it self.txt2d.text(self.msg).background(self.color) # put back original message self.add(mcut).render() elif evt.keypress == "u": # Undo last action if self.drawmode: self._on_right_click(evt) # toggle mode to normal else: self.txt2d.background(self.color, self.alpha) self.remove([self.mesh, self.spline, self.jline, self.points, self.topline]) self.mesh = self.mesh_prev self.cpoints, self.points, self.spline = [], None, None self.top_pts, self.topline = [], None self.add(self.mesh).render() elif evt.keypress in ("c", "Delete"): # clear all points self.remove([self.spline, self.points, self.jline, self.topline]).render() self.cpoints, self.points, self.spline = [], None, None self.top_pts, self.topline = [], None elif evt.keypress == "r": # reset camera and axes try: self.remove(self.axes_instances[0]) self.axes_instances[0] = None self.add_global_axes(axtype=1, c=None, bounds=self.mesh.bounds()) self.renderer.ResetCamera() self.render() except: pass elif evt.keypress == "s": if self.mesh.filename: fname = os.path.basename(self.mesh.filename) fname, extension = os.path.splitext(fname) fname = fname.replace("_edited", "") fname = f"{fname}_edited{extension}" else: fname = "mesh_edited.vtk" self.write(fname) def write(self, filename="mesh_edited.vtk") -> "FreeHandCutPlotter": """Save the resulting mesh to file""" self.mesh.write(filename) vedo.logger.info(f"mesh saved to file {filename}") return self def start(self, *args, **kwargs) -> "FreeHandCutPlotter": """Start window interaction (with mouse and keyboard)""" acts = [self.txt2d, self.mesh, self.points, self.spline, self.jline] self.show(acts + list(args), **kwargs) return self ######################################################################## class SplinePlotter(Plotter): """ Interactive drawing of splined curves on meshes. """ def __init__(self, obj, init_points=(), closed=False, splined=True, mode="auto", **kwargs): """ Create an interactive application that allows the user to click points and retrieve the coordinates of such points and optionally a spline or line (open or closed). Input object can be a image file name or a 3D mesh. Arguments: obj : (Mesh, str) The input object can be a image file name or a 3D mesh. init_points : (list) Set an initial number of points to define a region. closed : (bool) Close the spline or line. splined : (bool) Join points with a spline or a simple line. mode : (str) Set the mode of interaction. **kwargs : (dict) keyword arguments to pass to Plotter. """ super().__init__(**kwargs) self.verbose = True self.splined = splined self.resolution = None # spline resolution (None = automatic) self.closed = closed self.lcolor = "yellow4" self.lwidth = 3 self.pcolor = "purple5" self.psize = 10 self.cpoints = list(init_points) self.vpoints = None self.line = None if isinstance(obj, str): self.object = vedo.file_io.load(obj) else: self.object = obj self.mode = mode if self.mode == "auto": if isinstance(self.object, vedo.Image): self.mode = "image" self.parallel_projection(True) else: self.mode = "TrackballCamera" t = ( "Click to add a point\n" "Right-click to remove it\n" "Drag mouse to change contrast\n" "Press c to clear points\n" "Press q to continue" ) self.instructions = Text2D(t, pos="bottom-left", c="white", bg="green", font="Calco") self += [self.object, self.instructions] self.callid1 = self.add_callback("KeyPress", self._key_press) self.callid2 = self.add_callback("LeftButtonPress", self._on_left_click) self.callid3 = self.add_callback("RightButtonPress", self._on_right_click) def points(self, newpts=None) -> Union["SplinePlotter", np.ndarray]: """Retrieve the 3D coordinates of the clicked points""" if newpts is not None: self.cpoints = newpts self.update() return self return np.array(self.cpoints) def _on_left_click(self, evt): if not evt.actor: return if evt.actor.name == "points": # remove clicked point if clicked twice pid = self.vpoints.closest_point(evt.picked3d, return_point_id=True) self.cpoints.pop(pid) self.update() return p = evt.picked3d self.cpoints.append(p) self.update() if self.verbose: vedo.colors.printc("Added point:", precision(p, 4), c="g") def _on_right_click(self, evt): if evt.actor and len(self.cpoints) > 0: self.cpoints.pop() # pop removes from the list the last pt self.update() if self.verbose: vedo.colors.printc("Deleted last point", c="r") def update(self): self.remove(self.line, self.vpoints) # remove old points and spline self.vpoints = Points(self.cpoints).ps(self.psize).c(self.pcolor) self.vpoints.name = "points" self.vpoints.pickable(True) # to allow toggle minnr = 1 if self.splined: minnr = 2 if self.lwidth and len(self.cpoints) > minnr: if self.splined: try: self.line = Spline(self.cpoints, closed=self.closed, res=self.resolution) except ValueError: # if clicking too close splining might fail self.cpoints.pop() return else: self.line = Line(self.cpoints, closed=self.closed) self.line.c(self.lcolor).lw(self.lwidth).pickable(False) self.add(self.vpoints, self.line) else: self.add(self.vpoints) def _key_press(self, evt): if evt.keypress == "c": self.cpoints = [] self.remove(self.line, self.vpoints).render() if self.verbose: vedo.colors.printc("==== Cleared all points ====", c="r", invert=True) def start(self) -> "SplinePlotter": """Start the interaction""" self.update() self.show(self.object, self.instructions, mode=self.mode) return self ######################################################################## class Animation(Plotter): """ A `Plotter` derived class that allows to animate simultaneously various objects by specifying event times and durations of different visual effects. Arguments: total_duration : (float) expand or shrink the total duration of video to this value time_resolution : (float) in seconds, save a frame at this rate show_progressbar : (bool) whether to show a progress bar or not video_filename : (str) output file name of the video video_fps : (int) desired value of the nr of frames per second .. warning:: this is still very experimental at the moment. """ def __init__( self, total_duration=None, time_resolution=0.02, show_progressbar=True, video_filename="animation.mp4", video_fps=12, ): super().__init__() self.resetcam = True self.events = [] self.time_resolution = time_resolution self.total_duration = total_duration self.show_progressbar = show_progressbar self.video_filename = video_filename self.video_fps = video_fps self.bookingMode = True self._inputvalues = [] self._performers = [] self._lastT = None self._lastDuration = None self._lastActs = None self.eps = 0.00001 def _parse(self, objs, t, duration): if t is None: if self._lastT: t = self._lastT else: t = 0.0 if duration is None: if self._lastDuration: duration = self._lastDuration else: duration = 0.0 if objs is None: if self._lastActs: objs = self._lastActs else: vedo.logger.error("Need to specify actors!") raise RuntimeError objs2 = objs if is_sequence(objs): objs2 = objs else: objs2 = [objs] # quantize time steps and duration t = int(t / self.time_resolution + 0.5) * self.time_resolution nsteps = int(duration / self.time_resolution + 0.5) duration = nsteps * self.time_resolution rng = np.linspace(t, t + duration, nsteps + 1) self._lastT = t self._lastDuration = duration self._lastActs = objs2 for a in objs2: if a not in self.objects: self.objects.append(a) return objs2, t, duration, rng def switch_on(self, acts=None, t=None): """Switch on the input list of meshes.""" return self.fade_in(acts, t, 0) def switch_off(self, acts=None, t=None): """Switch off the input list of meshes.""" return self.fade_out(acts, t, 0) def fade_in(self, acts=None, t=None, duration=None): """Gradually switch on the input list of meshes by increasing opacity.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: alpha = lin_interpolate(tt, [t, t + duration], [0, 1]) self.events.append((tt, self.fade_in, acts, alpha)) else: for a in self._performers: if hasattr(a, "alpha"): if a.alpha() >= self._inputvalues: continue a.alpha(self._inputvalues) return self def fade_out(self, acts=None, t=None, duration=None): """Gradually switch off the input list of meshes by increasing transparency.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: alpha = lin_interpolate(tt, [t, t + duration], [1, 0]) self.events.append((tt, self.fade_out, acts, alpha)) else: for a in self._performers: if a.alpha() <= self._inputvalues: continue a.alpha(self._inputvalues) return self def change_alpha_between(self, alpha1, alpha2, acts=None, t=None, duration=None): """Gradually change transparency for the input list of meshes.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: alpha = lin_interpolate(tt, [t, t + duration], [alpha1, alpha2]) self.events.append((tt, self.fade_out, acts, alpha)) else: for a in self._performers: a.alpha(self._inputvalues) return self def change_color(self, c, acts=None, t=None, duration=None): """Gradually change color for the input list of meshes.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) col2 = get_color(c) for tt in rng: inputvalues = [] for a in acts: col1 = a.color() r = lin_interpolate(tt, [t, t + duration], [col1[0], col2[0]]) g = lin_interpolate(tt, [t, t + duration], [col1[1], col2[1]]) b = lin_interpolate(tt, [t, t + duration], [col1[2], col2[2]]) inputvalues.append((r, g, b)) self.events.append((tt, self.change_color, acts, inputvalues)) else: for i, a in enumerate(self._performers): a.color(self._inputvalues[i]) return self def change_backcolor(self, c, acts=None, t=None, duration=None): """Gradually change backface color for the input list of meshes. An initial backface color should be set in advance.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) col2 = get_color(c) for tt in rng: inputvalues = [] for a in acts: if a.GetBackfaceProperty(): col1 = a.backColor() r = lin_interpolate(tt, [t, t + duration], [col1[0], col2[0]]) g = lin_interpolate(tt, [t, t + duration], [col1[1], col2[1]]) b = lin_interpolate(tt, [t, t + duration], [col1[2], col2[2]]) inputvalues.append((r, g, b)) else: inputvalues.append(None) self.events.append((tt, self.change_backcolor, acts, inputvalues)) else: for i, a in enumerate(self._performers): a.backColor(self._inputvalues[i]) return self def change_to_wireframe(self, acts=None, t=None): """Switch representation to wireframe for the input list of meshes at time `t`.""" if self.bookingMode: acts, t, _, _ = self._parse(acts, t, None) self.events.append((t, self.change_to_wireframe, acts, True)) else: for a in self._performers: a.wireframe(self._inputvalues) return self def change_to_surface(self, acts=None, t=None): """Switch representation to surface for the input list of meshes at time `t`.""" if self.bookingMode: acts, t, _, _ = self._parse(acts, t, None) self.events.append((t, self.change_to_surface, acts, False)) else: for a in self._performers: a.wireframe(self._inputvalues) return self def change_line_width(self, lw, acts=None, t=None, duration=None): """Gradually change line width of the mesh edges for the input list of meshes.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: inputvalues = [] for a in acts: newlw = lin_interpolate(tt, [t, t + duration], [a.lw(), lw]) inputvalues.append(newlw) self.events.append((tt, self.change_line_width, acts, inputvalues)) else: for i, a in enumerate(self._performers): a.lw(self._inputvalues[i]) return self def change_line_color(self, c, acts=None, t=None, duration=None): """Gradually change line color of the mesh edges for the input list of meshes.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) col2 = get_color(c) for tt in rng: inputvalues = [] for a in acts: col1 = a.linecolor() r = lin_interpolate(tt, [t, t + duration], [col1[0], col2[0]]) g = lin_interpolate(tt, [t, t + duration], [col1[1], col2[1]]) b = lin_interpolate(tt, [t, t + duration], [col1[2], col2[2]]) inputvalues.append((r, g, b)) self.events.append((tt, self.change_line_color, acts, inputvalues)) else: for i, a in enumerate(self._performers): a.linecolor(self._inputvalues[i]) return self def change_lighting(self, style, acts=None, t=None, duration=None): """Gradually change the lighting style for the input list of meshes. Allowed styles are: [metallic, plastic, shiny, glossy, default]. """ if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) c = (1,1,0.99) if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, c] elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] else: vedo.logger.error(f"Unknown lighting style {style}") for tt in rng: inputvalues = [] for a in acts: pr = a.properties aa = pr.GetAmbient() ad = pr.GetDiffuse() asp = pr.GetSpecular() aspp = pr.GetSpecularPower() naa = lin_interpolate(tt, [t, t + duration], [aa, pars[0]]) nad = lin_interpolate(tt, [t, t + duration], [ad, pars[1]]) nasp = lin_interpolate(tt, [t, t + duration], [asp, pars[2]]) naspp = lin_interpolate(tt, [t, t + duration], [aspp, pars[3]]) inputvalues.append((naa, nad, nasp, naspp)) self.events.append((tt, self.change_lighting, acts, inputvalues)) else: for i, a in enumerate(self._performers): pr = a.properties vals = self._inputvalues[i] pr.SetAmbient(vals[0]) pr.SetDiffuse(vals[1]) pr.SetSpecular(vals[2]) pr.SetSpecularPower(vals[3]) return self def move(self, act=None, pt=(0, 0, 0), t=None, duration=None, style="linear"): """Smoothly change the position of a specific object to a new point in space.""" if self.bookingMode: acts, t, duration, rng = self._parse(act, t, duration) if len(acts) != 1: vedo.logger.error("in move(), can move only one object.") cpos = acts[0].pos() pt = np.array(pt) dv = (pt - cpos) / len(rng) for j, tt in enumerate(rng): i = j + 1 if "quad" in style: x = i / len(rng) y = x * x self.events.append((tt, self.move, acts, cpos + dv * i * y)) else: self.events.append((tt, self.move, acts, cpos + dv * i)) else: self._performers[0].pos(self._inputvalues) return self def rotate(self, act=None, axis=(1, 0, 0), angle=0, t=None, duration=None): """Smoothly rotate a specific object by a specified angle and axis.""" if self.bookingMode: acts, t, duration, rng = self._parse(act, t, duration) if len(acts) != 1: vedo.logger.error("in rotate(), can move only one object.") for tt in rng: ang = angle / len(rng) self.events.append((tt, self.rotate, acts, (axis, ang))) else: ax = self._inputvalues[0] if ax == "x": self._performers[0].rotate_x(self._inputvalues[1]) elif ax == "y": self._performers[0].rotate_y(self._inputvalues[1]) elif ax == "z": self._performers[0].rotate_z(self._inputvalues[1]) return self def scale(self, acts=None, factor=1, t=None, duration=None): """Smoothly scale a specific object to a specified scale factor.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: fac = lin_interpolate(tt, [t, t + duration], [1, factor]) self.events.append((tt, self.scale, acts, fac)) else: for a in self._performers: a.scale(self._inputvalues) return self def mesh_erode(self, act=None, corner=6, t=None, duration=None): """Erode a mesh by removing cells that are close to one of the 8 corners of the bounding box. """ if self.bookingMode: acts, t, duration, rng = self._parse(act, t, duration) if len(acts) != 1: vedo.logger.error("in meshErode(), can erode only one object.") diag = acts[0].diagonal_size() x0, x1, y0, y1, z0, z1 = acts[0].GetBounds() corners = [ (x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0), (x0, y0, z1), (x1, y0, z1), (x1, y1, z1), (x0, y1, z1), ] pcl = acts[0].closest_point(corners[corner]) dmin = np.linalg.norm(pcl - corners[corner]) for tt in rng: d = lin_interpolate(tt, [t, t + duration], [dmin, diag * 1.01]) if d > 0: ids = acts[0].closest_point(corners[corner], radius=d, return_point_id=True) if len(ids) <= acts[0].npoints: self.events.append((tt, self.mesh_erode, acts, ids)) return self def play(self): """Play the internal list of events and save a video.""" self.events = sorted(self.events, key=lambda x: x[0]) self.bookingMode = False if self.show_progressbar: pb = vedo.ProgressBar(0, len(self.events), c="g") if self.total_duration is None: self.total_duration = self.events[-1][0] - self.events[0][0] if self.video_filename: vd = vedo.Video(self.video_filename, fps=self.video_fps, duration=self.total_duration) ttlast = 0 for e in self.events: tt, action, self._performers, self._inputvalues = e action(0, 0) dt = tt - ttlast if dt > self.eps: self.show(interactive=False, resetcam=self.resetcam) if self.video_filename: vd.add_frame() if dt > self.time_resolution + self.eps: if self.video_filename: vd.pause(dt) ttlast = tt if self.show_progressbar: pb.print("t=" + str(int(tt * 100) / 100) + "s, " + action.__name__) self.show(interactive=False, resetcam=self.resetcam) if self.video_filename: vd.add_frame() vd.close() self.show(interactive=True, resetcam=self.resetcam) self.bookingMode = True ######################################################################## class AnimationPlayer(vedo.Plotter): """ A Plotter with play/pause, step forward/backward and slider functionalties. Useful for inspecting time series. The user has the responsibility to update all actors in the callback function. Arguments: func : (Callable) a function that passes an integer as input and updates the scene irange : (tuple) the range of the integer input representing the time series index dt : (float) the time interval between two calls to `func` in milliseconds loop : (bool) whether to loop the animation c : (list, str) the color of the play/pause button bc : (list) the background color of the play/pause button and the slider button_size : (int) the size of the play/pause buttons button_pos : (float, float) the position of the play/pause buttons as a fraction of the window size button_gap : (float) the gap between the buttons slider_length : (float) the length of the slider as a fraction of the window size slider_pos : (float, float) the position of the slider as a fraction of the window size kwargs: (dict) keyword arguments to be passed to `Plotter` Examples: - [aspring2_player.py](https://vedo.embl.es/images/simulations/spring_player.gif) """ # Original class contributed by @mikaeltulldahl (Mikael Tulldahl) PLAY_SYMBOL = " \u23F5 " PAUSE_SYMBOL = " \u23F8 " ONE_BACK_SYMBOL = " \u29CF" ONE_FORWARD_SYMBOL = "\u29D0 " def __init__( self, func, irange: tuple, dt: float = 1.0, loop: bool = True, c=("white", "white"), bc=("green3", "red4"), button_size=25, button_pos=(0.5, 0.04), button_gap=0.055, slider_length=0.5, slider_pos=(0.5, 0.055), **kwargs, ): super().__init__(**kwargs) min_value, max_value = np.array(irange).astype(int) button_pos = np.array(button_pos) slider_pos = np.array(slider_pos) self._func = func self.value = min_value - 1 self.min_value = min_value self.max_value = max_value self.dt = max(dt, 1) self.is_playing = False self._loop = loop self.timer_callback_id = self.add_callback( "timer", self._handle_timer, enable_picking=False ) self.timer_id = None self.play_pause_button = self.add_button( self.toggle, pos=button_pos, # x,y fraction from bottom left corner states=[self.PLAY_SYMBOL, self.PAUSE_SYMBOL], font="Kanopus", size=button_size, bc=bc, ) self.button_oneback = self.add_button( self.onebackward, pos=(-button_gap, 0) + button_pos, states=[self.ONE_BACK_SYMBOL], font="Kanopus", size=button_size, c=c, bc=bc, ) self.button_oneforward = self.add_button( self.oneforward, pos=(button_gap, 0) + button_pos, states=[self.ONE_FORWARD_SYMBOL], font="Kanopus", size=button_size, bc=bc, ) d = (1 - slider_length) / 2 self.slider: SliderWidget = self.add_slider( self._slider_callback, self.min_value, self.max_value - 1, value=self.min_value, pos=[(d - 0.5, 0) + slider_pos, (0.5 - d, 0) + slider_pos], show_value=False, c=bc[0], alpha=1, ) def pause(self) -> None: """Pause the animation.""" self.is_playing = False if self.timer_id is not None: self.timer_callback("destroy", self.timer_id) self.timer_id = None self.play_pause_button.status(self.PLAY_SYMBOL) def resume(self) -> None: """Resume the animation.""" if self.timer_id is not None: self.timer_callback("destroy", self.timer_id) self.timer_id = self.timer_callback("create", dt=int(self.dt)) self.is_playing = True self.play_pause_button.status(self.PAUSE_SYMBOL) def toggle(self, _obj, _evt) -> None: """Toggle between play and pause.""" if not self.is_playing: self.resume() else: self.pause() def oneforward(self, _obj, _evt) -> None: """Advance the animation by one frame.""" self.pause() self.set_frame(self.value + 1) def onebackward(self, _obj, _evt) -> None: """Go back one frame in the animation.""" self.pause() self.set_frame(self.value - 1) def set_frame(self, value: int) -> None: """Set the current value of the animation.""" if self._loop: if value < self.min_value: value = self.max_value - 1 elif value >= self.max_value: value = self.min_value else: if value < self.min_value: self.pause() value = self.min_value elif value >= self.max_value - 1: value = self.max_value - 1 self.pause() if self.value != value: self.value = value self.slider.value = value self._func(value) def _slider_callback(self, widget: SliderWidget, _: str) -> None: self.pause() self.set_frame(int(round(widget.value))) def _handle_timer(self, evt=None) -> None: self.set_frame(self.value + 1) def stop(self) -> "AnimationPlayer": """ Stop the animation timers, remove buttons and slider. Behave like a normal `Plotter` after this. """ # stop timer if self.timer_id is not None: self.timer_callback("destroy", self.timer_id) self.timer_id = None # remove callbacks self.remove_callback(self.timer_callback_id) # remove buttons self.slider.off() self.renderer.RemoveActor(self.play_pause_button.actor) self.renderer.RemoveActor(self.button_oneback.actor) self.renderer.RemoveActor(self.button_oneforward.actor) return self ######################################################################## class Clock(vedo.Assembly): def __init__(self, h=None, m=None, s=None, font="Quikhand", title="", c="k"): """ Create a clock with current time or user provided time. Arguments: h : (int) hours in range [0,23] m : (int) minutes in range [0,59] s : (int) seconds in range [0,59] font : (str) font type title : (str) some extra text to show on the clock c : (str) color of the numbers Example: ```python import time from vedo import show from vedo.applications import Clock clock = Clock() plt = show(clock, interactive=False) for i in range(10): time.sleep(1) clock.update() plt.render() plt.close() ``` ![](https://vedo.embl.es/images/feats/clock.png) """ self.elapsed = 0 self._start = time.time() wd = "" if h is None and m is None: t = time.localtime() h = t.tm_hour m = t.tm_min s = t.tm_sec if not title: d = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] wd = f"{d[t.tm_wday]} {t.tm_mday}/{t.tm_mon}/{t.tm_year} " h = int(h) % 24 m = int(m) % 60 t = (h * 60 + m) / 12 / 60 alpha = 2 * np.pi * t + np.pi / 2 beta = 12 * 2 * np.pi * t + np.pi / 2 x1, y1 = np.cos(alpha), np.sin(alpha) x2, y2 = np.cos(beta), np.sin(beta) if s is not None: s = int(s) % 60 gamma = s * 2 * np.pi / 60 + np.pi / 2 x3, y3 = np.cos(gamma), np.sin(gamma) ore = Line([0, 0], [x1, y1], lw=14, c="red4").scale(0.5).mirror() minu = Line([0, 0], [x2, y2], lw=7, c="blue3").scale(0.75).mirror() secs = None if s is not None: secs = Line([0, 0], [x3, y3], lw=1, c="k").scale(0.95).mirror() secs.z(0.003) back1 = vedo.shapes.Circle(res=180, c="k5") back2 = vedo.shapes.Circle(res=12).mirror().scale(0.84).rotate_z(-360 / 12) labels = back2.labels(range(1, 13), justify="center", font=font, c=c, scale=0.14) txt = vedo.shapes.Text3D(wd + title, font="VictorMono", justify="top-center", s=0.07, c=c) txt.pos(0, -0.25, 0.001) labels.z(0.001) minu.z(0.002) super().__init__([back1, labels, ore, minu, secs, txt]) self.name = "Clock" def update(self, h=None, m=None, s=None) -> "Clock": """Update clock with current or user time.""" parts = self.unpack() self.elapsed = time.time() - self._start if h is None and m is None: t = time.localtime() h = t.tm_hour m = t.tm_min s = t.tm_sec h = int(h) % 24 m = int(m) % 60 t = (h * 60 + m) / 12 / 60 alpha = 2 * np.pi * t + np.pi / 2 beta = 12 * 2 * np.pi * t + np.pi / 2 x1, y1 = np.cos(alpha), np.sin(alpha) x2, y2 = np.cos(beta), np.sin(beta) if s is not None: s = int(s) % 60 gamma = s * 2 * np.pi / 60 + np.pi / 2 x3, y3 = np.cos(gamma), np.sin(gamma) pts2 = parts[2].coordinates pts2[1] = [-x1 * 0.5, y1 * 0.5, 0.001] parts[2].coordinates = pts2 pts3 = parts[3].coordinates pts3[1] = [-x2 * 0.75, y2 * 0.75, 0.002] parts[3].coordinates = pts3 if s is not None: pts4 = parts[4].coordinates pts4[1] = [-x3 * 0.95, y3 * 0.95, 0.003] parts[4].coordinates = pts4 return self vedo-2025.5.3/vedo/assembly.py000066400000000000000000000546271474667405700160750ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- from weakref import ref as weak_ref_to from typing import List, Union, Any from typing_extensions import Self import numpy as np import vedo.file_io import vedo.vtkclasses as vtki # a wrapper for lazy imports import vedo from vedo.transformations import LinearTransform from vedo.visual import CommonVisual, Actor3DHelper __docformat__ = "google" __doc__ = """ Submodule for managing groups of vedo objects ![](https://vedo.embl.es/images/basic/align4.png) """ __all__ = ["Group", "Assembly", "procrustes_alignment"] ################################################# def procrustes_alignment(sources: List["vedo.Mesh"], rigid=False) -> "Assembly": """ Return an `Assembly` of aligned source meshes with the `Procrustes` algorithm. The output `Assembly` is normalized in size. The `Procrustes` algorithm takes N set of points and aligns them in a least-squares sense to their mutual mean. The algorithm is iterated until convergence, as the mean must be recomputed after each alignment. The set of average points generated by the algorithm can be accessed with `algoutput.info['mean']` as a numpy array. Arguments: rigid : bool if `True` scaling is disabled. Examples: - [align4.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align4.py) ![](https://vedo.embl.es/images/basic/align4.png) """ group = vtki.new("MultiBlockDataGroupFilter") for source in sources: if sources[0].npoints != source.npoints: vedo.logger.error("sources have different nr of points") raise RuntimeError() group.AddInputData(source.dataset) procrustes = vtki.new("ProcrustesAlignmentFilter") procrustes.StartFromCentroidOn() procrustes.SetInputConnection(group.GetOutputPort()) if rigid: procrustes.GetLandmarkTransform().SetModeToRigidBody() procrustes.Update() acts = [] for i, s in enumerate(sources): poly = procrustes.GetOutput().GetBlock(i) mesh = vedo.mesh.Mesh(poly) mesh.actor.SetProperty(s.actor.GetProperty()) mesh.properties = s.actor.GetProperty() if hasattr(s, "name"): mesh.name = s.name acts.append(mesh) assem = Assembly(acts) assem.transform = procrustes.GetLandmarkTransform() assem.info["mean"] = vedo.utils.vtk2numpy(procrustes.GetMeanPoints().GetData()) return assem ################################################# class Group(vtki.vtkPropAssembly): """Form groups of generic objects (not necessarily meshes).""" def __init__(self, objects=()): """Form groups of generic objects (not necessarily meshes).""" super().__init__() self.objects = [] if isinstance(objects, dict): for name in objects: objects[name].name = name objects = list(objects.values()) elif vedo.utils.is_sequence(objects): self.objects = objects self.actor = self self.name = "Group" self.filename = "" self.trail = None self.trail_points = [] self.trail_segment_size = 0 self.trail_offset = None self.shadows = [] self.info = {} self.rendered_at = set() self.scalarbar = None for a in vedo.utils.flatten(objects): if a: self.AddPart(a.actor) self.PickableOff() def __str__(self): """Print info about Group object.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(id(self))})".ljust(75), bold=True, invert=True, return_string=True, ) out += "\x1b[0m" if self.name: out += "name".ljust(14) + ": " + self.name if "legend" in self.info.keys() and self.info["legend"]: out+= f", legend='{self.info['legend']}'" out += "\n" n = len(self.unpack()) out += "n. of objects".ljust(14) + ": " + str(n) + " " names = [a.name for a in self.unpack() if a.name] if names: out += str(names).replace("'","")[:56] return out.rstrip() + "\x1b[0m" def __iadd__(self, obj): """Add an object to the group.""" if not vedo.utils.is_sequence(obj): obj = [obj] for a in obj: if a: try: self.AddPart(a) except TypeError: self.AddPart(a.actor) self.objects.append(a) return self def __isub__(self, obj): """Remove an object to the group.""" if not vedo.utils.is_sequence(obj): obj = [obj] for a in obj: if a: try: self.RemovePart(a) except TypeError: self.RemovePart(a.actor) self.objects.append(a) return self def add(self, obj): """Add an object to the group.""" self.__iadd__(obj) return self def remove(self, obj): """Remove an object to the group.""" self.__isub__(obj) return self def _unpack(self): """Unpack the group into its elements""" elements = [] self.InitPathTraversal() parts = self.GetParts() parts.InitTraversal() for i in range(parts.GetNumberOfItems()): ele = parts.GetItemAsObject(i) elements.append(ele) # gr.InitPathTraversal() # for _ in range(gr.GetNumberOfPaths()): # path = gr.GetNextPath() # print([path]) # path.InitTraversal() # for i in range(path.GetNumberOfItems()): # a = path.GetItemAsObject(i).GetViewProp() # print([a]) return elements def clear(self) -> "Group": """Remove all parts""" for a in self._unpack(): self.RemovePart(a) self.objects = [] return self def on(self) -> "Group": """Switch on visibility""" self.VisibilityOn() return self def off(self) -> "Group": """Switch off visibility""" self.VisibilityOff() return self def pickable(self, value=True) -> "Group": """The pickability property of the Group.""" self.SetPickable(value) return self def use_bounds(self, value=True) -> "Group": """Set the use bounds property of the Group.""" self.SetUseBounds(value) return self def print(self) -> "Group": """Print info about the object.""" print(self) return self def objects(self) -> List["vedo.Mesh"]: """Return the list of objects in the group.""" return self.objects ################################################# class Assembly(CommonVisual, Actor3DHelper, vtki.vtkAssembly): """ Group many objects and treat them as a single new object. """ def __init__(self, *meshs): """ Group many objects and treat them as a single new object, keeping track of internal transformations. File can be loaded by passing its name as a string. Format must be `npy`. Examples: - [gyroscope1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/gyroscope1.py) ![](https://vedo.embl.es/images/simulations/39766016-85c1c1d6-52e3-11e8-8575-d167b7ce5217.gif) """ super().__init__() self.actor = self self.actor.retrieve_object = weak_ref_to(self) self.name = "Assembly" self.filename = "" self.rendered_at = set() self.scalarbar = None self.info = {} self.time = 0 self.transform = LinearTransform() # Init by filename if len(meshs) == 1 and isinstance(meshs[0], str): filename = vedo.file_io.download(meshs[0], verbose=False) data = np.load(filename, allow_pickle=True) try: # old format with a single object meshs = [vedo.file_io.from_numpy(dd) for dd in data] except TypeError: # new format with a dictionary data = data.item() meshs = [] for ad in data["objects"][0]["parts"]: obb = vedo.file_io.from_numpy(ad) meshs.append(obb) self.transform = LinearTransform(data["objects"][0]["transform"]) self.actor.SetPosition(self.transform.T.GetPosition()) self.actor.SetOrientation(self.transform.T.GetOrientation()) self.actor.SetScale(self.transform.T.GetScale()) # Name and load from dictionary if len(meshs) == 1 and isinstance(meshs[0], dict): meshs = meshs[0] for name in meshs: meshs[name].name = name meshs = list(meshs.values()) else: if len(meshs) == 1: meshs = meshs[0] else: meshs = vedo.utils.flatten(meshs) self.objects = [m for m in meshs if m] self.actors = [m.actor for m in self.objects] scalarbars = [] for a in self.actors: if isinstance(a, vtki.get_class("Prop3D")): # and a.GetNumberOfPoints(): self.AddPart(a) if hasattr(a, "scalarbar") and a.scalarbar is not None: scalarbars.append(a.scalarbar) if len(scalarbars) > 1: self.scalarbar = Group(scalarbars) elif len(scalarbars) == 1: self.scalarbar = scalarbars[0] self.pipeline = vedo.utils.OperationNode( "Assembly", parents=self.objects, comment=f"#meshes {len(self.objects)}", c="#f08080", ) ########################################## def __str__(self): """Print info about Assembly object.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(id(self))})".ljust(75), bold=True, invert=True, return_string=True, ) out += "\x1b[0m" if self.name: out += "name".ljust(14) + ": " + self.name if "legend" in self.info.keys() and self.info["legend"]: out+= f", legend='{self.info['legend']}'" out += "\n" n = len(self.unpack()) out += "n. of objects".ljust(14) + ": " + str(n) + " " names = np.unique([a.name for a in self.unpack() if a.name]) if len(names): out += str(names).replace("'","")[:56] out += "\n" pos = self.GetPosition() out += "position".ljust(14) + ": " + str(pos) + "\n" bnds = self.GetBounds() bx1, bx2 = vedo.utils.precision(bnds[0], 3), vedo.utils.precision(bnds[1], 3) by1, by2 = vedo.utils.precision(bnds[2], 3), vedo.utils.precision(bnds[3], 3) bz1, bz2 = vedo.utils.precision(bnds[4], 3), vedo.utils.precision(bnds[5], 3) out += "bounds".ljust(14) + ":" out += " x=(" + bx1 + ", " + bx2 + ")," out += " y=(" + by1 + ", " + by2 + ")," out += " z=(" + bz1 + ", " + bz2 + ")\n" return out.rstrip() + "\x1b[0m" def _repr_html_(self): """ HTML representation of the Assembly object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.assembly.Assembly" help_url = "https://vedo.embl.es/docs/vedo/assembly.html" arr = self.thumbnail(zoom=1.1, elevation=-60) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" # statisitics bounds = "
".join( [ vedo.utils.precision(min_x, 4) + " ... " + vedo.utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", "
nr. of objects " + str(self.GetNumberOfPaths()) + "
position " + str(self.GetPosition()) + "
diagonal size " + vedo.utils.precision(self.diagonal_size(), 5) + "
bounds
(x/y/z)
" + str(bounds) + "
", "
", ] return "\n".join(allt) def __add__(self, obj): """ Add an object to the assembly """ if isinstance(getattr(obj, "actor", None), vtki.get_class("Prop3D")): self.objects.append(obj) self.actors.append(obj.actor) self.AddPart(obj.actor) if hasattr(obj, "scalarbar") and obj.scalarbar is not None: if self.scalarbar is None: self.scalarbar = obj.scalarbar return self def unpack_group(scalarbar): if isinstance(scalarbar, Group): return scalarbar.unpack() else: return scalarbar if isinstance(self.scalarbar, Group): self.scalarbar += unpack_group(obj.scalarbar) else: self.scalarbar = Group([unpack_group(self.scalarbar), unpack_group(obj.scalarbar)]) self.pipeline = vedo.utils.OperationNode("add mesh", parents=[self, obj], c="#f08080") return self def __isub__(self, obj): """ Remove an object to the assembly. """ if not vedo.utils.is_sequence(obj): obj = [obj] for a in obj: if a: try: self.RemovePart(a) self.objects.remove(a) except TypeError: self.RemovePart(a.actor) self.objects.remove(a) return self def add(self, obj): """ Add an object to the assembly. """ self.__add__(obj) return self def remove(self, obj): """ Remove an object to the assembly. """ self.__isub__(obj) return self def __contains__(self, obj): """Allows to use `in` to check if an object is in the `Assembly`.""" return obj in self.objects def __getitem__(self, i): """Return i-th object.""" if isinstance(i, int): return self.objects[i] elif isinstance(i, str): for m in self.objects: if i == m.name: return m return None def __len__(self): """Return nr. of objects in the assembly.""" return len(self.objects) def write(self, filename="assembly.npy") -> Self: """ Write the object to file in `numpy` format (npy). """ vedo.file_io.write(self, filename) return self # TODO #### # def propagate_transform(self): # """Propagate the transformation to all parts.""" # # navigate the assembly and apply the transform to all parts # # and reset position, orientation and scale of the assembly # for i in range(self.GetNumberOfPaths()): # path = self.GetPath(i) # obj = path.GetLastNode().GetViewProp() # obj.SetUserTransform(self.transform.T) # obj.SetPosition(0, 0, 0) # obj.SetOrientation(0, 0, 0) # obj.SetScale(1, 1, 1) # raise NotImplementedError() def unpack(self, i=None) -> Union[List["vedo.Mesh"], "vedo.Mesh"]: """Unpack the list of objects from a `Assembly`. If `i` is given, get `i-th` object from a `Assembly`. Input can be a string, in this case returns the first object whose name contains the given string. Examples: - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) """ if i is None: return self.objects elif isinstance(i, int): return self.objects[i] elif isinstance(i, str): for m in self.objects: if i == m.name: return m return [] def recursive_unpack(self) -> List["vedo.Mesh"]: """Flatten out an Assembly.""" def _genflatten(lst): if not lst: return [] ## if isinstance(lst[0], Assembly): lst = lst[0].unpack() ## for elem in lst: if isinstance(elem, Assembly): apos = elem.GetPosition() asum = np.sum(apos) for x in elem.unpack(): if asum: yield x.clone().shift(apos) else: yield x else: yield elem return list(_genflatten([self])) def pickable(self, value=True) -> "Assembly": """Set/get the pickability property of an assembly and its elements""" self.SetPickable(value) # set property to each element for elem in self.recursive_unpack(): elem.pickable(value) return self def clone(self) -> "Assembly": """Make a clone copy of the object. Same as `copy()`.""" newlist = [] for a in self.objects: newlist.append(a.clone()) return Assembly(newlist) def clone2d(self, pos="bottom-left", size=1, rotation=0, ontop=False, scale=None) -> Group: """ Convert the `Assembly` into a `Group` of 2D objects. Arguments: pos : (list, str) Position in 2D, as a string or list (x,y). The center of the renderer is [0,0] while top-right is [1,1]. Any combination of "center", "top", "bottom", "left" and "right" will work. size : (float) global scaling factor for the 2D object. The scaling is normalized to the x-range of the original object. rotation : (float) rotation angle in degrees. ontop : (bool) if `True` the now 2D object is rendered on top of the 3D scene. scale : (float) deprecated, use `size` instead. Returns: `Group` object. """ if scale is not None: vedo.logger.warning("clone2d(scale=...) is deprecated, use clone2d(size=...) instead") size = scale padding = 0.05 x0, x1 = self.xbounds() y0, y1 = self.ybounds() pp = self.pos() x0 -= pp[0] x1 -= pp[0] y0 -= pp[1] y1 -= pp[1] offset = [x0, y0] if "cent" in pos: offset = [(x0 + x1) / 2, (y0 + y1) / 2] position = [0., 0.] if "right" in pos: offset[0] = x1 position = [1 - padding, 0] if "left" in pos: offset[0] = x0 position = [-1 + padding, 0] if "top" in pos: offset[1] = y1 position = [0, 1 - padding] if "bottom" in pos: offset[1] = y0 position = [0, -1 + padding] elif "top" in pos: if "right" in pos: offset = [x1, y1] position = [1 - padding, 1 - padding] elif "left" in pos: offset = [x0, y1] position = [-1 + padding, 1 - padding] else: raise ValueError(f"incomplete position pos='{pos}'") elif "bottom" in pos: if "right" in pos: offset = [x1, y0] position = [1 - padding, -1 + padding] elif "left" in pos: offset = [x0, y0] position = [-1 + padding, -1 + padding] else: raise ValueError(f"incomplete position pos='{pos}'") else: position = pos scanned : List[Any] = [] group = Group() for a in self.recursive_unpack(): if a in scanned: continue if not isinstance(a, vedo.Points): continue if a.npoints == 0: continue s = size * 500 / (x1 - x0) if a.properties.GetRepresentation() == 1: # wireframe is not rendered correctly in 2d b = a.boundaries().lw(1).c(a.color(), a.alpha()) if rotation: b.rotate_z(rotation, around=self.origin()) a2d = b.clone2d(size=s, offset=offset) else: if rotation: # around=self.actor.GetCenter() a.rotate_z(rotation, around=self.origin()) a2d = a.clone2d(size=s, offset=offset) a2d.pos(position).ontop(ontop) group += a2d try: # copy info from Histogram1D group.entries = self.entries group.frequencies = self.frequencies group.errors = self.errors group.edges = self.edges group.centers = self.centers group.mean = self.mean group.mode = self.mode group.std = self.std except AttributeError: pass group.name = self.name return group def copy(self) -> "Assembly": """Return a copy of the object. Alias of `clone()`.""" return self.clone() vedo-2025.5.3/vedo/backends.py000066400000000000000000000351351474667405700160210ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import numpy as np import vedo.vtkclasses as vtki from vedo.pointcloud import Points from vedo.mesh import Mesh from vedo.volume import Volume import vedo from vedo import settings from vedo import utils __doc__ = """Submodule to delegate jupyter notebook rendering""" __all__ = [] ############################################################################################ def get_notebook_backend(actors2show=()): """Return the appropriate notebook viewer""" ######################################### if settings.default_backend == "2d": return start_2d() ######################################### if settings.default_backend == "k3d": return start_k3d(actors2show) ######################################### if settings.default_backend.startswith("trame"): return start_trame() ######################################### if settings.default_backend.startswith("ipyvtk"): return start_ipyvtklink() ######################################### if settings.default_backend.startswith("panel"): return start_panel() vedo.logger.error(f"Unknown jupyter backend: {settings.default_backend}") return None ##################################################################################### def start_2d(): try: import PIL.Image # import IPython except ImportError: print("PIL or IPython not available") return None plt = vedo.plotter_instance if hasattr(plt, "window") and plt.window: try: nn = vedo.file_io.screenshot(asarray=True, scale=1) pil_img = PIL.Image.fromarray(nn) except ValueError as e: return None # IPython.display.display(pil_img) vedo.notebook_plotter = pil_img if settings.backend_autoclose and plt.renderer == plt.renderers[-1]: plt.close() return pil_img ##################################################################################### def start_panel(): try: import panel as pn pn.extension('vtk', design='material', sizing_mode='stretch_width', template='material') # pn.state.template.config.raw_css.append(""" # #main { # padding: 0; # }""") except ImportError: print("panel is not installed, try:\n> conda install panel") return None print("panel backend NOT YET FUNCTIONAL") plt = vedo.plotter_instance if hasattr(plt, "window") and plt.window: plt.renderer.ResetCamera() vtkpan = pn.pane.VTK( plt.window, margin=0, sizing_mode='stretch_both', min_height=600, orientation_widget=True, enable_keybindings=True, ) vedo.notebook_plotter = vtkpan return vedo.notebook_plotter #################################################################################### def start_k3d(actors2show): try: # https://github.com/K3D-tools/K3D-jupyter import k3d except ModuleNotFoundError: print("Cannot find k3d, install with: pip install k3d") return None plt = vedo.plotter_instance if not plt: return None actors2show2 = [] for ia in actors2show: if not ia: continue if isinstance(ia, vedo.Assembly): # unpack assemblies actors2show2 += ia.recursive_unpack() else: actors2show2.append(ia) vedo.notebook_plotter = k3d.plot( axes=["x", "y", "z"], menu_visibility=settings.k3d_menu_visibility, height=settings.k3d_plot_height, antialias=settings.k3d_antialias, background_color=_rgb2int(vedo.get_color(plt.backgrcol)), camera_fov=30.0, # deg (this is the vtk default) lighting=settings.k3d_lighting, grid_color=_rgb2int(vedo.get_color(settings.k3d_axes_color)), label_color=_rgb2int(vedo.get_color(settings.k3d_axes_color)), axes_helper=settings.k3d_axes_helper, ) # set k3d camera vedo.notebook_plotter.camera_auto_fit = settings.k3d_camera_autofit vedo.notebook_plotter.grid_auto_fit = settings.k3d_grid_autofit vedo.notebook_plotter.axes_helper = settings.k3d_axes_helper if plt.camera: vedo.notebook_plotter.camera = utils.vtkCameraToK3D(plt.camera) if not plt.axes: vedo.notebook_plotter.grid_visible = False for ia in actors2show2: if isinstance(ia, (vtki.vtkCornerAnnotation, vtki.vtkAssembly, vtki.vtkActor2D)): continue if hasattr(ia, "actor") and isinstance( ia.actor, (vtki.vtkCornerAnnotation, vtki.vtkAssembly, vtki.vtkActor2D) ): continue iacloned = ia kobj = None kcmap = None color_attribute = None vtkscals = None name = None if hasattr(ia, "filename"): if ia.filename: name = os.path.basename(ia.filename) if ia.name: name = os.path.basename(ia.name) ################################################################## scalars # work out scalars first, Points Lines are also Mesh objs if isinstance(ia, Points): # print('scalars', ia.name, ia.npoints) iap = ia.properties if ia.dataset.GetNumberOfPolys(): iacloned = ia.clone() iapoly = iacloned.clean().triangulate().compute_normals().dataset else: iapoly = ia.dataset if ia.mapper.GetScalarVisibility() and ia.mapper.GetColorMode() > 0: vtkdata = iapoly.GetPointData() vtkscals = vtkdata.GetScalars() if vtkscals is None: vtkdata = iapoly.GetCellData() vtkscals = vtkdata.GetScalars() if vtkscals is not None: c2p = vtki.new("CellDataToPointData") c2p.SetInputData(iapoly) c2p.Update() iapoly = c2p.GetOutput() vtkdata = iapoly.GetPointData() vtkscals = vtkdata.GetScalars() else: if not vtkscals.GetName(): vtkscals.SetName("scalars") scals_min, scals_max = ia.mapper.GetScalarRange() color_attribute = (vtkscals.GetName(), scals_min, scals_max) lut = ia.mapper.GetLookupTable() lut.Build() kcmap = [] nlut = lut.GetNumberOfTableValues() for i in range(nlut): r, g, b, _ = lut.GetTableValue(i) kcmap += [i / (nlut - 1), r, g, b] else: color_attribute = ia.color() #####################################################################Volume if isinstance(ia, Volume): # print('Volume', ia.name, ia.dimensions()) kx, ky, _ = ia.dimensions() arr = ia.pointdata[0] kimage = arr.reshape(-1, ky, kx) colorTransferFunction = ia.properties.GetRGBTransferFunction() kcmap = [] for i in range(128): r, g, b = colorTransferFunction.GetColor(i / 127) kcmap += [i / 127, r, g, b] kbounds = np.array(ia.dataset.GetBounds()) + np.repeat( np.array(ia.dataset.GetSpacing()) / 2.0, 2 ) * np.array([-1, 1] * 3) kobj = k3d.volume( kimage.astype(np.float32), color_map=kcmap, # color_range=ia.dataset.GetScalarRange(), alpha_coef=10, bounds=kbounds, name=name, ) vedo.notebook_plotter += kobj ################################################################ Text2D elif isinstance(ia, vedo.Text2D): # print('Text2D', ia.GetPosition()) pos = (ia.GetPosition()[0], 1.0 - ia.GetPosition()[1]) kobj = k3d.text2d( ia.text(), position=pos, color=_rgb2int(vedo.get_color(ia.c())), is_html=True, size=ia.properties.GetFontSize() / 22.5 * 1.5, label_box=bool(ia.properties.GetFrame()), # reference_point='bl', ) vedo.notebook_plotter += kobj ################################################################# Lines elif ( hasattr(ia, "lines") and ia.dataset.GetNumberOfLines() and ia.dataset.GetNumberOfPolys() == 0 ): for i, ln_idx in enumerate(ia.lines): if i > 200: vedo.logger.warning("in k3d, nr. of lines is limited to 200.") break pts = ia.coordinates[ln_idx] aves = ia.diagonal_size() * iap.GetLineWidth() / 100 kobj = k3d.line( pts.astype(np.float32), color=_rgb2int(iap.GetColor()), opacity=iap.GetOpacity(), shader=settings.k3d_line_shader, width=aves.astype(float), name=name, ) vedo.notebook_plotter += kobj ################################################################## Mesh elif isinstance(ia, Mesh) and ia.npoints and ia.dataset.GetNumberOfPolys(): # print('Mesh', ia.name, ia.npoints, len(ia.cells)) if not vtkscals: color_attribute = None cols = [] if ia.mapper.GetColorMode() == 0: # direct RGB colors vcols = ia.dataset.GetPointData().GetScalars() if vcols and vcols.GetNumberOfComponents() == 3: cols = utils.vtk2numpy(vcols) cols = 65536 * cols[:, 0] + 256 * cols[:, 1] + cols[:, 2] # print("GetColor",iap.GetColor(), _rgb2int(iap.GetColor()) ) # print("colors", len(cols)) # print("color_attribute", color_attribute) # if kcmap is not None: print("color_map", len(kcmap)) # TODO: # https://k3d-jupyter.org/reference/factory.mesh.html#colormap kobj = k3d.mesh( iacloned.coordinates, iacloned.cells, colors=cols, name=name, color=_rgb2int(iap.GetColor()), opacity=iap.GetOpacity(), side="double", wireframe=(iap.GetRepresentation() == 1), ) else: kobj = k3d.vtk_poly_data( iapoly, name=name, color=_rgb2int(iap.GetColor()), color_attribute=color_attribute, color_map=kcmap, opacity=iap.GetOpacity(), side="double", wireframe=(iap.GetRepresentation() == 1), ) if iap.GetInterpolation() == 0: kobj.flat_shading = True vedo.notebook_plotter += kobj #####################################################################Points elif isinstance(ia, Points): # print('Points', ia.name, ia.npoints) kcols = [] if kcmap is not None and vtkscals: scals = utils.vtk2numpy(vtkscals) kcols = k3d.helpers.map_colors( scals, kcmap, [scals_min, scals_max] ).astype(np.uint32) aves = ia.average_size() * iap.GetPointSize() / 200 kobj = k3d.points( ia.coordinates.astype(np.float32), color=_rgb2int(iap.GetColor()), colors=kcols, opacity=iap.GetOpacity(), shader=settings.k3d_point_shader, point_size=aves.astype(float), name=name, ) vedo.notebook_plotter += kobj ##################################################################### elif isinstance(ia, vedo.Image): vedo.logger.error("Sorry Image objects are not supported in k3d.") if plt and settings.backend_autoclose: plt.close() return vedo.notebook_plotter ##################################################################################### def start_trame(): try: from trame.app import get_server, jupyter from trame.ui.vuetify import VAppLayout from trame.widgets import vtk as t_vtk, vuetify except ImportError: print("trame is not installed, try:\n> pip install trame==2.5.2") return None plt = vedo.plotter_instance if hasattr(plt, "window") and plt.window: plt.renderer.ResetCamera() server = get_server("jupyter-1") state, ctrl = server.state, server.controller plt.server = server plt.controller = ctrl plt.state = state with VAppLayout(server) as layout: with layout.root: with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): plt.reset_camera() view = t_vtk.VtkLocalView(plt.window) ctrl.view_update = view.update ctrl.view_reset_camera = view.reset_camera ctrl.on_server_exited.add(lambda **_: print("trame server exited")) vedo.notebook_plotter = jupyter.show(server) return vedo.notebook_plotter vedo.logger.error("No window present for the trame backend.") return None ##################################################################################### def start_ipyvtklink(): try: from ipyvtklink.viewer import ViewInteractiveWidget except ImportError: print("ipyvtklink is not installed, try:\n> pip install ipyvtklink") return None plt = vedo.plotter_instance if hasattr(plt, "window") and plt.window: plt.renderer.ResetCamera() vedo.notebook_plotter = ViewInteractiveWidget( plt.window, allow_wheel=True, quality=100, quick_quality=50 ) return vedo.notebook_plotter vedo.logger.error("No window present for the ipyvtklink backend.") return None ##################################################################################### def _rgb2int(rgb_tuple): # Return the int number of a color from (r,g,b), with 0 1: printc(f":target: Found {nmat} scripts containing string '{args.run}':", c="c") args.full_screen = True # to print out the one line description if args.full_screen: # -f option not to dump the full code but just the first line for mat in matching[:30]: printc(os.path.basename(mat).replace(".py", ""), c="c", end=" ") with open(mat, "r", encoding="UTF-8") as fm: lline = "".join(fm.readlines(60)) maxidx1 = lline.find("import ") maxidx2 = lline.find("from vedo") maxid = min(maxidx1, maxidx2) lline = lline[:maxid] # cut where the code starts lline = lline.replace("\n", " ").replace("'", "").replace('"', "") lline = lline.replace("#", "").replace("-", "").replace(" ", " ") line = lline[:68] # cut long lines if len(lline) > len(line) + 1: line += ".." if len(line) > 5: printc("-", line, c="c", bold=0, italic=1, dim=1) else: print() if nmat > 30: printc(f"... (and {nmat-30} more)", c="c") if nmat > 1: printc(":idea: Type 'vedo -r ' to run one of them", bold=0, c="c") return if not args.full_screen: # -f option not to dump the full code with open(matching[0], "r", encoding="UTF-8") as fm: code = fm.read() code = "#" * 80 + "\n" + code + "\n" + "#" * 80 from pygments import highlight from pygments.lexers import Python3Lexer from pygments.formatters import Terminal256Formatter from pygments.styles import STYLE_MAP # print("Terminal256Formatter STYLE_MAP", STYLE_MAP.keys()) if "zenburn" in STYLE_MAP.keys(): tform = Terminal256Formatter(style="zenburn") elif "monokai" in STYLE_MAP.keys(): tform = Terminal256Formatter(style="monokai") else: tform = Terminal256Formatter() result = highlight(code, Python3Lexer(), tform) print(result, end="") printc("(" + matching[0] + ")", c="y", bold=0, italic=1) os.system(f"python {matching[0]} || python3 {matching[0]}") ################################################################################################ def exe_convert(args): allowed_exts = [ "vtk", "vtp", "vtu", "vts", "npy", "ply", "stl", "obj", "off", "byu", "xml", "vti", "tif", "mhd", "xml", ] humansort(args.convert) nfiles = len(args.convert) if nfiles == 0: sys.exit() target_ext = args.to.lower() if target_ext not in allowed_exts: printc(f":sad: Sorry target cannot be {target_ext}\nMust be {allowed_exts}", c='r') sys.exit() for f in args.convert: source_ext = f.split(".")[-1] if target_ext == source_ext: continue a = load(f) newf = f.replace("." + source_ext, "") + "." + target_ext a.write(newf, binary=True) ############################################################################################## def exe_search(args): expath = os.path.join(vedo.installdir, "examples", "**", "*.py") exfiles = list(sorted(glob.glob(expath, recursive=True))) pattern = args.search if args.no_camera_share: pattern = pattern.lower() if len(pattern) > 3: for ifile in exfiles: if "dolfin" in ifile: continue if "trimesh" in ifile: continue with open(ifile, "r", encoding="UTF-8") as file: fflag = True for i, line in enumerate(file): if args.no_camera_share: bline = line.lower() else: bline = line if pattern in bline: if fflag: name = os.path.basename(ifile) try: etype = ifile.split("/")[-2] printc( "--> examples/" + etype + "/" + name + ":", c="y", italic=1, invert=1, ) except IndexError: etype = ifile.split("\\")[-2] printc( "--> examples\\" + etype + "\\" + name + ":", c="y", italic=1, invert=1, ) fflag = False line = line.replace( pattern, "\x1b[4m\x1b[1m" + pattern + "\x1b[0m\u001b[33m" ) print(f"\u001b[33m{i}\t{line}\x1b[0m", end="") # printc(i, line, c='y', bold=False, end='') else: printc("Please use at least 4 letters in keyword search!", c="r") ############################################################################################## def exe_search_code(args): import inspect from pygments import highlight from pygments.lexers import Python3Lexer from pygments.formatters import Terminal256Formatter # styles: autumn, material, rrt, zenburn style = "zenburn" key = args.search_code iopt = args.no_camera_share if key.lower() == key: iopt = True if len(key) < 4: printc("Please use at least 4 letters in keyword search!", c="r") return def _dump(mcontent): for name, mm in mcontent: if name.startswith("_"): continue if name.startswith("vtk"): continue # if not inspect.isfunction(mm): # continue try: mmdoc = inspect.getsource(mm) except TypeError: return if mmdoc is None: continue if iopt: # -i option to ignore case mmdoc_lower = mmdoc.lower() key_lower = key.lower() name_lower = name.lower() else: mmdoc_lower = mmdoc key_lower = key name_lower = name if "eprecated" in mmdoc_lower: continue if key_lower in name_lower: sname = inspect.getmodule(mm).__name__ + " -> " + name if sname in snames: continue snames.append(sname) printc( ":checked:Found matching", mm, "in module", os.path.basename(inspect.getfile(mm)), c="y", invert=True, ) mmdoc = mmdoc.replace("``", '"').replace("`", '"') mmdoc = mmdoc.replace(".. warning::", "Warning!") result = highlight(mmdoc, Python3Lexer(), Terminal256Formatter(style=style)) idcomment = result.rfind('"""') print(result[: idcomment + 3], "\x1b[0m\n") # printc("..parsing source code, please wait", c="y", bold=False) content = inspect.getmembers(vedo) snames = [] for name, m in content: if name.startswith("_"): continue if not inspect.isclass(m) and not inspect.isfunction(m): continue if inspect.isbuiltin(m): continue # if name != "Points": continue # test # printc("---", name, str(m), c='r') # function case _dump([[name, m]]) # class case mcontent = inspect.getmembers(m) _dump(mcontent) ############################################################################################## def exe_search_vtk(args): # input a vtk class name to get links to examples that involve that class # From https://kitware.github.io/vtk-examples/site/Python/Utilities/SelectExamples/ import json import tempfile from datetime import datetime from pathlib import Path from urllib.error import HTTPError from urllib.request import urlretrieve xref_url = "https://raw.githubusercontent.com/Kitware/vtk-examples/gh-pages/src/Coverage/vtk_vtk-examples_xref.json" def _download_file(dl_path, dl_url, overwrite=False): file_name = dl_url.split("/")[-1] # Create necessary sub-directories in the dl_path (if they don't exist). Path(dl_path).mkdir(parents=True, exist_ok=True) # Download if it doesn't exist in the directory overriding if overwrite is True. path = Path(dl_path, file_name) if not path.is_file() or overwrite: try: urlretrieve(dl_url, path) except HTTPError as e: raise RuntimeError(f"Failed to download {dl_url}. {e.reason}") return path def _get_examples(d, vtk_class, lang): try: kv = d[vtk_class][lang].items() except KeyError as e: print(f"For the combination {vtk_class} and {lang}, this key does not exist: {e}") return None, None total = len(kv) samples = list(kv) return total, [f"{s[1]}" for s in samples] vtk_class, language, all_values, number = args.search_vtk, "Python", True, 10000 tmp_dir = tempfile.gettempdir() path = _download_file(tmp_dir, xref_url, overwrite=False) if not path.is_file(): print(f"The path: {str(path)} does not exist.") dt = datetime.today().timestamp() - os.path.getmtime(path) # Force a new download if the time difference is > 10 minutes. if dt > 600: path = _download_file(tmp_dir, xref_url, overwrite=True) with open(path, "r", encoding="UTF-8") as json_file: xref_dict = json.load(json_file) total_number, examples = _get_examples(xref_dict, vtk_class, language) if examples: if total_number <= number or all_values: print( f"VTK Class: {vtk_class}, language: {language}\n" f"Number of example(s): {total_number}." ) else: print( f"VTK Class: {vtk_class}, language: {language}\n" f"Number of example(s): {total_number} with {number} random sample(s) shown." ) print("\n".join(examples)) else: print(f"No examples for the VTK Class: {vtk_class} and language: {language}") ################################################################################################################# def exe_eog(args): # print("EOG emulator") if settings.dry_run_mode >= 2: print(f"EOG emulator in dry run mode {settings.dry_run_mode}. Skip.") return settings.immediate_rendering = False settings.use_parallel_projection = True settings.enable_default_mouse_callbacks = False settings.enable_default_keyboard_callbacks = False if args.background == "": args.background = "white" if args.background_grad: args.background_grad = get_color(args.background_grad) files = [] for s in sys.argv: if "--" in s or s.endswith(".py") or s.endswith("vedo"): continue if s.endswith(".gif"): continue files.append(s) def vfunc(event): # print(event.keypress) for p in pics: if event.keypress == "r": p.window(win).level(lev) elif event.keypress == "Up": p.level(p.level() + 10) elif event.keypress == "Down": p.level(p.level() - 10) if event.keypress == "Right": p.window(p.window() + 10) elif event.keypress == "Down": p.window(p.window() - 10) elif event.keypress == "m": p.mirror() elif event.keypress == "t": p.rotate(90) elif event.keypress == "f": p.flip() elif event.keypress == "b": p.binarize() elif event.keypress == "i": p.invert() elif event.keypress == "I": plt.color_picker(event.picked2d, verbose=True) elif event.keypress == "k": p.enhance() elif event.keypress == "s": p.smooth(sigma=1) elif event.keypress == "S": ahl = plt.hover_legends[-1] plt.remove(ahl) plt.screenshot() # writer printc(":camera: Image saved as screenshot.png") plt.add(ahl) return elif event.keypress == "h": printc("---------------------------------------------") printc("Press:") printc(" up/down to modify level (or drag mouse)") printc(" left/right to modify window") printc(" m to mirror image horizontally") printc(" f to flip image vertically") printc(" t to rotate image by 90 deg") printc(" i to invert colors") printc(" I to pick the color under mouse") printc(" b to binarize the image") printc(" k to enhance b&w image") printc(" s to apply gaussian smoothing") printc(" S to save image as png") printc("---------------------------------------------") plt.render() pics = [] for f in files: if os.path.isfile(f): try: pic = Image(f) if pic: pics.append(pic) except: vedo.logger.error(f"Could not load image {f}") else: vedo.logger.error(f"Could not load image {f}") n = len(pics) if not n: return pic = pics[0] lev, win = pic.level(), pic.window() if n > 1: plt = Plotter(N=n, sharecam=True, bg=args.background, bg2=args.background_grad) plt.add_callback("key press", vfunc) for i in range(n): p = pics[i].pickable(True) pos = [-p.shape[0] / 2, -p.shape[1] / 2, 0] p.pos(pos) plt.add_hover_legend(at=i, c="k8", bg="k2", alpha=0.4) plt.show(p, axes=0, at=i, mode="image") plt.show(interactive=False) plt.reset_camera(tight=0.05) plt.interactor.Start() if vedo.vtk_version == (9, 2, 2): plt.interactor.GetRenderWindow().SetDisplayId("_0_p_void") else: shape = pic.shape if shape[0] > 1500: shape[1] = shape[1] / shape[0] * 1500 shape[0] = 1500 if shape[1] > 1200: shape[0] = shape[0] / shape[1] * 1200 shape[1] = 1200 plt = Plotter(title=files[0], size=shape, bg=args.background, bg2=args.background_grad) plt.add_callback("key press", vfunc) plt.add_hover_legend(c="k8", bg="k2", alpha=0.4) plt.show(pic, mode="image", interactive=False) plt.reset_camera(tight=0.0) plt.interactor.Start() if vedo.vtk_version == (9, 2, 2): plt.interactor.GetRenderWindow().SetDisplayId("_0_p_void") plt.close() ################################################################################################################# def draw_scene(args): if settings.dry_run_mode >= 2: print(f"draw_scene called in dry run mode {settings.dry_run_mode}. Skip.") return nfiles = len(args.files) if nfiles == 0: printc("No input files.", c="r") return humansort(args.files) wsize = "auto" if args.full_screen: wsize = "full" if args.ray_cast_mode: if args.background == "": args.background = "bb" if args.background == "": args.background = "white" if args.background_grad: args.background_grad = get_color(args.background_grad) if nfiles == 1 and args.files[0].endswith(".gif"): ###can be improved frames = load(args.files[0]) applications.Browser(frames).show(bg=args.background, bg2=args.background_grad) return ########################################################## if args.sequence_mode: args.multirenderer_mode = False settings.default_font = args.font sharecam = args.no_camera_share N = None if args.multirenderer_mode: if nfiles < 201: N = nfiles if nfiles > 200: printc(":lightning: Warning: option '-n' allows a maximum of 200 files", c="y") printc(" you are trying to load ", nfiles, " files.\n", c="y") N = 200 if N > 4: settings.use_depth_peeling = False plt = Plotter( size=wsize, N=N, bg=args.background, bg2=args.background_grad, sharecam=sharecam, ) settings.immediate_rendering = False plt.axes = args.axes_type for i in range(N): plt.add_hover_legend(at=i) if args.axes_type in (4, 5): plt.axes = 0 else: N = nfiles plt = Plotter(size=wsize, bg=args.background, bg2=args.background_grad) plt.axes = args.axes_type plt.add_hover_legend() ########################################################## # special case of SLC/TIFF volumes with -g option if args.ray_cast_mode: # print('DEBUG special case of SLC/TIFF volumes with -g option') vol = file_io.load(args.files[0], force=args.reload) if not isinstance(vol, Volume): vedo.logger.error(f"expected a Volume but loaded a {type(vol)} object") return sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vol.mode(int(args.mode)).color(args.cmap).jittering(True) plt = applications.RayCastPlotter(vol) plt.show(viewup="z", interactive=True).close() return ########################################################## # special case of SLC/TIFF/DICOM volumes with --slicer3d option elif args.slicer3d: # print('DEBUG special case of SLC/TIFF/DICOM volumes with --slicer3d option') useSlider3D = False if args.axes_type == 4: args.axes_type = 1 elif args.axes_type == 3: args.axes_type = 1 useSlider3D = True vol = file_io.load(args.files[0], force=args.reload) sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vedo.plotter_instance = None # reset plt = applications.Slicer3DPlotter( vol, bg="white", bg2="lb", use_slider3d=useSlider3D, axes=args.axes_type, clamp=True, size=(1350, 1000), ) plt += vedo.Text2D(args.files[0], pos="top-left", font="VictorMono", s=1, c="k") plt.show() return ######################################################################## elif args.edit: # print('edit mode for meshes and pointclouds') vedo.plotter_instance = None # reset settings.use_parallel_projection = True try: m = Mesh(args.files[0], alpha=args.alpha / 2, c=args.color) except AttributeError: vedo.logger.critical( "In edit mode, input file must be a point cloud or polygonal mesh." ) return plt = applications.FreeHandCutPlotter(m, splined=True) plt.add_hover_legend() if not args.background_grad: args.background_grad = None plt.start(axes=1, bg=args.background, bg2=args.background_grad) ######################################################################## elif args.slicer2d: # print('DEBUG special case of SLC/TIFF/DICOM volumes with --slicer2d option') vol = file_io.load(args.files[0], force=args.reload) if not vol: return vol.cmap("bone_r") sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vedo.plotter_instance = applications.Slicer2DPlotter(vol) vedo.plotter_instance.show().close() return ######################################################################## # normal mode for single VOXEL file with Isosurface Slider mode elif nfiles == 1 and ( ".slc" in args.files[0].lower() or ".vti" in args.files[0].lower() or ".tif" in args.files[0].lower() or ".mhd" in args.files[0].lower() or ".nrrd" in args.files[0].lower() or ".dem" in args.files[0].lower() ): # print('DEBUG normal mode for single VOXEL file with Isosurface Slider mode') vol = file_io.load(args.files[0], force=args.reload) if vol.shape[2] == 1: # print('DEBUG It is a 2D image!') img = vedo.Image(args.files[0]) plt = vedo.Plotter().parallel_projection() plt.show(img, zoom="tightest", mode="image").close() return sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) if not args.color: args.color = "gold" plt = applications.IsosurfaceBrowser( vol, c=args.color, cmap=args.cmap, precompute=False, use_gpu=True ) plt.show(zoom=args.zoom, viewup="z").close() return ######################################################################## # NORMAL mode for single or multiple files, or multiren mode, or numpy scene elif nfiles == 1 or (not args.sequence_mode): # print('DEBUG NORMAL mode for single or multiple files, or multiren mode') interactor_mode = 0 if args.image: interactor_mode = "image" ########################################################## # loading a full scene or list of objects if ".npy" in args.files[0] or ".npz" in args.files[0]: try: # full scene plt = file_io.import_window(args.files[0]) plt.show(mode=interactor_mode).close() return except KeyError: # list of objects, create Assembly objs = vedo.Assembly(args.files[0]) for i, ob in enumerate(objs): if ob: ob.c(i) plt = Plotter() plt.show(objs, mode=interactor_mode).close() return ######################################################### ds = 0 objs = [] for i in range(N): f = args.files[i] colb = args.color if args.color is None and N > 1: colb = i obj = load(f, force=args.reload) if isinstance(obj, (TetMesh, UnstructuredGrid)): # obj = obj#.shrink(0.95) obj.c(colb).alpha(args.alpha) elif isinstance(obj, vedo.Points): obj.c(colb).alpha(args.alpha) try: obj.wireframe(args.wireframe) if args.flat: obj.flat() else: obj.phong() except AttributeError: pass obj.lighting(args.lighting) if i == 0 and args.texture_file: obj.texture(args.texture_file) if args.point_size > 0: obj.ps(args.point_size) if args.cmap != "jet": obj.cmap(args.cmap) if args.showedges: try: obj.GetProperty().SetEdgeVisibility(1) obj.GetProperty().SetLineWidth(0.1) obj.GetProperty().SetRepresentationToSurface() except AttributeError: pass objs.append(obj) if args.multirenderer_mode: try: ds = obj.diagonal_size() * 3 plt.camera.SetClippingRange(0, ds) plt.reset_camera() # plt.render() plt.show( obj, at=i, interactive=False, zoom=args.zoom, mode=interactor_mode, ) except AttributeError: # wildcards in quotes make glob return obj as a list :( vedo.logger.error("Please do not use wildcards within single or double quotes") if args.multirenderer_mode: plt.interactor.Start() if vedo.vtk_version == (9, 2, 2): plt.interactor.GetRenderWindow().SetDisplayId("_0_p_void") else: # scene is empty if all(a is None for a in objs): vedo.logger.error("Could not load file(s). Quit.") return plt.show(objs, interactive=True, zoom=args.zoom, mode=interactor_mode) return ######################################################################## # sequence mode -s else: # print("DEBUG simple browser mode -s") if plt.axes == 4: plt.axes = 1 acts = load(args.files, force=args.reload) plt += acts for a in acts: if hasattr(a, "c"): # Image doesnt have it a.c(args.color) if args.point_size > 0: try: a.GetProperty().SetPointSize(args.point_size) a.GetProperty().SetRepresentationToPoints() except AttributeError: pass if args.cmap != "jet": try: a.cmap(args.cmap) except AttributeError: pass try: a.lighting(args.lighting) except AttributeError: pass a.alpha(args.alpha) plt = applications.Browser(acts, axes=1) plt.show(zoom=args.zoom).close() vedo-2025.5.3/vedo/cmaps.py000066400000000000000000011232231474667405700153470ustar00rootroot00000000000000cmaps = { "Accent": [ "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666" ], "Blues": [ "#f7fbff", "#f6fafe", "#f5f9fe", "#f4f9fe", "#f3f8fd", "#f3f8fd", "#f2f7fd", "#f1f7fd", "#f0f6fc", "#eff6fc", "#eff5fc", "#eef5fc", "#edf4fb", "#ecf4fb", "#ecf3fb", "#ebf3fb", "#eaf2fa", "#e9f2fa", "#e8f1fa", "#e8f1fa", "#e7f0f9", "#e6f0f9", "#e5eff9", "#e4eff9", "#e4eef8", "#e3eef8", "#e2edf8", "#e1edf8", "#e1ecf7", "#e0ecf7", "#dfebf7", "#deebf7", "#ddeaf6", "#ddeaf6", "#dce9f6", "#dbe9f6", "#dae8f5", "#dae8f5", "#d9e7f5", "#d8e7f5", "#d7e6f4", "#d7e6f4", "#d6e5f4", "#d5e5f4", "#d4e4f3", "#d4e4f3", "#d3e3f3", "#d2e3f3", "#d1e2f2", "#d1e2f2", "#d0e1f2", "#cfe1f2", "#cee0f1", "#cee0f1", "#cddff1", "#ccdff1", "#cbdef0", "#cbdef0", "#caddf0", "#c9ddf0", "#c8dcef", "#c8dcef", "#c7dbef", "#c6dbef", "#c5daee", "#c4daee", "#c3d9ee", "#c1d9ed", "#c0d8ed", "#bfd8ec", "#bed7ec", "#bcd7eb", "#bbd6eb", "#bad6ea", "#b9d5ea", "#b7d4ea", "#b6d4e9", "#b5d3e9", "#b4d3e8", "#b2d2e8", "#b1d2e7", "#b0d1e7", "#afd1e6", "#add0e6", "#acd0e6", "#abcfe5", "#aacfe5", "#a8cee4", "#a7cee4", "#a6cde3", "#a5cde3", "#a3cce3", "#a2cbe2", "#a1cbe2", "#a0cae1", "#9ecae1", "#9dc9e0", "#9bc8e0", "#9ac7e0", "#98c7df", "#97c6df", "#95c5df", "#93c4de", "#92c3de", "#90c2de", "#8fc1dd", "#8dc0dd", "#8bc0dd", "#8abfdc", "#88bedc", "#87bddc", "#85bcdb", "#83bbdb", "#82badb", "#80b9da", "#7fb8da", "#7db8d9", "#7bb7d9", "#7ab6d9", "#78b5d8", "#77b4d8", "#75b3d8", "#73b2d7", "#72b1d7", "#70b1d7", "#6fb0d6", "#6dafd6", "#6baed6", "#6aadd5", "#69acd5", "#67abd4", "#66aad4", "#65aad3", "#63a9d3", "#62a8d2", "#61a7d2", "#60a6d1", "#5ea5d1", "#5da4d0", "#5ca3d0", "#5aa3cf", "#59a2cf", "#58a1ce", "#57a0ce", "#559fcd", "#549ecd", "#539dcc", "#519ccc", "#509bcb", "#4f9bcb", "#4e9aca", "#4c99ca", "#4b98c9", "#4a97c9", "#4896c8", "#4795c8", "#4694c7", "#4594c7", "#4393c6", "#4292c6", "#4191c5", "#4090c5", "#3f8fc4", "#3e8ec4", "#3d8dc3", "#3c8cc3", "#3b8bc2", "#3a8ac1", "#3989c1", "#3888c0", "#3787c0", "#3585bf", "#3484bf", "#3383be", "#3282be", "#3181bd", "#3080bd", "#2f7fbc", "#2e7ebc", "#2d7dbb", "#2c7cbb", "#2b7bba", "#2a7ab9", "#2979b9", "#2878b8", "#2777b8", "#2676b7", "#2575b7", "#2474b6", "#2373b6", "#2272b5", "#2171b5", "#2070b4", "#1f6fb3", "#1e6eb2", "#1e6db2", "#1d6cb1", "#1c6bb0", "#1b6aaf", "#1a69ae", "#1a68ae", "#1967ad", "#1866ac", "#1765ab", "#1764ab", "#1663aa", "#1562a9", "#1461a8", "#1360a7", "#135fa7", "#125ea6", "#115da5", "#105ca4", "#0f5ba3", "#0f5aa3", "#0e59a2", "#0d58a1", "#0c57a0", "#0c56a0", "#0b559f", "#0a549e", "#09539d", "#08529c", "#08519c", "#08509a", "#084f99", "#084e97", "#084c96", "#084b94", "#084a92", "#084991", "#08488f", "#08478e", "#08468c", "#08458b", "#084489", "#084388", "#084286", "#084185", "#084083", "#083f82", "#083e80", "#083d7e", "#083c7d", "#083b7b", "#083a7a", "#083978", "#083877", "#083775", "#083674", "#083572", "#083471", "#08336f", "#08326e", "#08316c", "#08306b" ], "BrBG": [ "#543005", "#563105", "#583205", "#5a3305", "#5c3505", "#5e3605", "#613706", "#633906", "#653a06", "#673b06", "#693c06", "#6c3e07", "#6e3f07", "#704007", "#724207", "#744307", "#774408", "#794508", "#7b4708", "#7d4808", "#7f4908", "#824b09", "#844c09", "#864d09", "#884f09", "#8a5009", "#8d510a", "#8f530c", "#91550d", "#93570e", "#955910", "#975b11", "#995d12", "#9b5f14", "#9d6115", "#9f6217", "#a16418", "#a36619", "#a5681b", "#a76a1c", "#a96c1d", "#ab6e1f", "#ad7020", "#af7122", "#b17323", "#b37524", "#b57726", "#b77927", "#b97b28", "#bb7d2a", "#bd7f2b", "#bf812d", "#c08330", "#c18633", "#c28836", "#c48b39", "#c58d3c", "#c6903f", "#c79242", "#c99546", "#ca9749", "#cb9a4c", "#cc9d4f", "#ce9f52", "#cfa255", "#d0a458", "#d1a75c", "#d3a95f", "#d4ac62", "#d5ae65", "#d6b168", "#d8b36b", "#d9b66e", "#dab972", "#dbbb75", "#ddbe78", "#dec07b", "#dfc27e", "#e0c481", "#e1c583", "#e2c786", "#e3c889", "#e3ca8c", "#e4cb8e", "#e5cd91", "#e6ce94", "#e7d097", "#e8d199", "#e9d39c", "#ead49f", "#ebd6a2", "#ecd7a4", "#ecd9a7", "#eddaaa", "#eedcad", "#efddaf", "#f0dfb2", "#f1e0b5", "#f2e2b8", "#f3e3ba", "#f4e5bd", "#f5e6c0", "#f6e8c3", "#f5e8c4", "#f5e9c6", "#f5e9c8", "#f5eaca", "#f5eacc", "#f5ebce", "#f5ebd0", "#f5ecd2", "#f5ecd4", "#f5edd6", "#f5edd8", "#f5eeda", "#f5eedc", "#f5efde", "#f5efe0", "#f5f0e2", "#f5f0e4", "#f5f1e6", "#f5f1e8", "#f5f2ea", "#f5f2ec", "#f5f3ee", "#f5f3f0", "#f5f4f2", "#f5f4f4", "#f4f4f4", "#f2f4f4", "#f0f3f3", "#eef3f2", "#ecf3f2", "#ebf2f1", "#e9f2f0", "#e7f1f0", "#e5f1ef", "#e3f0ef", "#e2f0ee", "#e0f0ed", "#deefed", "#dcefec", "#daeeeb", "#d9eeeb", "#d7edea", "#d5edea", "#d3ede9", "#d1ece8", "#d0ece8", "#ceebe7", "#ccebe6", "#caeae6", "#c8eae5", "#c7eae5", "#c4e8e3", "#c1e7e2", "#bee6e0", "#bbe5df", "#b9e4dd", "#b6e3dc", "#b3e2db", "#b0e0d9", "#addfd8", "#abded6", "#a8ddd5", "#a5dcd4", "#a2dbd2", "#a0dad1", "#9dd8cf", "#9ad7ce", "#97d6cd", "#94d5cb", "#92d4ca", "#8fd3c8", "#8cd2c7", "#89d0c5", "#86cfc4", "#84cec3", "#81cdc1", "#7ecbc0", "#7bc9be", "#78c7bc", "#75c5ba", "#72c3b8", "#6fc1b6", "#6cbfb4", "#69bdb2", "#67bbb0", "#64b8ae", "#61b6ac", "#5eb4aa", "#5bb2a8", "#58b0a6", "#55aea4", "#52aca2", "#4faaa0", "#4ca79e", "#49a59c", "#46a39a", "#43a198", "#409f96", "#3d9d94", "#3a9b92", "#379990", "#35978f", "#32958d", "#30938b", "#2e9189", "#2c8f87", "#2a8d85", "#288b83", "#268981", "#24877f", "#22857d", "#20837b", "#1e8179", "#1c7f77", "#1a7e76", "#187c74", "#167a72", "#147870", "#12766e", "#10746c", "#0e726a", "#0c7068", "#0a6e66", "#086c64", "#066a62", "#046860", "#02665e", "#00655d", "#00635b", "#006159", "#006057", "#005e55", "#005c54", "#005b52", "#005950", "#00584e", "#00564c", "#00544b", "#005349", "#005147", "#004f45", "#004e43", "#004c42", "#004a40", "#00493e", "#00473c", "#00453a", "#004439", "#004237", "#004035", "#003f33", "#003d31", "#003c30" ], "BuGn": [ "#f7fcfd", "#f6fbfc", "#f5fbfc", "#f5fbfc", "#f4fbfc", "#f4fafc", "#f3fafc", "#f3fafc", "#f2fafb", "#f1fafb", "#f1f9fb", "#f0f9fb", "#f0f9fb", "#eff9fb", "#eff8fb", "#eef8fb", "#edf8fa", "#edf8fa", "#ecf8fa", "#ecf7fa", "#ebf7fa", "#ebf7fa", "#eaf7fa", "#eaf6fa", "#e9f6f9", "#e8f6f9", "#e8f6f9", "#e7f6f9", "#e7f5f9", "#e6f5f9", "#e6f5f9", "#e5f5f9", "#e4f4f8", "#e4f4f8", "#e3f4f7", "#e2f4f7", "#e1f3f6", "#e0f3f5", "#e0f3f5", "#dff2f4", "#def2f4", "#ddf2f3", "#ddf2f2", "#dcf1f2", "#dbf1f1", "#daf1f1", "#d9f1f0", "#d9f0ef", "#d8f0ef", "#d7f0ee", "#d6efee", "#d6efed", "#d5efed", "#d4efec", "#d3eeeb", "#d2eeeb", "#d2eeea", "#d1edea", "#d0ede9", "#cfede8", "#ceede8", "#ceece7", "#cdece7", "#ccece6", "#cbebe5", "#caebe4", "#c8eae3", "#c6e9e3", "#c5e9e2", "#c3e8e1", "#c2e8e0", "#c0e7df", "#bee6de", "#bde6dd", "#bbe5dc", "#bae4db", "#b8e4da", "#b6e3d9", "#b5e3d9", "#b3e2d8", "#b2e1d7", "#b0e1d6", "#aee0d5", "#addfd4", "#abdfd3", "#aaded2", "#a8ded1", "#a6ddd0", "#a5dccf", "#a3dccf", "#a2dbce", "#a0dacd", "#9edacc", "#9dd9cb", "#9bd9ca", "#9ad8c9", "#98d7c8", "#96d7c7", "#95d6c6", "#93d5c5", "#92d4c3", "#90d4c2", "#8ed3c1", "#8dd2c0", "#8bd2bf", "#8ad1be", "#88d0bc", "#86d0bb", "#85cfba", "#83ceb9", "#82ceb8", "#80cdb7", "#7eccb5", "#7dccb4", "#7bcbb3", "#7acab2", "#78c9b1", "#76c9b0", "#75c8af", "#73c7ad", "#72c7ac", "#70c6ab", "#6ec5aa", "#6dc5a9", "#6bc4a8", "#6ac3a6", "#68c3a5", "#66c2a4", "#65c1a3", "#64c1a1", "#63c0a0", "#61bf9e", "#60bf9d", "#5fbe9c", "#5ebd9a", "#5dbd99", "#5cbc97", "#5abc96", "#59bb94", "#58ba93", "#57ba91", "#56b990", "#55b88f", "#54b88d", "#52b78c", "#51b78a", "#50b689", "#4fb587", "#4eb586", "#4db484", "#4bb383", "#4ab382", "#49b280", "#48b27f", "#47b17d", "#46b07c", "#44b07a", "#43af79", "#42ae77", "#41ae76", "#40ad75", "#3fac73", "#3eab71", "#3daa70", "#3ca86e", "#3ba76d", "#3aa66b", "#39a56a", "#38a468", "#37a367", "#37a265", "#36a164", "#35a062", "#349f61", "#339d5f", "#329c5d", "#319b5c", "#309a5a", "#2f9959", "#2e9857", "#2d9756", "#2c9654", "#2b9553", "#2a9451", "#299250", "#28914e", "#27904d", "#278f4b", "#268e49", "#258d48", "#248c46", "#238b45", "#228a44", "#218943", "#1f8842", "#1e8742", "#1d8641", "#1c8540", "#1b843f", "#1a833e", "#19823e", "#18813d", "#17803c", "#167f3b", "#157e3a", "#137e3a", "#127d39", "#117c38", "#107b37", "#0f7a37", "#0e7936", "#0d7835", "#0c7734", "#0b7633", "#0a7533", "#087432", "#077331", "#067230", "#057130", "#04702f", "#036f2e", "#026f2d", "#016e2c", "#006d2c", "#006b2b", "#006a2b", "#00692a", "#006829", "#006629", "#006528", "#006428", "#006227", "#006127", "#006026", "#005f26", "#005d25", "#005c25", "#005b24", "#005924", "#005823", "#005723", "#005622", "#005421", "#005321", "#005220", "#005020", "#004f1f", "#004e1f", "#004d1e", "#004b1e", "#004a1d", "#00491d", "#00471c", "#00461c", "#00451b", "#00441b" ], "BuPu": [ "#f7fcfd", "#f6fbfc", "#f5fafc", "#f4fafc", "#f4f9fb", "#f3f9fb", "#f2f8fb", "#f1f8fb", "#f1f7fa", "#f0f7fa", "#eff6fa", "#eff6f9", "#eef5f9", "#edf5f9", "#ecf4f9", "#ecf4f8", "#ebf3f8", "#eaf3f8", "#eaf2f7", "#e9f2f7", "#e8f1f7", "#e7f1f7", "#e7f0f6", "#e6f0f6", "#e5eff6", "#e4eff5", "#e4eef5", "#e3eef5", "#e2edf5", "#e2edf4", "#e1ecf4", "#e0ecf4", "#dfebf3", "#deebf3", "#ddeaf3", "#dce9f2", "#dbe8f2", "#dae7f1", "#d9e7f1", "#d8e6f0", "#d7e5f0", "#d6e4ef", "#d5e4ef", "#d4e3ef", "#d3e2ee", "#d2e1ee", "#d1e0ed", "#d0e0ed", "#cfdfec", "#cedeec", "#cdddec", "#ccddeb", "#cbdceb", "#cadbea", "#c9daea", "#c8d9e9", "#c7d9e9", "#c5d8e8", "#c4d7e8", "#c3d6e8", "#c2d5e7", "#c1d5e7", "#c0d4e6", "#bfd3e6", "#bed2e5", "#bdd2e5", "#bcd1e5", "#bbd0e4", "#bacfe4", "#b9cfe4", "#b8cee3", "#b7cde3", "#b6cde2", "#b5cce2", "#b4cbe2", "#b3cae1", "#b2cae1", "#b1c9e1", "#b0c8e0", "#afc7e0", "#aec7df", "#adc6df", "#acc5df", "#abc5de", "#aac4de", "#a9c3de", "#a7c2dd", "#a6c2dd", "#a5c1dc", "#a4c0dc", "#a3c0dc", "#a2bfdb", "#a1bedb", "#a0bdda", "#9fbdda", "#9ebcda", "#9dbbd9", "#9dbad9", "#9cb9d8", "#9cb7d7", "#9bb6d7", "#9ab5d6", "#9ab4d6", "#99b3d5", "#99b2d4", "#98b0d4", "#98afd3", "#97aed2", "#97add2", "#96acd1", "#95aad0", "#95a9d0", "#94a8cf", "#94a7cf", "#93a6ce", "#93a4cd", "#92a3cd", "#91a2cc", "#91a1cb", "#90a0cb", "#909eca", "#8f9dca", "#8f9cc9", "#8e9bc8", "#8d9ac8", "#8d98c7", "#8c97c6", "#8c96c6", "#8c95c5", "#8c93c5", "#8c92c4", "#8c91c3", "#8c8fc3", "#8c8ec2", "#8c8dc1", "#8c8bc1", "#8c8ac0", "#8c89bf", "#8c87bf", "#8c86be", "#8c85bd", "#8c83bd", "#8c82bc", "#8c81bb", "#8c7fbb", "#8c7eba", "#8c7db9", "#8c7bb9", "#8c7ab8", "#8c78b7", "#8c77b7", "#8c76b6", "#8c74b5", "#8c73b5", "#8c72b4", "#8c70b3", "#8c6fb3", "#8c6eb2", "#8c6cb1", "#8c6bb1", "#8b6ab0", "#8b68af", "#8b67af", "#8b66ae", "#8b64ae", "#8b63ad", "#8b62ac", "#8b60ac", "#8a5fab", "#8a5eaa", "#8a5daa", "#8a5ba9", "#8a5aa9", "#8a59a8", "#8a57a7", "#8a56a7", "#8955a6", "#8953a5", "#8952a5", "#8951a4", "#894fa4", "#894ea3", "#894da2", "#894ba2", "#884aa1", "#8849a0", "#8847a0", "#88469f", "#88459f", "#88439e", "#88429d", "#88419d", "#873f9c", "#873e9b", "#873c9a", "#873b99", "#863998", "#863797", "#863696", "#863494", "#863393", "#853192", "#853091", "#852e90", "#852c8f", "#842b8e", "#84298d", "#84288c", "#84268b", "#84258a", "#832389", "#832288", "#832087", "#831e86", "#831d85", "#821b84", "#821a83", "#821882", "#821781", "#811580", "#81137f", "#81127e", "#81107d", "#810f7c", "#7f0e7a", "#7d0e79", "#7c0d77", "#7a0d76", "#790c74", "#770c72", "#750b71", "#740b6f", "#720a6e", "#700a6c", "#6f096b", "#6d0969", "#6b0868", "#6a0866", "#680865", "#670763", "#650762", "#630660", "#62065e", "#60055d", "#5e055b", "#5d045a", "#5b0458", "#5a0357", "#580355", "#560254", "#550252", "#530151", "#51014f", "#50004e", "#4e004c", "#4d004b" ], "CMRmap": [ "#000000", "#010104", "#020208", "#03030c", "#040410", "#060614", "#070718", "#08081c", "#090920", "#0a0a24", "#0c0c28", "#0d0d2c", "#0e0e30", "#0f0f34", "#101038", "#12123c", "#131340", "#141444", "#151548", "#16164c", "#181850", "#191954", "#1a1a58", "#1b1b5c", "#1c1c60", "#1e1e64", "#1f1f68", "#20206c", "#212170", "#222274", "#242478", "#25257c", "#26267f", "#272681", "#282683", "#2a2685", "#2b2687", "#2c2689", "#2d268b", "#2e268d", "#30268f", "#312691", "#322693", "#332695", "#342697", "#352699", "#37269b", "#38269d", "#39269f", "#3a26a1", "#3c26a3", "#3d26a5", "#3e26a7", "#3f26a9", "#4026ab", "#4126ad", "#4326af", "#4426b1", "#4526b3", "#4626b5", "#4826b7", "#4926b9", "#4a26bb", "#4b26bd", "#4d26be", "#4f26bc", "#5127ba", "#5427b8", "#5627b6", "#5928b4", "#5b28b2", "#5d29b0", "#6029ae", "#6229ac", "#652aaa", "#672aa8", "#692ba6", "#6c2ba4", "#6e2ba2", "#712ca0", "#732c9e", "#752d9c", "#782d9a", "#7a2d98", "#7d2e96", "#7f2e94", "#812f92", "#842f90", "#862f8e", "#89308c", "#8b308a", "#8d3188", "#903186", "#923184", "#953282", "#973280", "#9a337e", "#9d337b", "#a03378", "#a33476", "#a73473", "#aa3570", "#ad356d", "#b0356a", "#b33668", "#b73665", "#ba3762", "#bd375f", "#c0375c", "#c3385a", "#c73857", "#ca3954", "#cd3951", "#d0394e", "#d33a4c", "#d73a49", "#da3b46", "#dd3b43", "#e03b40", "#e33c3e", "#e73c3b", "#ea3d38", "#ed3d35", "#f03d32", "#f33e30", "#f73e2d", "#fa3f2a", "#fd3f27", "#fe4025", "#fd4224", "#fd4423", "#fc4622", "#fb4820", "#fa4a1f", "#f94c1e", "#f94e1d", "#f8501c", "#f7521a", "#f65419", "#f55618", "#f55817", "#f45a16", "#f35c14", "#f25e13", "#f16012", "#f16211", "#f06410", "#ef660e", "#ee680d", "#ed6a0c", "#ed6c0b", "#ec6e0a", "#eb7008", "#ea7207", "#e97406", "#e97605", "#e87804", "#e77a02", "#e67c01", "#e57e00", "#e58000", "#e58201", "#e58402", "#e58602", "#e58803", "#e58a04", "#e58c05", "#e58e06", "#e59006", "#e59207", "#e59408", "#e59609", "#e5980a", "#e59a0a", "#e59c0b", "#e59e0c", "#e5a00d", "#e5a20e", "#e5a40e", "#e5a60f", "#e5a810", "#e5aa11", "#e5ac12", "#e5ae12", "#e5b013", "#e5b214", "#e5b415", "#e5b616", "#e5b816", "#e5ba17", "#e5bc18", "#e5be19", "#e5c01b", "#e5c11f", "#e5c222", "#e5c325", "#e5c428", "#e5c62b", "#e5c72f", "#e5c832", "#e5c935", "#e5ca38", "#e5cc3b", "#e5cd3f", "#e5ce42", "#e5cf45", "#e5d048", "#e5d24b", "#e5d34f", "#e5d452", "#e5d555", "#e5d658", "#e5d85b", "#e5d95f", "#e5da62", "#e5db65", "#e5dc68", "#e5de6b", "#e5df6f", "#e5e072", "#e5e175", "#e5e278", "#e5e47b", "#e5e57f", "#e6e683", "#e7e787", "#e7e78b", "#e8e88f", "#e9e992", "#eaea97", "#ebeb9b", "#ebeb9f", "#ececa3", "#ededa7", "#eeeeab", "#efefaf", "#efefb3", "#f0f0b7", "#f1f1bb", "#f2f2bf", "#f3f3c3", "#f3f3c7", "#f4f4cb", "#f5f5cf", "#f6f6d2", "#f7f7d7", "#f7f7db", "#f8f8df", "#f9f9e3", "#fafae7", "#fbfbeb", "#fbfbef", "#fcfcf3", "#fdfdf7", "#fefefb", "#ffffff" ], "Dark2": [ "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666" ], "GnBu": [ "#f7fcf0", "#f6fbef", "#f5fbee", "#f4fbee", "#f4faed", "#f3faec", "#f2faec", "#f1faeb", "#f1f9ea", "#f0f9ea", "#eff9e9", "#eff8e8", "#eef8e8", "#edf8e7", "#ecf8e6", "#ecf7e6", "#ebf7e5", "#eaf7e4", "#eaf6e4", "#e9f6e3", "#e8f6e2", "#e7f6e2", "#e7f5e1", "#e6f5e0", "#e5f5e0", "#e4f4df", "#e4f4de", "#e3f4de", "#e2f4dd", "#e2f3dc", "#e1f3dc", "#e0f3db", "#dff2da", "#dff2da", "#def2d9", "#def2d8", "#ddf1d8", "#dcf1d7", "#dcf1d6", "#dbf1d6", "#daf0d5", "#daf0d4", "#d9f0d4", "#d9f0d3", "#d8efd2", "#d7efd1", "#d7efd1", "#d6efd0", "#d5eecf", "#d5eecf", "#d4eece", "#d4eecd", "#d3edcd", "#d2edcc", "#d2edcb", "#d1edcb", "#d0ecca", "#d0ecc9", "#cfecc8", "#ceecc8", "#ceebc7", "#cdebc6", "#cdebc6", "#ccebc5", "#cbeac4", "#caeac4", "#c9eac3", "#c8e9c3", "#c7e9c2", "#c6e8c2", "#c4e8c1", "#c3e7c1", "#c2e7c0", "#c1e6c0", "#c0e6bf", "#bfe6bf", "#bee5be", "#bde5be", "#bbe4bd", "#bae4bd", "#b9e3bc", "#b8e3bc", "#b7e2bb", "#b6e2bb", "#b5e2ba", "#b4e1ba", "#b2e1b9", "#b1e0b9", "#b0e0b8", "#afdfb8", "#aedfb7", "#addfb7", "#acdeb6", "#aadeb6", "#a9ddb5", "#a8ddb5", "#a7dcb5", "#a6dcb5", "#a4dbb6", "#a3dbb6", "#a1dab7", "#a0dab7", "#9fd9b8", "#9dd9b8", "#9cd8b8", "#9ad8b9", "#99d7b9", "#97d6ba", "#96d6ba", "#95d5bb", "#93d5bb", "#92d4bc", "#90d4bc", "#8fd3bd", "#8ed3bd", "#8cd2be", "#8bd2be", "#89d1bf", "#88d1bf", "#87d0c0", "#85d0c0", "#84cfc0", "#82cec1", "#81cec1", "#7fcdc2", "#7ecdc2", "#7dccc3", "#7bccc3", "#7acbc4", "#78cac4", "#77cac5", "#76c9c5", "#74c8c6", "#73c7c6", "#71c6c7", "#70c6c7", "#6fc5c8", "#6dc4c8", "#6cc3c8", "#6ac2c9", "#69c2c9", "#67c1ca", "#66c0ca", "#65bfcb", "#63bfcb", "#62becc", "#60bdcc", "#5fbccd", "#5ebbcd", "#5cbbce", "#5bbace", "#59b9cf", "#58b8cf", "#57b8d0", "#55b7d0", "#54b6d0", "#52b5d1", "#51b4d1", "#4fb4d2", "#4eb3d2", "#4db2d2", "#4cb1d1", "#4bafd1", "#4aaed0", "#48adcf", "#47accf", "#46aace", "#45a9cd", "#44a8cd", "#43a7cc", "#42a6cb", "#41a4cb", "#40a3ca", "#3fa2ca", "#3da1c9", "#3c9fc8", "#3b9ec8", "#3a9dc7", "#399cc6", "#389ac6", "#3799c5", "#3698c4", "#3597c4", "#3496c3", "#3294c2", "#3193c2", "#3092c1", "#2f91c0", "#2e8fc0", "#2d8ebf", "#2c8dbe", "#2b8cbe", "#2a8bbd", "#298abd", "#2788bc", "#2687bb", "#2586bb", "#2485ba", "#2384ba", "#2283b9", "#2182b9", "#2080b8", "#1f7fb7", "#1e7eb7", "#1d7db6", "#1b7cb6", "#1a7bb5", "#197ab5", "#1879b4", "#1777b3", "#1676b3", "#1575b2", "#1474b2", "#1373b1", "#1272b1", "#1071b0", "#0f70b0", "#0e6eaf", "#0d6dae", "#0c6cae", "#0b6bad", "#0a6aad", "#0969ac", "#0868ac", "#0866aa", "#0865a9", "#0864a8", "#0863a6", "#0861a5", "#0860a4", "#085fa2", "#085ea1", "#085ca0", "#085b9e", "#085a9d", "#08599b", "#08579a", "#085699", "#085597", "#085496", "#085295", "#085193", "#085092", "#084f91", "#084d8f", "#084c8e", "#084b8d", "#084a8b", "#08488a", "#084789", "#084687", "#084586", "#084385", "#084283", "#084182", "#084081" ], "Greens": [ "#f7fcf5", "#f6fbf4", "#f5fbf3", "#f5fbf3", "#f4fbf2", "#f4faf1", "#f3faf1", "#f3faf0", "#f2faef", "#f1faef", "#f1f9ee", "#f0f9ed", "#f0f9ed", "#eff9ec", "#eff8eb", "#eef8eb", "#edf8ea", "#edf8e9", "#ecf8e9", "#ecf7e8", "#ebf7e7", "#ebf7e7", "#eaf7e6", "#eaf6e5", "#e9f6e5", "#e8f6e4", "#e8f6e3", "#e7f6e3", "#e7f5e2", "#e6f5e1", "#e6f5e1", "#e5f5e0", "#e4f4df", "#e3f4de", "#e3f4dd", "#e2f3dc", "#e1f3db", "#e0f3da", "#dff2d9", "#def2d8", "#ddf1d7", "#dcf1d6", "#dbf1d5", "#daf0d4", "#d9f0d3", "#d8f0d2", "#d7efd1", "#d6efd0", "#d5eecf", "#d4eece", "#d3eecd", "#d3edcc", "#d2edcb", "#d1edca", "#d0ecc9", "#cfecc8", "#ceebc7", "#cdebc6", "#ccebc5", "#cbeac4", "#caeac3", "#c9eac2", "#c8e9c1", "#c7e9c0", "#c6e8bf", "#c5e8be", "#c4e7bd", "#c3e7bc", "#c1e6bb", "#c0e6b9", "#bfe5b8", "#bee5b7", "#bde4b6", "#bbe4b5", "#bae3b4", "#b9e3b2", "#b8e2b1", "#b7e2b0", "#b6e1af", "#b4e1ae", "#b3e0ad", "#b2e0ab", "#b1dfaa", "#b0dfa9", "#aedea8", "#addea7", "#acdda6", "#abdda5", "#aadca3", "#a8dca2", "#a7dba1", "#a6dba0", "#a5da9f", "#a4da9e", "#a2d99c", "#a1d99b", "#a0d89a", "#9fd899", "#9dd798", "#9cd697", "#9ad695", "#99d594", "#98d493", "#96d492", "#95d391", "#93d290", "#92d28e", "#90d18d", "#8fd08c", "#8ed08b", "#8ccf8a", "#8bce89", "#89ce87", "#88cd86", "#87cc85", "#85cc84", "#84cb83", "#82ca82", "#81ca81", "#80c97f", "#7ec87e", "#7dc87d", "#7bc77c", "#7ac67b", "#78c67a", "#77c578", "#76c477", "#74c476", "#73c375", "#71c274", "#70c274", "#6ec173", "#6cc072", "#6bbf71", "#69be70", "#68be70", "#66bd6f", "#64bc6e", "#63bb6d", "#61ba6c", "#60ba6c", "#5eb96b", "#5cb86a", "#5bb769", "#59b769", "#58b668", "#56b567", "#54b466", "#53b365", "#51b365", "#50b264", "#4eb163", "#4cb062", "#4bb061", "#49af61", "#48ae60", "#46ad5f", "#44ac5e", "#43ac5e", "#41ab5d", "#40aa5c", "#3fa95b", "#3ea85b", "#3da75a", "#3ca659", "#3ba558", "#3aa458", "#39a357", "#38a256", "#37a155", "#37a055", "#369f54", "#359e53", "#349d52", "#339c51", "#329b51", "#319a50", "#30994f", "#2f984e", "#2e974e", "#2d964d", "#2c954c", "#2b944b", "#2a934b", "#29924a", "#289149", "#279048", "#278f48", "#268e47", "#258d46", "#248c45", "#238b45", "#228a44", "#218943", "#1f8842", "#1e8742", "#1d8641", "#1c8540", "#1b843f", "#1a833e", "#19823e", "#18813d", "#17803c", "#167f3b", "#157e3a", "#137e3a", "#127d39", "#117c38", "#107b37", "#0f7a37", "#0e7936", "#0d7835", "#0c7734", "#0b7633", "#0a7533", "#087432", "#077331", "#067230", "#057130", "#04702f", "#036f2e", "#026f2d", "#016e2c", "#006d2c", "#006b2b", "#006a2b", "#00692a", "#006829", "#006629", "#006528", "#006428", "#006227", "#006127", "#006026", "#005f26", "#005d25", "#005c25", "#005b24", "#005924", "#005823", "#005723", "#005622", "#005421", "#005321", "#005220", "#005020", "#004f1f", "#004e1f", "#004d1e", "#004b1e", "#004a1d", "#00491d", "#00471c", "#00461c", "#00451b", "#00441b" ], "Greys": [ "#ffffff", "#fefefe", "#fefefe", "#fdfdfd", "#fdfdfd", "#fcfcfc", "#fcfcfc", "#fbfbfb", "#fbfbfb", "#fafafa", "#fafafa", "#f9f9f9", "#f9f9f9", "#f8f8f8", "#f8f8f8", "#f7f7f7", "#f7f7f7", "#f7f7f7", "#f6f6f6", "#f6f6f6", "#f5f5f5", "#f5f5f5", "#f4f4f4", "#f4f4f4", "#f3f3f3", "#f3f3f3", "#f2f2f2", "#f2f2f2", "#f1f1f1", "#f1f1f1", "#f0f0f0", "#f0f0f0", "#efefef", "#efefef", "#eeeeee", "#ededed", "#ededed", "#ececec", "#ebebeb", "#eaeaea", "#eaeaea", "#e9e9e9", "#e8e8e8", "#e7e7e7", "#e7e7e7", "#e6e6e6", "#e5e5e5", "#e5e5e5", "#e4e4e4", "#e3e3e3", "#e2e2e2", "#e2e2e2", "#e1e1e1", "#e0e0e0", "#e0e0e0", "#dfdfdf", "#dedede", "#dddddd", "#dddddd", "#dcdcdc", "#dbdbdb", "#dadada", "#dadada", "#d9d9d9", "#d8d8d8", "#d7d7d7", "#d7d7d7", "#d6d6d6", "#d5d5d5", "#d4d4d4", "#d3d3d3", "#d2d2d2", "#d1d1d1", "#d0d0d0", "#cfcfcf", "#cfcfcf", "#cecece", "#cdcdcd", "#cccccc", "#cbcbcb", "#cacaca", "#c9c9c9", "#c8c8c8", "#c8c8c8", "#c7c7c7", "#c6c6c6", "#c5c5c5", "#c4c4c4", "#c3c3c3", "#c2c2c2", "#c1c1c1", "#c1c1c1", "#c0c0c0", "#bfbfbf", "#bebebe", "#bdbdbd", "#bcbcbc", "#bbbbbb", "#bababa", "#b8b8b8", "#b7b7b7", "#b6b6b6", "#b5b5b5", "#b3b3b3", "#b2b2b2", "#b1b1b1", "#b0b0b0", "#afafaf", "#adadad", "#acacac", "#ababab", "#aaaaaa", "#a8a8a8", "#a7a7a7", "#a6a6a6", "#a5a5a5", "#a4a4a4", "#a2a2a2", "#a1a1a1", "#a0a0a0", "#9f9f9f", "#9d9d9d", "#9c9c9c", "#9b9b9b", "#9a9a9a", "#999999", "#979797", "#969696", "#959595", "#949494", "#939393", "#929292", "#919191", "#8f8f8f", "#8e8e8e", "#8d8d8d", "#8c8c8c", "#8b8b8b", "#8a8a8a", "#898989", "#888888", "#878787", "#868686", "#848484", "#838383", "#828282", "#818181", "#808080", "#7f7f7f", "#7e7e7e", "#7d7d7d", "#7c7c7c", "#7b7b7b", "#7a7a7a", "#787878", "#777777", "#767676", "#757575", "#747474", "#737373", "#727272", "#717171", "#707070", "#6f6f6f", "#6e6e6e", "#6d6d6d", "#6c6c6c", "#6b6b6b", "#6a6a6a", "#696969", "#686868", "#666666", "#656565", "#646464", "#636363", "#626262", "#616161", "#606060", "#5f5f5f", "#5e5e5e", "#5d5d5d", "#5c5c5c", "#5b5b5b", "#5a5a5a", "#595959", "#585858", "#575757", "#565656", "#555555", "#545454", "#535353", "#525252", "#505050", "#4f4f4f", "#4e4e4e", "#4c4c4c", "#4b4b4b", "#494949", "#484848", "#474747", "#454545", "#444444", "#424242", "#414141", "#404040", "#3e3e3e", "#3d3d3d", "#3b3b3b", "#3a3a3a", "#383838", "#373737", "#363636", "#343434", "#333333", "#313131", "#303030", "#2f2f2f", "#2d2d2d", "#2c2c2c", "#2a2a2a", "#292929", "#282828", "#262626", "#252525", "#232323", "#222222", "#212121", "#202020", "#1f1f1f", "#1e1e1e", "#1d1d1d", "#1b1b1b", "#1a1a1a", "#191919", "#181818", "#171717", "#161616", "#141414", "#131313", "#121212", "#111111", "#101010", "#0f0f0f", "#0d0d0d", "#0c0c0c", "#0b0b0b", "#0a0a0a", "#090909", "#080808", "#060606", "#050505", "#040404", "#030303", "#020202", "#010101", "#000000" ], "OrRd": [ "#fff7ec", "#fef6ea", "#fef6e9", "#fef5e8", "#fef5e7", "#fef4e6", "#fef4e5", "#fef3e4", "#fef3e2", "#fef2e1", "#fef2e0", "#fef1df", "#fef1de", "#fef0dd", "#fef0dc", "#feefdb", "#feefd9", "#feefd8", "#feeed7", "#feeed6", "#feedd5", "#feedd4", "#feecd3", "#feecd2", "#feebd0", "#feebcf", "#feeace", "#feeacd", "#fee9cc", "#fee9cb", "#fee8ca", "#fee8c8", "#fde7c7", "#fde7c6", "#fde6c5", "#fde6c3", "#fde5c2", "#fde4c1", "#fde4bf", "#fde3be", "#fde2bd", "#fde2bb", "#fde1ba", "#fde1b9", "#fde0b8", "#fddfb6", "#fddfb5", "#fddeb4", "#fdddb2", "#fdddb1", "#fddcb0", "#fddcae", "#fddbad", "#fddaac", "#fddaaa", "#fdd9a9", "#fdd8a8", "#fdd8a6", "#fdd7a5", "#fdd6a4", "#fdd6a2", "#fdd5a1", "#fdd5a0", "#fdd49e", "#fdd39d", "#fdd39c", "#fdd29c", "#fdd19b", "#fdd09a", "#fdcf99", "#fdcf98", "#fdce98", "#fdcd97", "#fdcc96", "#fdcb95", "#fdcb94", "#fdca94", "#fdc993", "#fdc892", "#fdc891", "#fdc790", "#fdc68f", "#fdc58f", "#fdc48e", "#fdc48d", "#fdc38c", "#fdc28b", "#fdc18b", "#fdc08a", "#fdc089", "#fdbf88", "#fdbe87", "#fdbd86", "#fdbd86", "#fdbc85", "#fdbb84", "#fcba83", "#fcb982", "#fcb780", "#fcb67f", "#fcb47e", "#fcb37c", "#fcb17b", "#fcb07a", "#fcae78", "#fcad77", "#fcac76", "#fcaa74", "#fca973", "#fca771", "#fca670", "#fca46f", "#fca36d", "#fca16c", "#fca06b", "#fc9f69", "#fc9d68", "#fc9c67", "#fc9a65", "#fc9964", "#fc9763", "#fc9661", "#fc9460", "#fc935f", "#fc925d", "#fc905c", "#fc8f5b", "#fc8d59", "#fb8c58", "#fb8b58", "#fa8957", "#fa8857", "#fa8756", "#f98656", "#f98455", "#f88355", "#f88254", "#f88153", "#f77f53", "#f77e52", "#f67d52", "#f67c51", "#f67a51", "#f57950", "#f57850", "#f4774f", "#f4754f", "#f4744e", "#f3734e", "#f3724d", "#f2704d", "#f26f4c", "#f26e4b", "#f16d4b", "#f16b4a", "#f06a4a", "#f06949", "#ef6749", "#ef6648", "#ef6548", "#ee6347", "#ed6245", "#ed6044", "#ec5e43", "#eb5d42", "#ea5b40", "#ea593f", "#e9583e", "#e8563c", "#e7543b", "#e7533a", "#e65139", "#e55037", "#e44e36", "#e34c35", "#e34b33", "#e24932", "#e14731", "#e04630", "#e0442e", "#df422d", "#de412c", "#dd3f2a", "#dd3d29", "#dc3c28", "#db3a27", "#da3825", "#da3724", "#d93523", "#d83321", "#d73220", "#d7301f", "#d62e1e", "#d52d1d", "#d32b1c", "#d22a1b", "#d1281a", "#d02719", "#cf2518", "#ce2417", "#cd2216", "#cb2115", "#ca1f14", "#c91e13", "#c81c12", "#c71b11", "#c61910", "#c5180f", "#c4160e", "#c2150d", "#c1130c", "#c0120b", "#bf100a", "#be0f09", "#bd0d08", "#bc0c07", "#bb0a06", "#b90905", "#b80704", "#b70604", "#b60403", "#b50302", "#b40101", "#b30000", "#b10000", "#af0000", "#ae0000", "#ac0000", "#ab0000", "#a90000", "#a70000", "#a60000", "#a40000", "#a20000", "#a10000", "#9f0000", "#9d0000", "#9c0000", "#9a0000", "#990000", "#970000", "#950000", "#940000", "#920000", "#900000", "#8f0000", "#8d0000", "#8c0000", "#8a0000", "#880000", "#870000", "#850000", "#830000", "#820000", "#800000", "#7f0000" ], "Oranges": [ "#fff5eb", "#fef4ea", "#fef4e9", "#fef3e8", "#fef3e7", "#fef2e6", "#fef2e5", "#fef1e4", "#fef1e3", "#fef0e2", "#fef0e1", "#feefe0", "#feefe0", "#feeedf", "#feeede", "#feeddd", "#feeddc", "#feeddb", "#feecda", "#feecd9", "#feebd8", "#feebd7", "#feead6", "#feead6", "#fee9d5", "#fee9d4", "#fee8d3", "#fee8d2", "#fee7d1", "#fee7d0", "#fee6cf", "#fee6ce", "#fde5cd", "#fde5cc", "#fde4cb", "#fde3c9", "#fde3c8", "#fde2c6", "#fde1c5", "#fde1c4", "#fde0c2", "#fddfc1", "#fddfc0", "#fddebe", "#fdddbd", "#fddcbb", "#fddcba", "#fddbb9", "#fddab7", "#fddab6", "#fdd9b4", "#fdd8b3", "#fdd8b2", "#fdd7b0", "#fdd6af", "#fdd6ae", "#fdd5ac", "#fdd4ab", "#fdd3a9", "#fdd3a8", "#fdd2a7", "#fdd1a5", "#fdd1a4", "#fdd0a3", "#fdcfa1", "#fdce9f", "#fdcd9e", "#fdcc9c", "#fdcb9a", "#fdca98", "#fdc997", "#fdc895", "#fdc793", "#fdc692", "#fdc590", "#fdc48e", "#fdc28c", "#fdc18b", "#fdc089", "#fdbf87", "#fdbe85", "#fdbd84", "#fdbc82", "#fdbb80", "#fdba7f", "#fdb97d", "#fdb87b", "#fdb779", "#fdb678", "#fdb576", "#fdb474", "#fdb272", "#fdb171", "#fdb06f", "#fdaf6d", "#fdae6c", "#fdad6a", "#fdac68", "#fdab67", "#fdaa66", "#fda964", "#fda863", "#fda761", "#fda660", "#fda55e", "#fda45d", "#fda35b", "#fda25a", "#fda158", "#fda057", "#fd9f55", "#fd9e54", "#fd9d52", "#fd9c51", "#fd9a4f", "#fd994e", "#fd984c", "#fd974b", "#fd964a", "#fd9548", "#fd9447", "#fd9345", "#fd9244", "#fd9142", "#fd9041", "#fd8f3f", "#fd8e3e", "#fd8d3c", "#fc8c3b", "#fc8b3a", "#fc8a38", "#fb8937", "#fb8736", "#fa8634", "#fa8533", "#fa8432", "#f98331", "#f9822f", "#f9812e", "#f8802d", "#f87e2b", "#f77d2a", "#f77c29", "#f77b28", "#f67a26", "#f67925", "#f67824", "#f57622", "#f57521", "#f47420", "#f4731f", "#f4721d", "#f3711c", "#f3701b", "#f36f19", "#f26d18", "#f26c17", "#f16b16", "#f16a14", "#f16913", "#f06812", "#ef6712", "#ef6611", "#ee6510", "#ed6410", "#ec630f", "#ec620f", "#eb610e", "#ea600e", "#e95f0d", "#e95d0d", "#e85c0c", "#e75b0b", "#e65a0b", "#e5590a", "#e5580a", "#e45709", "#e35609", "#e25508", "#e25407", "#e15307", "#e05206", "#df5106", "#df5005", "#de4f05", "#dd4e04", "#dc4d03", "#dc4c03", "#db4b02", "#da4a02", "#d94901", "#d94801", "#d74701", "#d64701", "#d44601", "#d34501", "#d14501", "#cf4401", "#ce4401", "#cc4301", "#cb4301", "#c94201", "#c74101", "#c64101", "#c44001", "#c34001", "#c13f01", "#bf3f01", "#be3e02", "#bc3d02", "#bb3d02", "#b93c02", "#b73c02", "#b63b02", "#b43b02", "#b33a02", "#b13a02", "#af3902", "#ae3802", "#ac3802", "#ab3702", "#a93702", "#a73602", "#a63602", "#a43503", "#a33503", "#a23403", "#a13403", "#a03303", "#9e3303", "#9d3203", "#9c3203", "#9b3103", "#993103", "#983003", "#973003", "#962f03", "#952f03", "#932f03", "#922e03", "#912e03", "#902d03", "#8e2d03", "#8d2c03", "#8c2c03", "#8b2b03", "#8a2b03", "#882a03", "#872a03", "#862903", "#852903", "#832803", "#822803", "#812703", "#802703", "#7f2704" ], "PRGn": [ "#40004b", "#42014d", "#44034f", "#460451", "#480653", "#4a0855", "#4c0958", "#4e0b5a", "#500d5c", "#530e5e", "#551060", "#571263", "#591365", "#5b1567", "#5d1769", "#5f186b", "#611a6e", "#641c70", "#661d72", "#681f74", "#6a2076", "#6c2279", "#6e247b", "#70257d", "#72277f", "#742981", "#762b83", "#782e85", "#793086", "#7a3388", "#7c368a", "#7d398b", "#7e3b8d", "#803e8e", "#814190", "#834491", "#844693", "#854995", "#874c96", "#884f98", "#895199", "#8b549b", "#8c579c", "#8e5a9e", "#8f5ca0", "#905fa1", "#9262a3", "#9365a4", "#9467a6", "#966aa7", "#976da9", "#9970ab", "#9a72ac", "#9c74ad", "#9d76af", "#9f78b0", "#a17ab2", "#a27cb3", "#a47eb4", "#a580b6", "#a782b7", "#a984b9", "#aa86ba", "#ac88bb", "#ad8bbd", "#af8dbe", "#b18fc0", "#b291c1", "#b493c3", "#b595c4", "#b797c5", "#b999c7", "#ba9bc8", "#bc9dca", "#bd9fcb", "#bfa1cc", "#c1a3ce", "#c2a5cf", "#c4a7d0", "#c5a9d1", "#c7abd2", "#c8add3", "#c9afd4", "#cbb0d5", "#ccb2d6", "#ceb4d7", "#cfb6d8", "#d1b8d9", "#d2bada", "#d4bcdb", "#d5bddc", "#d7bfdd", "#d8c1de", "#d9c3df", "#dbc5e0", "#dcc7e1", "#dec8e2", "#dfcae3", "#e1cce4", "#e2cee5", "#e4d0e6", "#e5d2e7", "#e7d4e8", "#e7d5e8", "#e8d6e9", "#e8d8e9", "#e9d9ea", "#eadaea", "#eadceb", "#ebddec", "#ecdeec", "#ece0ed", "#ede1ed", "#ede3ee", "#eee4ef", "#efe5ef", "#efe7f0", "#f0e8f0", "#f1e9f1", "#f1ebf2", "#f2ecf2", "#f2eef3", "#f3eff3", "#f4f0f4", "#f4f2f4", "#f5f3f5", "#f6f4f6", "#f6f6f6", "#f6f6f6", "#f5f6f4", "#f4f6f3", "#f2f6f2", "#f1f5f0", "#f0f5ef", "#eff5ed", "#eef4ec", "#edf4eb", "#ebf4e9", "#eaf4e8", "#e9f3e6", "#e8f3e5", "#e7f3e3", "#e5f3e2", "#e4f2e1", "#e3f2df", "#e2f2de", "#e1f1dc", "#e0f1db", "#def1da", "#ddf1d8", "#dcf0d7", "#dbf0d5", "#daf0d4", "#d9f0d3", "#d7efd1", "#d5eecf", "#d3edcd", "#d1eccb", "#cfebc9", "#cdebc7", "#cbeac5", "#c9e9c3", "#c7e8c1", "#c5e7bf", "#c3e6bd", "#c1e6bb", "#bfe5b9", "#bde4b7", "#bbe3b5", "#b9e2b3", "#b7e2b1", "#b5e1af", "#b3e0ad", "#b1dfab", "#afdea9", "#addda7", "#abdda5", "#a9dca3", "#a7dba1", "#a4da9e", "#a1d89c", "#9ed699", "#9bd497", "#98d394", "#95d192", "#92cf8f", "#8fcd8d", "#8ccc8b", "#89ca88", "#86c886", "#83c683", "#80c481", "#7dc37e", "#7ac17c", "#77bf79", "#74bd77", "#71bc74", "#6eba72", "#6bb86f", "#68b66d", "#65b56a", "#62b368", "#5fb165", "#5caf63", "#5aae61", "#57ab5f", "#55a95d", "#52a75c", "#50a55a", "#4da358", "#4ba157", "#489f55", "#469d53", "#439a52", "#419850", "#3e964e", "#3c944d", "#39924b", "#379049", "#348e48", "#328c46", "#308a45", "#2d8743", "#2b8541", "#288340", "#26813e", "#237f3c", "#217d3b", "#1e7b39", "#1c7937", "#1a7636", "#197435", "#187234", "#177033", "#166e32", "#156c30", "#146a2f", "#13682e", "#12662d", "#10642c", "#0f622b", "#0e602a", "#0d5e29", "#0c5c28", "#0b5a27", "#0a5825", "#095624", "#085423", "#075222", "#065021", "#054e20", "#044c1f", "#034a1e", "#02481d", "#01461c", "#00441b" ], "Paired": [ "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928" ], "Pastel1": [ "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2" ], "Pastel2": [ "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc" ], "PiYG": [ "#8e0152", "#900253", "#920355", "#940457", "#960558", "#98065a", "#9a075c", "#9d085d", "#9f095f", "#a10a61", "#a30b62", "#a50c64", "#a70d66", "#aa0e67", "#ac0f69", "#ae106b", "#b0116c", "#b2126e", "#b41370", "#b61472", "#b91573", "#bb1675", "#bd1777", "#bf1878", "#c1197a", "#c31a7c", "#c51c7d", "#c6207f", "#c72481", "#c82783", "#c92b85", "#ca2e87", "#cb3289", "#cc368b", "#cd398d", "#ce3d8f", "#cf4091", "#d04493", "#d14895", "#d24b96", "#d34f98", "#d4529a", "#d5569c", "#d65a9e", "#d75da0", "#d861a2", "#d964a4", "#da68a6", "#db6ca8", "#dc6faa", "#dd73ac", "#de77ae", "#de79af", "#df7bb1", "#e07eb3", "#e080b4", "#e183b6", "#e285b8", "#e388ba", "#e38abb", "#e48dbd", "#e58fbf", "#e692c0", "#e694c2", "#e797c4", "#e899c6", "#e99cc7", "#e99ec9", "#eaa1cb", "#eba3cd", "#eca5ce", "#eca8d0", "#edaad2", "#eeadd3", "#efafd5", "#efb2d7", "#f0b4d9", "#f1b6da", "#f1b8db", "#f2badc", "#f2bbdc", "#f3bddd", "#f3bfde", "#f4c0df", "#f4c2e0", "#f5c3e1", "#f5c5e1", "#f5c7e2", "#f6c8e3", "#f6cae4", "#f7cce5", "#f7cde5", "#f8cfe6", "#f8d1e7", "#f9d2e8", "#f9d4e9", "#fad6ea", "#fad7ea", "#fbd9eb", "#fbdbec", "#fcdced", "#fcdeee", "#fde0ef", "#fce0ef", "#fce1ef", "#fce2ef", "#fce3f0", "#fbe4f0", "#fbe5f0", "#fbe6f1", "#fbe7f1", "#fae8f1", "#fae9f2", "#fae9f2", "#faeaf2", "#f9ebf3", "#f9ecf3", "#f9edf3", "#f9eef4", "#f9eff4", "#f8f0f4", "#f8f1f4", "#f8f2f5", "#f8f2f5", "#f7f3f5", "#f7f4f6", "#f7f5f6", "#f7f6f6", "#f6f6f6", "#f6f6f4", "#f5f6f3", "#f4f6f1", "#f4f6f0", "#f3f6ee", "#f2f6ed", "#f2f6eb", "#f1f6ea", "#f0f6e8", "#f0f6e6", "#eff6e5", "#eef6e3", "#eef5e2", "#edf5e0", "#ecf5df", "#ecf5dd", "#ebf5dc", "#eaf5da", "#eaf5d9", "#e9f5d7", "#e8f5d6", "#e8f5d4", "#e7f5d3", "#e6f5d1", "#e6f5d0", "#e4f4cd", "#e2f3ca", "#e0f2c7", "#def1c4", "#dcf1c1", "#dbf0be", "#d9efbb", "#d7eeb8", "#d5edb5", "#d3edb2", "#d2ecb0", "#d0ebad", "#ceeaaa", "#cceaa7", "#cae9a4", "#c9e8a1", "#c7e79e", "#c5e69b", "#c3e698", "#c1e595", "#c0e493", "#bee390", "#bce28d", "#bae28a", "#b8e187", "#b6e084", "#b4de81", "#b2dd7f", "#b0db7c", "#adda79", "#abd977", "#a9d774", "#a7d671", "#a5d46f", "#a2d36c", "#a0d169", "#9ed066", "#9cce64", "#99cd61", "#97cb5e", "#95ca5c", "#93c959", "#90c756", "#8ec653", "#8cc451", "#8ac34e", "#87c14b", "#85c049", "#83be46", "#81bd43", "#7fbc41", "#7dba3f", "#7bb83e", "#79b73d", "#77b53b", "#75b33a", "#73b239", "#71b038", "#6fae36", "#6dad35", "#6bab34", "#69a933", "#67a831", "#65a630", "#63a42f", "#61a32e", "#5fa12c", "#5da02b", "#5b9e2a", "#599c29", "#579b27", "#559926", "#539725", "#519624", "#4f9422", "#4d9221", "#4c9120", "#4a8f20", "#498d20", "#478b1f", "#46891f", "#44881f", "#43861e", "#41841e", "#40821e", "#3e801e", "#3d7f1d", "#3b7d1d", "#3a7b1d", "#38791c", "#37771c", "#35761c", "#34741b", "#32721b", "#31701b", "#2f6e1a", "#2e6d1a", "#2c6b1a", "#2b6919", "#296719", "#286519", "#276419" ], "PuBu": [ "#fff7fb", "#fef6fa", "#fdf5fa", "#fdf5fa", "#fcf4f9", "#fcf4f9", "#fbf3f9", "#faf3f9", "#faf2f8", "#f9f2f8", "#f9f1f8", "#f8f1f7", "#f7f0f7", "#f7f0f7", "#f6eff7", "#f6eff6", "#f5eef6", "#f4eef6", "#f4edf5", "#f3edf5", "#f3ecf5", "#f2ecf5", "#f1ebf4", "#f1ebf4", "#f0eaf4", "#f0eaf3", "#efe9f3", "#eee9f3", "#eee8f3", "#ede8f2", "#ede7f2", "#ece7f2", "#ebe6f1", "#ebe6f1", "#eae5f1", "#e9e4f0", "#e8e4f0", "#e7e3f0", "#e6e2ef", "#e5e2ef", "#e4e1ee", "#e3e0ee", "#e3e0ee", "#e2dfed", "#e1deed", "#e0dded", "#dfddec", "#dedcec", "#dddbeb", "#dcdbeb", "#dcdaeb", "#dbd9ea", "#dad9ea", "#d9d8ea", "#d8d7e9", "#d7d7e9", "#d6d6e8", "#d5d5e8", "#d5d4e8", "#d4d4e7", "#d3d3e7", "#d2d2e7", "#d1d2e6", "#d0d1e6", "#cfd0e5", "#ced0e5", "#cdcfe5", "#cbcee4", "#cacee4", "#c9cde4", "#c7cde3", "#c6cce3", "#c5cbe3", "#c3cbe2", "#c2cae2", "#c1c9e2", "#bfc9e1", "#bec8e1", "#bdc8e1", "#bbc7e0", "#bac6e0", "#b9c6e0", "#b7c5df", "#b6c4df", "#b5c4df", "#b4c3de", "#b2c3de", "#b1c2dd", "#b0c1dd", "#aec1dd", "#adc0dc", "#acbfdc", "#aabfdc", "#a9bedb", "#a8bedb", "#a6bddb", "#a5bcda", "#a3bcda", "#a2bbda", "#a0bad9", "#9fbad9", "#9db9d8", "#9cb9d8", "#9ab8d8", "#98b7d7", "#97b7d7", "#95b6d7", "#94b5d6", "#92b5d6", "#91b4d5", "#8fb3d5", "#8db3d5", "#8cb2d4", "#8ab2d4", "#89b1d4", "#87b0d3", "#86b0d3", "#84afd2", "#82aed2", "#81aed2", "#7fadd1", "#7eadd1", "#7cacd1", "#7babd0", "#79abd0", "#77aacf", "#76a9cf", "#74a9cf", "#73a8ce", "#71a7ce", "#6fa7cd", "#6da6cd", "#6ba5cc", "#69a4cc", "#67a3cb", "#65a3cb", "#63a2cb", "#61a1ca", "#5fa0ca", "#5d9fc9", "#5b9fc9", "#599ec8", "#579dc8", "#559cc7", "#539cc7", "#519bc6", "#509ac6", "#4e99c5", "#4c98c5", "#4a98c4", "#4897c4", "#4696c3", "#4495c3", "#4294c3", "#4094c2", "#3e93c2", "#3c92c1", "#3a91c1", "#3891c0", "#3690c0", "#358fbf", "#338ebf", "#318dbe", "#308cbe", "#2e8bbd", "#2d8abd", "#2b89bc", "#2a88bc", "#2887bb", "#2786bb", "#2585ba", "#2484ba", "#2283b9", "#2182b9", "#1f81b8", "#1d80b8", "#1c7fb7", "#1a7eb7", "#197db6", "#177cb6", "#167bb5", "#147ab5", "#1379b4", "#1178b4", "#1077b3", "#0e76b3", "#0d75b2", "#0b74b2", "#0973b1", "#0872b1", "#0671b0", "#0570b0", "#046faf", "#046eae", "#046eac", "#046dab", "#046caa", "#046ca9", "#046ba8", "#046aa7", "#0469a6", "#0469a5", "#0468a4", "#0467a3", "#0467a2", "#0466a0", "#04659f", "#04659e", "#04649d", "#04639c", "#04639b", "#04629a", "#046199", "#046098", "#046097", "#045f95", "#045e94", "#045e93", "#045d92", "#045c91", "#045c90", "#045b8f", "#045a8e", "#045a8d", "#03598b", "#035889", "#035688", "#035586", "#035484", "#035383", "#035281", "#03517f", "#03507e", "#034f7c", "#034e7a", "#034d79", "#034c77", "#034b75", "#034a74", "#034972", "#024870", "#02466f", "#02456d", "#02446b", "#02436a", "#024268", "#024166", "#024065", "#023f63", "#023e61", "#023d60", "#023c5e", "#023b5c", "#023a5b", "#023959", "#023858" ], "PuBuGn": [ "#fff7fb", "#fef6fa", "#fdf5fa", "#fdf5f9", "#fcf4f9", "#fcf3f9", "#fbf3f8", "#faf2f8", "#faf1f8", "#f9f1f7", "#f9f0f7", "#f8eff7", "#f7eff6", "#f7eef6", "#f6edf6", "#f6edf5", "#f5ecf5", "#f4ebf5", "#f4ebf4", "#f3eaf4", "#f3e9f4", "#f2e9f3", "#f1e8f3", "#f1e7f3", "#f0e7f2", "#f0e6f2", "#efe5f2", "#eee5f1", "#eee4f1", "#ede3f0", "#ede3f0", "#ece2f0", "#ebe1ef", "#ebe1ef", "#eae0ef", "#e9e0ef", "#e8dfee", "#e7dfee", "#e6deee", "#e5deed", "#e4dded", "#e3dded", "#e3dcec", "#e2dcec", "#e1dbec", "#e0dbeb", "#dfdaeb", "#ded9eb", "#ddd9ea", "#dcd8ea", "#dcd8ea", "#dbd7ea", "#dad7e9", "#d9d6e9", "#d8d6e9", "#d7d5e8", "#d6d5e8", "#d5d4e8", "#d5d4e7", "#d4d3e7", "#d3d3e7", "#d2d2e6", "#d1d1e6", "#d0d1e6", "#cfd0e5", "#ced0e5", "#cdcfe5", "#cbcee4", "#cacee4", "#c9cde4", "#c7cde3", "#c6cce3", "#c5cbe3", "#c3cbe2", "#c2cae2", "#c1c9e2", "#bfc9e1", "#bec8e1", "#bdc8e1", "#bbc7e0", "#bac6e0", "#b9c6e0", "#b7c5df", "#b6c4df", "#b5c4df", "#b4c3de", "#b2c3de", "#b1c2dd", "#b0c1dd", "#aec1dd", "#adc0dc", "#acbfdc", "#aabfdc", "#a9bedb", "#a8bedb", "#a6bddb", "#a5bcda", "#a3bcda", "#a1bbda", "#9fbad9", "#9dbad9", "#9bb9d8", "#99b9d8", "#97b8d8", "#95b7d7", "#93b7d7", "#91b6d7", "#8fb5d6", "#8db5d6", "#8bb4d5", "#89b3d5", "#87b3d5", "#85b2d4", "#83b2d4", "#81b1d4", "#7fb0d3", "#7db0d3", "#7bafd2", "#79aed2", "#77aed2", "#75add1", "#73add1", "#71acd1", "#6fabd0", "#6dabd0", "#6baacf", "#69a9cf", "#67a9cf", "#66a8ce", "#64a7ce", "#63a7cd", "#61a6cd", "#60a5cc", "#5ea4cc", "#5da3cb", "#5ba3cb", "#59a2cb", "#58a1ca", "#56a0ca", "#559fc9", "#539fc9", "#529ec8", "#509dc8", "#4f9cc7", "#4d9cc7", "#4c9bc6", "#4a9ac6", "#4999c5", "#4798c5", "#4598c4", "#4497c4", "#4296c3", "#4195c3", "#3f94c3", "#3e94c2", "#3c93c2", "#3b92c1", "#3991c1", "#3891c0", "#3690c0", "#348fbe", "#338fbd", "#318ebb", "#308eb9", "#2e8db8", "#2c8db6", "#2b8cb4", "#298cb3", "#278bb1", "#268baf", "#248bae", "#238aac", "#218aaa", "#1f89a8", "#1e89a7", "#1c88a5", "#1a88a3", "#1987a2", "#1787a0", "#15869e", "#14869d", "#12859b", "#118599", "#0f8497", "#0d8496", "#0c8394", "#0a8392", "#088391", "#07828f", "#05828d", "#04818c", "#02818a", "#018088", "#017f87", "#017f85", "#017e84", "#017d82", "#017d81", "#017c7f", "#017b7e", "#017b7c", "#017a7b", "#017979", "#017977", "#017876", "#017774", "#017773", "#017671", "#017570", "#01756e", "#01746d", "#01736b", "#01736a", "#017268", "#017267", "#017165", "#017063", "#017062", "#016f60", "#016e5f", "#016e5d", "#016d5c", "#016c5a", "#016c59", "#016a58", "#016956", "#016855", "#016754", "#016653", "#016452", "#016351", "#016250", "#01614f", "#01604e", "#015f4d", "#015d4b", "#015c4a", "#015b49", "#015a48", "#015947", "#015746", "#015645", "#015544", "#015443", "#015342", "#015140", "#01503f", "#014f3e", "#014e3d", "#014d3c", "#014b3b", "#014a3a", "#014939", "#014838", "#014737", "#014636" ], "PuOr": [ "#7f3b08", "#813c07", "#833d07", "#853e07", "#873f07", "#894007", "#8b4107", "#8d4207", "#8f4407", "#914507", "#934607", "#954707", "#974807", "#994906", "#9b4a06", "#9d4c06", "#9f4d06", "#a14e06", "#a34f06", "#a55006", "#a75106", "#a95206", "#ab5406", "#ad5506", "#af5606", "#b15706", "#b35806", "#b55a06", "#b75c07", "#b95d07", "#ba5f08", "#bc6109", "#be6209", "#c0640a", "#c2650a", "#c3670b", "#c5690b", "#c76a0c", "#c96c0c", "#ca6e0d", "#cc6f0d", "#ce710e", "#d0730f", "#d1740f", "#d37610", "#d57810", "#d77911", "#d87b11", "#da7d12", "#dc7e12", "#de8013", "#e08214", "#e18417", "#e2861a", "#e3881d", "#e48a20", "#e58c23", "#e68e26", "#e79029", "#e9922c", "#ea952f", "#eb9732", "#ec9936", "#ed9b39", "#ee9d3c", "#ef9f3f", "#f1a142", "#f2a345", "#f3a548", "#f4a84b", "#f5aa4e", "#f6ac51", "#f7ae55", "#f9b058", "#fab25b", "#fbb45e", "#fcb661", "#fdb864", "#fdba67", "#fdbb6b", "#fdbd6e", "#fdbf71", "#fdc074", "#fdc278", "#fdc37b", "#fdc57e", "#fdc681", "#fdc885", "#fdca88", "#fdcb8b", "#fdcd8e", "#fdce92", "#fdd095", "#fdd198", "#fdd39b", "#fdd59f", "#fdd6a2", "#fdd8a5", "#fdd9a8", "#fddbac", "#fddcaf", "#fddeb2", "#fee0b6", "#fde0b8", "#fde1bb", "#fde2bd", "#fce3c0", "#fce4c2", "#fce5c5", "#fce6c7", "#fbe7ca", "#fbe8cc", "#fbe9cf", "#fae9d2", "#faead4", "#faebd7", "#faecd9", "#f9eddc", "#f9eede", "#f9efe1", "#f9f0e3", "#f8f1e6", "#f8f2e8", "#f8f2eb", "#f7f3ee", "#f7f4f0", "#f7f5f3", "#f7f6f5", "#f6f6f6", "#f5f5f6", "#f3f4f5", "#f2f3f5", "#f1f1f4", "#f0f0f4", "#efeff3", "#edeef3", "#ecedf3", "#ebecf2", "#eaebf2", "#e9e9f1", "#e7e8f1", "#e6e7f0", "#e5e6f0", "#e4e5ef", "#e2e4ef", "#e1e3ee", "#e0e1ee", "#dfe0ed", "#dedfed", "#dcdeec", "#dbddec", "#dadceb", "#d9dbeb", "#d8daeb", "#d6d8ea", "#d5d6e9", "#d3d4e8", "#d2d2e7", "#d0d0e6", "#cfcee5", "#cdcde4", "#cccbe3", "#cac9e2", "#c9c7e1", "#c7c5e0", "#c6c3df", "#c4c2de", "#c3c0dd", "#c1bedc", "#c0bcdb", "#bebada", "#bdb8d9", "#bbb6d8", "#bab5d7", "#b8b3d6", "#b7b1d5", "#b5afd4", "#b4add3", "#b2abd2", "#b1a9d1", "#afa7cf", "#ada5ce", "#aba3cc", "#a9a1cb", "#a79ec9", "#a59cc8", "#a39ac6", "#a198c5", "#9f96c3", "#9d93c2", "#9b91c0", "#998fbf", "#978dbd", "#958bbc", "#9388ba", "#9186b9", "#8f84b7", "#8d82b6", "#8b80b4", "#897db3", "#877bb1", "#8579b0", "#8377ae", "#8175ad", "#8073ac", "#7e70aa", "#7c6da9", "#7a6aa7", "#7967a6", "#7764a4", "#7561a3", "#735ea2", "#725ba0", "#70589f", "#6e559d", "#6d529c", "#6b4f9b", "#694c99", "#674998", "#664696", "#644395", "#624094", "#603d92", "#5f3a91", "#5d378f", "#5b348e", "#5a318c", "#582e8b", "#562b8a", "#542888", "#532686", "#512484", "#502382", "#4e217f", "#4d207d", "#4b1e7a", "#4a1d78", "#481b76", "#471a73", "#451871", "#43166e", "#42156c", "#40136a", "#3f1267", "#3d1065", "#3c0f62", "#3a0d60", "#390c5e", "#370a5b", "#360959", "#340756", "#330654", "#310452", "#30034f", "#2e014d", "#2d004b" ], "PuRd": [ "#f7f4f9", "#f6f3f8", "#f5f2f8", "#f5f2f8", "#f4f1f7", "#f4f1f7", "#f3f0f7", "#f3eff6", "#f2eff6", "#f2eef6", "#f1eef5", "#f1edf5", "#f0ecf5", "#f0ecf4", "#efebf4", "#efebf4", "#eeeaf3", "#eee9f3", "#ede9f3", "#ede8f3", "#ece8f2", "#ece7f2", "#ebe6f2", "#ebe6f1", "#eae5f1", "#eae5f1", "#e9e4f0", "#e9e3f0", "#e8e3f0", "#e8e2ef", "#e7e2ef", "#e7e1ef", "#e6e0ee", "#e6dfee", "#e5deed", "#e5ddec", "#e4dbec", "#e3daeb", "#e3d9ea", "#e2d8ea", "#e2d6e9", "#e1d5e8", "#e0d4e8", "#e0d3e7", "#dfd1e7", "#dfd0e6", "#decfe5", "#ddcee5", "#ddcce4", "#dccbe3", "#dccae3", "#dbc9e2", "#dbc7e1", "#dac6e1", "#d9c5e0", "#d9c3df", "#d8c2df", "#d8c1de", "#d7c0dd", "#d6bedd", "#d6bddc", "#d5bcdb", "#d5bbdb", "#d4b9da", "#d3b8d9", "#d3b7d9", "#d3b6d8", "#d2b5d8", "#d2b4d7", "#d2b2d6", "#d1b1d6", "#d1b0d5", "#d1afd5", "#d0aed4", "#d0add3", "#d0abd3", "#cfaad2", "#cfa9d2", "#cfa8d1", "#cea7d0", "#cea6d0", "#cea4cf", "#cda3cf", "#cda2ce", "#cda1cd", "#cca0cd", "#cc9fcc", "#cb9ecc", "#cb9ccb", "#cb9bca", "#ca9aca", "#ca99c9", "#ca98c9", "#c997c8", "#c995c7", "#c994c7", "#c993c6", "#c991c6", "#ca90c5", "#cb8fc4", "#cc8dc3", "#cc8cc3", "#cd8ac2", "#ce89c1", "#ce87c0", "#cf86c0", "#d084bf", "#d083be", "#d181be", "#d280bd", "#d27ebc", "#d37dbb", "#d47bbb", "#d47aba", "#d578b9", "#d677b9", "#d775b8", "#d774b7", "#d873b6", "#d971b6", "#d970b5", "#da6eb4", "#db6db3", "#db6bb3", "#dc6ab2", "#dd68b1", "#dd67b1", "#de65b0", "#df64af", "#df62ae", "#df60ad", "#df5eab", "#e05caa", "#e05aa9", "#e058a8", "#e056a7", "#e155a5", "#e153a4", "#e151a3", "#e14fa2", "#e24da1", "#e24b9f", "#e2499e", "#e2479d", "#e3459c", "#e3449b", "#e34299", "#e34098", "#e43e97", "#e43c96", "#e43a95", "#e43893", "#e53692", "#e53491", "#e53390", "#e5318f", "#e62f8e", "#e62d8c", "#e62b8b", "#e6298a", "#e62888", "#e52787", "#e42785", "#e42684", "#e32582", "#e22480", "#e1247f", "#e1237d", "#e0227b", "#df227a", "#de2178", "#dd2077", "#dd1f75", "#dc1f73", "#db1e72", "#da1d70", "#d91d6e", "#d91c6d", "#d81b6b", "#d71a69", "#d61a68", "#d61966", "#d51865", "#d41763", "#d31761", "#d21660", "#d2155e", "#d1155c", "#d0145b", "#cf1359", "#ce1258", "#ce1256", "#cc1155", "#cb1154", "#c91054", "#c70f53", "#c50f53", "#c40e52", "#c20e51", "#c00d51", "#bf0d50", "#bd0c50", "#bb0b4f", "#ba0b4e", "#b80a4e", "#b60a4d", "#b5094d", "#b3094c", "#b1084c", "#af074b", "#ae074a", "#ac064a", "#aa0649", "#a90549", "#a70548", "#a50447", "#a40447", "#a20346", "#a00246", "#9e0245", "#9d0144", "#9b0144", "#990043", "#980043", "#960042", "#950040", "#93003f", "#92003e", "#90003d", "#8e003c", "#8d003b", "#8b003a", "#8a0038", "#880037", "#870036", "#850035", "#840034", "#820033", "#810032", "#7f0031", "#7e002f", "#7c002e", "#7a002d", "#79002c", "#77002b", "#76002a", "#740029", "#730028", "#710026", "#700025", "#6e0024", "#6d0023", "#6b0022", "#6a0021", "#680020", "#67001f" ], "Purples": [ "#fcfbfd", "#fbfafc", "#fbfafc", "#faf9fc", "#faf9fb", "#f9f8fb", "#f9f8fb", "#f9f7fb", "#f8f7fa", "#f8f7fa", "#f7f6fa", "#f7f6fa", "#f7f5f9", "#f6f5f9", "#f6f4f9", "#f5f4f9", "#f5f3f8", "#f5f3f8", "#f4f3f8", "#f4f2f8", "#f3f2f7", "#f3f1f7", "#f3f1f7", "#f2f0f7", "#f2f0f6", "#f1f0f6", "#f1eff6", "#f0eff6", "#f0eef5", "#f0eef5", "#efedf5", "#efedf5", "#eeecf4", "#eeecf4", "#edebf4", "#ecebf4", "#eceaf3", "#ebe9f3", "#eae9f3", "#eae8f2", "#e9e8f2", "#e8e7f2", "#e8e6f1", "#e7e6f1", "#e7e5f1", "#e6e5f0", "#e5e4f0", "#e5e3f0", "#e4e3ef", "#e3e2ef", "#e3e2ef", "#e2e1ef", "#e1e1ee", "#e1e0ee", "#e0dfee", "#dfdfed", "#dfdeed", "#dedeed", "#ddddec", "#dddcec", "#dcdcec", "#dbdbeb", "#dbdbeb", "#dadaeb", "#d9d9ea", "#d8d8ea", "#d7d7e9", "#d6d7e9", "#d6d6e9", "#d5d5e8", "#d4d4e8", "#d3d3e7", "#d2d2e7", "#d1d1e6", "#d0d0e6", "#cfcfe5", "#cecee5", "#cdcde4", "#cccde4", "#cbcce3", "#cacbe3", "#c9cae2", "#c8c9e2", "#c7c8e1", "#c6c7e1", "#c6c6e1", "#c5c5e0", "#c4c4e0", "#c3c3df", "#c2c3df", "#c1c2de", "#c0c1de", "#bfc0dd", "#bebfdd", "#bdbedc", "#bcbddc", "#bbbcdb", "#babbdb", "#b9bada", "#b8b9d9", "#b7b8d9", "#b6b7d8", "#b6b6d8", "#b5b4d7", "#b4b3d6", "#b3b2d6", "#b2b1d5", "#b1b0d4", "#b0afd4", "#afaed3", "#aeadd2", "#adacd2", "#acabd1", "#aba9d1", "#aaa8d0", "#a9a7cf", "#a8a6cf", "#a7a5ce", "#a6a4cd", "#a6a3cd", "#a5a2cc", "#a4a1cc", "#a3a0cb", "#a29eca", "#a19dca", "#a09cc9", "#9f9bc8", "#9e9ac8", "#9d99c7", "#9c98c7", "#9b97c6", "#9a96c6", "#9995c6", "#9894c5", "#9794c5", "#9693c4", "#9692c4", "#9591c3", "#9490c3", "#938fc2", "#928ec2", "#918dc2", "#908cc1", "#8f8bc1", "#8e8ac0", "#8d8ac0", "#8c89bf", "#8b88bf", "#8a87be", "#8986be", "#8885be", "#8784bd", "#8683bd", "#8682bc", "#8581bc", "#8480bb", "#8380bb", "#827fbb", "#817eba", "#807dba", "#7f7cb9", "#7e7ab8", "#7e79b8", "#7d77b7", "#7c76b6", "#7c75b5", "#7b73b5", "#7a72b4", "#7a71b3", "#796fb3", "#786eb2", "#776cb1", "#776bb0", "#766ab0", "#7568af", "#7567ae", "#7466ae", "#7364ad", "#7363ac", "#7261ab", "#7160ab", "#715faa", "#705da9", "#6f5ca8", "#6f5ba8", "#6e59a7", "#6d58a6", "#6c56a6", "#6c55a5", "#6b54a4", "#6a52a3", "#6a51a3", "#6950a2", "#684ea1", "#684da1", "#674ca0", "#664aa0", "#66499f", "#65489e", "#64469e", "#63459d", "#63449c", "#62429c", "#61419b", "#61409b", "#603e9a", "#5f3d99", "#5f3c99", "#5e3a98", "#5d3997", "#5d3897", "#5c3696", "#5b3595", "#5a3495", "#5a3394", "#593194", "#583093", "#582f92", "#572d92", "#562c91", "#562b90", "#552990", "#54288f", "#54278f", "#53258e", "#52248d", "#52238d", "#51228c", "#50218c", "#501f8b", "#4f1e8b", "#4e1d8a", "#4e1c89", "#4d1a89", "#4c1988", "#4c1888", "#4b1787", "#4a1687", "#4a1486", "#491386", "#481285", "#481184", "#470f84", "#460e83", "#460d83", "#450c82", "#440b82", "#440981", "#430880", "#420780", "#42067f", "#41047f", "#40037e", "#40027e", "#3f017d", "#3f007d" ], "RdBu": [ "#67001f", "#69001f", "#6c011f", "#6f0220", "#720320", "#750421", "#780521", "#7b0622", "#7e0722", "#810823", "#840923", "#870a24", "#8a0b24", "#8d0c25", "#900d25", "#930e26", "#960f26", "#991027", "#9b1027", "#9e1127", "#a11228", "#a41328", "#a71429", "#aa1529", "#ad162a", "#b0172a", "#b2192b", "#b41c2d", "#b51f2e", "#b6212f", "#b82431", "#b92732", "#bb2a33", "#bc2d34", "#be3036", "#bf3237", "#c03538", "#c2383a", "#c33b3b", "#c53e3c", "#c6403e", "#c7433f", "#c94641", "#ca4942", "#cc4c43", "#cd4f44", "#ce5146", "#d05447", "#d15749", "#d35a4a", "#d45d4b", "#d6604d", "#d7624f", "#d86551", "#d96853", "#da6a55", "#db6d57", "#dd7059", "#de725b", "#df755d", "#e0785f", "#e17b61", "#e27d63", "#e48065", "#e58368", "#e6856a", "#e7886c", "#e88b6e", "#ea8d70", "#eb9072", "#ec9374", "#ed9676", "#ee9878", "#ef9b7a", "#f19e7c", "#f2a07e", "#f3a380", "#f4a683", "#f4a886", "#f4aa88", "#f5ac8b", "#f5ae8e", "#f5b090", "#f6b293", "#f6b496", "#f7b698", "#f7b99b", "#f7bb9e", "#f8bda1", "#f8bfa3", "#f8c1a6", "#f9c3a9", "#f9c5ab", "#f9c7ae", "#facab1", "#faccb4", "#faceb6", "#fbd0b9", "#fbd2bc", "#fbd4be", "#fcd6c1", "#fcd8c4", "#fddbc7", "#fcdcc8", "#fcddca", "#fcdecc", "#fcdfce", "#fbe0d0", "#fbe1d2", "#fbe2d4", "#fbe3d6", "#fae4d7", "#fae5d9", "#fae7db", "#fae8dd", "#f9e9df", "#f9eae1", "#f9ebe3", "#f9ece5", "#f9ede7", "#f8eee8", "#f8efea", "#f8f0ec", "#f8f2ee", "#f7f3f0", "#f7f4f2", "#f7f5f4", "#f7f6f6", "#f6f6f6", "#f4f5f6", "#f3f5f6", "#f1f4f6", "#f0f3f5", "#eef3f5", "#edf2f5", "#ebf1f4", "#eaf1f4", "#e8f0f4", "#e7eff4", "#e5eef3", "#e4eef3", "#e2edf3", "#e1ecf3", "#dfecf2", "#deebf2", "#dceaf2", "#dbe9f1", "#d9e9f1", "#d8e8f1", "#d6e7f1", "#d5e7f0", "#d3e6f0", "#d2e5f0", "#d1e5f0", "#cee3ef", "#cce2ee", "#c9e1ed", "#c7dfed", "#c4deec", "#c2ddeb", "#bfdceb", "#bddaea", "#bad9e9", "#b8d8e8", "#b5d7e8", "#b3d5e7", "#b0d4e6", "#aed3e6", "#abd2e5", "#a9d0e4", "#a7cfe4", "#a4cee3", "#a2cde2", "#9fcbe1", "#9dcae1", "#9ac9e0", "#98c8df", "#95c6df", "#93c5de", "#90c4dd", "#8dc2dc", "#8ac0db", "#87beda", "#84bcd9", "#80bad8", "#7db8d7", "#7ab6d6", "#77b4d5", "#74b2d3", "#71b0d2", "#6eaed1", "#6bacd0", "#68aacf", "#65a8ce", "#61a6cd", "#5ea4cc", "#5ba2cb", "#58a0ca", "#559ec9", "#529cc8", "#4f9ac7", "#4c98c6", "#4996c5", "#4694c4", "#4393c3", "#4191c2", "#408fc1", "#3f8dc0", "#3d8bbf", "#3c8abe", "#3b88bd", "#3986bc", "#3884bb", "#3783ba", "#3581b9", "#347fb9", "#337db8", "#317cb7", "#307ab6", "#2f78b5", "#2d76b4", "#2c75b3", "#2b73b2", "#2971b1", "#286fb0", "#276db0", "#256caf", "#246aae", "#2368ad", "#2166ac", "#2064aa", "#1f62a7", "#1e60a4", "#1d5ea1", "#1c5c9e", "#1a5a9b", "#195898", "#185695", "#175493", "#165190", "#154f8d", "#144d8a", "#134b87", "#124984", "#114781", "#0f457e", "#0e437b", "#0d4078", "#0c3e75", "#0b3c72", "#0a3a6f", "#09386c", "#083669", "#073466", "#063263", "#053061" ], "RdGy": [ "#67001f", "#69001f", "#6c011f", "#6f0220", "#720320", "#750421", "#780521", "#7b0622", "#7e0722", "#810823", "#840923", "#870a24", "#8a0b24", "#8d0c25", "#900d25", "#930e26", "#960f26", "#991027", "#9b1027", "#9e1127", "#a11228", "#a41328", "#a71429", "#aa1529", "#ad162a", "#b0172a", "#b2192b", "#b41c2d", "#b51f2e", "#b6212f", "#b82431", "#b92732", "#bb2a33", "#bc2d34", "#be3036", "#bf3237", "#c03538", "#c2383a", "#c33b3b", "#c53e3c", "#c6403e", "#c7433f", "#c94641", "#ca4942", "#cc4c43", "#cd4f44", "#ce5146", "#d05447", "#d15749", "#d35a4a", "#d45d4b", "#d6604d", "#d7624f", "#d86551", "#d96853", "#da6a55", "#db6d57", "#dd7059", "#de725b", "#df755d", "#e0785f", "#e17b61", "#e27d63", "#e48065", "#e58368", "#e6856a", "#e7886c", "#e88b6e", "#ea8d70", "#eb9072", "#ec9374", "#ed9676", "#ee9878", "#ef9b7a", "#f19e7c", "#f2a07e", "#f3a380", "#f4a683", "#f4a886", "#f4aa88", "#f5ac8b", "#f5ae8e", "#f5b090", "#f6b293", "#f6b496", "#f7b698", "#f7b99b", "#f7bb9e", "#f8bda1", "#f8bfa3", "#f8c1a6", "#f9c3a9", "#f9c5ab", "#f9c7ae", "#facab1", "#faccb4", "#faceb6", "#fbd0b9", "#fbd2bc", "#fbd4be", "#fcd6c1", "#fcd8c4", "#fddbc7", "#fddcc9", "#fdddcb", "#fddfcd", "#fde0cf", "#fde2d1", "#fde3d4", "#fde4d6", "#fde6d8", "#fde7da", "#fde9dc", "#fdeadf", "#fdebe1", "#feede3", "#feeee5", "#fef0e7", "#fef1ea", "#fef3ec", "#fef4ee", "#fef5f0", "#fef7f2", "#fef8f5", "#fefaf7", "#fefbf9", "#fefcfb", "#fefefd", "#fefefe", "#fdfdfd", "#fbfbfb", "#fafafa", "#f9f9f9", "#f8f8f8", "#f7f7f7", "#f5f5f5", "#f4f4f4", "#f3f3f3", "#f2f2f2", "#f1f1f1", "#efefef", "#eeeeee", "#ededed", "#ececec", "#eaeaea", "#e9e9e9", "#e8e8e8", "#e7e7e7", "#e6e6e6", "#e4e4e4", "#e3e3e3", "#e2e2e2", "#e1e1e1", "#e0e0e0", "#dedede", "#dddddd", "#dbdbdb", "#dadada", "#d8d8d8", "#d7d7d7", "#d5d5d5", "#d4d4d4", "#d2d2d2", "#d1d1d1", "#cfcfcf", "#cecece", "#cccccc", "#cbcbcb", "#c9c9c9", "#c8c8c8", "#c6c6c6", "#c5c5c5", "#c3c3c3", "#c2c2c2", "#c0c0c0", "#bfbfbf", "#bdbdbd", "#bcbcbc", "#bababa", "#b9b9b9", "#b7b7b7", "#b5b5b5", "#b3b3b3", "#b1b1b1", "#afafaf", "#adadad", "#ababab", "#a9a9a9", "#a7a7a7", "#a5a5a5", "#a3a3a3", "#a1a1a1", "#9f9f9f", "#9d9d9d", "#9b9b9b", "#999999", "#979797", "#959595", "#939393", "#919191", "#8f8f8f", "#8d8d8d", "#8b8b8b", "#898989", "#878787", "#848484", "#828282", "#808080", "#7d7d7d", "#7b7b7b", "#797979", "#777777", "#747474", "#727272", "#707070", "#6d6d6d", "#6b6b6b", "#696969", "#676767", "#646464", "#626262", "#606060", "#5e5e5e", "#5b5b5b", "#595959", "#575757", "#545454", "#525252", "#505050", "#4e4e4e", "#4c4c4c", "#494949", "#484848", "#454545", "#444444", "#414141", "#404040", "#3d3d3d", "#3c3c3c", "#393939", "#383838", "#353535", "#343434", "#313131", "#303030", "#2e2e2e", "#2c2c2c", "#2a2a2a", "#282828", "#262626", "#242424", "#222222", "#202020", "#1e1e1e", "#1c1c1c", "#1a1a1a" ], "RdPu": [ "#fff7f3", "#fef6f2", "#fef5f1", "#fef4f0", "#fef4f0", "#fef3ef", "#fef2ee", "#fef1ee", "#fef1ed", "#fef0ec", "#feefec", "#feefeb", "#feeeea", "#feedea", "#feece9", "#feece8", "#fdebe7", "#fdeae7", "#fdeae6", "#fde9e5", "#fde8e5", "#fde7e4", "#fde7e3", "#fde6e3", "#fde5e2", "#fde4e1", "#fde4e1", "#fde3e0", "#fde2df", "#fde2de", "#fde1de", "#fde0dd", "#fcdfdc", "#fcdfdb", "#fcdedb", "#fcddda", "#fcdcd9", "#fcdbd8", "#fcdad7", "#fcd9d6", "#fcd9d5", "#fcd8d4", "#fcd7d3", "#fcd6d2", "#fcd5d1", "#fcd4d1", "#fcd4d0", "#fcd3cf", "#fcd2ce", "#fcd1cd", "#fcd0cc", "#fccfcb", "#fcceca", "#fccec9", "#fccdc8", "#fcccc7", "#fccbc7", "#fccac6", "#fcc9c5", "#fcc9c4", "#fcc8c3", "#fcc7c2", "#fcc6c1", "#fcc5c0", "#fbc4bf", "#fbc3bf", "#fbc2bf", "#fbc1be", "#fbbfbe", "#fbbebe", "#fbbdbd", "#fbbcbd", "#fbbbbd", "#fbb9bc", "#fbb8bc", "#fbb7bc", "#fbb6bb", "#fbb5bb", "#fbb4bb", "#fbb2ba", "#fab1ba", "#fab0ba", "#faafb9", "#faaeb9", "#faacb9", "#faabb8", "#faaab8", "#faa9b7", "#faa8b7", "#faa6b7", "#faa5b6", "#faa4b6", "#faa3b6", "#faa2b5", "#faa0b5", "#fa9fb5", "#f99eb4", "#f99cb4", "#f99ab3", "#f999b2", "#f997b2", "#f995b1", "#f994b1", "#f992b0", "#f990af", "#f98eaf", "#f98dae", "#f88bad", "#f889ad", "#f887ac", "#f886ab", "#f884ab", "#f882aa", "#f881aa", "#f87fa9", "#f87da8", "#f87ba8", "#f77aa7", "#f778a6", "#f776a6", "#f774a5", "#f773a5", "#f771a4", "#f76fa3", "#f76ea3", "#f76ca2", "#f76aa1", "#f768a1", "#f667a0", "#f565a0", "#f463a0", "#f4629f", "#f3609f", "#f25f9f", "#f15d9e", "#f05b9e", "#f05a9e", "#ef589e", "#ee569d", "#ed559d", "#ec539d", "#eb519c", "#eb509c", "#ea4e9c", "#e94d9b", "#e84b9b", "#e7499b", "#e7489a", "#e6469a", "#e5449a", "#e44399", "#e34199", "#e34099", "#e23e99", "#e13c98", "#e03b98", "#df3998", "#de3797", "#de3697", "#dd3497", "#dc3396", "#da3195", "#d92f94", "#d72e94", "#d62c93", "#d42a92", "#d32991", "#d12791", "#d02690", "#ce248f", "#cd238e", "#cb218d", "#ca1f8d", "#c81e8c", "#c71c8b", "#c51b8a", "#c41989", "#c31789", "#c11688", "#c01487", "#be1386", "#bd1186", "#bb0f85", "#ba0e84", "#b80c83", "#b70a82", "#b50982", "#b40781", "#b20680", "#b1047f", "#af027e", "#ae017e", "#ac017d", "#ab017d", "#a9017d", "#a7017d", "#a6017c", "#a4017c", "#a2017c", "#a1017c", "#9f017c", "#9e017b", "#9c017b", "#9a017b", "#99017b", "#97017a", "#95017a", "#94017a", "#92017a", "#91017a", "#8f0179", "#8d0179", "#8c0179", "#8a0179", "#880179", "#870178", "#850178", "#830178", "#820178", "#800177", "#7f0177", "#7d0177", "#7b0177", "#7a0177", "#780076", "#770076", "#750075", "#740075", "#720075", "#700074", "#6f0074", "#6d0073", "#6c0073", "#6a0072", "#690072", "#670072", "#660071", "#640071", "#630070", "#610070", "#600070", "#5e006f", "#5c006f", "#5b006e", "#59006e", "#58006e", "#56006d", "#55006d", "#53006c", "#52006c", "#50006c", "#4f006b", "#4d006b", "#4c006a", "#4a006a", "#49006a" ], "RdYlBu": [ "#a50026", "#a60126", "#a80326", "#aa0526", "#ac0726", "#ae0926", "#b00b26", "#b20d26", "#b40f26", "#b61026", "#b81226", "#ba1426", "#bc1626", "#be1826", "#c01a26", "#c21c26", "#c41e26", "#c62026", "#c82126", "#ca2326", "#cc2526", "#ce2726", "#d02926", "#d22b26", "#d42d26", "#d62f26", "#d73127", "#d83328", "#d93529", "#da382a", "#dc3a2b", "#dd3d2d", "#de3f2e", "#df412f", "#e04430", "#e14631", "#e24932", "#e44b33", "#e54d34", "#e65035", "#e75236", "#e85538", "#e95739", "#ea593a", "#ec5c3b", "#ed5e3c", "#ee613d", "#ef633e", "#f0653f", "#f16840", "#f26a41", "#f46d43", "#f46f44", "#f47245", "#f57446", "#f57747", "#f57948", "#f67c4a", "#f67e4b", "#f6814c", "#f7834d", "#f7864e", "#f7894f", "#f88b51", "#f88e52", "#f89053", "#f99354", "#f99555", "#fa9856", "#fa9a58", "#fa9d59", "#fb9f5a", "#fba25b", "#fba55c", "#fca75e", "#fcaa5f", "#fcac60", "#fdae61", "#fdb063", "#fdb265", "#fdb467", "#fdb669", "#fdb86b", "#fdba6c", "#fdbc6e", "#fdbe70", "#fdc072", "#fdc274", "#fdc476", "#fdc678", "#fdc879", "#fdca7b", "#fdcc7d", "#fdce7f", "#fdd081", "#fdd283", "#fdd484", "#fdd686", "#fdd888", "#fdda8a", "#fddc8c", "#fdde8e", "#fee090", "#fee191", "#fee293", "#fee395", "#fee497", "#fee699", "#fee79b", "#fee89c", "#fee99e", "#feeaa0", "#feeca2", "#feeda4", "#feeea6", "#feefa7", "#fef1a9", "#fef2ab", "#fef3ad", "#fef4af", "#fef5b1", "#fef7b3", "#fef8b4", "#fef9b6", "#fefab8", "#fefbba", "#fefdbc", "#fefebe", "#fefec0", "#fdfec2", "#fbfdc4", "#fafdc6", "#f9fcc9", "#f8fccb", "#f7fbcd", "#f5fbcf", "#f4fbd2", "#f3fad4", "#f2fad6", "#f1f9d8", "#eff9da", "#eef8dd", "#edf8df", "#ecf7e1", "#eaf7e3", "#e9f6e6", "#e8f6e8", "#e7f5ea", "#e6f5ec", "#e4f4ef", "#e3f4f1", "#e2f3f3", "#e1f3f5", "#e0f3f7", "#ddf1f7", "#dbf0f6", "#d9eff6", "#d7eef5", "#d5edf5", "#d3ecf4", "#d1ebf3", "#cfeaf3", "#cde9f2", "#cbe8f2", "#c9e7f1", "#c7e6f0", "#c4e5f0", "#c2e4ef", "#c0e3ef", "#bee2ee", "#bce1ee", "#bae0ed", "#b8dfec", "#b6deec", "#b4ddeb", "#b2dceb", "#b0dbea", "#aedae9", "#acd9e9", "#a9d8e8", "#a7d6e7", "#a5d4e6", "#a3d2e5", "#a1d1e4", "#9fcfe3", "#9ccde2", "#9acce1", "#98cae1", "#96c8e0", "#94c6df", "#92c5de", "#90c3dd", "#8dc1dc", "#8bbfdb", "#89beda", "#87bcd9", "#85bad8", "#83b9d7", "#80b7d6", "#7eb5d5", "#7cb3d4", "#7ab2d3", "#78b0d2", "#76aed1", "#74add1", "#72aacf", "#70a8ce", "#6ea6cd", "#6ca4cc", "#6aa2cb", "#689fca", "#679dc9", "#659bc7", "#6399c6", "#6197c5", "#5f94c4", "#5d92c3", "#5c90c2", "#5a8ec1", "#588cbf", "#5689be", "#5487bd", "#5285bc", "#5083bb", "#4f81ba", "#4d7eb9", "#4b7cb7", "#497ab6", "#4778b5", "#4576b4", "#4473b3", "#4371b2", "#436eb0", "#426caf", "#4169ae", "#4067ad", "#3f64ac", "#3f62aa", "#3e60a9", "#3d5da8", "#3c5ba7", "#3b58a6", "#3b56a4", "#3a53a3", "#3951a2", "#384ea1", "#384c9f", "#37499e", "#36479d", "#35449c", "#34429b", "#343f99", "#333d98", "#323a97", "#313896", "#313695" ], "RdYlGn": [ "#a50026", "#a60126", "#a80326", "#aa0526", "#ac0726", "#ae0926", "#b00b26", "#b20d26", "#b40f26", "#b61026", "#b81226", "#ba1426", "#bc1626", "#be1826", "#c01a26", "#c21c26", "#c41e26", "#c62026", "#c82126", "#ca2326", "#cc2526", "#ce2726", "#d02926", "#d22b26", "#d42d26", "#d62f26", "#d73127", "#d83328", "#d93529", "#da382a", "#dc3a2b", "#dd3d2d", "#de3f2e", "#df412f", "#e04430", "#e14631", "#e24932", "#e44b33", "#e54d34", "#e65035", "#e75236", "#e85538", "#e95739", "#ea593a", "#ec5c3b", "#ed5e3c", "#ee613d", "#ef633e", "#f0653f", "#f16840", "#f26a41", "#f46d43", "#f46f44", "#f47245", "#f57446", "#f57747", "#f57948", "#f67c4a", "#f67e4b", "#f6814c", "#f7834d", "#f7864e", "#f7894f", "#f88b51", "#f88e52", "#f89053", "#f99354", "#f99555", "#fa9856", "#fa9a58", "#fa9d59", "#fb9f5a", "#fba25b", "#fba55c", "#fca75e", "#fcaa5f", "#fcac60", "#fdae61", "#fdb063", "#fdb265", "#fdb466", "#fdb668", "#fdb86a", "#fdba6b", "#fdbc6d", "#fdbe6e", "#fdc070", "#fdc272", "#fdc473", "#fdc675", "#fdc877", "#fdca78", "#fdcc7a", "#fdce7c", "#fdd07d", "#fdd27f", "#fdd481", "#fdd682", "#fdd884", "#fdda86", "#fddc87", "#fdde89", "#fee08b", "#fee18d", "#fee28f", "#fee391", "#fee493", "#fee695", "#fee797", "#fee899", "#fee99b", "#feea9d", "#feec9f", "#feeda1", "#feeea3", "#feefa5", "#fef1a7", "#fef2a9", "#fef3ab", "#fef4ad", "#fef5af", "#fef7b1", "#fef8b3", "#fef9b5", "#fefab7", "#fefbb9", "#fefdbb", "#fefebd", "#fefebd", "#fcfebb", "#fbfdb9", "#f9fcb7", "#f8fcb5", "#f6fbb3", "#f5fab1", "#f3faaf", "#f2f9ad", "#f0f9ab", "#eff8a9", "#edf7a7", "#ecf7a5", "#eaf6a3", "#e9f5a1", "#e7f59f", "#e6f49d", "#e4f49b", "#e3f399", "#e1f297", "#e0f295", "#def193", "#ddf091", "#dbf08f", "#daef8d", "#d9ef8b", "#d7ee89", "#d5ed88", "#d3ec87", "#d1eb85", "#cfea84", "#cde983", "#cbe881", "#c9e880", "#c7e77f", "#c5e67e", "#c3e57c", "#c1e47b", "#bfe37a", "#bde278", "#bbe277", "#b9e176", "#b7e075", "#b5df73", "#b3de72", "#b1dd71", "#afdc6f", "#addc6e", "#abdb6d", "#a9da6b", "#a7d96a", "#a4d869", "#a2d769", "#9fd669", "#9dd569", "#9ad468", "#98d268", "#95d168", "#93d067", "#90cf67", "#8ece67", "#8bcd67", "#89cc66", "#86cb66", "#84ca66", "#81c966", "#7fc765", "#7cc665", "#7ac565", "#77c464", "#75c364", "#72c264", "#70c164", "#6dc063", "#6bbf63", "#68be63", "#66bd63", "#63bb62", "#60ba61", "#5db860", "#5ab760", "#57b55f", "#54b45e", "#51b25d", "#4eb15d", "#4baf5c", "#48ae5b", "#45ad5a", "#42ab5a", "#3faa59", "#3ca858", "#39a757", "#36a557", "#33a456", "#30a255", "#2da154", "#2a9f54", "#279e53", "#249d52", "#219b51", "#1e9a51", "#1b9850", "#19974f", "#18954e", "#17934d", "#16914c", "#158f4b", "#148d4a", "#138b49", "#128948", "#118847", "#108646", "#0f8445", "#0e8244", "#0d8043", "#0c7e42", "#0b7c41", "#0a7a40", "#09783f", "#08773e", "#07753d", "#06733c", "#05713b", "#046f3a", "#036d39", "#026b38", "#016937", "#006837" ], "Reds": [ "#fff5f0", "#fef4ef", "#fef3ee", "#fef3ed", "#fef2ec", "#fef1eb", "#fef1ea", "#fef0e9", "#feefe8", "#feefe7", "#feeee6", "#feede5", "#feede4", "#feece3", "#feebe2", "#feebe1", "#feeae0", "#fee9e0", "#fee9df", "#fee8de", "#fee7dd", "#fee7dc", "#fee6db", "#fee5da", "#fee5d9", "#fee4d8", "#fee3d7", "#fee3d6", "#fee2d5", "#fee1d4", "#fee1d3", "#fee0d2", "#fddfd1", "#fdded0", "#fdddce", "#fddccd", "#fddbcb", "#fddaca", "#fdd8c8", "#fdd7c7", "#fdd6c5", "#fdd5c3", "#fdd4c2", "#fdd3c0", "#fdd1bf", "#fdd0bd", "#fdcfbc", "#fdceba", "#fccdb9", "#fcccb7", "#fccab6", "#fcc9b4", "#fcc8b3", "#fcc7b1", "#fcc6af", "#fcc5ae", "#fcc3ac", "#fcc2ab", "#fcc1a9", "#fcc0a8", "#fcbfa6", "#fcbea5", "#fcbda3", "#fcbba2", "#fcbaa0", "#fcb99f", "#fcb89d", "#fcb69c", "#fcb59a", "#fcb499", "#fcb297", "#fcb196", "#fcb094", "#fcaf93", "#fcad91", "#fcac90", "#fcab8e", "#fca98d", "#fca88b", "#fca78a", "#fca689", "#fca487", "#fca386", "#fca284", "#fca083", "#fc9f81", "#fc9e80", "#fc9d7e", "#fc9b7d", "#fc9a7b", "#fc997a", "#fc9778", "#fc9677", "#fc9575", "#fc9474", "#fc9272", "#fb9171", "#fb9070", "#fb8f6f", "#fb8d6d", "#fb8c6c", "#fb8b6b", "#fb8a6a", "#fb8868", "#fb8767", "#fb8666", "#fb8464", "#fb8363", "#fb8262", "#fb8161", "#fb7f5f", "#fb7e5e", "#fb7d5d", "#fb7c5c", "#fb7a5a", "#fb7959", "#fb7858", "#fb7757", "#fb7555", "#fb7454", "#fb7353", "#fb7252", "#fb7050", "#fb6f4f", "#fb6e4e", "#fb6d4d", "#fb6b4b", "#fb6a4a", "#fa6949", "#fa6748", "#fa6647", "#f96446", "#f96345", "#f86144", "#f86043", "#f85e42", "#f75d42", "#f75b41", "#f75a40", "#f6593f", "#f6573e", "#f5563d", "#f5543c", "#f5533b", "#f4513a", "#f45039", "#f44e38", "#f34d37", "#f34b36", "#f24a35", "#f24834", "#f24733", "#f14532", "#f14432", "#f14231", "#f04130", "#f03f2f", "#ef3e2e", "#ef3d2d", "#ef3b2c", "#ee3a2b", "#ed392b", "#ec382a", "#ea372a", "#e93529", "#e83429", "#e73328", "#e63228", "#e53127", "#e43027", "#e32f27", "#e12e26", "#e02d26", "#df2c25", "#de2a25", "#dd2924", "#dc2824", "#db2723", "#d92623", "#d82522", "#d72422", "#d62321", "#d52221", "#d42120", "#d31f20", "#d21e1f", "#d01d1f", "#cf1c1f", "#ce1b1e", "#cd1a1e", "#cc191d", "#cb181d", "#ca171c", "#c8171c", "#c7171c", "#c6161c", "#c5161b", "#c4161b", "#c2161b", "#c1151b", "#c0151a", "#bf151a", "#be141a", "#bc141a", "#bb1419", "#ba1419", "#b91319", "#b81319", "#b71318", "#b51218", "#b41218", "#b31218", "#b21217", "#b11117", "#af1117", "#ae1117", "#ad1116", "#ac1016", "#ab1016", "#a91016", "#a80f15", "#a70f15", "#a60f15", "#a50f15", "#a30e14", "#a10e14", "#9f0d14", "#9d0d14", "#9b0c13", "#990c13", "#970b13", "#950b13", "#930a12", "#910a12", "#8f0912", "#8d0912", "#8b0811", "#8a0811", "#880811", "#860711", "#840710", "#820610", "#800610", "#7e0510", "#7c050f", "#7a040f", "#78040f", "#76030f", "#74030e", "#72020e", "#70020e", "#6e010e", "#6c010d", "#6a000d", "#68000d", "#67000c" ], "Set1": [ "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999" ], "Set2": [ "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3" ], "Set3": [ "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f" ], "Spectral": [ "#9e0142", "#a00342", "#a20543", "#a40843", "#a60a44", "#a80c44", "#aa0f45", "#ad1145", "#af1446", "#b11646", "#b31847", "#b51b47", "#b71d48", "#ba2048", "#bc2249", "#be2449", "#c0274a", "#c2294a", "#c42c4b", "#c62e4b", "#c9304c", "#cb334c", "#cd354d", "#cf384d", "#d13a4e", "#d33c4e", "#d53e4e", "#d6404e", "#d8424d", "#d9444d", "#da464c", "#db484c", "#dc494b", "#de4b4b", "#df4d4b", "#e04f4a", "#e1514a", "#e25349", "#e45549", "#e55648", "#e65848", "#e75a47", "#e95c47", "#ea5e46", "#eb6046", "#ec6145", "#ed6345", "#ef6544", "#f06744", "#f16943", "#f26b43", "#f46d43", "#f46f44", "#f47245", "#f57446", "#f57747", "#f57948", "#f67c4a", "#f67e4b", "#f6814c", "#f7834d", "#f7864e", "#f7894f", "#f88b51", "#f88e52", "#f89053", "#f99354", "#f99555", "#fa9856", "#fa9a58", "#fa9d59", "#fb9f5a", "#fba25b", "#fba55c", "#fca75e", "#fcaa5f", "#fcac60", "#fdae61", "#fdb063", "#fdb265", "#fdb466", "#fdb668", "#fdb86a", "#fdba6b", "#fdbc6d", "#fdbe6e", "#fdc070", "#fdc272", "#fdc473", "#fdc675", "#fdc877", "#fdca78", "#fdcc7a", "#fdce7c", "#fdd07d", "#fdd27f", "#fdd481", "#fdd682", "#fdd884", "#fdda86", "#fddc87", "#fdde89", "#fee08b", "#fee18d", "#fee28f", "#fee391", "#fee493", "#fee695", "#fee797", "#fee899", "#fee99b", "#feea9d", "#feec9f", "#feeda1", "#feeea3", "#feefa5", "#fef1a7", "#fef2a9", "#fef3ab", "#fef4ad", "#fef5af", "#fef7b1", "#fef8b3", "#fef9b5", "#fefab7", "#fefbb9", "#fefdbb", "#fefebd", "#fefebe", "#fdfebc", "#fcfebb", "#fbfdb9", "#fafdb8", "#f9fcb6", "#f8fcb5", "#f7fcb3", "#f6fbb2", "#f5fbb0", "#f4faae", "#f3faad", "#f2faab", "#f1f9aa", "#f0f9a8", "#eff8a7", "#eef8a5", "#edf8a4", "#ecf7a2", "#ebf7a1", "#eaf69f", "#e9f69e", "#e8f69c", "#e7f59b", "#e6f599", "#e6f598", "#e3f498", "#e1f398", "#dff299", "#dcf199", "#daf09a", "#d8ef9a", "#d5ee9b", "#d3ed9b", "#d1ec9c", "#ceeb9c", "#ccea9d", "#cae99d", "#c7e89e", "#c5e79e", "#c3e69f", "#c0e59f", "#bee5a0", "#bce4a0", "#bae3a0", "#b7e2a1", "#b5e1a1", "#b3e0a2", "#b0dfa2", "#aedea3", "#acdda3", "#a9dca4", "#a6dba4", "#a4daa4", "#a1d9a4", "#9ed8a4", "#9cd7a4", "#99d6a4", "#96d5a4", "#94d4a4", "#91d2a4", "#8ed1a4", "#8bd0a4", "#89cfa4", "#86cea4", "#83cda4", "#81cca4", "#7ecba4", "#7bcaa4", "#78c9a4", "#76c8a4", "#73c7a4", "#70c6a4", "#6ec5a4", "#6bc4a4", "#68c3a4", "#66c2a5", "#63bfa5", "#61bda6", "#5fbba7", "#5db8a8", "#5bb6a9", "#59b4aa", "#57b2ab", "#55afac", "#53adad", "#51abae", "#4fa8af", "#4da6b0", "#4ba4b1", "#49a2b2", "#479fb3", "#459db4", "#439bb5", "#4199b5", "#3f96b6", "#3d94b7", "#3b92b8", "#398fb9", "#378dba", "#358bbb", "#3389bc", "#3286bc", "#3484bb", "#3682ba", "#3880b9", "#397db8", "#3b7bb7", "#3d79b6", "#3e77b5", "#4075b4", "#4272b2", "#4470b1", "#456eb0", "#476caf", "#4969ae", "#4b67ad", "#4c65ac", "#4e63ab", "#5060aa", "#515ea9", "#535ca8", "#555aa7", "#5757a6", "#5855a5", "#5a53a4", "#5c51a3", "#5e4fa2" ], "Wistia": [ "#e4ff7a", "#e4fe78", "#e4fe76", "#e5fd75", "#e5fd73", "#e6fd72", "#e6fc70", "#e6fc6f", "#e7fc6d", "#e7fb6c", "#e8fb6a", "#e8fb69", "#e9fa67", "#e9fa66", "#e9f964", "#eaf963", "#eaf961", "#ebf860", "#ebf85e", "#ecf85d", "#ecf75b", "#ecf75a", "#edf758", "#edf657", "#eef655", "#eef554", "#eff552", "#eff551", "#eff44f", "#f0f44e", "#f0f44c", "#f1f34b", "#f1f349", "#f1f348", "#f2f246", "#f2f245", "#f3f243", "#f3f142", "#f4f140", "#f4f03f", "#f4f03d", "#f5f03c", "#f5ef3a", "#f6ef39", "#f6ef37", "#f7ee36", "#f7ee34", "#f7ee33", "#f8ed31", "#f8ed30", "#f9ec2e", "#f9ec2d", "#faec2b", "#faeb2a", "#faeb28", "#fbeb27", "#fbea25", "#fcea24", "#fcea22", "#fce921", "#fde91f", "#fde81e", "#fee81c", "#fee81b", "#ffe719", "#ffe719", "#ffe619", "#ffe518", "#ffe518", "#ffe417", "#ffe317", "#ffe317", "#ffe216", "#ffe116", "#ffe115", "#ffe015", "#ffdf15", "#ffdf14", "#ffde14", "#ffdd13", "#ffdd13", "#ffdc12", "#ffdb12", "#ffdb12", "#ffda11", "#ffd911", "#ffd810", "#ffd810", "#ffd710", "#ffd60f", "#ffd60f", "#ffd50e", "#ffd40e", "#ffd40e", "#ffd30d", "#ffd20d", "#ffd20c", "#ffd10c", "#ffd00c", "#ffd00b", "#ffcf0b", "#ffce0a", "#ffce0a", "#ffcd09", "#ffcc09", "#ffcc09", "#ffcb08", "#ffca08", "#ffca07", "#ffc907", "#ffc807", "#ffc806", "#ffc706", "#ffc605", "#ffc605", "#ffc505", "#ffc404", "#ffc404", "#ffc303", "#ffc203", "#ffc203", "#ffc102", "#ffc002", "#ffc001", "#ffbf01", "#ffbe01", "#ffbe00", "#ffbd00", "#ffbc00", "#ffbc00", "#ffbb00", "#ffbb00", "#ffba00", "#ffba00", "#ffba00", "#ffb900", "#ffb900", "#ffb800", "#ffb800", "#ffb700", "#ffb700", "#ffb600", "#ffb600", "#ffb500", "#ffb500", "#ffb500", "#ffb400", "#ffb400", "#ffb300", "#ffb300", "#ffb200", "#ffb200", "#ffb100", "#ffb100", "#ffb000", "#ffb000", "#ffb000", "#ffaf00", "#ffaf00", "#ffae00", "#ffae00", "#ffad00", "#ffad00", "#ffac00", "#ffac00", "#ffab00", "#ffab00", "#ffab00", "#ffaa00", "#ffaa00", "#ffa900", "#ffa900", "#ffa800", "#ffa800", "#ffa700", "#ffa700", "#ffa600", "#ffa600", "#ffa600", "#ffa500", "#ffa500", "#ffa400", "#ffa400", "#ffa300", "#ffa300", "#ffa200", "#ffa200", "#ffa100", "#ffa100", "#ffa100", "#ffa000", "#ffa000", "#fe9f00", "#fe9f00", "#fe9e00", "#fe9e00", "#fe9d00", "#fe9d00", "#fe9c00", "#fe9b00", "#fe9b00", "#fe9a00", "#fe9a00", "#fe9900", "#fe9900", "#fe9800", "#fe9800", "#fe9700", "#fe9700", "#fe9600", "#fe9600", "#fe9500", "#fe9500", "#fd9400", "#fd9400", "#fd9300", "#fd9300", "#fd9200", "#fd9200", "#fd9100", "#fd9100", "#fd9000", "#fd9000", "#fd8f00", "#fd8f00", "#fd8e00", "#fd8e00", "#fd8d00", "#fd8c00", "#fd8c00", "#fd8b00", "#fd8b00", "#fd8a00", "#fd8a00", "#fc8900", "#fc8900", "#fc8800", "#fc8800", "#fc8700", "#fc8700", "#fc8600", "#fc8600", "#fc8500", "#fc8500", "#fc8400", "#fc8400", "#fc8300", "#fc8300", "#fc8200", "#fc8200", "#fc8100", "#fc8100", "#fc8000", "#fc8000", "#fc7f00", "#fc7f00" ], "YlGn": [ "#ffffe5", "#fefee3", "#fefee2", "#fefee0", "#fdfedf", "#fdfede", "#fdfedc", "#fdfedb", "#fcfed9", "#fcfed8", "#fcfed7", "#fcfdd5", "#fbfdd4", "#fbfdd3", "#fbfdd1", "#fbfdd0", "#fafdce", "#fafdcd", "#fafdcc", "#fafdca", "#f9fdc9", "#f9fdc8", "#f9fcc6", "#f9fcc5", "#f8fcc3", "#f8fcc2", "#f8fcc1", "#f8fcbf", "#f7fcbe", "#f7fcbc", "#f7fcbb", "#f7fcba", "#f6fbb8", "#f5fbb8", "#f5fbb7", "#f4fab6", "#f3fab6", "#f2fab5", "#f1f9b4", "#f0f9b4", "#eff8b3", "#eef8b2", "#edf8b2", "#ecf7b1", "#ebf7b0", "#eaf7af", "#e9f6af", "#e8f6ae", "#e7f5ad", "#e6f5ad", "#e5f5ac", "#e5f4ab", "#e4f4ab", "#e3f4aa", "#e2f3a9", "#e1f3a9", "#e0f2a8", "#dff2a7", "#def2a6", "#ddf1a6", "#dcf1a5", "#dbf1a4", "#daf0a4", "#d9f0a3", "#d8efa2", "#d7efa2", "#d5eea1", "#d4eea0", "#d3eda0", "#d1ec9f", "#d0ec9e", "#ceeb9e", "#cdeb9d", "#ccea9c", "#cae99c", "#c9e99b", "#c8e89a", "#c6e89a", "#c5e799", "#c3e698", "#c2e698", "#c1e597", "#bfe596", "#bee496", "#bde395", "#bbe395", "#bae294", "#b8e293", "#b7e193", "#b6e092", "#b4e091", "#b3df91", "#b2df90", "#b0de8f", "#afdd8f", "#addd8e", "#acdc8d", "#aadc8d", "#a9db8c", "#a7da8b", "#a5d98b", "#a4d98a", "#a2d889", "#a0d789", "#9fd688", "#9dd687", "#9bd587", "#9ad486", "#98d485", "#96d385", "#95d284", "#93d183", "#91d183", "#90d082", "#8ecf81", "#8ccf81", "#8bce80", "#89cd7f", "#87cc7f", "#86cc7e", "#84cb7d", "#82ca7d", "#81c97c", "#7fc97b", "#7dc87b", "#7cc77a", "#7ac779", "#78c679", "#77c578", "#75c477", "#73c376", "#71c375", "#70c275", "#6ec174", "#6cc073", "#6bbf72", "#69be71", "#67bd70", "#65bd6f", "#64bc6e", "#62bb6e", "#60ba6d", "#5eb96c", "#5db86b", "#5bb86a", "#59b769", "#58b668", "#56b567", "#54b466", "#52b366", "#51b265", "#4fb264", "#4db163", "#4bb062", "#4aaf61", "#48ae60", "#46ad5f", "#45ad5f", "#43ac5e", "#41ab5d", "#40aa5c", "#3fa95b", "#3ea75a", "#3da65a", "#3ca559", "#3ba458", "#3aa257", "#39a156", "#38a055", "#379f55", "#379e54", "#369c53", "#359b52", "#349a51", "#339951", "#329750", "#31964f", "#30954e", "#2f944d", "#2e924c", "#2d914c", "#2c904b", "#2b8f4a", "#2a8e49", "#298c48", "#288b48", "#278a47", "#278946", "#268745", "#258644", "#248544", "#238443", "#228342", "#218242", "#1f8141", "#1e8041", "#1d7f41", "#1c7e40", "#1b7e40", "#1a7d40", "#197c3f", "#187b3f", "#177a3e", "#16793e", "#15783e", "#13773d", "#12773d", "#11763d", "#10753c", "#0f743c", "#0e733b", "#0d723b", "#0c713b", "#0b703a", "#0a703a", "#086f3a", "#076e39", "#066d39", "#056c38", "#046b38", "#036a38", "#026937", "#016837", "#006837", "#006736", "#006536", "#006435", "#006335", "#006234", "#006134", "#006033", "#005f33", "#005e33", "#005d32", "#005c32", "#005a31", "#005931", "#005830", "#005730", "#005630", "#00552f", "#00542f", "#00532e", "#00522e", "#00512d", "#004f2d", "#004e2c", "#004d2c", "#004c2c", "#004b2b", "#004a2b", "#00492a", "#00482a", "#004729", "#004629", "#004529" ], "YlGnBu": [ "#ffffd9", "#fefed7", "#fdfed6", "#fdfed5", "#fcfed3", "#fcfdd2", "#fbfdd1", "#fbfdd0", "#fafdce", "#f9fdcd", "#f9fccc", "#f8fccb", "#f8fcc9", "#f7fcc8", "#f7fbc7", "#f6fbc6", "#f5fbc4", "#f5fbc3", "#f4fbc2", "#f4fac1", "#f3fabf", "#f3fabe", "#f2fabd", "#f2f9bc", "#f1f9ba", "#f0f9b9", "#f0f9b8", "#eff9b7", "#eff8b5", "#eef8b4", "#eef8b3", "#edf8b2", "#ecf7b1", "#ebf7b1", "#eaf7b1", "#e9f6b1", "#e8f6b1", "#e6f5b1", "#e5f5b1", "#e4f4b1", "#e3f4b1", "#e2f3b1", "#e0f3b1", "#dff2b2", "#def2b2", "#ddf1b2", "#dcf1b2", "#daf0b2", "#d9f0b2", "#d8efb2", "#d7efb2", "#d6efb2", "#d5eeb2", "#d3eeb2", "#d2edb3", "#d1edb3", "#d0ecb3", "#cfecb3", "#cdebb3", "#ccebb3", "#cbeab3", "#caeab3", "#c9e9b3", "#c7e9b3", "#c6e8b4", "#c4e7b4", "#c1e7b4", "#bfe6b4", "#bde5b4", "#bbe4b5", "#b8e3b5", "#b6e2b5", "#b4e1b5", "#b2e0b6", "#afdfb6", "#addfb6", "#abdeb6", "#a9ddb6", "#a6dcb7", "#a4dbb7", "#a2dab7", "#a0d9b7", "#9dd8b8", "#9bd8b8", "#99d7b8", "#97d6b8", "#94d5b8", "#92d4b9", "#90d3b9", "#8dd2b9", "#8bd1b9", "#89d1b9", "#87d0ba", "#84cfba", "#82ceba", "#80cdba", "#7eccbb", "#7cccbb", "#7acbbb", "#78cabb", "#76c9bc", "#74c9bc", "#72c8bc", "#70c7bd", "#6ec6bd", "#6cc6bd", "#6ac5bd", "#68c4be", "#66c4be", "#64c3be", "#63c2bf", "#61c1bf", "#5fc1bf", "#5dc0bf", "#5bbfc0", "#59bfc0", "#57bec0", "#55bdc1", "#53bcc1", "#51bcc1", "#4fbbc1", "#4dbac2", "#4bb9c2", "#49b9c2", "#47b8c3", "#45b7c3", "#43b7c3", "#41b6c3", "#40b5c3", "#3fb4c3", "#3eb3c3", "#3db1c3", "#3bb0c3", "#3aafc3", "#39aec3", "#38adc3", "#37acc2", "#36aac2", "#35a9c2", "#34a8c2", "#32a7c2", "#31a6c2", "#30a5c2", "#2fa4c2", "#2ea2c1", "#2da1c1", "#2ca0c1", "#2a9fc1", "#299ec1", "#289dc1", "#279bc1", "#269ac1", "#2599c0", "#2498c0", "#2397c0", "#2196c0", "#2094c0", "#1f93c0", "#1e92c0", "#1d91c0", "#1d90bf", "#1d8ebe", "#1d8cbe", "#1d8bbd", "#1d89bc", "#1d88bb", "#1e86bb", "#1e84ba", "#1e83b9", "#1e81b8", "#1e80b8", "#1e7eb7", "#1e7cb6", "#1f7bb5", "#1f79b4", "#1f78b4", "#1f76b3", "#1f74b2", "#1f73b1", "#2071b1", "#2070b0", "#206eaf", "#206cae", "#206bae", "#2069ad", "#2168ac", "#2166ab", "#2164ab", "#2163aa", "#2161a9", "#2160a8", "#215ea8", "#225da7", "#225ba6", "#225aa6", "#2259a5", "#2257a5", "#2256a4", "#2255a3", "#2253a3", "#2252a2", "#2251a1", "#234fa1", "#234ea0", "#234da0", "#234b9f", "#234a9e", "#23499e", "#23479d", "#23469c", "#23459c", "#23439b", "#23429a", "#24419a", "#244099", "#243e99", "#243d98", "#243c97", "#243a97", "#243996", "#243895", "#243695", "#243594", "#243494", "#243392", "#233290", "#22318e", "#21318c", "#20308a", "#1f2f88", "#1e2f87", "#1d2e85", "#1c2d83", "#1c2c81", "#1b2c7f", "#1a2b7d", "#192a7b", "#182979", "#172978", "#162876", "#152774", "#142772", "#132670", "#12256e", "#12246c", "#11246a", "#102368", "#0f2267", "#0e2265", "#0d2163", "#0c2061", "#0b1f5f", "#0a1f5d", "#091e5b", "#081d59", "#081d58" ], "YlOrBr": [ "#ffffe5", "#fffee3", "#fffee2", "#fffee1", "#fffddf", "#fffdde", "#fffddd", "#fffddb", "#fffcda", "#fffcd9", "#fffcd8", "#fffcd6", "#fffbd5", "#fffbd4", "#fffbd2", "#fffbd1", "#fffad0", "#fffacf", "#fffacd", "#fffacc", "#fff9cb", "#fff9c9", "#fff9c8", "#fff9c7", "#fff8c6", "#fff8c4", "#fff8c3", "#fff8c2", "#fff7c0", "#fff7bf", "#fff7be", "#fff7bd", "#fef6bb", "#fef6ba", "#fef5b9", "#fef5b7", "#fef4b6", "#fef3b5", "#fef3b3", "#fef2b2", "#fef1b1", "#fef1af", "#fef0ae", "#fef0ac", "#feefab", "#feeeaa", "#feeea8", "#feeda7", "#feeca6", "#feeca4", "#feeba3", "#feeba2", "#feeaa0", "#fee99f", "#fee99e", "#fee89c", "#fee79b", "#fee79a", "#fee698", "#fee597", "#fee596", "#fee494", "#fee493", "#fee392", "#fee290", "#fee18e", "#fee08c", "#fedf8a", "#fede88", "#fedd86", "#fedc84", "#fedb81", "#feda7f", "#feda7d", "#fed97b", "#fed879", "#fed777", "#fed675", "#fed573", "#fed471", "#fed36f", "#fed26d", "#fed16b", "#fed069", "#fecf67", "#fece65", "#fecd62", "#fecc60", "#fecb5e", "#feca5c", "#fec95a", "#fec858", "#fec756", "#fec654", "#fec552", "#fec450", "#fec34e", "#fec24d", "#fec04c", "#febf4a", "#febe49", "#febc48", "#febb47", "#feba46", "#feb845", "#feb743", "#feb642", "#feb441", "#feb340", "#feb13f", "#feb03d", "#feaf3c", "#fead3b", "#feac3a", "#feab39", "#fea937", "#fea836", "#fea735", "#fea534", "#fea433", "#fea331", "#fea130", "#fea02f", "#fe9f2e", "#fe9d2d", "#fe9c2b", "#fe9b2a", "#fe9929", "#fd9828", "#fd9728", "#fc9527", "#fc9426", "#fb9326", "#fa9125", "#fa9024", "#f98f24", "#f98e23", "#f88c22", "#f88b22", "#f78a21", "#f68820", "#f68720", "#f5861f", "#f5851e", "#f4831e", "#f4821d", "#f3811c", "#f27f1c", "#f27e1b", "#f17d1a", "#f17c1a", "#f07a19", "#f07918", "#ef7818", "#ef7617", "#ee7516", "#ed7416", "#ed7315", "#ec7114", "#ec7014", "#eb6f13", "#ea6e13", "#e96d12", "#e86b11", "#e76a11", "#e66910", "#e56810", "#e4670f", "#e3660f", "#e2650e", "#e1640e", "#e0620d", "#df610c", "#de600c", "#dd5f0b", "#dc5e0b", "#db5d0a", "#da5c0a", "#d95a09", "#d85908", "#d75808", "#d65707", "#d55607", "#d45506", "#d35406", "#d25305", "#d15104", "#d05004", "#cf4f03", "#ce4e03", "#cd4d02", "#cc4c02", "#ca4b02", "#c94a02", "#c74902", "#c64902", "#c44802", "#c24702", "#c14602", "#bf4602", "#be4502", "#bc4402", "#ba4302", "#b94302", "#b74202", "#b64102", "#b44002", "#b24002", "#b13f03", "#af3e03", "#ae3d03", "#ac3d03", "#aa3c03", "#a93b03", "#a73a03", "#a63a03", "#a43903", "#a23803", "#a13703", "#9f3703", "#9e3603", "#9c3503", "#9a3403", "#993403", "#973304", "#963304", "#943204", "#923204", "#913104", "#8f3104", "#8e3004", "#8c3004", "#8a2f04", "#892f04", "#872e04", "#862e04", "#842d04", "#822d04", "#812d04", "#7f2c04", "#7e2c05", "#7c2b05", "#7a2b05", "#792a05", "#772a05", "#762905", "#742905", "#722805", "#712805", "#6f2705", "#6e2705", "#6c2605", "#6a2605", "#692505", "#672505", "#662505" ], "YlOrRd": [ "#ffffcc", "#fffeca", "#fffdc9", "#fffdc7", "#fffcc6", "#fffcc5", "#fffbc3", "#fffbc2", "#fffac0", "#fff9bf", "#fff9be", "#fff8bc", "#fff8bb", "#fff7ba", "#fff7b8", "#fff6b7", "#fff5b5", "#fff5b4", "#fff4b3", "#fff4b1", "#fff3b0", "#fff3af", "#fff2ad", "#fff2ac", "#fff1aa", "#fff0a9", "#fff0a8", "#ffefa6", "#ffefa5", "#ffeea3", "#ffeea2", "#ffeda1", "#feec9f", "#feec9e", "#feeb9d", "#feeb9b", "#feea9a", "#fee999", "#fee997", "#fee896", "#fee795", "#fee793", "#fee692", "#fee691", "#fee590", "#fee48e", "#fee48d", "#fee38c", "#fee28a", "#fee289", "#fee188", "#fee186", "#fee085", "#fedf84", "#fedf82", "#fede81", "#fedd80", "#fedd7e", "#fedc7d", "#fedb7c", "#fedb7a", "#feda79", "#feda78", "#fed976", "#fed875", "#fed774", "#fed673", "#fed571", "#fed370", "#fed26f", "#fed16d", "#fed06c", "#fece6b", "#fecd69", "#fecc68", "#fecb67", "#feca65", "#fec864", "#fec763", "#fec661", "#fec560", "#fec35f", "#fec25d", "#fec15c", "#fec05b", "#febf5a", "#febd58", "#febc57", "#febb56", "#feba54", "#feb853", "#feb752", "#feb650", "#feb54f", "#feb34e", "#feb24c", "#fdb14b", "#fdb04b", "#fdaf4a", "#fdae4a", "#fdac49", "#fdab49", "#fdaa48", "#fda948", "#fda847", "#fda747", "#fda546", "#fda446", "#fda345", "#fda245", "#fda144", "#fda044", "#fd9e43", "#fd9d43", "#fd9c42", "#fd9b42", "#fd9a41", "#fd9941", "#fd9840", "#fd9640", "#fd953f", "#fd943f", "#fd933e", "#fd923e", "#fd913d", "#fd8f3d", "#fd8e3c", "#fd8d3c", "#fc8c3b", "#fc8a3b", "#fc883a", "#fc863a", "#fc8439", "#fc8238", "#fc8038", "#fc7e37", "#fc7c37", "#fc7a36", "#fc7836", "#fc7635", "#fc7434", "#fc7234", "#fc7033", "#fc6e33", "#fc6c32", "#fc6a32", "#fc6831", "#fc6630", "#fc6430", "#fc622f", "#fc602f", "#fc5e2e", "#fc5c2e", "#fc5a2d", "#fc582d", "#fc562c", "#fc542b", "#fc522b", "#fc502a", "#fc4e2a", "#fb4c29", "#fa4b29", "#f94928", "#f94828", "#f84627", "#f74427", "#f64327", "#f64126", "#f53f26", "#f43e25", "#f33c25", "#f23b24", "#f23924", "#f13724", "#f03623", "#ef3423", "#ee3222", "#ee3122", "#ed2f21", "#ec2d21", "#eb2c20", "#eb2a20", "#ea2920", "#e9271f", "#e8251f", "#e7241e", "#e7221e", "#e6201d", "#e51f1d", "#e41d1c", "#e31c1c", "#e31a1c", "#e2191c", "#e0181c", "#df171c", "#de161d", "#dd161d", "#dc151d", "#da141e", "#d9131e", "#d8121e", "#d7121f", "#d6111f", "#d4101f", "#d30f20", "#d20e20", "#d10d20", "#d00d20", "#cf0c21", "#cd0b21", "#cc0a21", "#cb0922", "#ca0922", "#c90822", "#c70723", "#c60623", "#c50523", "#c40424", "#c30424", "#c10324", "#c00225", "#bf0125", "#be0025", "#bd0025", "#bb0026", "#b90026", "#b70026", "#b50026", "#b30026", "#b10026", "#af0026", "#ad0026", "#ac0026", "#aa0026", "#a80026", "#a60026", "#a40026", "#a20026", "#a00026", "#9e0026", "#9c0026", "#9a0026", "#980026", "#960026", "#950026", "#930026", "#910026", "#8f0026", "#8d0026", "#8b0026", "#890026", "#870026", "#850026", "#830026", "#810026", "#800026" ], "afmhot": [ "#000000", "#020000", "#040000", "#060000", "#080000", "#0a0000", "#0c0000", "#0e0000", "#100000", "#120000", "#140000", "#160000", "#180000", "#1a0000", "#1c0000", "#1e0000", "#200000", "#220000", "#240000", "#260000", "#280000", "#2a0000", "#2c0000", "#2e0000", "#300000", "#320000", "#340000", "#360000", "#380000", "#3a0000", "#3c0000", "#3e0000", "#400000", "#410000", "#440000", "#460000", "#480000", "#490000", "#4c0000", "#4e0000", "#500000", "#510000", "#540000", "#560000", "#580000", "#590000", "#5c0000", "#5e0000", "#600000", "#610000", "#640000", "#660000", "#680000", "#690000", "#6c0000", "#6e0000", "#700000", "#710000", "#740000", "#760000", "#780000", "#790000", "#7c0000", "#7e0000", "#800000", "#820200", "#830400", "#860600", "#880800", "#8a0a00", "#8c0c00", "#8e0e00", "#901000", "#921200", "#931400", "#961600", "#981800", "#9a1a00", "#9c1c00", "#9e1e00", "#a02000", "#a22200", "#a32400", "#a62600", "#a82800", "#aa2a00", "#ac2c00", "#ae2e00", "#b03000", "#b23200", "#b33400", "#b63600", "#b83800", "#ba3a00", "#bc3c00", "#be3e00", "#c04000", "#c24200", "#c34400", "#c64600", "#c84800", "#ca4a00", "#cc4c00", "#ce4e00", "#d05000", "#d25200", "#d35400", "#d65600", "#d85800", "#da5a00", "#dc5c00", "#de5e00", "#e06000", "#e26200", "#e36400", "#e66600", "#e86800", "#ea6a00", "#ec6c00", "#ee6e00", "#f07000", "#f27200", "#f37400", "#f67600", "#f87800", "#fa7a00", "#fc7c00", "#fe7e00", "#ff8000", "#ff8202", "#ff8404", "#ff8606", "#ff8808", "#ff8a0b", "#ff8c0d", "#ff8e0f", "#ff9010", "#ff9212", "#ff9414", "#ff9616", "#ff9819", "#ff9a1b", "#ff9c1d", "#ff9e1f", "#ffa020", "#ffa222", "#ffa424", "#ffa626", "#ffa828", "#ffaa2b", "#ffac2d", "#ffae2f", "#ffb030", "#ffb232", "#ffb434", "#ffb636", "#ffb839", "#ffba3b", "#ffbc3d", "#ffbe3f", "#ffc041", "#ffc242", "#ffc444", "#ffc646", "#ffc848", "#ffca4b", "#ffcc4d", "#ffce4f", "#ffd051", "#ffd252", "#ffd454", "#ffd656", "#ffd859", "#ffda5b", "#ffdc5d", "#ffde5f", "#ffe061", "#ffe262", "#ffe464", "#ffe666", "#ffe868", "#ffea6b", "#ffec6d", "#ffee6f", "#fff071", "#fff272", "#fff474", "#fff676", "#fff879", "#fffa7b", "#fffc7d", "#fffe7f", "#ffff81", "#ffff83", "#ffff84", "#ffff86", "#ffff88", "#ffff8b", "#ffff8d", "#ffff8f", "#ffff91", "#ffff93", "#ffff94", "#ffff96", "#ffff99", "#ffff9b", "#ffff9d", "#ffff9f", "#ffffa1", "#ffffa3", "#ffffa4", "#ffffa6", "#ffffa8", "#ffffab", "#ffffad", "#ffffaf", "#ffffb1", "#ffffb3", "#ffffb4", "#ffffb6", "#ffffb9", "#ffffbb", "#ffffbd", "#ffffbf", "#ffffc1", "#ffffc3", "#ffffc4", "#ffffc6", "#ffffc8", "#ffffcb", "#ffffcd", "#ffffcf", "#ffffd1", "#ffffd3", "#ffffd4", "#ffffd6", "#ffffd9", "#ffffdb", "#ffffdd", "#ffffdf", "#ffffe1", "#ffffe3", "#ffffe4", "#ffffe6", "#ffffe8", "#ffffeb", "#ffffed", "#ffffef", "#fffff1", "#fffff3", "#fffff4", "#fffff6", "#fffff9", "#fffffb", "#fffffd", "#ffffff" ], "autumn": [ "#ff0000", "#ff0100", "#ff0200", "#ff0300", "#ff0400", "#ff0500", "#ff0600", "#ff0700", "#ff0800", "#ff0900", "#ff0a00", "#ff0b00", "#ff0c00", "#ff0d00", "#ff0e00", "#ff0f00", "#ff1000", "#ff1100", "#ff1200", "#ff1300", "#ff1400", "#ff1500", "#ff1600", "#ff1700", "#ff1800", "#ff1900", "#ff1a00", "#ff1b00", "#ff1c00", "#ff1d00", "#ff1e00", "#ff1f00", "#ff2000", "#ff2000", "#ff2200", "#ff2300", "#ff2400", "#ff2400", "#ff2600", "#ff2700", "#ff2800", "#ff2800", "#ff2a00", "#ff2b00", "#ff2c00", "#ff2c00", "#ff2e00", "#ff2f00", "#ff3000", "#ff3000", "#ff3200", "#ff3300", "#ff3400", "#ff3400", "#ff3600", "#ff3700", "#ff3800", "#ff3800", "#ff3a00", "#ff3b00", "#ff3c00", "#ff3c00", "#ff3e00", "#ff3f00", "#ff4000", "#ff4100", "#ff4100", "#ff4300", "#ff4400", "#ff4500", "#ff4600", "#ff4700", "#ff4800", "#ff4900", "#ff4900", "#ff4b00", "#ff4c00", "#ff4d00", "#ff4e00", "#ff4f00", "#ff5000", "#ff5100", "#ff5100", "#ff5300", "#ff5400", "#ff5500", "#ff5600", "#ff5700", "#ff5800", "#ff5900", "#ff5900", "#ff5b00", "#ff5c00", "#ff5d00", "#ff5e00", "#ff5f00", "#ff6000", "#ff6100", "#ff6100", "#ff6300", "#ff6400", "#ff6500", "#ff6600", "#ff6700", "#ff6800", "#ff6900", "#ff6900", "#ff6b00", "#ff6c00", "#ff6d00", "#ff6e00", "#ff6f00", "#ff7000", "#ff7100", "#ff7100", "#ff7300", "#ff7400", "#ff7500", "#ff7600", "#ff7700", "#ff7800", "#ff7900", "#ff7900", "#ff7b00", "#ff7c00", "#ff7d00", "#ff7e00", "#ff7f00", "#ff8000", "#ff8100", "#ff8200", "#ff8300", "#ff8300", "#ff8500", "#ff8600", "#ff8700", "#ff8800", "#ff8900", "#ff8a00", "#ff8b00", "#ff8c00", "#ff8d00", "#ff8e00", "#ff8f00", "#ff9000", "#ff9100", "#ff9200", "#ff9300", "#ff9300", "#ff9500", "#ff9600", "#ff9700", "#ff9800", "#ff9900", "#ff9a00", "#ff9b00", "#ff9c00", "#ff9d00", "#ff9e00", "#ff9f00", "#ffa000", "#ffa100", "#ffa200", "#ffa300", "#ffa300", "#ffa500", "#ffa600", "#ffa700", "#ffa800", "#ffa900", "#ffaa00", "#ffab00", "#ffac00", "#ffad00", "#ffae00", "#ffaf00", "#ffb000", "#ffb100", "#ffb200", "#ffb300", "#ffb300", "#ffb500", "#ffb600", "#ffb700", "#ffb800", "#ffb900", "#ffba00", "#ffbb00", "#ffbc00", "#ffbd00", "#ffbe00", "#ffbf00", "#ffc000", "#ffc100", "#ffc200", "#ffc300", "#ffc300", "#ffc500", "#ffc600", "#ffc700", "#ffc800", "#ffc900", "#ffca00", "#ffcb00", "#ffcc00", "#ffcd00", "#ffce00", "#ffcf00", "#ffd000", "#ffd100", "#ffd200", "#ffd300", "#ffd300", "#ffd500", "#ffd600", "#ffd700", "#ffd800", "#ffd900", "#ffda00", "#ffdb00", "#ffdc00", "#ffdd00", "#ffde00", "#ffdf00", "#ffe000", "#ffe100", "#ffe200", "#ffe300", "#ffe300", "#ffe500", "#ffe600", "#ffe700", "#ffe800", "#ffe900", "#ffea00", "#ffeb00", "#ffec00", "#ffed00", "#ffee00", "#ffef00", "#fff000", "#fff100", "#fff200", "#fff300", "#fff300", "#fff500", "#fff600", "#fff700", "#fff800", "#fff900", "#fffa00", "#fffb00", "#fffc00", "#fffd00", "#fffe00", "#ffff00" ], "binary": [ "#ffffff", "#fefefe", "#fdfdfd", "#fcfcfc", "#fbfbfb", "#fafafa", "#f9f9f9", "#f8f8f8", "#f7f7f7", "#f6f6f6", "#f5f5f5", "#f4f4f4", "#f3f3f3", "#f2f2f2", "#f1f1f1", "#f0f0f0", "#efefef", "#eeeeee", "#ededed", "#ececec", "#ebebeb", "#eaeaea", "#e9e9e9", "#e8e8e8", "#e7e7e7", "#e6e6e6", "#e5e5e5", "#e4e4e4", "#e3e3e3", "#e2e2e2", "#e1e1e1", "#e0e0e0", "#dfdfdf", "#dedede", "#dddddd", "#dcdcdc", "#dbdbdb", "#dadada", "#d9d9d9", "#d8d8d8", "#d7d7d7", "#d6d6d6", "#d5d5d5", "#d3d3d3", "#d3d3d3", "#d2d2d2", "#d1d1d1", "#d0d0d0", "#cfcfcf", "#cecece", "#cdcdcd", "#cccccc", "#cbcbcb", "#cacaca", "#c9c9c9", "#c8c8c8", "#c7c7c7", "#c6c6c6", "#c5c5c5", "#c3c3c3", "#c3c3c3", "#c2c2c2", "#c1c1c1", "#c0c0c0", "#bfbfbf", "#bebebe", "#bdbdbd", "#bcbcbc", "#bbbbbb", "#bababa", "#b9b9b9", "#b8b8b8", "#b7b7b7", "#b6b6b6", "#b5b5b5", "#b3b3b3", "#b3b3b3", "#b2b2b2", "#b1b1b1", "#b0b0b0", "#afafaf", "#aeaeae", "#adadad", "#acacac", "#ababab", "#aaaaaa", "#a9a9a9", "#a8a8a8", "#a7a7a7", "#a6a6a6", "#a5a5a5", "#a3a3a3", "#a3a3a3", "#a2a2a2", "#a1a1a1", "#a0a0a0", "#9f9f9f", "#9e9e9e", "#9d9d9d", "#9c9c9c", "#9b9b9b", "#9a9a9a", "#999999", "#989898", "#979797", "#969696", "#959595", "#939393", "#939393", "#929292", "#919191", "#909090", "#8f8f8f", "#8e8e8e", "#8d8d8d", "#8c8c8c", "#8b8b8b", "#8a8a8a", "#898989", "#888888", "#878787", "#868686", "#858585", "#838383", "#838383", "#828282", "#818181", "#808080", "#7f7f7f", "#7e7e7e", "#7d7d7d", "#7c7c7c", "#7b7b7b", "#797979", "#797979", "#787878", "#777777", "#767676", "#757575", "#747474", "#727272", "#717171", "#717171", "#707070", "#6f6f6f", "#6e6e6e", "#6d6d6d", "#6c6c6c", "#6b6b6b", "#696969", "#696969", "#686868", "#676767", "#666666", "#656565", "#646464", "#626262", "#616161", "#616161", "#606060", "#5f5f5f", "#5e5e5e", "#5d5d5d", "#5c5c5c", "#5b5b5b", "#595959", "#595959", "#585858", "#575757", "#565656", "#555555", "#545454", "#525252", "#515151", "#515151", "#505050", "#4f4f4f", "#4e4e4e", "#4d4d4d", "#4c4c4c", "#4b4b4b", "#494949", "#494949", "#484848", "#474747", "#464646", "#454545", "#444444", "#424242", "#414141", "#414141", "#404040", "#3f3f3f", "#3e3e3e", "#3d3d3d", "#3c3c3c", "#3b3b3b", "#393939", "#383838", "#383838", "#373737", "#363636", "#353535", "#343434", "#323232", "#313131", "#303030", "#303030", "#2f2f2f", "#2e2e2e", "#2d2d2d", "#2c2c2c", "#2b2b2b", "#292929", "#282828", "#282828", "#272727", "#262626", "#252525", "#242424", "#222222", "#212121", "#202020", "#202020", "#1f1f1f", "#1e1e1e", "#1d1d1d", "#1c1c1c", "#1b1b1b", "#191919", "#181818", "#181818", "#171717", "#161616", "#151515", "#141414", "#121212", "#111111", "#101010", "#101010", "#0f0f0f", "#0e0e0e", "#0d0d0d", "#0c0c0c", "#0b0b0b", "#090909", "#080808", "#080808", "#070707", "#060606", "#050505", "#040404", "#020202", "#010101", "#000000", "#000000" ], "bone": [ "#000000", "#000001", "#010102", "#020203", "#030304", "#040406", "#050507", "#060608", "#070609", "#07070a", "#08080c", "#09090d", "#0a0a0e", "#0b0b0f", "#0c0c11", "#0d0d12", "#0e0d13", "#0e0e14", "#0f0f15", "#101017", "#111118", "#121219", "#13131a", "#14141c", "#15141d", "#15151e", "#16161f", "#171720", "#181822", "#191923", "#1a1a24", "#1b1b25", "#1c1b26", "#1c1c28", "#1d1d29", "#1e1e2a", "#1f1f2b", "#20202d", "#21212e", "#22222f", "#232230", "#232331", "#242433", "#252534", "#262635", "#272736", "#282838", "#292939", "#2a293a", "#2a2a3b", "#2b2b3c", "#2c2c3e", "#2d2d3f", "#2e2e40", "#2f2f41", "#303042", "#313044", "#313145", "#323246", "#333347", "#343449", "#35354a", "#36364b", "#37374c", "#38374d", "#38384f", "#393950", "#3a3a51", "#3b3b52", "#3c3c54", "#3d3d55", "#3e3e56", "#3f3e57", "#3f3f58", "#40405a", "#41415b", "#42425c", "#43435d", "#44445e", "#454560", "#464561", "#464662", "#474763", "#484865", "#494966", "#4a4a67", "#4b4b68", "#4c4c69", "#4d4c6b", "#4d4d6c", "#4e4e6d", "#4f4f6e", "#505070", "#515171", "#525272", "#535372", "#545473", "#545674", "#555775", "#565876", "#575977", "#585a78", "#595c79", "#5a5d79", "#5b5e7a", "#5b5f7b", "#5c607c", "#5d627d", "#5e637e", "#5f647f", "#606580", "#616680", "#626881", "#626982", "#636a83", "#646b84", "#656d85", "#666e86", "#676f87", "#687087", "#697188", "#697389", "#6a748a", "#6b758b", "#6c768c", "#6d778d", "#6e798e", "#6f7a8e", "#707b8f", "#707c90", "#717d91", "#727f92", "#738093", "#748194", "#758295", "#768395", "#778596", "#778697", "#788798", "#798899", "#7a899a", "#7b8b9b", "#7c8c9c", "#7d8d9c", "#7e8e9d", "#7e8f9e", "#7f919f", "#8092a0", "#8193a1", "#8294a2", "#8395a3", "#8497a3", "#8598a4", "#8599a5", "#869aa6", "#879ba7", "#889da8", "#899ea9", "#8a9faa", "#8ba0aa", "#8ca1ab", "#8ca3ac", "#8da4ad", "#8ea5ae", "#8fa6af", "#90a7b0", "#91a9b1", "#92aab1", "#93abb2", "#93acb3", "#94adb4", "#95afb5", "#96b0b6", "#97b1b7", "#98b2b8", "#99b3b8", "#9ab5b9", "#9ab6ba", "#9bb7bb", "#9cb8bc", "#9dbabd", "#9ebbbe", "#9fbcbf", "#a0bdbf", "#a1bec0", "#a1c0c1", "#a2c1c2", "#a3c2c3", "#a4c3c4", "#a5c4c5", "#a6c6c6", "#a7c7c6", "#a8c7c7", "#aac8c8", "#abc9c9", "#accaca", "#aecbcb", "#afcccc", "#b1cdcd", "#b2cecd", "#b3cece", "#b5cfcf", "#b6d0d0", "#b7d1d1", "#b9d2d2", "#bad3d3", "#bcd4d4", "#bdd5d4", "#bed5d5", "#c0d6d6", "#c1d7d7", "#c2d8d8", "#c4d9d9", "#c5dada", "#c6dbdb", "#c8dcdb", "#c9dcdc", "#cbdddd", "#ccdede", "#cddfdf", "#cfe0e0", "#d0e1e1", "#d1e2e2", "#d3e3e2", "#d4e3e3", "#d5e4e4", "#d7e5e5", "#d8e6e6", "#dae7e7", "#dbe8e8", "#dce9e9", "#deeae9", "#dfeaea", "#e0ebeb", "#e2ecec", "#e3eded", "#e5eeee", "#e6efef", "#e7f0f0", "#e9f1f0", "#eaf1f1", "#ebf2f2", "#edf3f3", "#eef4f4", "#eff5f5", "#f1f6f6", "#f2f7f7", "#f4f8f7", "#f5f8f8", "#f6f9f9", "#f8fafa", "#f9fbfb", "#fafcfc", "#fcfdfd", "#fdfefe", "#ffffff" ], "brg": [ "#0000ff", "#0200fd", "#0400fb", "#0600f9", "#0800f7", "#0a00f5", "#0c00f3", "#0e00f1", "#1000ef", "#1200ed", "#1400eb", "#1600e9", "#1800e7", "#1a00e5", "#1c00e3", "#1e00e1", "#2000df", "#2200dd", "#2400db", "#2600d9", "#2800d7", "#2a00d5", "#2c00d3", "#2e00d1", "#3000cf", "#3200cd", "#3400cb", "#3600c9", "#3800c7", "#3a00c5", "#3c00c3", "#3e00c1", "#4000bf", "#4100bd", "#4400bb", "#4600b9", "#4800b7", "#4900b5", "#4c00b3", "#4e00b1", "#5000af", "#5100ad", "#5400ab", "#5600a9", "#5800a7", "#5900a5", "#5c00a3", "#5e00a1", "#60009f", "#61009d", "#64009b", "#660099", "#680097", "#690095", "#6c0093", "#6e0091", "#70008f", "#71008d", "#74008b", "#760089", "#780087", "#790085", "#7c0083", "#7e0081", "#80007f", "#82007d", "#83007b", "#860079", "#880077", "#8a0075", "#8c0072", "#8e0071", "#90006f", "#92006d", "#93006b", "#960069", "#980067", "#9a0065", "#9c0062", "#9e0061", "#a0005f", "#a2005d", "#a3005b", "#a60059", "#a80057", "#aa0055", "#ac0052", "#ae0051", "#b0004f", "#b2004d", "#b3004b", "#b60049", "#b80047", "#ba0045", "#bc0042", "#be0041", "#c0003f", "#c2003d", "#c3003b", "#c60038", "#c80037", "#ca0035", "#cc0032", "#ce0030", "#d0002f", "#d2002d", "#d3002b", "#d60028", "#d80027", "#da0025", "#dc0022", "#de0020", "#e0001f", "#e2001d", "#e3001b", "#e60018", "#e80017", "#ea0015", "#ec0012", "#ee0010", "#f0000f", "#f2000d", "#f3000b", "#f60008", "#f80007", "#fa0005", "#fc0002", "#fe0000", "#fe0100", "#fc0300", "#fa0500", "#f80700", "#f60800", "#f40b00", "#f20d00", "#f00f00", "#ee1100", "#ec1300", "#ea1500", "#e81700", "#e61900", "#e41b00", "#e21d00", "#e01f00", "#de2100", "#dc2300", "#da2500", "#d82700", "#d62800", "#d32b00", "#d22d00", "#d02f00", "#ce3100", "#cc3300", "#ca3500", "#c83700", "#c63900", "#c33b00", "#c23d00", "#c03f00", "#be4100", "#bc4300", "#ba4500", "#b84700", "#b64800", "#b34b00", "#b24d00", "#b04f00", "#ae5100", "#ac5300", "#aa5500", "#a85700", "#a65900", "#a35b00", "#a25d00", "#a05f00", "#9e6100", "#9c6300", "#9a6500", "#986700", "#966800", "#936b00", "#926d00", "#906f00", "#8e7100", "#8c7300", "#8a7500", "#887700", "#867900", "#837b00", "#827d00", "#807f00", "#7e8100", "#7c8300", "#798500", "#788700", "#768800", "#748b00", "#718d00", "#708f00", "#6e9100", "#6c9300", "#699500", "#689700", "#669900", "#649b00", "#619d00", "#609f00", "#5ea100", "#5ca300", "#59a500", "#58a700", "#56a800", "#54ab00", "#51ad00", "#50af00", "#4eb100", "#4cb300", "#49b500", "#48b700", "#46b900", "#44bb00", "#41bd00", "#40bf00", "#3ec100", "#3cc300", "#39c500", "#38c700", "#36c800", "#34cb00", "#31cd00", "#30cf00", "#2ed100", "#2cd300", "#29d500", "#28d700", "#26d900", "#24db00", "#21dd00", "#20df00", "#1ee100", "#1ce300", "#19e500", "#18e700", "#16e800", "#14eb00", "#11ed00", "#10ef00", "#0ef100", "#0cf300", "#09f500", "#08f700", "#06f900", "#04fb00", "#01fd00", "#00ff00" ], "bwr": [ "#0000ff", "#0202ff", "#0404ff", "#0606ff", "#0808ff", "#0a0aff", "#0c0cff", "#0e0eff", "#1010ff", "#1212ff", "#1414ff", "#1616ff", "#1818ff", "#1a1aff", "#1c1cff", "#1e1eff", "#2020ff", "#2222ff", "#2424ff", "#2626ff", "#2828ff", "#2a2aff", "#2c2cff", "#2e2eff", "#3030ff", "#3232ff", "#3434ff", "#3636ff", "#3838ff", "#3a3aff", "#3c3cff", "#3e3eff", "#4040ff", "#4141ff", "#4444ff", "#4646ff", "#4848ff", "#4949ff", "#4c4cff", "#4e4eff", "#5050ff", "#5151ff", "#5454ff", "#5656ff", "#5858ff", "#5959ff", "#5c5cff", "#5e5eff", "#6060ff", "#6161ff", "#6464ff", "#6666ff", "#6868ff", "#6969ff", "#6c6cff", "#6e6eff", "#7070ff", "#7171ff", "#7474ff", "#7676ff", "#7878ff", "#7979ff", "#7c7cff", "#7e7eff", "#8080ff", "#8282ff", "#8383ff", "#8686ff", "#8888ff", "#8a8aff", "#8c8cff", "#8e8eff", "#9090ff", "#9292ff", "#9393ff", "#9696ff", "#9898ff", "#9a9aff", "#9c9cff", "#9e9eff", "#a0a0ff", "#a2a2ff", "#a3a3ff", "#a6a6ff", "#a8a8ff", "#aaaaff", "#acacff", "#aeaeff", "#b0b0ff", "#b2b2ff", "#b3b3ff", "#b6b6ff", "#b8b8ff", "#babaff", "#bcbcff", "#bebeff", "#c0c0ff", "#c2c2ff", "#c3c3ff", "#c6c6ff", "#c8c8ff", "#cacaff", "#ccccff", "#ceceff", "#d0d0ff", "#d2d2ff", "#d3d3ff", "#d6d6ff", "#d8d8ff", "#dadaff", "#dcdcff", "#dedeff", "#e0e0ff", "#e2e2ff", "#e3e3ff", "#e6e6ff", "#e8e8ff", "#eaeaff", "#ececff", "#eeeeff", "#f0f0ff", "#f2f2ff", "#f3f3ff", "#f6f6ff", "#f8f8ff", "#fafaff", "#fcfcff", "#fefeff", "#fffefe", "#fffcfc", "#fffafa", "#fff8f8", "#fff6f6", "#fff4f4", "#fff2f2", "#fff0f0", "#ffeeee", "#ffecec", "#ffeaea", "#ffe8e8", "#ffe6e6", "#ffe4e4", "#ffe2e2", "#ffe0e0", "#ffdede", "#ffdcdc", "#ffdada", "#ffd8d8", "#ffd6d6", "#ffd3d3", "#ffd2d2", "#ffd0d0", "#ffcece", "#ffcccc", "#ffcaca", "#ffc8c8", "#ffc6c6", "#ffc3c3", "#ffc2c2", "#ffc0c0", "#ffbebe", "#ffbcbc", "#ffbaba", "#ffb8b8", "#ffb6b6", "#ffb3b3", "#ffb2b2", "#ffb0b0", "#ffaeae", "#ffacac", "#ffaaaa", "#ffa8a8", "#ffa6a6", "#ffa3a3", "#ffa2a2", "#ffa0a0", "#ff9e9e", "#ff9c9c", "#ff9a9a", "#ff9898", "#ff9696", "#ff9393", "#ff9292", "#ff9090", "#ff8e8e", "#ff8c8c", "#ff8a8a", "#ff8888", "#ff8686", "#ff8383", "#ff8282", "#ff8080", "#ff7e7e", "#ff7c7c", "#ff7979", "#ff7878", "#ff7676", "#ff7474", "#ff7171", "#ff7070", "#ff6e6e", "#ff6c6c", "#ff6969", "#ff6868", "#ff6666", "#ff6464", "#ff6161", "#ff6060", "#ff5e5e", "#ff5c5c", "#ff5959", "#ff5858", "#ff5656", "#ff5454", "#ff5151", "#ff5050", "#ff4e4e", "#ff4c4c", "#ff4949", "#ff4848", "#ff4646", "#ff4444", "#ff4141", "#ff4040", "#ff3e3e", "#ff3c3c", "#ff3939", "#ff3838", "#ff3636", "#ff3434", "#ff3131", "#ff3030", "#ff2e2e", "#ff2c2c", "#ff2929", "#ff2828", "#ff2626", "#ff2424", "#ff2121", "#ff2020", "#ff1e1e", "#ff1c1c", "#ff1919", "#ff1818", "#ff1616", "#ff1414", "#ff1111", "#ff1010", "#ff0e0e", "#ff0c0c", "#ff0909", "#ff0808", "#ff0606", "#ff0404", "#ff0101", "#ff0000" ], "cividis": [ "#00224d", "#00234f", "#002350", "#002452", "#002554", "#002655", "#002657", "#002759", "#00285b", "#00285c", "#00295e", "#002a60", "#002a62", "#002b64", "#002c66", "#002c67", "#002d69", "#002e6b", "#002f6d", "#002f6f", "#003070", "#003070", "#003170", "#003170", "#043270", "#083370", "#0b3370", "#0e3470", "#11356f", "#14366f", "#16366f", "#18376f", "#1a386f", "#1c386e", "#1d396e", "#1f3a6e", "#213b6e", "#223b6e", "#243c6e", "#253d6d", "#273d6d", "#283e6d", "#2a3f6d", "#2b3f6d", "#2c406d", "#2e416c", "#2f426c", "#30426c", "#31436c", "#32446c", "#34446c", "#35456c", "#36466c", "#37466c", "#38476c", "#39486c", "#3a486b", "#3b496b", "#3d4a6b", "#3e4b6b", "#3f4b6b", "#404c6b", "#414d6b", "#424d6b", "#434e6b", "#444f6b", "#454f6b", "#46506b", "#47516b", "#48516b", "#49526b", "#4a536b", "#4b546c", "#4c546c", "#4d556c", "#4e566c", "#4e566c", "#4f576c", "#50586c", "#51586c", "#52596c", "#535a6c", "#545a6c", "#555b6d", "#565c6d", "#575d6d", "#585d6d", "#595e6d", "#595f6d", "#5a5f6d", "#5b606e", "#5c616e", "#5d616e", "#5e626e", "#5f636e", "#60646e", "#61646f", "#61656f", "#62666f", "#63666f", "#64676f", "#656870", "#666970", "#676970", "#686a70", "#686b71", "#696b71", "#6a6c71", "#6b6d71", "#6c6d72", "#6d6e72", "#6e6f72", "#6e7073", "#6f7073", "#707173", "#717273", "#727374", "#737374", "#747475", "#747575", "#757575", "#767676", "#777776", "#787876", "#797877", "#797977", "#7a7a77", "#7b7b77", "#7c7b78", "#7d7c78", "#7e7d78", "#7f7d78", "#807e78", "#817f78", "#828078", "#838078", "#848178", "#858278", "#858378", "#868378", "#878478", "#888578", "#898678", "#8a8678", "#8b8778", "#8c8878", "#8d8978", "#8e8978", "#8f8a77", "#908b77", "#918c77", "#928c77", "#938d77", "#948e77", "#958f77", "#968f77", "#979076", "#989176", "#999276", "#9a9376", "#9b9376", "#9c9476", "#9d9575", "#9e9675", "#9f9675", "#a09775", "#a19874", "#a29974", "#a39a74", "#a49a74", "#a59b73", "#a69c73", "#a79d73", "#a89e73", "#a99e72", "#aa9f72", "#aba072", "#aca171", "#ada271", "#aea271", "#afa370", "#b0a470", "#b1a570", "#b2a66f", "#b3a66f", "#b4a76f", "#b5a86e", "#b6a96e", "#b7aa6d", "#b8ab6d", "#b9ab6d", "#baac6c", "#bbad6c", "#bcae6b", "#bdaf6b", "#beb06a", "#bfb06a", "#c1b169", "#c2b269", "#c3b368", "#c4b468", "#c5b567", "#c6b567", "#c7b666", "#c8b765", "#c9b865", "#cab964", "#cbba64", "#ccbb63", "#cdbc62", "#cebc62", "#cfbd61", "#d0be60", "#d2bf60", "#d3c05f", "#d4c15e", "#d5c25e", "#d6c35d", "#d7c35c", "#d8c45b", "#d9c55a", "#dac65a", "#dbc759", "#dcc858", "#dec957", "#dfca56", "#e0cb55", "#e1cc54", "#e2cc53", "#e3cd52", "#e4ce51", "#e5cf50", "#e6d04f", "#e8d14e", "#e9d24d", "#ead34c", "#ebd44b", "#ecd54a", "#edd648", "#eed747", "#efd846", "#f1d944", "#f2da43", "#f3da42", "#f4db40", "#f5dc3f", "#f6dd3d", "#f8de3b", "#f9df3a", "#fae038", "#fbe136", "#fde234", "#fde333", "#fde534", "#fde636", "#fde737" ], "cool": [ "#00ffff", "#01feff", "#02fdff", "#03fcff", "#04fbff", "#05faff", "#06f9ff", "#07f8ff", "#08f7ff", "#09f6ff", "#0af5ff", "#0bf4ff", "#0cf3ff", "#0df2ff", "#0ef1ff", "#0ff0ff", "#10efff", "#11eeff", "#12edff", "#13ecff", "#14ebff", "#15eaff", "#16e9ff", "#17e8ff", "#18e7ff", "#19e6ff", "#1ae5ff", "#1be4ff", "#1ce3ff", "#1de2ff", "#1ee1ff", "#1fe0ff", "#20dfff", "#20deff", "#22ddff", "#23dcff", "#24dbff", "#24daff", "#26d9ff", "#27d8ff", "#28d7ff", "#28d6ff", "#2ad5ff", "#2bd3ff", "#2cd3ff", "#2cd2ff", "#2ed1ff", "#2fd0ff", "#30cfff", "#30ceff", "#32cdff", "#33ccff", "#34cbff", "#34caff", "#36c9ff", "#37c8ff", "#38c7ff", "#38c6ff", "#3ac5ff", "#3bc3ff", "#3cc3ff", "#3cc2ff", "#3ec1ff", "#3fc0ff", "#40bfff", "#41beff", "#41bdff", "#43bcff", "#44bbff", "#45baff", "#46b9ff", "#47b8ff", "#48b7ff", "#49b6ff", "#49b5ff", "#4bb3ff", "#4cb3ff", "#4db2ff", "#4eb1ff", "#4fb0ff", "#50afff", "#51aeff", "#51adff", "#53acff", "#54abff", "#55aaff", "#56a9ff", "#57a8ff", "#58a7ff", "#59a6ff", "#59a5ff", "#5ba3ff", "#5ca3ff", "#5da2ff", "#5ea1ff", "#5fa0ff", "#609fff", "#619eff", "#619dff", "#639cff", "#649bff", "#659aff", "#6699ff", "#6798ff", "#6897ff", "#6996ff", "#6995ff", "#6b93ff", "#6c93ff", "#6d92ff", "#6e91ff", "#6f90ff", "#708fff", "#718eff", "#718dff", "#738cff", "#748bff", "#758aff", "#7689ff", "#7788ff", "#7887ff", "#7986ff", "#7985ff", "#7b83ff", "#7c83ff", "#7d82ff", "#7e81ff", "#7f80ff", "#807fff", "#817eff", "#827dff", "#837cff", "#837bff", "#8579ff", "#8679ff", "#8778ff", "#8877ff", "#8976ff", "#8a75ff", "#8b74ff", "#8c72ff", "#8d71ff", "#8e71ff", "#8f70ff", "#906fff", "#916eff", "#926dff", "#936cff", "#936bff", "#9569ff", "#9669ff", "#9768ff", "#9867ff", "#9966ff", "#9a65ff", "#9b64ff", "#9c62ff", "#9d61ff", "#9e61ff", "#9f60ff", "#a05fff", "#a15eff", "#a25dff", "#a35cff", "#a35bff", "#a559ff", "#a659ff", "#a758ff", "#a857ff", "#a956ff", "#aa55ff", "#ab54ff", "#ac52ff", "#ad51ff", "#ae51ff", "#af50ff", "#b04fff", "#b14eff", "#b24dff", "#b34cff", "#b34bff", "#b549ff", "#b649ff", "#b748ff", "#b847ff", "#b946ff", "#ba45ff", "#bb44ff", "#bc42ff", "#bd41ff", "#be41ff", "#bf40ff", "#c03fff", "#c13eff", "#c23dff", "#c33cff", "#c33bff", "#c539ff", "#c638ff", "#c738ff", "#c837ff", "#c936ff", "#ca35ff", "#cb34ff", "#cc32ff", "#cd31ff", "#ce30ff", "#cf30ff", "#d02fff", "#d12eff", "#d22dff", "#d32cff", "#d32bff", "#d529ff", "#d628ff", "#d728ff", "#d827ff", "#d926ff", "#da25ff", "#db24ff", "#dc22ff", "#dd21ff", "#de20ff", "#df20ff", "#e01fff", "#e11eff", "#e21dff", "#e31cff", "#e31bff", "#e519ff", "#e618ff", "#e718ff", "#e817ff", "#e916ff", "#ea15ff", "#eb14ff", "#ec12ff", "#ed11ff", "#ee10ff", "#ef10ff", "#f00fff", "#f10eff", "#f20dff", "#f30cff", "#f30bff", "#f509ff", "#f608ff", "#f708ff", "#f807ff", "#f906ff", "#fa05ff", "#fb04ff", "#fc02ff", "#fd01ff", "#fe00ff", "#ff00ff" ], "coolwarm": [ "#3a4cc0", "#3b4dc1", "#3c4fc3", "#3e51c4", "#3f53c6", "#4054c7", "#4156c9", "#4258ca", "#435acc", "#455bcd", "#465dcf", "#475fd0", "#4860d1", "#4962d3", "#4b64d4", "#4c66d6", "#4d67d7", "#4e69d8", "#506bda", "#516cdb", "#526edc", "#5370dd", "#5571de", "#5673e0", "#5775e1", "#5876e2", "#5a78e3", "#5b79e4", "#5c7be5", "#5d7de6", "#5f7ee7", "#6080e8", "#6182ea", "#6383ea", "#6485eb", "#6586ec", "#6788ed", "#6889ee", "#698bef", "#6b8df0", "#6c8ef1", "#6d90f1", "#6f91f2", "#7093f3", "#7194f4", "#7395f4", "#7497f5", "#7598f6", "#779af6", "#789bf7", "#7a9df8", "#7b9ef8", "#7ca0f9", "#7ea1f9", "#7fa2fa", "#80a4fa", "#82a5fb", "#83a6fb", "#85a8fb", "#86a9fc", "#87aafc", "#89acfc", "#8aadfd", "#8baefd", "#8daffd", "#8eb1fd", "#90b2fe", "#91b3fe", "#92b4fe", "#94b5fe", "#95b7fe", "#97b8fe", "#98b9fe", "#99bafe", "#9bbbfe", "#9cbcfe", "#9dbdfe", "#9fbefe", "#a0bffe", "#a2c0fe", "#a3c1fe", "#a4c2fe", "#a6c3fd", "#a7c4fd", "#a8c5fd", "#aac6fd", "#abc7fc", "#acc8fc", "#aec9fc", "#afcafb", "#b0cbfb", "#b2cbfb", "#b3ccfa", "#b4cdfa", "#b6cef9", "#b7cff9", "#b8cff8", "#b9d0f8", "#bbd1f7", "#bcd1f6", "#bdd2f6", "#bed3f5", "#c0d3f5", "#c1d4f4", "#c2d4f3", "#c3d5f2", "#c5d5f2", "#c6d6f1", "#c7d6f0", "#c8d7ef", "#c9d7ee", "#cad8ee", "#ccd8ed", "#cdd9ec", "#ced9eb", "#cfd9ea", "#d0dae9", "#d1dae8", "#d2dae7", "#d3dbe6", "#d5dbe5", "#d6dbe4", "#d7dbe2", "#d8dbe1", "#d9dce0", "#dadcdf", "#dbdcde", "#dcdcdd", "#dddcdb", "#dedbda", "#dfdbd9", "#e0dad7", "#e1dad6", "#e2d9d4", "#e3d9d3", "#e4d8d1", "#e5d8d0", "#e6d7cf", "#e7d6cd", "#e7d6cc", "#e8d5ca", "#e9d4c9", "#ead3c7", "#ebd3c6", "#ecd2c4", "#ecd1c3", "#edd0c1", "#edcfc0", "#eecfbe", "#efcebc", "#efcdbb", "#f0ccb9", "#f1cbb8", "#f1cab6", "#f2c9b5", "#f2c8b3", "#f2c7b2", "#f3c6b0", "#f3c5af", "#f4c4ad", "#f4c3ab", "#f4c2aa", "#f5c1a8", "#f5c0a7", "#f5bfa5", "#f6bda4", "#f6bca2", "#f6bba0", "#f6ba9f", "#f6b99d", "#f6b79c", "#f6b69a", "#f7b598", "#f7b397", "#f7b295", "#f7b194", "#f7b092", "#f7ae91", "#f7ad8f", "#f6ab8d", "#f6aa8c", "#f6a98a", "#f6a789", "#f6a687", "#f6a486", "#f6a384", "#f5a182", "#f5a081", "#f59e7f", "#f49d7e", "#f49b7c", "#f49a7b", "#f39879", "#f39678", "#f39576", "#f29375", "#f29173", "#f19072", "#f18e70", "#f08d6f", "#f08b6d", "#ef896c", "#ee876a", "#ee8669", "#ed8467", "#ec8266", "#ec8064", "#eb7f63", "#ea7d61", "#ea7b60", "#e9795e", "#e8775d", "#e7755c", "#e6745a", "#e67259", "#e57057", "#e46e56", "#e36c54", "#e26a53", "#e16852", "#e06650", "#df644f", "#de624e", "#dd604c", "#dc5e4b", "#db5c4a", "#da5a48", "#d95847", "#d85646", "#d75444", "#d65243", "#d44f42", "#d34d40", "#d24b3f", "#d1493e", "#cf463d", "#ce443c", "#cd423a", "#cc3f39", "#ca3d38", "#c93b37", "#c83835", "#c63534", "#c53233", "#c43032", "#c22d31", "#c12a30", "#bf282e", "#be232d", "#bc1f2c", "#bb1a2b", "#b9162a", "#b81129", "#b60d28", "#b50827", "#b30326" ], "copper": [ "#000000", "#010000", "#020100", "#030201", "#040301", "#060302", "#070402", "#080503", "#090603", "#0b0704", "#0c0704", "#0d0805", "#0e0905", "#100a06", "#110a06", "#120b07", "#130c07", "#140d08", "#160e08", "#170e09", "#180f09", "#19100a", "#1b110a", "#1c110b", "#1d120b", "#1e130c", "#20140c", "#21150d", "#22150d", "#23160e", "#25170e", "#26180f", "#27180f", "#281910", "#291a10", "#2b1b11", "#2c1c11", "#2d1c12", "#2e1d12", "#301e13", "#311f13", "#322014", "#332014", "#352115", "#362215", "#372316", "#382316", "#3a2417", "#3b2517", "#3c2618", "#3d2718", "#3e2719", "#402819", "#41291a", "#422a1a", "#432a1b", "#452b1b", "#462c1c", "#472d1c", "#482e1d", "#4a2e1d", "#4b2f1e", "#4c301e", "#4d311f", "#4f311f", "#503220", "#513320", "#523421", "#533521", "#553522", "#563622", "#573723", "#583823", "#5a3924", "#5b3924", "#5c3a25", "#5d3b25", "#5f3c26", "#603c26", "#613d27", "#623e27", "#643f28", "#654028", "#664029", "#674129", "#68422a", "#6a432a", "#6b432b", "#6c442b", "#6d452c", "#6f462c", "#70472d", "#71472d", "#72482e", "#74492e", "#754a2f", "#764a2f", "#774b30", "#794c30", "#7a4d31", "#7b4e31", "#7c4e32", "#7d4f32", "#7f5033", "#805133", "#815234", "#825234", "#845335", "#855435", "#865536", "#875536", "#895637", "#8a5737", "#8b5838", "#8c5938", "#8e5939", "#8f5a39", "#905b3a", "#915c3a", "#925c3b", "#945d3b", "#955e3c", "#965f3c", "#97603d", "#99603d", "#9a613e", "#9b623e", "#9c633f", "#9e633f", "#9f6440", "#a06540", "#a16641", "#a36741", "#a46742", "#a56842", "#a66943", "#a76a43", "#a96b44", "#aa6b44", "#ab6c45", "#ac6d45", "#ae6e46", "#af6e46", "#b06f47", "#b17047", "#b37148", "#b47248", "#b57249", "#b67349", "#b8744a", "#b9754a", "#ba754b", "#bb764b", "#bc774c", "#be784c", "#bf794d", "#c0794d", "#c17a4e", "#c37b4e", "#c47c4f", "#c57c4f", "#c67d50", "#c87e50", "#c97f51", "#ca8051", "#cb8052", "#cd8152", "#ce8253", "#cf8353", "#d08454", "#d18454", "#d38555", "#d48655", "#d58756", "#d68756", "#d88857", "#d98957", "#da8a58", "#db8b58", "#dd8b59", "#de8c59", "#df8d5a", "#e08e5a", "#e28e5b", "#e38f5b", "#e4905c", "#e5915c", "#e6925d", "#e8925d", "#e9935e", "#ea945e", "#eb955f", "#ed955f", "#ee9660", "#ef9760", "#f09861", "#f29961", "#f39962", "#f49a62", "#f59b63", "#f79c63", "#f89d63", "#f99d64", "#fa9e64", "#fb9f65", "#fda065", "#fea066", "#ffa166", "#ffa267", "#ffa367", "#ffa468", "#ffa468", "#ffa569", "#ffa669", "#ffa76a", "#ffa76a", "#ffa86b", "#ffa96b", "#ffaa6c", "#ffab6c", "#ffab6d", "#ffac6d", "#ffad6e", "#ffae6e", "#ffae6f", "#ffaf6f", "#ffb070", "#ffb170", "#ffb271", "#ffb271", "#ffb372", "#ffb472", "#ffb573", "#ffb673", "#ffb674", "#ffb774", "#ffb875", "#ffb975", "#ffb976", "#ffba76", "#ffbb77", "#ffbc77", "#ffbd78", "#ffbd78", "#ffbe79", "#ffbf79", "#ffc07a", "#ffc07a", "#ffc17b", "#ffc27b", "#ffc37c", "#ffc47c", "#ffc47d", "#ffc57d", "#ffc67e", "#ffc77e" ], "cubehelix": [ "#000000", "#010001", "#030103", "#040104", "#060206", "#080208", "#090309", "#0a040b", "#0c040d", "#0d050f", "#0e0611", "#0f0613", "#110715", "#120817", "#130919", "#140a1b", "#140b1d", "#150b1f", "#160c21", "#170d23", "#170e25", "#180f27", "#181129", "#19122b", "#19132d", "#19142f", "#1a1530", "#1a1632", "#1a1834", "#1a1936", "#1a1a38", "#1a1c39", "#1a1d3b", "#1a1f3c", "#1a203e", "#1a223f", "#1a2341", "#192542", "#192643", "#192845", "#192946", "#182b47", "#182d48", "#182e49", "#17304a", "#17324a", "#17344b", "#17354c", "#16374c", "#16394d", "#163a4d", "#153c4d", "#153e4e", "#15404e", "#15424e", "#15434e", "#15454e", "#14474e", "#14494e", "#144a4d", "#154c4d", "#154e4d", "#154f4c", "#15514c", "#15534b", "#16544b", "#16564a", "#165849", "#175949", "#175b48", "#185c47", "#195e46", "#1a5f45", "#1b6144", "#1b6243", "#1c6342", "#1e6542", "#1f6641", "#206740", "#21683f", "#236a3d", "#246b3c", "#266c3b", "#276d3a", "#296e3a", "#2b6f39", "#2d7038", "#2f7137", "#317236", "#337235", "#357334", "#377433", "#397433", "#3c7532", "#3e7631", "#417631", "#437730", "#467730", "#48782f", "#4b782f", "#4e782f", "#51792e", "#53792e", "#56792e", "#59792e", "#5c7a2e", "#5f7a2f", "#627a2f", "#657a2f", "#687a30", "#6b7a30", "#6e7a31", "#717a32", "#747a32", "#787a33", "#7b7a34", "#7e7a35", "#817a37", "#847a38", "#877a39", "#8a793b", "#8d793c", "#90793e", "#937940", "#967941", "#997943", "#9b7945", "#9e7947", "#a1794a", "#a4784c", "#a6784e", "#a97851", "#ab7853", "#ae7856", "#b07858", "#b2785b", "#b5785e", "#b77860", "#b97863", "#bb7966", "#bd7969", "#bf796c", "#c1796f", "#c27972", "#c47a75", "#c67a78", "#c77a7c", "#c97b7f", "#ca7b82", "#cb7c85", "#cc7c88", "#cd7d8c", "#ce7d8f", "#cf7e92", "#d07f95", "#d17f99", "#d1809c", "#d2819f", "#d382a2", "#d383a5", "#d383a9", "#d484ac", "#d485af", "#d487b2", "#d488b5", "#d489b8", "#d48aba", "#d48bbd", "#d48cc0", "#d38ec3", "#d38fc5", "#d390c8", "#d292cb", "#d293cd", "#d295cf", "#d196d2", "#d098d4", "#d09ad6", "#cf9bd8", "#cf9dda", "#ce9edc", "#cda0de", "#cda2e0", "#cca4e2", "#cba5e3", "#cba7e5", "#caa9e6", "#c9abe7", "#c9ace9", "#c8aeea", "#c7b0eb", "#c7b2ec", "#c6b4ed", "#c5b6ee", "#c5b7ef", "#c4b9ef", "#c4bbf0", "#c3bdf1", "#c3bff1", "#c2c1f2", "#c2c2f2", "#c2c4f2", "#c1c6f3", "#c1c8f3", "#c1caf3", "#c1cbf3", "#c1cdf3", "#c1cff3", "#c1d0f3", "#c1d2f3", "#c1d4f3", "#c1d5f3", "#c2d7f2", "#c2d8f2", "#c3daf2", "#c3dbf2", "#c4ddf1", "#c4def1", "#c5e0f1", "#c6e1f1", "#c7e2f0", "#c8e4f0", "#c8e5f0", "#cae6ef", "#cbe7ef", "#cce8ef", "#cde9ef", "#ceebef", "#d0ecee", "#d1edee", "#d2eeee", "#d4efee", "#d5f0ee", "#d7f0ee", "#d9f1ee", "#daf2ee", "#dcf3ef", "#def4ef", "#dff4ef", "#e1f5f0", "#e3f6f0", "#e5f7f0", "#e7f7f1", "#e8f8f2", "#eaf8f2", "#ecf9f3", "#eefaf4", "#f0faf5", "#f2fbf6", "#f4fbf7", "#f5fcf8", "#f7fcf9", "#f9fdfa", "#fbfdfc", "#fdfefd", "#ffffff" ], "flag": [ "#ff0000", "#ff6035", "#ffb27d", "#ffeac6", "#fffeff", "#ccedff", "#84b9ff", "#3c69ff", "#0009ff", "#0000cf", "#000088", "#00003f", "#000000", "#2b0000", "#730000", "#bc0000", "#fc0000", "#ff4e28", "#ffa46f", "#ffe2b8", "#fffdf9", "#d9f3ff", "#92c5ff", "#497aff", "#081cff", "#0000dc", "#000096", "#00004c", "#00000a", "#1f0000", "#650000", "#ae0000", "#f10000", "#ff3c1c", "#ff9561", "#ffd8ab", "#fffbee", "#e5f8ff", "#a0d1ff", "#578aff", "#132eff", "#0000e8", "#0000a4", "#00005a", "#000016", "#130000", "#570000", "#a00000", "#e50000", "#ff2a10", "#ff8653", "#ffce9d", "#fff7e2", "#f1fcff", "#aedbff", "#6599ff", "#1f41ff", "#0000f4", "#0000b2", "#000068", "#000022", "#080000", "#490000", "#920000", "#d90000", "#ff1705", "#ff7546", "#ffc28f", "#fff2d6", "#fcfeff", "#bce4ff", "#73a8ff", "#2b53ff", "#0000ff", "#0000bf", "#000076", "#00002f", "#000000", "#3c0000", "#840000", "#cc0000", "#ff0400", "#ff6438", "#ffb581", "#ffecc9", "#ffffff", "#c9ecff", "#81b5ff", "#3864ff", "#0004ff", "#0000cc", "#000084", "#00003c", "#000000", "#2f0000", "#760000", "#bf0000", "#ff0000", "#ff532b", "#ffa873", "#ffe4bc", "#fffefc", "#d6f2ff", "#8fc2ff", "#4675ff", "#0517ff", "#0000d9", "#000092", "#000049", "#000008", "#220000", "#680000", "#b20000", "#f40000", "#ff411f", "#ff9965", "#ffdbae", "#fffcf1", "#e2f7ff", "#9dceff", "#5386ff", "#102aff", "#0000e5", "#0000a0", "#000057", "#000013", "#160000", "#5a0000", "#a40000", "#e80000", "#ff2e13", "#ff8a57", "#ffd1a0", "#fff8e5", "#eefbff", "#abd8ff", "#6195ff", "#1c3cff", "#0000f1", "#0000ae", "#000065", "#00001f", "#0a0000", "#4c0000", "#960000", "#dc0000", "#ff1c08", "#ff7a49", "#ffc592", "#fff3d9", "#f9fdff", "#b8e2ff", "#6fa4ff", "#284eff", "#0000fc", "#0000bc", "#000073", "#00002b", "#000000", "#3f0000", "#880000", "#cf0000", "#ff0900", "#ff693c", "#ffb984", "#ffedcc", "#fffeff", "#c6eaff", "#7db2ff", "#3560ff", "#0000ff", "#0000c9", "#000081", "#000038", "#000000", "#320000", "#7a0000", "#c20000", "#ff0000", "#ff572f", "#ffab76", "#ffe6bf", "#fffeff", "#d3f1ff", "#8bbfff", "#4271ff", "#0212ff", "#0000d6", "#00008f", "#000046", "#000005", "#250000", "#6c0000", "#b50000", "#f60000", "#ff4522", "#ff9d68", "#ffddb2", "#fffcf4", "#dff6ff", "#99cbff", "#5082ff", "#0d25ff", "#0000e2", "#00009d", "#000053", "#000010", "#190000", "#5e0000", "#a70000", "#eb0000", "#ff3316", "#ff8e5a", "#ffd3a4", "#fff9e8", "#ebfaff", "#a7d6ff", "#5e92ff", "#1938ff", "#0000ee", "#0000ab", "#000061", "#00001c", "#0d0000", "#500000", "#990000", "#df0000", "#ff200a", "#ff7e4c", "#ffc896", "#fff5dc", "#f6fdff", "#b5dfff", "#6ca1ff", "#254aff", "#0000f9", "#0000b8", "#00006f", "#000028", "#020000", "#420000", "#8b0000", "#d30000", "#ff0e00", "#ff6d3f", "#ffbc88", "#ffefcf", "#fffeff", "#c2e8ff", "#7aafff", "#325cff", "#0000ff", "#0000c6", "#00007d", "#000035", "#000000" ], "gist_earth": [ "#000000", "#00002b", "#010038", "#010043", "#02004e", "#030058", "#030063", "#04006e", "#050273", "#050474", "#060674", "#070974", "#070b74", "#080d74", "#091075", "#091275", "#0a1475", "#0b1675", "#0b1975", "#0c1b75", "#0d1d76", "#0d2076", "#0e2276", "#0f2476", "#0f2776", "#102977", "#112b77", "#112d77", "#123077", "#133277", "#133477", "#143678", "#153878", "#153a78", "#163c78", "#173e78", "#174079", "#184279", "#194579", "#194779", "#1a4979", "#1b4b79", "#1b4d7a", "#1c4f7a", "#1d517a", "#1d537a", "#1e547a", "#1f567b", "#1f587b", "#205a7b", "#215c7b", "#215e7b", "#22607b", "#23617c", "#23637c", "#24657c", "#25667c", "#25687c", "#26697d", "#276b7d", "#276d7d", "#286e7d", "#29707d", "#29717d", "#2a737e", "#2b747e", "#2b767e", "#2c787e", "#2d797e", "#2d7b7f", "#2e7c7f", "#2f7e7f", "#2f7f7f", "#30807e", "#30817d", "#31817b", "#31827a", "#328279", "#328378", "#338477", "#338475", "#348574", "#348573", "#358672", "#358670", "#36876f", "#36886e", "#37886d", "#37896c", "#38896a", "#388a69", "#388a68", "#398b67", "#398c65", "#3a8c64", "#3a8d63", "#3b8d62", "#3b8e61", "#3c8e5f", "#3c8f5e", "#3d905d", "#3d905c", "#3e915a", "#3e9159", "#3f9258", "#3f9357", "#409355", "#409454", "#409453", "#419552", "#419551", "#42964f", "#42974e", "#43974d", "#43984c", "#44984a", "#449949", "#459948", "#479a47", "#499b46", "#4b9b46", "#4e9c47", "#509c47", "#529d48", "#549d48", "#579e49", "#599f4a", "#5b9f4a", "#5da04b", "#5fa04b", "#62a14c", "#64a14d", "#66a24d", "#68a34e", "#6ba34e", "#6da34f", "#6fa44f", "#71a450", "#73a551", "#76a551", "#78a652", "#79a652", "#7ba752", "#7da752", "#7ea753", "#80a853", "#82a853", "#83a954", "#85a954", "#87aa54", "#88aa55", "#8aab55", "#8cab55", "#8dab56", "#8fac56", "#91ac56", "#92ad57", "#94ad57", "#96ae57", "#97ae58", "#99ae58", "#9aaf58", "#9caf58", "#9eb059", "#9fb059", "#a1b159", "#a3b15a", "#a4b25a", "#a6b25a", "#a8b25b", "#a9b35b", "#abb35b", "#adb45c", "#aeb45c", "#b0b55c", "#b2b55d", "#b3b55d", "#b5b65d", "#b6b65e", "#b7b55e", "#b7b55e", "#b8b45f", "#b8b35f", "#b9b25f", "#b9b15f", "#b9b060", "#baaf60", "#baaf60", "#bbae61", "#bbad61", "#bcac61", "#bcab62", "#bcaa62", "#bda962", "#bda963", "#bea863", "#bea763", "#bea664", "#bfa564", "#bfa464", "#c0a365", "#c0a367", "#c1a369", "#c2a36c", "#c3a46e", "#c5a471", "#c6a573", "#c7a676", "#c8a678", "#c9a77b", "#caa87d", "#cba97f", "#ccaa82", "#ceab84", "#cfac87", "#d0ad89", "#d1ad8c", "#d2ae8e", "#d3af91", "#d4b093", "#d5b196", "#d6b298", "#d8b39a", "#d9b59d", "#dab69f", "#dbb7a2", "#dcb9a4", "#ddbaa7", "#debca9", "#dfbdac", "#e1bfaf", "#e2c1b2", "#e3c3b5", "#e4c5b8", "#e5c7bb", "#e6c9be", "#e7cbc1", "#e8cdc4", "#e9cfc7", "#ebd1ca", "#ecd3cd", "#edd5d0", "#eed7d3", "#efd9d6", "#f0dcd9", "#f1dedc", "#f2e0df", "#f4e3e2", "#f5e6e5", "#f6e9e8", "#f7eceb", "#f8efee", "#f9f2f1", "#faf5f4", "#fbf8f7", "#fdfafa" ], "gist_gray": [ "#000000", "#010101", "#020202", "#030303", "#040404", "#050505", "#060606", "#070707", "#080808", "#090909", "#0a0a0a", "#0b0b0b", "#0c0c0c", "#0d0d0d", "#0e0e0e", "#0f0f0f", "#101010", "#111111", "#121212", "#131313", "#141414", "#151515", "#161616", "#171717", "#181818", "#191919", "#1a1a1a", "#1b1b1b", "#1c1c1c", "#1d1d1d", "#1e1e1e", "#1f1f1f", "#202020", "#202020", "#222222", "#232323", "#242424", "#242424", "#262626", "#272727", "#282828", "#282828", "#2a2a2a", "#2b2b2b", "#2c2c2c", "#2c2c2c", "#2e2e2e", "#2f2f2f", "#303030", "#303030", "#323232", "#333333", "#343434", "#343434", "#363636", "#373737", "#383838", "#383838", "#3a3a3a", "#3b3b3b", "#3c3c3c", "#3c3c3c", "#3e3e3e", "#3f3f3f", "#404040", "#414141", "#414141", "#434343", "#444444", "#454545", "#464646", "#474747", "#484848", "#494949", "#494949", "#4b4b4b", "#4c4c4c", "#4d4d4d", "#4e4e4e", "#4f4f4f", "#505050", "#515151", "#515151", "#535353", "#545454", "#555555", "#565656", "#575757", "#585858", "#595959", "#595959", "#5b5b5b", "#5c5c5c", "#5d5d5d", "#5e5e5e", "#5f5f5f", "#606060", "#616161", "#616161", "#636363", "#646464", "#656565", "#666666", "#676767", "#686868", "#696969", "#696969", "#6b6b6b", "#6c6c6c", "#6d6d6d", "#6e6e6e", "#6f6f6f", "#707070", "#717171", "#717171", "#737373", "#747474", "#757575", "#767676", "#777777", "#787878", "#797979", "#797979", "#7b7b7b", "#7c7c7c", "#7d7d7d", "#7e7e7e", "#7f7f7f", "#808080", "#818181", "#828282", "#838383", "#838383", "#858585", "#868686", "#878787", "#888888", "#898989", "#8a8a8a", "#8b8b8b", "#8c8c8c", "#8d8d8d", "#8e8e8e", "#8f8f8f", "#909090", "#919191", "#929292", "#939393", "#939393", "#959595", "#969696", "#979797", "#989898", "#999999", "#9a9a9a", "#9b9b9b", "#9c9c9c", "#9d9d9d", "#9e9e9e", "#9f9f9f", "#a0a0a0", "#a1a1a1", "#a2a2a2", "#a3a3a3", "#a3a3a3", "#a5a5a5", "#a6a6a6", "#a7a7a7", "#a8a8a8", "#a9a9a9", "#aaaaaa", "#ababab", "#acacac", "#adadad", "#aeaeae", "#afafaf", "#b0b0b0", "#b1b1b1", "#b2b2b2", "#b3b3b3", "#b3b3b3", "#b5b5b5", "#b6b6b6", "#b7b7b7", "#b8b8b8", "#b9b9b9", "#bababa", "#bbbbbb", "#bcbcbc", "#bdbdbd", "#bebebe", "#bfbfbf", "#c0c0c0", "#c1c1c1", "#c2c2c2", "#c3c3c3", "#c3c3c3", "#c5c5c5", "#c6c6c6", "#c7c7c7", "#c8c8c8", "#c9c9c9", "#cacaca", "#cbcbcb", "#cccccc", "#cdcdcd", "#cecece", "#cfcfcf", "#d0d0d0", "#d1d1d1", "#d2d2d2", "#d3d3d3", "#d3d3d3", "#d5d5d5", "#d6d6d6", "#d7d7d7", "#d8d8d8", "#d9d9d9", "#dadada", "#dbdbdb", "#dcdcdc", "#dddddd", "#dedede", "#dfdfdf", "#e0e0e0", "#e1e1e1", "#e2e2e2", "#e3e3e3", "#e3e3e3", "#e5e5e5", "#e6e6e6", "#e7e7e7", "#e8e8e8", "#e9e9e9", "#eaeaea", "#ebebeb", "#ececec", "#ededed", "#eeeeee", "#efefef", "#f0f0f0", "#f1f1f1", "#f2f2f2", "#f3f3f3", "#f3f3f3", "#f5f5f5", "#f6f6f6", "#f7f7f7", "#f8f8f8", "#f9f9f9", "#fafafa", "#fbfbfb", "#fcfcfc", "#fdfdfd", "#fefefe", "#ffffff" ], "gist_heat": [ "#000000", "#010000", "#030000", "#040000", "#060000", "#070000", "#090000", "#0a0000", "#0c0000", "#0d0000", "#0f0000", "#100000", "#120000", "#130000", "#150000", "#160000", "#180000", "#190000", "#1b0000", "#1c0000", "#1e0000", "#1f0000", "#200000", "#220000", "#240000", "#250000", "#270000", "#280000", "#2a0000", "#2b0000", "#2c0000", "#2e0000", "#300000", "#310000", "#330000", "#340000", "#360000", "#370000", "#380000", "#3a0000", "#3c0000", "#3d0000", "#3f0000", "#400000", "#410000", "#430000", "#450000", "#460000", "#480000", "#490000", "#4b0000", "#4c0000", "#4e0000", "#4f0000", "#510000", "#520000", "#540000", "#550000", "#570000", "#580000", "#590000", "#5b0000", "#5d0000", "#5e0000", "#600000", "#610000", "#620000", "#640000", "#660000", "#670000", "#690000", "#6a0000", "#6c0000", "#6d0000", "#6e0000", "#700000", "#710000", "#730000", "#750000", "#760000", "#780000", "#790000", "#7a0000", "#7c0000", "#7e0000", "#7f0000", "#810000", "#820000", "#830000", "#850000", "#860000", "#880000", "#8a0000", "#8b0000", "#8d0000", "#8e0000", "#900000", "#910000", "#930000", "#940000", "#960000", "#970000", "#990000", "#9a0000", "#9c0000", "#9d0000", "#9f0000", "#a00000", "#a20000", "#a30000", "#a50000", "#a60000", "#a80000", "#a90000", "#ab0000", "#ac0000", "#ae0000", "#af0000", "#b10000", "#b20000", "#b30000", "#b50000", "#b60000", "#b80000", "#ba0000", "#bb0000", "#bd0000", "#be0000", "#c00000", "#c10200", "#c30400", "#c40600", "#c50800", "#c70b00", "#c90d00", "#ca0f00", "#cc1000", "#cd1200", "#cf1400", "#d01600", "#d21900", "#d31b00", "#d51d00", "#d61f00", "#d82000", "#d92200", "#db2400", "#dc2600", "#dd2800", "#df2b00", "#e12d00", "#e22f00", "#e33000", "#e53200", "#e63400", "#e83600", "#ea3900", "#eb3b00", "#ed3d00", "#ee3f00", "#f04100", "#f14200", "#f34400", "#f44600", "#f54800", "#f74b00", "#f94d00", "#fa4f00", "#fc5100", "#fd5200", "#ff5400", "#ff5600", "#ff5900", "#ff5b00", "#ff5d00", "#ff5f00", "#ff6100", "#ff6200", "#ff6400", "#ff6600", "#ff6800", "#ff6b00", "#ff6d00", "#ff6f00", "#ff7100", "#ff7200", "#ff7400", "#ff7600", "#ff7900", "#ff7b00", "#ff7d00", "#ff7f00", "#ff8102", "#ff8306", "#ff840a", "#ff860e", "#ff8812", "#ff8b17", "#ff8d1b", "#ff8f1f", "#ff9122", "#ff9326", "#ff942a", "#ff962e", "#ff9933", "#ff9b37", "#ff9d3b", "#ff9f3f", "#ffa142", "#ffa346", "#ffa44a", "#ffa64e", "#ffa852", "#ffab57", "#ffad5b", "#ffaf5f", "#ffb162", "#ffb366", "#ffb46a", "#ffb66e", "#ffb973", "#ffbb77", "#ffbd7b", "#ffbf7f", "#ffc183", "#ffc386", "#ffc48a", "#ffc68e", "#ffc892", "#ffcb97", "#ffcd9b", "#ffcf9f", "#ffd1a3", "#ffd3a6", "#ffd4aa", "#ffd6ae", "#ffd9b3", "#ffdbb7", "#ffddbb", "#ffdfbf", "#ffe1c3", "#ffe3c6", "#ffe4ca", "#ffe6ce", "#ffe8d2", "#ffebd7", "#ffeddb", "#ffefdf", "#fff1e3", "#fff3e6", "#fff4ea", "#fff6ee", "#fff9f3", "#fffbf7", "#fffdfb", "#ffffff" ], "gist_ncar": [ "#000080", "#000776", "#000e6d", "#001563", "#001d5a", "#002450", "#002b47", "#00333e", "#003a34", "#00412b", "#004821", "#005018", "#00570f", "#005e05", "#005816", "#005126", "#004a37", "#004348", "#003d58", "#003669", "#002f79", "#00288a", "#00219b", "#001bab", "#0014bc", "#000dcd", "#0006dd", "#0000ee", "#000eff", "#001cff", "#002aff", "#0038ff", "#0046ff", "#0054ff", "#0062ff", "#0070ff", "#007fff", "#008dff", "#009bff", "#00a9ff", "#00b7ff", "#00c0ff", "#00c5ff", "#00caff", "#00ceff", "#00d2ff", "#00d7ff", "#00dbff", "#00e0ff", "#00e4ff", "#00e8ff", "#00edff", "#00f1fe", "#00f6f8", "#00faf1", "#00feeb", "#00fee4", "#00fede", "#00fdd7", "#00fdd1", "#00fcca", "#00fcc3", "#00fbbd", "#00fbb6", "#00fab0", "#00faa9", "#00faa3", "#00fa9c", "#00fa92", "#00fa87", "#00fa7d", "#00fa72", "#00fb68", "#00fb5d", "#00fc53", "#00fc49", "#00fc3e", "#00fd34", "#00fd29", "#00fe1f", "#06fe14", "#0cfe0a", "#13fb00", "#19f700", "#1ff300", "#26ef00", "#2cec00", "#32e800", "#39e400", "#3fe000", "#46dd00", "#4cd900", "#52d500", "#59d100", "#5fce00", "#65d100", "#67d400", "#69d700", "#6bdb00", "#6dde00", "#6fe100", "#71e400", "#73e800", "#75eb00", "#77ee00", "#79f100", "#7bf500", "#7df803", "#7ffb07", "#84fe0b", "#88ff0f", "#8dff13", "#91ff17", "#96ff1b", "#9aff1f", "#9fff23", "#a4ff27", "#a8ff2b", "#adff2f", "#b1ff33", "#b6ff37", "#baff3b", "#bfff37", "#c3ff33", "#c8ff2f", "#ccff2b", "#d1ff27", "#d6ff23", "#daff1f", "#dfff1b", "#e3ff17", "#e8ff13", "#ecff0f", "#f1ff0b", "#f5fc07", "#fafa03", "#fff700", "#fff500", "#fff200", "#fff000", "#ffed00", "#ffeb00", "#ffe800", "#ffe600", "#ffe300", "#ffe100", "#ffde00", "#ffdc00", "#ffda00", "#ffd701", "#ffd502", "#ffd203", "#ffd004", "#ffcd05", "#ffcb06", "#ffc807", "#ffc608", "#ffc309", "#ffc10a", "#ffbe0b", "#ffbc0c", "#ffb90d", "#ffb10d", "#ffa90c", "#ffa10b", "#ff990a", "#ff9109", "#ff8808", "#ff8007", "#ff7806", "#ff7005", "#ff6804", "#ff5f03", "#ff5702", "#ff4f01", "#ff4700", "#ff4200", "#ff3d00", "#ff3900", "#ff3400", "#ff2f00", "#ff2a00", "#ff2600", "#ff2100", "#ff1c00", "#ff1700", "#ff1300", "#ff0e00", "#ff0900", "#ff0411", "#ff0023", "#ff0035", "#ff0046", "#ff0058", "#ff006a", "#ff007b", "#ff008d", "#ff009f", "#ff00b1", "#ff00c2", "#ff00d4", "#ff00e6", "#ff00f8", "#f803fb", "#f106ff", "#ea0aff", "#e30dff", "#dc11ff", "#d514ff", "#ce18ff", "#c71bff", "#c11eff", "#ba22ff", "#b325ff", "#ac29ff", "#a52cfe", "#9e32fd", "#a438fc", "#aa3efb", "#b044fa", "#b64af8", "#bc50f7", "#c256f6", "#c75cf5", "#cd61f4", "#d367f2", "#d96df1", "#df73f0", "#e579ef", "#eb7fee", "#ec84ee", "#ec88ef", "#ed8df0", "#ee92f0", "#ef96f1", "#ef9bf1", "#f09ff2", "#f1a4f3", "#f1a9f3", "#f2adf4", "#f3b2f4", "#f4b7f5", "#f4bbf6", "#f5c0f6", "#f6c5f7", "#f6c9f7", "#f7cef8", "#f8d2f9", "#f9d7f9", "#f9dcfa", "#fae0fa", "#fbe5fb", "#fbeafc", "#fceefc", "#fdf3fd", "#fef7fe" ], "gist_stern": [ "#000000", "#120102", "#240204", "#360306", "#490408", "#5b050a", "#6d060c", "#7f070e", "#920810", "#a40912", "#b60a14", "#c90b16", "#db0c18", "#ed0d1a", "#fe0e1c", "#f90f1e", "#f41020", "#ef1122", "#ea1224", "#e51326", "#e01428", "#db152a", "#d6162c", "#d1172e", "#cc1830", "#c71932", "#c21a34", "#bd1b36", "#b81c38", "#b41d3a", "#af1e3c", "#aa1f3e", "#a52040", "#a02041", "#9b2244", "#962346", "#912448", "#8c2449", "#87264c", "#82274e", "#7d2850", "#782851", "#732a54", "#6e2b56", "#692c58", "#642c59", "#5f2e5c", "#5a2f5e", "#553060", "#503061", "#4b3264", "#463366", "#413468", "#3c3469", "#37366c", "#32376e", "#2d3870", "#283871", "#233a74", "#1e3b76", "#193c78", "#143c79", "#0f3e7c", "#0a3f7e", "#404080", "#414182", "#414183", "#434386", "#444488", "#45458a", "#46468c", "#47478e", "#484890", "#494992", "#494993", "#4b4b96", "#4c4c98", "#4d4d9a", "#4e4e9c", "#4f4f9e", "#5050a0", "#5151a2", "#5151a3", "#5353a6", "#5454a8", "#5555aa", "#5656ac", "#5757ae", "#5858b0", "#5959b2", "#5959b3", "#5b5bb6", "#5c5cb8", "#5d5dba", "#5e5ebc", "#5f5fbe", "#6060c0", "#6161c2", "#6161c3", "#6363c6", "#6464c8", "#6565ca", "#6666cc", "#6767ce", "#6868d0", "#6969d2", "#6969d3", "#6b6bd6", "#6c6cd8", "#6d6dda", "#6e6edc", "#6f6fde", "#7070e0", "#7171e2", "#7171e3", "#7373e6", "#7474e8", "#7575ea", "#7676ec", "#7777ee", "#7878f0", "#7979f2", "#7979f3", "#7b7bf6", "#7c7cf8", "#7d7dfa", "#7e7efc", "#7f7ffe", "#8080fc", "#8181f8", "#8282f4", "#8383f0", "#8383eb", "#8485e7", "#8686e3", "#8787df", "#8888da", "#8989d6", "#8a8ad2", "#8b8bce", "#8c8cc9", "#8d8dc5", "#8e8ec1", "#8f8fbd", "#9090b8", "#9191b4", "#9292b0", "#9393ac", "#9393a7", "#9595a3", "#96969f", "#97979a", "#989896", "#999992", "#9a9a8e", "#9b9b89", "#9c9c85", "#9d9d81", "#9e9e7d", "#9f9f78", "#a0a074", "#a1a170", "#a2a26c", "#a3a367", "#a3a363", "#a5a55f", "#a6a65b", "#a7a756", "#a8a852", "#a9a94e", "#aaaa4a", "#abab45", "#acac41", "#adad3d", "#aeae39", "#afaf34", "#b0b030", "#b1b12c", "#b2b228", "#b3b323", "#b3b31f", "#b5b51b", "#b6b617", "#b7b712", "#b8b80e", "#b9b90a", "#baba06", "#bbbb01", "#bcbc02", "#bdbd05", "#bebe09", "#bfbf0d", "#c0c011", "#c1c115", "#c2c218", "#c3c31c", "#c3c320", "#c4c524", "#c5c627", "#c7c72b", "#c8c82f", "#c9c933", "#caca37", "#cbcb3a", "#cbcc3e", "#cdcd42", "#cece46", "#cfcf49", "#d0d04d", "#d1d151", "#d2d255", "#d3d358", "#d3d35c", "#d5d560", "#d6d664", "#d7d768", "#d8d86b", "#d9d96f", "#dada73", "#dbdb77", "#dcdc7a", "#dddd7e", "#dede82", "#dfdf86", "#e0e08a", "#e1e18d", "#e2e291", "#e3e395", "#e3e399", "#e5e59c", "#e6e6a0", "#e7e7a4", "#e8e8a8", "#e9e9ab", "#eaeaaf", "#ebebb3", "#ececb7", "#ededbb", "#eeeebe", "#efefc2", "#f0f0c6", "#f1f1ca", "#f2f2cd", "#f3f3d1", "#f3f3d5", "#f4f5d9", "#f5f6dd", "#f7f7e0", "#f8f8e4", "#f9f9e8", "#fafaec", "#fbfbef", "#fbfcf3", "#fdfdf7", "#fefefb", "#ffffff" ], "gist_yarg": [ "#ffffff", "#fefefe", "#fdfdfd", "#fcfcfc", "#fbfbfb", "#fafafa", "#f9f9f9", "#f8f8f8", "#f7f7f7", "#f6f6f6", "#f5f5f5", "#f4f4f4", "#f3f3f3", "#f2f2f2", "#f1f1f1", "#f0f0f0", "#efefef", "#eeeeee", "#ededed", "#ececec", "#ebebeb", "#eaeaea", "#e9e9e9", "#e8e8e8", "#e7e7e7", "#e6e6e6", "#e5e5e5", "#e4e4e4", "#e3e3e3", "#e2e2e2", "#e1e1e1", "#e0e0e0", "#dfdfdf", "#dedede", "#dddddd", "#dcdcdc", "#dbdbdb", "#dadada", "#d9d9d9", "#d8d8d8", "#d7d7d7", "#d6d6d6", "#d5d5d5", "#d3d3d3", "#d3d3d3", "#d2d2d2", "#d1d1d1", "#d0d0d0", "#cfcfcf", "#cecece", "#cdcdcd", "#cccccc", "#cbcbcb", "#cacaca", "#c9c9c9", "#c8c8c8", "#c7c7c7", "#c6c6c6", "#c5c5c5", "#c3c3c3", "#c3c3c3", "#c2c2c2", "#c1c1c1", "#c0c0c0", "#bfbfbf", "#bebebe", "#bdbdbd", "#bcbcbc", "#bbbbbb", "#bababa", "#b9b9b9", "#b8b8b8", "#b7b7b7", "#b6b6b6", "#b5b5b5", "#b3b3b3", "#b3b3b3", "#b2b2b2", "#b1b1b1", "#b0b0b0", "#afafaf", "#aeaeae", "#adadad", "#acacac", "#ababab", "#aaaaaa", "#a9a9a9", "#a8a8a8", "#a7a7a7", "#a6a6a6", "#a5a5a5", "#a3a3a3", "#a3a3a3", "#a2a2a2", "#a1a1a1", "#a0a0a0", "#9f9f9f", "#9e9e9e", "#9d9d9d", "#9c9c9c", "#9b9b9b", "#9a9a9a", "#999999", "#989898", "#979797", "#969696", "#959595", "#939393", "#939393", "#929292", "#919191", "#909090", "#8f8f8f", "#8e8e8e", "#8d8d8d", "#8c8c8c", "#8b8b8b", "#8a8a8a", "#898989", "#888888", "#878787", "#868686", "#858585", "#838383", "#838383", "#828282", "#818181", "#808080", "#7f7f7f", "#7e7e7e", "#7d7d7d", "#7c7c7c", "#7b7b7b", "#797979", "#797979", "#787878", "#777777", "#767676", "#757575", "#747474", "#727272", "#717171", "#717171", "#707070", "#6f6f6f", "#6e6e6e", "#6d6d6d", "#6c6c6c", "#6b6b6b", "#696969", "#696969", "#686868", "#676767", "#666666", "#656565", "#646464", "#626262", "#616161", "#616161", "#606060", "#5f5f5f", "#5e5e5e", "#5d5d5d", "#5c5c5c", "#5b5b5b", "#595959", "#595959", "#585858", "#575757", "#565656", "#555555", "#545454", "#525252", "#515151", "#515151", "#505050", "#4f4f4f", "#4e4e4e", "#4d4d4d", "#4c4c4c", "#4b4b4b", "#494949", "#494949", "#484848", "#474747", "#464646", "#454545", "#444444", "#424242", "#414141", "#414141", "#404040", "#3f3f3f", "#3e3e3e", "#3d3d3d", "#3c3c3c", "#3b3b3b", "#393939", "#383838", "#383838", "#373737", "#363636", "#353535", "#343434", "#323232", "#313131", "#303030", "#303030", "#2f2f2f", "#2e2e2e", "#2d2d2d", "#2c2c2c", "#2b2b2b", "#292929", "#282828", "#282828", "#272727", "#262626", "#252525", "#242424", "#222222", "#212121", "#202020", "#202020", "#1f1f1f", "#1e1e1e", "#1d1d1d", "#1c1c1c", "#1b1b1b", "#191919", "#181818", "#181818", "#171717", "#161616", "#151515", "#141414", "#121212", "#111111", "#101010", "#101010", "#0f0f0f", "#0e0e0e", "#0d0d0d", "#0c0c0c", "#0b0b0b", "#090909", "#080808", "#080808", "#070707", "#060606", "#050505", "#040404", "#020202", "#010101", "#000000", "#000000" ], "gnuplot": [ "#000000", "#0f0006", "#16000c", "#1b0012", "#1f0019", "#23001f", "#270025", "#2a002b", "#2d0031", "#2f0038", "#32003e", "#340044", "#37004a", "#390050", "#3b0056", "#3d005c", "#3f0061", "#410067", "#43006d", "#450073", "#470078", "#49007e", "#4a0083", "#4c0088", "#4e008e", "#4f0093", "#510098", "#52009d", "#5400a2", "#5500a7", "#5700ab", "#5800b0", "#5a00b4", "#5b00b9", "#5d00bd", "#5e00c1", "#5f00c5", "#6100c9", "#6200cd", "#6300d1", "#6400d4", "#6601d7", "#6701db", "#6801de", "#6901e1", "#6b01e4", "#6c01e6", "#6d01e9", "#6e01ec", "#6f01ee", "#7001f0", "#7202f2", "#7302f4", "#7402f6", "#7502f7", "#7602f9", "#7702fa", "#7802fb", "#7903fc", "#7a03fd", "#7b03fd", "#7c03fe", "#7d03fe", "#7e03fe", "#7f04fe", "#8004fe", "#8104fe", "#8204fe", "#8304fd", "#8405fc", "#8505fb", "#8605fa", "#8705f9", "#8805f8", "#8906f6", "#8a06f5", "#8b06f3", "#8c07f1", "#8d07ef", "#8d07ed", "#8e07ea", "#8f08e8", "#9008e5", "#9108e2", "#9209df", "#9309dc", "#9409d9", "#940ad6", "#950ad2", "#960acf", "#970bcb", "#980bc7", "#990bc3", "#990cbf", "#9a0cbb", "#9b0db7", "#9c0db2", "#9d0eae", "#9e0ea9", "#9e0ea4", "#9f0f9f", "#a00f9a", "#a11095", "#a21090", "#a2118b", "#a31186", "#a41280", "#a5127b", "#a51375", "#a61370", "#a7146a", "#a81564", "#a8155f", "#a91659", "#aa1653", "#ab174d", "#ab1847", "#ac1841", "#ad193b", "#ae1935", "#ae1a2e", "#af1b28", "#b01b22", "#b11c1c", "#b11d15", "#b21e0f", "#b31e09", "#b31f03", "#b42000", "#b52100", "#b62100", "#b62200", "#b72300", "#b82400", "#b82500", "#b92500", "#ba2600", "#ba2700", "#bb2800", "#bc2900", "#bc2a00", "#bd2b00", "#be2c00", "#be2c00", "#bf2d00", "#c02e00", "#c02f00", "#c13000", "#c23100", "#c23200", "#c33300", "#c43400", "#c43600", "#c53700", "#c63800", "#c63900", "#c73a00", "#c83b00", "#c83c00", "#c93d00", "#c93e00", "#ca4000", "#cb4100", "#cb4200", "#cc4300", "#cd4500", "#cd4600", "#ce4700", "#ce4800", "#cf4a00", "#d04b00", "#d04c00", "#d14e00", "#d24f00", "#d25100", "#d35200", "#d35300", "#d45500", "#d55600", "#d55800", "#d65900", "#d65b00", "#d75c00", "#d85e00", "#d85f00", "#d96100", "#d96200", "#da6400", "#da6600", "#db6700", "#dc6900", "#dc6b00", "#dd6c00", "#dd6e00", "#de7000", "#de7200", "#df7300", "#e07500", "#e07700", "#e17900", "#e17b00", "#e27c00", "#e27e00", "#e38000", "#e48200", "#e48400", "#e58600", "#e58800", "#e68a00", "#e68c00", "#e78e00", "#e79000", "#e89200", "#e99400", "#e99600", "#ea9800", "#ea9a00", "#eb9d00", "#eb9f00", "#eca100", "#eca300", "#eda500", "#eda800", "#eeaa00", "#eeac00", "#efaf00", "#f0b100", "#f0b300", "#f1b600", "#f1b800", "#f2bb00", "#f2bd00", "#f3c000", "#f3c200", "#f4c500", "#f4c700", "#f5ca00", "#f5cc00", "#f6cf00", "#f6d100", "#f7d400", "#f7d700", "#f8d900", "#f8dc00", "#f9df00", "#f9e200", "#fae400", "#fae700", "#fbea00", "#fbed00", "#fcf000", "#fcf300", "#fdf600", "#fdf900", "#fefc00", "#ffff00" ], "gnuplot2": [ "#000000", "#000004", "#000008", "#00000c", "#000010", "#000014", "#000018", "#00001c", "#000020", "#000024", "#000028", "#00002c", "#000030", "#000034", "#000038", "#00003c", "#000040", "#000044", "#000048", "#00004c", "#000050", "#000054", "#000058", "#00005c", "#000060", "#000064", "#000068", "#00006c", "#000070", "#000074", "#000078", "#00007c", "#000080", "#000083", "#000088", "#00008c", "#000090", "#000093", "#000098", "#00009c", "#0000a0", "#0000a3", "#0000a8", "#0000ac", "#0000b0", "#0000b3", "#0000b8", "#0000bc", "#0000c0", "#0000c3", "#0000c8", "#0000cc", "#0000d0", "#0000d3", "#0000d8", "#0000dc", "#0000e0", "#0000e3", "#0000e8", "#0000ec", "#0000f0", "#0000f3", "#0000f8", "#0000fc", "#0000ff", "#0300ff", "#0700ff", "#0a00ff", "#0d00ff", "#1000ff", "#1300ff", "#1600ff", "#1900ff", "#1c00ff", "#2000ff", "#2300ff", "#2600ff", "#2900ff", "#2c00ff", "#2f00ff", "#3200ff", "#3500ff", "#3900ff", "#3c00ff", "#3f00ff", "#4200ff", "#4500ff", "#4800ff", "#4b00ff", "#4e00ff", "#5200ff", "#5500ff", "#5800ff", "#5b00ff", "#5e00ff", "#6100ff", "#6400ff", "#6700ff", "#6b00ff", "#6e00ff", "#7100ff", "#7400ff", "#7700ff", "#7a00ff", "#7d00ff", "#8000ff", "#8400ff", "#8700ff", "#8a01fd", "#8d03fb", "#9005f9", "#9307f7", "#9609f5", "#990bf3", "#9d0df1", "#a00fef", "#a311ed", "#a613eb", "#a915e9", "#ac17e7", "#af19e5", "#b21be3", "#b61de1", "#b91fdf", "#bc21dd", "#bf23db", "#c225d9", "#c527d7", "#c829d5", "#cb2bd3", "#cf2dd1", "#d22fcf", "#d531cd", "#d833cb", "#db35c9", "#de37c7", "#e139c5", "#e43bc3", "#e83dc1", "#eb3fbf", "#ee41bd", "#f143bb", "#f445b9", "#f747b7", "#fa49b5", "#fd4bb3", "#ff4db1", "#ff4faf", "#ff51ad", "#ff53ab", "#ff55a9", "#ff57a7", "#ff59a5", "#ff5ba3", "#ff5da1", "#ff5f9f", "#ff619d", "#ff639b", "#ff6599", "#ff6797", "#ff6995", "#ff6b93", "#ff6d91", "#ff6f8f", "#ff718d", "#ff738b", "#ff7589", "#ff7787", "#ff7985", "#ff7b83", "#ff7d81", "#ff7f7f", "#ff817d", "#ff837b", "#ff8579", "#ff8777", "#ff8975", "#ff8b73", "#ff8d71", "#ff8f6f", "#ff916d", "#ff936b", "#ff9569", "#ff9767", "#ff9965", "#ff9b63", "#ff9d61", "#ff9f5f", "#ffa15d", "#ffa35b", "#ffa559", "#ffa757", "#ffa955", "#ffab53", "#ffad51", "#ffaf4f", "#ffb14d", "#ffb34b", "#ffb549", "#ffb747", "#ffb945", "#ffbb43", "#ffbd41", "#ffbf3f", "#ffc13d", "#ffc33b", "#ffc539", "#ffc737", "#ffc935", "#ffcb33", "#ffcd31", "#ffcf2f", "#ffd12d", "#ffd32b", "#ffd529", "#ffd727", "#ffd925", "#ffdb23", "#ffdd21", "#ffdf1f", "#ffe11d", "#ffe31b", "#ffe519", "#ffe717", "#ffe915", "#ffeb13", "#ffed11", "#ffef0f", "#fff10d", "#fff30b", "#fff509", "#fff707", "#fff905", "#fffb03", "#fffd01", "#ffff04", "#ffff11", "#ffff1d", "#ffff2a", "#ffff36", "#ffff43", "#ffff4f", "#ffff5c", "#ffff68", "#ffff75", "#ffff82", "#ffff8e", "#ffff9a", "#ffffa7", "#ffffb3", "#ffffc0", "#ffffcc", "#ffffd9", "#ffffe6", "#fffff2", "#ffffff" ], "hot": [ "#0a0000", "#0d0000", "#0f0000", "#120000", "#150000", "#170000", "#1a0000", "#1c0000", "#1f0000", "#220000", "#240000", "#270000", "#2a0000", "#2c0000", "#2f0000", "#310000", "#340000", "#370000", "#390000", "#3c0000", "#3f0000", "#410000", "#440000", "#460000", "#490000", "#4c0000", "#4e0000", "#510000", "#540000", "#560000", "#590000", "#5b0000", "#5e0000", "#610000", "#630000", "#660000", "#690000", "#6b0000", "#6e0000", "#700000", "#730000", "#760000", "#780000", "#7b0000", "#7e0000", "#800000", "#830000", "#850000", "#880000", "#8b0000", "#8d0000", "#900000", "#930000", "#950000", "#980000", "#9a0000", "#9d0000", "#a00000", "#a20000", "#a50000", "#a80000", "#aa0000", "#ad0000", "#af0000", "#b20000", "#b50000", "#b70000", "#ba0000", "#bd0000", "#bf0000", "#c20000", "#c40000", "#c70000", "#ca0000", "#cc0000", "#cf0000", "#d20000", "#d40000", "#d70000", "#d90000", "#dc0000", "#df0000", "#e10000", "#e40000", "#e70000", "#e90000", "#ec0000", "#ee0000", "#f10000", "#f40000", "#f60000", "#f90000", "#fc0000", "#fe0000", "#ff0200", "#ff0500", "#ff0700", "#ff0a00", "#ff0c00", "#ff0f00", "#ff1200", "#ff1400", "#ff1700", "#ff1a00", "#ff1c00", "#ff1f00", "#ff2100", "#ff2400", "#ff2700", "#ff2900", "#ff2c00", "#ff2f00", "#ff3100", "#ff3400", "#ff3600", "#ff3900", "#ff3c00", "#ff3e00", "#ff4100", "#ff4400", "#ff4600", "#ff4900", "#ff4b00", "#ff4e00", "#ff5100", "#ff5300", "#ff5600", "#ff5900", "#ff5b00", "#ff5e00", "#ff6000", "#ff6300", "#ff6600", "#ff6800", "#ff6b00", "#ff6e00", "#ff7000", "#ff7300", "#ff7500", "#ff7800", "#ff7b00", "#ff7d00", "#ff8000", "#ff8300", "#ff8500", "#ff8800", "#ff8a00", "#ff8d00", "#ff9000", "#ff9200", "#ff9500", "#ff9700", "#ff9a00", "#ff9d00", "#ff9f00", "#ffa200", "#ffa500", "#ffa700", "#ffaa00", "#ffac00", "#ffaf00", "#ffb200", "#ffb400", "#ffb700", "#ffba00", "#ffbc00", "#ffbf00", "#ffc100", "#ffc400", "#ffc700", "#ffc900", "#ffcc00", "#ffcf00", "#ffd100", "#ffd400", "#ffd600", "#ffd900", "#ffdc00", "#ffde00", "#ffe100", "#ffe400", "#ffe600", "#ffe900", "#ffeb00", "#ffee00", "#fff100", "#fff300", "#fff600", "#fff900", "#fffb00", "#fffe00", "#ffff02", "#ffff06", "#ffff0a", "#ffff0e", "#ffff12", "#ffff16", "#ffff1a", "#ffff1e", "#ffff22", "#ffff26", "#ffff2a", "#ffff2e", "#ffff32", "#ffff36", "#ffff3a", "#ffff3e", "#ffff41", "#ffff45", "#ffff49", "#ffff4d", "#ffff51", "#ffff55", "#ffff59", "#ffff5d", "#ffff61", "#ffff65", "#ffff69", "#ffff6d", "#ffff71", "#ffff75", "#ffff79", "#ffff7d", "#ffff80", "#ffff84", "#ffff88", "#ffff8c", "#ffff90", "#ffff94", "#ffff98", "#ffff9c", "#ffffa0", "#ffffa4", "#ffffa8", "#ffffac", "#ffffb0", "#ffffb4", "#ffffb8", "#ffffbc", "#ffffbf", "#ffffc3", "#ffffc7", "#ffffcb", "#ffffcf", "#ffffd3", "#ffffd7", "#ffffdb", "#ffffdf", "#ffffe3", "#ffffe7", "#ffffeb", "#ffffef", "#fffff3", "#fffff7", "#fffffb", "#ffffff" ], "hsv": [ "#ff0000", "#ff0500", "#ff0b00", "#ff1100", "#ff1700", "#ff1d00", "#ff2300", "#ff2900", "#ff2f00", "#ff3500", "#ff3b00", "#ff4000", "#ff4600", "#ff4c00", "#ff5200", "#ff5800", "#ff5e00", "#ff6400", "#ff6a00", "#ff7000", "#ff7600", "#ff7c00", "#ff8100", "#ff8700", "#ff8d00", "#ff9300", "#ff9900", "#ff9f00", "#ffa500", "#ffab00", "#ffb100", "#ffb700", "#ffbd00", "#ffc200", "#ffc800", "#ffce00", "#ffd400", "#ffda00", "#ffe000", "#ffe600", "#ffec00", "#fdf100", "#fbf500", "#faf900", "#f8fc00", "#f4ff00", "#eeff00", "#e8ff00", "#e2ff00", "#dcff00", "#d6ff00", "#d0ff00", "#caff00", "#c4ff00", "#bfff00", "#b9ff00", "#b3ff00", "#adff00", "#a7ff00", "#a1ff00", "#9bff00", "#95ff00", "#8fff00", "#89ff00", "#83ff00", "#7eff00", "#78ff00", "#72ff00", "#6cff00", "#66ff00", "#60ff00", "#5aff00", "#54ff00", "#4eff00", "#48ff00", "#43ff00", "#3dff00", "#37ff00", "#31ff00", "#2bff00", "#25ff00", "#1fff00", "#19ff00", "#13ff00", "#0dff00", "#07ff00", "#05ff03", "#04ff07", "#02ff0b", "#00ff0f", "#00ff15", "#00ff1b", "#00ff21", "#00ff27", "#00ff2d", "#00ff33", "#00ff39", "#00ff3e", "#00ff44", "#00ff4a", "#00ff50", "#00ff56", "#00ff5c", "#00ff62", "#00ff68", "#00ff6e", "#00ff74", "#00ff79", "#00ff7f", "#00ff85", "#00ff8b", "#00ff91", "#00ff97", "#00ff9d", "#00ffa3", "#00ffa9", "#00ffaf", "#00ffb5", "#00ffba", "#00ffc0", "#00ffc6", "#00ffcc", "#00ffd2", "#00ffd8", "#00ffde", "#00ffe4", "#00ffea", "#00fff0", "#00fff5", "#00fffb", "#00fcff", "#00f6ff", "#00f0ff", "#00eaff", "#00e4ff", "#00deff", "#00d8ff", "#00d2ff", "#00ccff", "#00c7ff", "#00c1ff", "#00bbff", "#00b5ff", "#00afff", "#00a9ff", "#00a3ff", "#009dff", "#0097ff", "#0091ff", "#008bff", "#0086ff", "#0080ff", "#007aff", "#0074ff", "#006eff", "#0068ff", "#0062ff", "#005cff", "#0056ff", "#0050ff", "#004bff", "#0045ff", "#003fff", "#0039ff", "#0033ff", "#002dff", "#0027ff", "#0021ff", "#001bff", "#0015ff", "#000fff", "#010cff", "#0308ff", "#0504ff", "#0700ff", "#0d00ff", "#1300ff", "#1900ff", "#1f00ff", "#2500ff", "#2b00ff", "#3100ff", "#3600ff", "#3c00ff", "#4200ff", "#4800ff", "#4e00ff", "#5400ff", "#5a00ff", "#6000ff", "#6600ff", "#6c00ff", "#7100ff", "#7700ff", "#7d00ff", "#8300ff", "#8900ff", "#8f00ff", "#9500ff", "#9b00ff", "#a100ff", "#a700ff", "#ad00ff", "#b200ff", "#b800ff", "#be00ff", "#c400ff", "#ca00ff", "#d000ff", "#d600ff", "#dc00ff", "#e200ff", "#e800ff", "#ee00ff", "#f300ff", "#f700fd", "#f900f9", "#fb00f5", "#fd00f1", "#ff00ec", "#ff00e6", "#ff00e0", "#ff00da", "#ff00d4", "#ff00cf", "#ff00c9", "#ff00c3", "#ff00bd", "#ff00b7", "#ff00b1", "#ff00ab", "#ff00a5", "#ff009f", "#ff0099", "#ff0093", "#ff008e", "#ff0088", "#ff0082", "#ff007c", "#ff0076", "#ff0070", "#ff006a", "#ff0064", "#ff005e", "#ff0058", "#ff0052", "#ff004d", "#ff0047", "#ff0041", "#ff003b", "#ff0035", "#ff002f", "#ff0029", "#ff0023", "#ff001d", "#ff0017" ], "inferno": [ "#000003", "#000004", "#000006", "#010007", "#010109", "#01010b", "#02010e", "#020210", "#030212", "#040314", "#040316", "#050418", "#06041b", "#07051d", "#08061f", "#090621", "#0a0723", "#0b0726", "#0d0828", "#0e082a", "#0f092d", "#10092f", "#120a32", "#130a34", "#140b36", "#160b39", "#170b3b", "#190b3e", "#1a0b40", "#1c0c43", "#1d0c45", "#1f0c47", "#200c4a", "#220b4c", "#240b4e", "#260b50", "#270b52", "#290b54", "#2b0a56", "#2d0a58", "#2e0a5a", "#300a5c", "#32095d", "#34095f", "#350960", "#370961", "#390962", "#3b0964", "#3c0965", "#3e0966", "#400966", "#410967", "#430a68", "#450a69", "#460a69", "#480b6a", "#4a0b6a", "#4b0c6b", "#4d0c6b", "#4f0d6c", "#500d6c", "#520e6c", "#530e6d", "#550f6d", "#570f6d", "#58106d", "#5a116d", "#5b116e", "#5d126e", "#5f126e", "#60136e", "#62146e", "#63146e", "#65156e", "#66156e", "#68166e", "#6a176e", "#6b176e", "#6d186e", "#6e186e", "#70196e", "#72196d", "#731a6d", "#751b6d", "#761b6d", "#781c6d", "#7a1c6d", "#7b1d6c", "#7d1d6c", "#7e1e6c", "#801f6b", "#811f6b", "#83206b", "#85206a", "#86216a", "#88216a", "#892269", "#8b2269", "#8d2369", "#8e2468", "#902468", "#912567", "#932567", "#952666", "#962666", "#982765", "#992864", "#9b2864", "#9c2963", "#9e2963", "#a02a62", "#a12b61", "#a32b61", "#a42c60", "#a62c5f", "#a72d5f", "#a92e5e", "#ab2e5d", "#ac2f5c", "#ae305b", "#af315b", "#b1315a", "#b23259", "#b43358", "#b53357", "#b73456", "#b83556", "#ba3655", "#bb3754", "#bd3753", "#be3852", "#bf3951", "#c13a50", "#c23b4f", "#c43c4e", "#c53d4d", "#c73e4c", "#c83e4b", "#c93f4a", "#cb4049", "#cc4148", "#cd4247", "#cf4446", "#d04544", "#d14643", "#d24742", "#d44841", "#d54940", "#d64a3f", "#d74b3e", "#d94d3d", "#da4e3b", "#db4f3a", "#dc5039", "#dd5238", "#de5337", "#df5436", "#e05634", "#e25733", "#e35832", "#e45a31", "#e55b30", "#e65c2e", "#e65e2d", "#e75f2c", "#e8612b", "#e9622a", "#ea6428", "#eb6527", "#ec6726", "#ed6825", "#ed6a23", "#ee6c22", "#ef6d21", "#f06f1f", "#f0701e", "#f1721d", "#f2741c", "#f2751a", "#f37719", "#f37918", "#f47a16", "#f57c15", "#f57e14", "#f68012", "#f68111", "#f78310", "#f7850e", "#f8870d", "#f8880c", "#f88a0b", "#f98c09", "#f98e08", "#f99008", "#fa9107", "#fa9306", "#fa9506", "#fa9706", "#fb9906", "#fb9b06", "#fb9d06", "#fb9e07", "#fba007", "#fba208", "#fba40a", "#fba60b", "#fba80d", "#fbaa0e", "#fbac10", "#fbae12", "#fbb014", "#fbb116", "#fbb318", "#fbb51a", "#fbb71c", "#fbb91e", "#fabb21", "#fabd23", "#fabf25", "#fac128", "#f9c32a", "#f9c52c", "#f9c72f", "#f8c931", "#f8cb34", "#f8cd37", "#f7cf3a", "#f7d13c", "#f6d33f", "#f6d542", "#f5d745", "#f5d948", "#f4db4b", "#f4dc4f", "#f3de52", "#f3e056", "#f3e259", "#f2e45d", "#f2e660", "#f1e864", "#f1e968", "#f1eb6c", "#f1ed70", "#f1ee74", "#f1f079", "#f1f27d", "#f2f381", "#f2f485", "#f3f689", "#f4f78d", "#f5f891", "#f6fa95", "#f7fb99", "#f9fc9d", "#fafda0", "#fcfea4" ], "jet": [ "#00007f", "#000084", "#000088", "#00008d", "#000091", "#000096", "#00009a", "#00009f", "#0000a3", "#0000a8", "#0000ac", "#0000b1", "#0000b6", "#0000ba", "#0000bf", "#0000c3", "#0000c8", "#0000cc", "#0000d1", "#0000d5", "#0000da", "#0000de", "#0000e3", "#0000e8", "#0000ec", "#0000f1", "#0000f5", "#0000fa", "#0000fe", "#0000ff", "#0000ff", "#0000ff", "#0000ff", "#0004ff", "#0008ff", "#000cff", "#0010ff", "#0014ff", "#0018ff", "#001cff", "#0020ff", "#0024ff", "#0028ff", "#002cff", "#0030ff", "#0034ff", "#0038ff", "#003cff", "#0040ff", "#0044ff", "#0048ff", "#004cff", "#0050ff", "#0054ff", "#0058ff", "#005cff", "#0060ff", "#0064ff", "#0068ff", "#006cff", "#0070ff", "#0074ff", "#0078ff", "#007cff", "#0080ff", "#0084ff", "#0088ff", "#008cff", "#0090ff", "#0094ff", "#0098ff", "#009cff", "#00a0ff", "#00a4ff", "#00a8ff", "#00acff", "#00b0ff", "#00b4ff", "#00b8ff", "#00bcff", "#00c0ff", "#00c4ff", "#00c8ff", "#00ccff", "#00d0ff", "#00d4ff", "#00d8ff", "#00dcfe", "#00e0fa", "#00e4f7", "#02e8f4", "#05ecf1", "#08f0ed", "#0cf4ea", "#0ff8e7", "#12fce4", "#15ffe1", "#18ffdd", "#1cffda", "#1fffd7", "#22ffd4", "#25ffd0", "#29ffcd", "#2cffca", "#2fffc7", "#32ffc3", "#36ffc0", "#39ffbd", "#3cffba", "#3fffb7", "#42ffb3", "#46ffb0", "#49ffad", "#4cffaa", "#4fffa6", "#53ffa3", "#56ffa0", "#59ff9d", "#5cff9a", "#5fff96", "#63ff93", "#66ff90", "#69ff8d", "#6cff89", "#70ff86", "#73ff83", "#76ff80", "#79ff7d", "#7cff79", "#80ff76", "#83ff73", "#86ff70", "#89ff6c", "#8dff69", "#90ff66", "#93ff63", "#96ff5f", "#9aff5c", "#9dff59", "#a0ff56", "#a3ff53", "#a6ff4f", "#aaff4c", "#adff49", "#b0ff46", "#b3ff42", "#b7ff3f", "#baff3c", "#bdff39", "#c0ff36", "#c3ff32", "#c7ff2f", "#caff2c", "#cdff29", "#d0ff25", "#d4ff22", "#d7ff1f", "#daff1c", "#ddff18", "#e0ff15", "#e4ff12", "#e7ff0f", "#eaff0c", "#edff08", "#f1fc05", "#f4f802", "#f7f400", "#faf000", "#feed00", "#ffe900", "#ffe500", "#ffe200", "#ffde00", "#ffda00", "#ffd700", "#ffd300", "#ffcf00", "#ffcb00", "#ffc800", "#ffc400", "#ffc000", "#ffbd00", "#ffb900", "#ffb500", "#ffb100", "#ffae00", "#ffaa00", "#ffa600", "#ffa300", "#ff9f00", "#ff9b00", "#ff9800", "#ff9400", "#ff9000", "#ff8c00", "#ff8900", "#ff8500", "#ff8100", "#ff7e00", "#ff7a00", "#ff7600", "#ff7300", "#ff6f00", "#ff6b00", "#ff6700", "#ff6400", "#ff6000", "#ff5c00", "#ff5900", "#ff5500", "#ff5100", "#ff4d00", "#ff4a00", "#ff4600", "#ff4200", "#ff3f00", "#ff3b00", "#ff3700", "#ff3400", "#ff3000", "#ff2c00", "#ff2800", "#ff2500", "#ff2100", "#ff1d00", "#ff1a00", "#ff1600", "#fe1200", "#fa0f00", "#f50b00", "#f10700", "#ec0300", "#e80000", "#e30000", "#de0000", "#da0000", "#d50000", "#d10000", "#cc0000", "#c80000", "#c30000", "#bf0000", "#ba0000", "#b60000", "#b10000", "#ac0000", "#a80000", "#a30000", "#9f0000", "#9a0000", "#960000", "#910000", "#8d0000", "#880000", "#840000", "#7f0000" ], "magma": [ "#000003", "#000004", "#000006", "#010007", "#010109", "#01010b", "#02020d", "#02020f", "#030311", "#040313", "#040415", "#050417", "#060519", "#07051b", "#08061d", "#09071f", "#0a0722", "#0b0824", "#0c0926", "#0d0a28", "#0e0a2a", "#0f0b2c", "#100c2f", "#110c31", "#120d33", "#140d35", "#150e38", "#160e3a", "#170f3c", "#180f3f", "#1a1041", "#1b1044", "#1c1046", "#1e1049", "#1f114b", "#20114d", "#221150", "#231152", "#251155", "#261157", "#281159", "#2a115c", "#2b115e", "#2d1060", "#2f1062", "#301065", "#321067", "#341068", "#350f6a", "#370f6c", "#390f6e", "#3b0f6f", "#3c0f71", "#3e0f72", "#400f73", "#420f74", "#430f75", "#450f76", "#470f77", "#481078", "#4a1079", "#4b1079", "#4d117a", "#4f117b", "#50127b", "#52127c", "#53137c", "#55137d", "#57147d", "#58157e", "#5a157e", "#5b167e", "#5d177e", "#5e177f", "#60187f", "#61187f", "#63197f", "#651a80", "#661a80", "#681b80", "#691c80", "#6b1c80", "#6c1d80", "#6e1e81", "#6f1e81", "#711f81", "#731f81", "#742081", "#762181", "#772181", "#792281", "#7a2281", "#7c2381", "#7e2481", "#7f2481", "#812581", "#822581", "#842681", "#852681", "#872781", "#892881", "#8a2881", "#8c2980", "#8d2980", "#8f2a80", "#912a80", "#922b80", "#942b80", "#952c80", "#972c7f", "#992d7f", "#9a2d7f", "#9c2e7f", "#9e2e7e", "#9f2f7e", "#a12f7e", "#a3307e", "#a4307d", "#a6317d", "#a7317d", "#a9327c", "#ab337c", "#ac337b", "#ae347b", "#b0347b", "#b1357a", "#b3357a", "#b53679", "#b63679", "#b83778", "#b93778", "#bb3877", "#bd3977", "#be3976", "#c03a75", "#c23a75", "#c33b74", "#c53c74", "#c63c73", "#c83d72", "#ca3e72", "#cb3e71", "#cd3f70", "#ce4070", "#d0416f", "#d1426e", "#d3426d", "#d4436d", "#d6446c", "#d7456b", "#d9466a", "#da4769", "#dc4869", "#dd4968", "#de4a67", "#e04b66", "#e14c66", "#e24d65", "#e44e64", "#e55063", "#e65162", "#e75262", "#e85461", "#ea5560", "#eb5660", "#ec585f", "#ed595f", "#ee5b5e", "#ee5d5d", "#ef5e5d", "#f0605d", "#f1615c", "#f2635c", "#f3655c", "#f3675b", "#f4685b", "#f56a5b", "#f56c5b", "#f66e5b", "#f6705b", "#f7715b", "#f7735c", "#f8755c", "#f8775c", "#f9795c", "#f97b5d", "#f97d5d", "#fa7f5e", "#fa805e", "#fa825f", "#fb8460", "#fb8660", "#fb8861", "#fb8a62", "#fc8c63", "#fc8e63", "#fc9064", "#fc9265", "#fc9366", "#fd9567", "#fd9768", "#fd9969", "#fd9b6a", "#fd9d6b", "#fd9f6c", "#fda16e", "#fda26f", "#fda470", "#fea671", "#fea873", "#feaa74", "#feac75", "#feae76", "#feaf78", "#feb179", "#feb37b", "#feb57c", "#feb77d", "#feb97f", "#febb80", "#febc82", "#febe83", "#fec085", "#fec286", "#fec488", "#fec689", "#fec78b", "#fec98d", "#fecb8e", "#fdcd90", "#fdcf92", "#fdd193", "#fdd295", "#fdd497", "#fdd698", "#fdd89a", "#fdda9c", "#fddc9d", "#fddd9f", "#fddfa1", "#fde1a3", "#fce3a5", "#fce5a6", "#fce6a8", "#fce8aa", "#fceaac", "#fcecae", "#fceeb0", "#fcf0b1", "#fcf1b3", "#fcf3b5", "#fcf5b7", "#fbf7b9", "#fbf9bb", "#fbfabd", "#fbfcbf" ], "nipy_spectral": [ "#000000", "#09000a", "#120015", "#1c001f", "#25002a", "#2e0035", "#38003f", "#41004a", "#4a0055", "#54005f", "#5d006a", "#660075", "#70007f", "#770088", "#780089", "#7a008a", "#7b008c", "#7c008d", "#7e008e", "#7f0090", "#800091", "#810092", "#830094", "#840095", "#850096", "#870098", "#820099", "#77009b", "#6d009c", "#62009d", "#57009f", "#4d00a0", "#4200a1", "#3700a3", "#2d00a4", "#2200a5", "#1700a7", "#0d00a8", "#0200a9", "#0000ad", "#0000b1", "#0000b5", "#0000b9", "#0000bd", "#0000c1", "#0000c5", "#0000c9", "#0000cd", "#0000d1", "#0000d5", "#0000d9", "#0000dd", "#0009dd", "#0012dd", "#001cdd", "#0025dd", "#002edd", "#0038dd", "#0041dd", "#004add", "#0054dd", "#005ddd", "#0066dd", "#0070dd", "#0077dd", "#007add", "#007ddd", "#007fdd", "#0082dd", "#0085dd", "#0087dd", "#008add", "#008ddd", "#008fdd", "#0092dd", "#0095dd", "#0097dd", "#0099db", "#009bd7", "#009cd3", "#009dcf", "#009fcb", "#00a0c7", "#00a1c3", "#00a3bf", "#00a4bb", "#00a5b7", "#00a7b3", "#00a8af", "#00a9ab", "#00aaa8", "#00aaa5", "#00aaa2", "#00aaa0", "#00aa9d", "#00aa9a", "#00aa97", "#00aa95", "#00aa92", "#00aa8f", "#00aa8d", "#00aa8a", "#00aa87", "#00a87d", "#00a772", "#00a667", "#00a45d", "#00a352", "#00a247", "#00a03d", "#009f32", "#009e27", "#009c1d", "#009b12", "#009a07", "#009900", "#009c00", "#009e00", "#00a100", "#00a400", "#00a600", "#00a900", "#00ac00", "#00ae00", "#00b100", "#00b400", "#00b600", "#00b900", "#00bc00", "#00be00", "#00c100", "#00c400", "#00c600", "#00c900", "#00cc00", "#00cf00", "#00d100", "#00d400", "#00d700", "#00d900", "#00dc00", "#00df00", "#00e100", "#00e400", "#00e700", "#00e900", "#00ec00", "#00ef00", "#00f100", "#00f400", "#00f700", "#00f900", "#00fc00", "#00ff00", "#0eff00", "#1dff00", "#2bff00", "#3aff00", "#49ff00", "#57ff00", "#66ff00", "#75ff00", "#83ff00", "#92ff00", "#a1ff00", "#afff00", "#bbfe00", "#bffd00", "#c3fb00", "#c7fa00", "#cbf900", "#cff700", "#d3f600", "#d7f500", "#dbf300", "#dff200", "#e3f100", "#e7ef00", "#ebee00", "#eeec00", "#efe900", "#f1e700", "#f2e400", "#f3e100", "#f5df00", "#f6dc00", "#f7d900", "#f9d700", "#fad400", "#fbd100", "#fdcf00", "#fecc00", "#ffc900", "#ffc500", "#ffc100", "#ffbd00", "#ffb900", "#ffb500", "#ffb100", "#ffad00", "#ffa900", "#ffa500", "#ffa100", "#ff9d00", "#ff9900", "#ff8d00", "#ff8100", "#ff7500", "#ff6900", "#ff5d00", "#ff5100", "#ff4500", "#ff3900", "#ff2c00", "#ff2000", "#ff1400", "#ff0800", "#fe0000", "#fb0000", "#f90000", "#f60000", "#f30000", "#f10000", "#ee0000", "#eb0000", "#e90000", "#e60000", "#e30000", "#e10000", "#de0000", "#dc0000", "#db0000", "#d90000", "#d80000", "#d70000", "#d50000", "#d40000", "#d30000", "#d10000", "#d00000", "#cf0000", "#cd0000", "#cc0000", "#cc0c0c", "#cc1b1b", "#cc2c2c", "#cc3c3c", "#cc4c4c", "#cc5c5c", "#cc6c6c", "#cc7c7c", "#cc8c8c", "#cc9c9c", "#ccacac", "#ccbcbc", "#cccccc" ], "ocean": [ "#007f00", "#007e01", "#007c02", "#007b03", "#007904", "#007805", "#007606", "#007507", "#007308", "#007209", "#00700a", "#006f0b", "#006d0c", "#006c0d", "#006a0e", "#00690f", "#006710", "#006611", "#006412", "#006313", "#006114", "#006015", "#005e16", "#005d17", "#005b18", "#005919", "#00581a", "#00571b", "#00551c", "#00541d", "#00521e", "#00511f", "#004f20", "#004e20", "#004c22", "#004a23", "#004924", "#004824", "#004626", "#004527", "#004328", "#004228", "#00402a", "#003f2b", "#003d2c", "#003c2c", "#003a2e", "#00382f", "#003730", "#003630", "#003432", "#003233", "#003134", "#003034", "#002e36", "#002c37", "#002b38", "#002a38", "#00283a", "#00273b", "#00253c", "#00243c", "#00223e", "#00203f", "#001f40", "#001e41", "#001c41", "#001a43", "#001944", "#001845", "#001646", "#001447", "#001348", "#001249", "#001049", "#000f4b", "#000d4c", "#000c4d", "#000a4e", "#00084f", "#000750", "#000651", "#000451", "#000253", "#000154", "#000055", "#000156", "#000257", "#000458", "#000559", "#000759", "#00085b", "#000a5c", "#000b5d", "#000d5e", "#000f5f", "#001060", "#001161", "#001361", "#001563", "#001664", "#001865", "#001966", "#001b67", "#001c68", "#001e69", "#001f69", "#00206b", "#00226c", "#00236d", "#00256e", "#00276f", "#002870", "#002971", "#002b71", "#002d73", "#002e74", "#003075", "#003176", "#003277", "#003478", "#003579", "#003779", "#00387b", "#003a7c", "#003b7d", "#003d7e", "#003f7f", "#004080", "#004181", "#004382", "#004483", "#004683", "#004885", "#004986", "#004b87", "#004c88", "#004e89", "#004f8a", "#00518b", "#00528c", "#00548d", "#00558e", "#00578f", "#005890", "#005991", "#005b92", "#005c93", "#005e93", "#006095", "#006196", "#006297", "#006498", "#006599", "#00679a", "#00689b", "#006a9c", "#006c9d", "#006d9e", "#006f9f", "#0070a0", "#0071a1", "#0073a2", "#0074a3", "#0076a3", "#0078a5", "#0079a6", "#007ba7", "#007ca8", "#007ea9", "#007faa", "#0281ab", "#0582ac", "#0883ad", "#0b85ae", "#0e86af", "#1188b0", "#1489b1", "#178bb2", "#1a8cb3", "#1d8eb3", "#2090b5", "#2391b6", "#2693b7", "#2994b8", "#2c95b9", "#2f97ba", "#3298bb", "#369abc", "#399cbd", "#3c9dbe", "#3f9fbf", "#41a0c0", "#44a2c1", "#47a3c2", "#4aa4c3", "#4da6c3", "#51a8c5", "#54a9c6", "#57abc7", "#5aacc8", "#5daec9", "#60afca", "#62b1cb", "#66b2cc", "#69b4cd", "#6cb5ce", "#6fb7cf", "#72b8d0", "#75bad1", "#78bbd2", "#7bbdd3", "#7ebed3", "#81c0d5", "#83c1d6", "#86c3d7", "#89c4d8", "#8cc5d9", "#8fc7da", "#92c8db", "#96cadc", "#99ccdd", "#9ccdde", "#9fcfdf", "#a2d0e0", "#a4d2e1", "#a7d3e2", "#aad4e3", "#add6e3", "#b1d8e5", "#b4d9e6", "#b7dbe7", "#badce8", "#bddee9", "#c0dfea", "#c3e1eb", "#c5e2ec", "#c8e3ed", "#cbe5ee", "#cee6ef", "#d1e8f0", "#d4e9f1", "#d7ebf2", "#daecf3", "#ddeef3", "#e1f0f5", "#e3f1f6", "#e6f3f7", "#e9f4f8", "#ecf5f9", "#eff7fa", "#f2f8fb", "#f6fafc", "#f9fcfd", "#fcfdfe", "#ffffff" ], "plasma": [ "#0c0786", "#100787", "#130689", "#15068a", "#18068b", "#1b068c", "#1d068d", "#1f058e", "#21058f", "#230590", "#250591", "#270592", "#290593", "#2b0594", "#2d0494", "#2f0495", "#310496", "#330497", "#340498", "#360498", "#380499", "#3a049a", "#3b039a", "#3d039b", "#3f039c", "#40039c", "#42039d", "#44039e", "#45039e", "#47029f", "#49029f", "#4a02a0", "#4c02a1", "#4e02a1", "#4f02a2", "#5101a2", "#5201a3", "#5401a3", "#5601a3", "#5701a4", "#5901a4", "#5a00a5", "#5c00a5", "#5e00a5", "#5f00a6", "#6100a6", "#6200a6", "#6400a7", "#6500a7", "#6700a7", "#6800a7", "#6a00a7", "#6c00a8", "#6d00a8", "#6f00a8", "#7000a8", "#7200a8", "#7300a8", "#7500a8", "#7601a8", "#7801a8", "#7901a8", "#7b02a8", "#7c02a7", "#7e03a7", "#7f03a7", "#8104a7", "#8204a7", "#8405a6", "#8506a6", "#8607a6", "#8807a5", "#8908a5", "#8b09a4", "#8c0aa4", "#8e0ca4", "#8f0da3", "#900ea3", "#920fa2", "#9310a1", "#9511a1", "#9612a0", "#9713a0", "#99149f", "#9a159e", "#9b179e", "#9d189d", "#9e199c", "#9f1a9b", "#a01b9b", "#a21c9a", "#a31d99", "#a41e98", "#a51f97", "#a72197", "#a82296", "#a92395", "#aa2494", "#ac2593", "#ad2692", "#ae2791", "#af2890", "#b02a8f", "#b12b8f", "#b22c8e", "#b42d8d", "#b52e8c", "#b62f8b", "#b7308a", "#b83289", "#b93388", "#ba3487", "#bb3586", "#bc3685", "#bd3784", "#be3883", "#bf3982", "#c03b81", "#c13c80", "#c23d80", "#c33e7f", "#c43f7e", "#c5407d", "#c6417c", "#c7427b", "#c8447a", "#c94579", "#ca4678", "#cb4777", "#cc4876", "#cd4975", "#ce4a75", "#cf4b74", "#d04d73", "#d14e72", "#d14f71", "#d25070", "#d3516f", "#d4526e", "#d5536d", "#d6556d", "#d7566c", "#d7576b", "#d8586a", "#d95969", "#da5a68", "#db5b67", "#dc5d66", "#dc5e66", "#dd5f65", "#de6064", "#df6163", "#df6262", "#e06461", "#e16560", "#e26660", "#e3675f", "#e3685e", "#e46a5d", "#e56b5c", "#e56c5b", "#e66d5a", "#e76e5a", "#e87059", "#e87158", "#e97257", "#ea7356", "#ea7455", "#eb7654", "#ec7754", "#ec7853", "#ed7952", "#ed7b51", "#ee7c50", "#ef7d4f", "#ef7e4e", "#f0804d", "#f0814d", "#f1824c", "#f2844b", "#f2854a", "#f38649", "#f38748", "#f48947", "#f48a47", "#f58b46", "#f58d45", "#f68e44", "#f68f43", "#f69142", "#f79241", "#f79341", "#f89540", "#f8963f", "#f8983e", "#f9993d", "#f99a3c", "#fa9c3b", "#fa9d3a", "#fa9f3a", "#faa039", "#fba238", "#fba337", "#fba436", "#fca635", "#fca735", "#fca934", "#fcaa33", "#fcac32", "#fcad31", "#fdaf31", "#fdb030", "#fdb22f", "#fdb32e", "#fdb52d", "#fdb62d", "#fdb82c", "#fdb92b", "#fdbb2b", "#fdbc2a", "#fdbe29", "#fdc029", "#fdc128", "#fdc328", "#fdc427", "#fdc626", "#fcc726", "#fcc926", "#fccb25", "#fccc25", "#fcce25", "#fbd024", "#fbd124", "#fbd324", "#fad524", "#fad624", "#fad824", "#f9d924", "#f9db24", "#f8dd24", "#f8df24", "#f7e024", "#f7e225", "#f6e425", "#f6e525", "#f5e726", "#f5e926", "#f4ea26", "#f3ec26", "#f3ee26", "#f2f026", "#f2f126", "#f1f326", "#f0f525", "#f0f623", "#eff821" ], "prism": [ "#ff0000", "#ff0000", "#ff2100", "#ff5100", "#ff8200", "#ffb000", "#ffd700", "#fff600", "#e2ff00", "#b2ff00", "#81ff00", "#53fe00", "#2ae200", "#0abc39", "#00907d", "#0060b9", "#002fe8", "#0000ff", "#1900ff", "#3d00ff", "#6900fe", "#9900d7", "#ca00a2", "#f90063", "#ff001c", "#ff0000", "#ff0e00", "#ff3d00", "#ff6f00", "#ff9e00", "#ffc800", "#ffeb00", "#f5ff00", "#c5ff00", "#94ff00", "#65ff00", "#3aee00", "#16cc1c", "#00a362", "#0074a2", "#0043d7", "#0013fd", "#0d00ff", "#2e00ff", "#5700ff", "#8500e8", "#b600b9", "#e7007d", "#ff0039", "#ff0000", "#ff0000", "#ff2a00", "#ff5b00", "#ff8b00", "#ffb800", "#ffde00", "#fffb00", "#d9ff00", "#a8ff00", "#77ff00", "#4af900", "#23db00", "#05b447", "#008789", "#0056c3", "#0026f0", "#0300ff", "#2000ff", "#4600ff", "#7200f7", "#a300ce", "#d40096", "#ff0055", "#ff000e", "#ff0000", "#ff1700", "#ff4700", "#ff7800", "#ffa700", "#ffd000", "#fff100", "#ecff00", "#bcff00", "#8bff00", "#5cff00", "#32e800", "#10c52a", "#009a6f", "#006aad", "#0039e0", "#000aff", "#1300ff", "#3500ff", "#6000ff", "#8f00e0", "#c000ae", "#f00070", "#ff002b", "#ff0000", "#ff0400", "#ff3300", "#ff6400", "#ff9400", "#ffc000", "#ffe500", "#feff00", "#cfff00", "#9eff00", "#6eff00", "#42f400", "#1dd40d", "#01ac54", "#007e96", "#004dcd", "#001cf7", "#0700ff", "#2600ff", "#4e00ff", "#7c00f0", "#ac00c4", "#dd008a", "#ff0048", "#ff0000", "#ff0000", "#ff2000", "#ff5100", "#ff8100", "#ffaf00", "#ffd700", "#fff600", "#e3ff00", "#b2ff00", "#81ff00", "#53fe00", "#2be200", "#0bbd38", "#00917c", "#0060b8", "#002fe8", "#0001ff", "#1900ff", "#3d00ff", "#6900fe", "#9900d7", "#ca00a3", "#f90063", "#ff001d", "#ff0000", "#ff0d00", "#ff3d00", "#ff6e00", "#ff9d00", "#ffc800", "#ffeb00", "#f5ff00", "#c6ff00", "#95ff00", "#65ff00", "#3aee00", "#16cd1b", "#00a362", "#0074a1", "#0043d6", "#0013fd", "#0d00ff", "#2d00ff", "#5600ff", "#8500e9", "#b600b9", "#e6007e", "#ff003a", "#ff0000", "#ff0000", "#ff2900", "#ff5a00", "#ff8b00", "#ffb800", "#ffde00", "#fffb00", "#d9ff00", "#a9ff00", "#78ff00", "#4bf900", "#24db00", "#05b546", "#008789", "#0057c3", "#0026ef", "#0200ff", "#1f00ff", "#4500ff", "#7200f8", "#a200ce", "#d30097", "#ff0056", "#ff000f", "#ff0000", "#ff1600", "#ff4700", "#ff7800", "#ffa600", "#ffcf00", "#fff000", "#ecff00", "#bcff00", "#8bff00", "#5cff00", "#32e900", "#10c52a", "#009a6f", "#006bad", "#0039df", "#000aff", "#1200ff", "#3500ff", "#5f00ff", "#8f00e1", "#c000af", "#ef0071", "#ff002c", "#ff0000", "#ff0400", "#ff3300", "#ff6400", "#ff9400", "#ffc000", "#ffe400", "#feff00", "#d0ff00", "#9fff00", "#6fff00", "#42f400", "#1dd40d", "#01ac54", "#007e95", "#004dcc", "#001df6", "#0700ff", "#2600ff", "#4d00ff", "#7b00f1", "#ac00c4", "#dd008b", "#ff0048", "#ff0001", "#ff0000", "#ff2000", "#ff5000", "#ff8100", "#ffaf00", "#ffd700", "#fff600", "#e3ff00", "#b3ff00", "#82ff00", "#54fe00" ], "rainbow": [ "#7f00ff", "#7d03fe", "#7b06fe", "#7909fe", "#770cfe", "#750ffe", "#7312fe", "#7115fe", "#6f19fe", "#6d1cfe", "#6b1ffe", "#6922fe", "#6725fe", "#6528fe", "#632bfe", "#612efd", "#5f31fd", "#5d35fd", "#5b38fd", "#593bfd", "#573efd", "#5541fc", "#5344fc", "#5147fc", "#4f4afc", "#4d4dfb", "#4b50fb", "#4953fb", "#4756fb", "#4559fa", "#435cfa", "#415ffa", "#3f61fa", "#3d64f9", "#3b67f9", "#396af9", "#376df8", "#3570f8", "#3373f8", "#3175f7", "#2f78f7", "#2d7bf6", "#2b7ef6", "#2980f6", "#2783f5", "#2586f5", "#2388f4", "#218bf4", "#1f8ef3", "#1d90f3", "#1b93f3", "#1995f2", "#1798f2", "#159af1", "#139df1", "#119ff0", "#0fa2ef", "#0da4ef", "#0ba7ee", "#09a9ee", "#07abed", "#05aeed", "#03b0ec", "#01b2ec", "#00b4eb", "#02b7ea", "#04b9ea", "#06bbe9", "#08bde8", "#0abfe8", "#0cc1e7", "#0ec3e6", "#10c5e6", "#12c7e5", "#14c9e4", "#16cbe4", "#18cde3", "#1acfe2", "#1cd1e2", "#1ed2e1", "#20d4e0", "#22d6df", "#24d7df", "#26d9de", "#28dbdd", "#2adcdc", "#2cdedc", "#2edfdb", "#30e1da", "#32e2d9", "#34e4d8", "#36e5d7", "#38e6d7", "#3ae8d6", "#3ce9d5", "#3eead4", "#40ecd3", "#42edd2", "#44eed1", "#46efd1", "#48f0d0", "#4af1cf", "#4cf2ce", "#4ef3cd", "#50f4cc", "#52f5cb", "#54f6ca", "#56f6c9", "#58f7c8", "#5af8c7", "#5cf9c6", "#5ef9c5", "#60fac4", "#62fac3", "#64fbc2", "#66fbc1", "#68fcc0", "#6afcbf", "#6cfdbe", "#6efdbd", "#70fdbc", "#72febb", "#74feba", "#76feb9", "#78feb8", "#7afeb7", "#7cfeb5", "#7efeb4", "#80feb3", "#82feb2", "#84feb1", "#86feb0", "#88feaf", "#8afeae", "#8cfeac", "#8efdab", "#90fdaa", "#92fda9", "#94fca8", "#96fca7", "#98fba5", "#9afba4", "#9cfaa3", "#9efaa2", "#a0f9a1", "#a2f99f", "#a4f89e", "#a6f79d", "#a8f69c", "#aaf69a", "#acf599", "#aef498", "#b0f397", "#b2f295", "#b4f194", "#b6f093", "#b8ef92", "#baee90", "#bced8f", "#beec8e", "#c0ea8c", "#c2e98b", "#c4e88a", "#c6e688", "#c8e587", "#cae486", "#cce284", "#cee183", "#d0df82", "#d2de80", "#d4dc7f", "#d6db7e", "#d8d97c", "#dad77b", "#dcd67a", "#ded478", "#e0d277", "#e2d175", "#e4cf74", "#e6cd73", "#e8cb71", "#eac970", "#ecc76e", "#eec56d", "#f0c36c", "#f2c16a", "#f4bf69", "#f6bd67", "#f8bb66", "#fab964", "#fcb763", "#feb461", "#ffb260", "#ffb05f", "#ffae5d", "#ffab5c", "#ffa95a", "#ffa759", "#ffa457", "#ffa256", "#ff9f54", "#ff9d53", "#ff9a51", "#ff9850", "#ff954e", "#ff934d", "#ff904b", "#ff8e4a", "#ff8b48", "#ff8847", "#ff8645", "#ff8344", "#ff8042", "#ff7e41", "#ff7b3f", "#ff783e", "#ff753c", "#ff733b", "#ff7039", "#ff6d38", "#ff6a36", "#ff6735", "#ff6433", "#ff6131", "#ff5f30", "#ff5c2e", "#ff592d", "#ff562b", "#ff532a", "#ff5028", "#ff4d27", "#ff4a25", "#ff4724", "#ff4422", "#ff4120", "#ff3e1f", "#ff3b1d", "#ff381c", "#ff351a", "#ff3119", "#ff2e17", "#ff2b15", "#ff2814", "#ff2512", "#ff2211", "#ff1f0f", "#ff1c0e", "#ff190c", "#ff150a", "#ff1209", "#ff0f07", "#ff0c06", "#ff0904", "#ff0603", "#ff0301", "#ff0000" ], "seismic": [ "#00004c", "#00004f", "#000052", "#000054", "#000057", "#00005a", "#00005d", "#000060", "#000062", "#000065", "#000068", "#00006b", "#00006e", "#000070", "#000073", "#000076", "#000079", "#00007c", "#00007e", "#000081", "#000084", "#000087", "#00008a", "#00008c", "#00008f", "#000092", "#000095", "#000098", "#00009a", "#00009d", "#0000a0", "#0000a3", "#0000a6", "#0000a8", "#0000ab", "#0000ae", "#0000b1", "#0000b4", "#0000b6", "#0000b9", "#0000bc", "#0000bf", "#0000c2", "#0000c4", "#0000c7", "#0000ca", "#0000cd", "#0000d0", "#0000d2", "#0000d5", "#0000d8", "#0000db", "#0000de", "#0000e0", "#0000e3", "#0000e6", "#0000e9", "#0000ec", "#0000ee", "#0000f1", "#0000f4", "#0000f7", "#0000fa", "#0000fc", "#0101ff", "#0505ff", "#0808ff", "#0d0dff", "#1111ff", "#1515ff", "#1919ff", "#1d1dff", "#2121ff", "#2525ff", "#2828ff", "#2d2dff", "#3131ff", "#3535ff", "#3939ff", "#3d3dff", "#4141ff", "#4545ff", "#4848ff", "#4d4dff", "#5151ff", "#5555ff", "#5959ff", "#5d5dff", "#6161ff", "#6565ff", "#6868ff", "#6d6dff", "#7171ff", "#7575ff", "#7979ff", "#7d7dff", "#8181ff", "#8585ff", "#8888ff", "#8d8dff", "#9191ff", "#9595ff", "#9999ff", "#9d9dff", "#a1a1ff", "#a5a5ff", "#a8a8ff", "#adadff", "#b1b1ff", "#b5b5ff", "#b9b9ff", "#bdbdff", "#c1c1ff", "#c5c5ff", "#c8c8ff", "#cdcdff", "#d1d1ff", "#d5d5ff", "#d9d9ff", "#ddddff", "#e1e1ff", "#e5e5ff", "#e8e8ff", "#ededff", "#f1f1ff", "#f5f5ff", "#f9f9ff", "#fdfdff", "#fffdfd", "#fff9f9", "#fff5f5", "#fff1f1", "#ffeded", "#ffe9e9", "#ffe5e5", "#ffe1e1", "#ffdddd", "#ffd9d9", "#ffd5d5", "#ffd1d1", "#ffcdcd", "#ffc9c9", "#ffc5c5", "#ffc1c1", "#ffbdbd", "#ffb9b9", "#ffb4b4", "#ffb1b1", "#ffadad", "#ffa9a9", "#ffa4a4", "#ffa1a1", "#ff9d9d", "#ff9999", "#ff9494", "#ff9191", "#ff8d8d", "#ff8989", "#ff8484", "#ff8181", "#ff7d7d", "#ff7979", "#ff7575", "#ff7171", "#ff6d6d", "#ff6969", "#ff6565", "#ff6161", "#ff5d5d", "#ff5959", "#ff5555", "#ff5151", "#ff4d4d", "#ff4949", "#ff4545", "#ff4141", "#ff3d3d", "#ff3838", "#ff3535", "#ff3030", "#ff2d2d", "#ff2828", "#ff2525", "#ff2020", "#ff1d1d", "#ff1818", "#ff1515", "#ff1010", "#ff0d0d", "#ff0808", "#ff0505", "#ff0000", "#fd0000", "#fb0000", "#f90000", "#f70000", "#f50000", "#f30000", "#f10000", "#ef0000", "#ed0000", "#eb0000", "#e90000", "#e70000", "#e50000", "#e30000", "#e10000", "#df0000", "#dd0000", "#db0000", "#d90000", "#d70000", "#d50000", "#d30000", "#d10000", "#cf0000", "#cd0000", "#cb0000", "#c90000", "#c70000", "#c50000", "#c30000", "#c10000", "#bf0000", "#bd0000", "#bb0000", "#b90000", "#b70000", "#b50000", "#b30000", "#b10000", "#af0000", "#ad0000", "#ab0000", "#a90000", "#a70000", "#a50000", "#a30000", "#a10000", "#9f0000", "#9d0000", "#9b0000", "#990000", "#970000", "#950000", "#930000", "#910000", "#8f0000", "#8d0000", "#8b0000", "#890000", "#870000", "#850000", "#830000", "#810000", "#7f0000" ], "spring": [ "#ff00ff", "#ff01fe", "#ff02fd", "#ff03fc", "#ff04fb", "#ff05fa", "#ff06f9", "#ff07f8", "#ff08f7", "#ff09f6", "#ff0af5", "#ff0bf4", "#ff0cf3", "#ff0df2", "#ff0ef1", "#ff0ff0", "#ff10ef", "#ff11ee", "#ff12ed", "#ff13ec", "#ff14eb", "#ff15ea", "#ff16e9", "#ff17e8", "#ff18e7", "#ff19e6", "#ff1ae5", "#ff1be4", "#ff1ce3", "#ff1de2", "#ff1ee1", "#ff1fe0", "#ff20df", "#ff20de", "#ff22dd", "#ff23dc", "#ff24db", "#ff24da", "#ff26d9", "#ff27d8", "#ff28d7", "#ff28d6", "#ff2ad5", "#ff2bd3", "#ff2cd3", "#ff2cd2", "#ff2ed1", "#ff2fd0", "#ff30cf", "#ff30ce", "#ff32cd", "#ff33cc", "#ff34cb", "#ff34ca", "#ff36c9", "#ff37c8", "#ff38c7", "#ff38c6", "#ff3ac5", "#ff3bc3", "#ff3cc3", "#ff3cc2", "#ff3ec1", "#ff3fc0", "#ff40bf", "#ff41be", "#ff41bd", "#ff43bc", "#ff44bb", "#ff45ba", "#ff46b9", "#ff47b8", "#ff48b7", "#ff49b6", "#ff49b5", "#ff4bb3", "#ff4cb3", "#ff4db2", "#ff4eb1", "#ff4fb0", "#ff50af", "#ff51ae", "#ff51ad", "#ff53ac", "#ff54ab", "#ff55aa", "#ff56a9", "#ff57a8", "#ff58a7", "#ff59a6", "#ff59a5", "#ff5ba3", "#ff5ca3", "#ff5da2", "#ff5ea1", "#ff5fa0", "#ff609f", "#ff619e", "#ff619d", "#ff639c", "#ff649b", "#ff659a", "#ff6699", "#ff6798", "#ff6897", "#ff6996", "#ff6995", "#ff6b93", "#ff6c93", "#ff6d92", "#ff6e91", "#ff6f90", "#ff708f", "#ff718e", "#ff718d", "#ff738c", "#ff748b", "#ff758a", "#ff7689", "#ff7788", "#ff7887", "#ff7986", "#ff7985", "#ff7b83", "#ff7c83", "#ff7d82", "#ff7e81", "#ff7f80", "#ff807f", "#ff817e", "#ff827d", "#ff837c", "#ff837b", "#ff8579", "#ff8679", "#ff8778", "#ff8877", "#ff8976", "#ff8a75", "#ff8b74", "#ff8c72", "#ff8d71", "#ff8e71", "#ff8f70", "#ff906f", "#ff916e", "#ff926d", "#ff936c", "#ff936b", "#ff9569", "#ff9669", "#ff9768", "#ff9867", "#ff9966", "#ff9a65", "#ff9b64", "#ff9c62", "#ff9d61", "#ff9e61", "#ff9f60", "#ffa05f", "#ffa15e", "#ffa25d", "#ffa35c", "#ffa35b", "#ffa559", "#ffa659", "#ffa758", "#ffa857", "#ffa956", "#ffaa55", "#ffab54", "#ffac52", "#ffad51", "#ffae51", "#ffaf50", "#ffb04f", "#ffb14e", "#ffb24d", "#ffb34c", "#ffb34b", "#ffb549", "#ffb649", "#ffb748", "#ffb847", "#ffb946", "#ffba45", "#ffbb44", "#ffbc42", "#ffbd41", "#ffbe41", "#ffbf40", "#ffc03f", "#ffc13e", "#ffc23d", "#ffc33c", "#ffc33b", "#ffc539", "#ffc638", "#ffc738", "#ffc837", "#ffc936", "#ffca35", "#ffcb34", "#ffcc32", "#ffcd31", "#ffce30", "#ffcf30", "#ffd02f", "#ffd12e", "#ffd22d", "#ffd32c", "#ffd32b", "#ffd529", "#ffd628", "#ffd728", "#ffd827", "#ffd926", "#ffda25", "#ffdb24", "#ffdc22", "#ffdd21", "#ffde20", "#ffdf20", "#ffe01f", "#ffe11e", "#ffe21d", "#ffe31c", "#ffe31b", "#ffe519", "#ffe618", "#ffe718", "#ffe817", "#ffe916", "#ffea15", "#ffeb14", "#ffec12", "#ffed11", "#ffee10", "#ffef10", "#fff00f", "#fff10e", "#fff20d", "#fff30c", "#fff30b", "#fff509", "#fff608", "#fff708", "#fff807", "#fff906", "#fffa05", "#fffb04", "#fffc02", "#fffd01", "#fffe00", "#ffff00" ], "summer": [ "#007f66", "#018066", "#028066", "#038166", "#048166", "#058266", "#068266", "#078366", "#088366", "#098466", "#0a8466", "#0b8566", "#0c8566", "#0d8666", "#0e8666", "#0f8766", "#108766", "#118866", "#128866", "#138966", "#148966", "#158a66", "#168a66", "#178b66", "#188b66", "#198c66", "#1a8c66", "#1b8d66", "#1c8d66", "#1d8e66", "#1e8e66", "#1f8f66", "#208f66", "#209066", "#229066", "#239166", "#249166", "#249266", "#269266", "#279366", "#289366", "#289366", "#2a9466", "#2b9566", "#2c9566", "#2c9666", "#2e9666", "#2f9766", "#309766", "#309866", "#329866", "#339966", "#349966", "#349a66", "#369a66", "#379b66", "#389b66", "#389c66", "#3a9c66", "#3b9d66", "#3c9d66", "#3c9e66", "#3e9e66", "#3f9f66", "#409f66", "#41a066", "#41a066", "#43a166", "#44a166", "#45a266", "#46a266", "#47a366", "#48a366", "#49a366", "#49a466", "#4ba566", "#4ca566", "#4da666", "#4ea666", "#4fa766", "#50a766", "#51a866", "#51a866", "#53a966", "#54a966", "#55aa66", "#56aa66", "#57ab66", "#58ab66", "#59ac66", "#59ac66", "#5bad66", "#5cad66", "#5dae66", "#5eae66", "#5faf66", "#60af66", "#61b066", "#61b066", "#63b166", "#64b166", "#65b266", "#66b266", "#67b366", "#68b366", "#69b366", "#69b466", "#6bb566", "#6cb566", "#6db666", "#6eb666", "#6fb766", "#70b766", "#71b866", "#71b866", "#73b966", "#74b966", "#75ba66", "#76ba66", "#77bb66", "#78bb66", "#79bc66", "#79bc66", "#7bbd66", "#7cbd66", "#7dbe66", "#7ebe66", "#7fbf66", "#80bf66", "#81c066", "#82c066", "#83c166", "#83c166", "#85c266", "#86c266", "#87c366", "#88c366", "#89c366", "#8ac466", "#8bc466", "#8cc566", "#8dc666", "#8ec666", "#8fc766", "#90c766", "#91c866", "#92c866", "#93c966", "#93c966", "#95ca66", "#96ca66", "#97cb66", "#98cb66", "#99cc66", "#9acc66", "#9bcd66", "#9ccd66", "#9dce66", "#9ece66", "#9fcf66", "#a0cf66", "#a1d066", "#a2d066", "#a3d166", "#a3d166", "#a5d266", "#a6d266", "#a7d366", "#a8d366", "#a9d366", "#aad466", "#abd466", "#acd566", "#add666", "#aed666", "#afd766", "#b0d766", "#b1d866", "#b2d866", "#b3d966", "#b3d966", "#b5da66", "#b6da66", "#b7db66", "#b8db66", "#b9dc66", "#badc66", "#bbdd66", "#bcdd66", "#bdde66", "#bede66", "#bfdf66", "#c0df66", "#c1e066", "#c2e066", "#c3e166", "#c3e166", "#c5e266", "#c6e266", "#c7e366", "#c8e366", "#c9e366", "#cae466", "#cbe466", "#cce566", "#cde666", "#cee666", "#cfe766", "#d0e766", "#d1e866", "#d2e866", "#d3e966", "#d3e966", "#d5ea66", "#d6ea66", "#d7eb66", "#d8eb66", "#d9ec66", "#daec66", "#dbed66", "#dced66", "#ddee66", "#deee66", "#dfef66", "#e0ef66", "#e1f066", "#e2f066", "#e3f166", "#e3f166", "#e5f266", "#e6f266", "#e7f366", "#e8f366", "#e9f366", "#eaf466", "#ebf466", "#ecf566", "#edf666", "#eef666", "#eff766", "#f0f766", "#f1f866", "#f2f866", "#f3f966", "#f3f966", "#f5fa66", "#f6fa66", "#f7fb66", "#f8fb66", "#f9fc66", "#fafc66", "#fbfd66", "#fcfd66", "#fdfe66", "#fefe66", "#ffff66" ], "tab10": [ "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf" ], "tab20": [ "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5" ], "tab20b": [ "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6" ], "tab20c": [ "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9" ], "terrain": [ "#333399", "#31359b", "#30389e", "#2f3ba1", "#2d3da3", "#2c40a6", "#2b43a9", "#2945ab", "#2848ae", "#274bb1", "#254db3", "#2450b6", "#2353b9", "#2155bb", "#2058be", "#1f5bc1", "#1d5dc3", "#1c60c6", "#1b62c9", "#1965cb", "#1868ce", "#176bd1", "#156dd3", "#1470d6", "#1373d9", "#1175db", "#1078de", "#0e7be1", "#0d7de3", "#0c80e6", "#0b83e9", "#0985eb", "#0888ee", "#078af1", "#058df3", "#0490f6", "#0393f9", "#0195fb", "#0098fe", "#009afa", "#009cf4", "#009eee", "#00a0e8", "#00a2e2", "#00a4dc", "#00a6d6", "#00a8d0", "#00aaca", "#00acc4", "#00aebe", "#00b0b8", "#00b2b2", "#00b4ac", "#00b6a6", "#00b8a0", "#00ba9a", "#00bc94", "#00be8e", "#00c088", "#00c282", "#00c47c", "#00c676", "#00c870", "#00ca6a", "#01cc66", "#05cd67", "#08cd67", "#0dce68", "#11cf69", "#15d06a", "#19d16b", "#1dd16b", "#21d26c", "#25d36d", "#28d46e", "#2dd56f", "#31d56f", "#35d670", "#39d771", "#3dd872", "#41d973", "#45d973", "#48da74", "#4ddb75", "#51dc76", "#55dd77", "#59dd77", "#5dde78", "#61df79", "#65e07a", "#68e17a", "#6de17b", "#71e27c", "#75e37d", "#79e47e", "#7de57f", "#81e57f", "#85e680", "#88e781", "#8de882", "#91e983", "#95e983", "#99ea84", "#9deb85", "#a1ec86", "#a5ed87", "#a8ed87", "#adee88", "#b1ef89", "#b5f08a", "#b9f18b", "#bdf18b", "#c1f28c", "#c5f38d", "#c8f48e", "#cdf58f", "#d1f58f", "#d5f690", "#d9f791", "#ddf892", "#e1f993", "#e5f993", "#e8fa94", "#edfb95", "#f1fc96", "#f5fd97", "#f9fd97", "#fdfe98", "#fefd98", "#fcfb97", "#faf896", "#f8f695", "#f6f394", "#f4f093", "#f2ee91", "#f0eb90", "#eee98f", "#ece68e", "#eae48d", "#e8e18c", "#e6df8b", "#e4dc8a", "#e2d989", "#e0d788", "#ded487", "#dcd286", "#dacf85", "#d8cd83", "#d6ca82", "#d3c781", "#d2c580", "#d0c27f", "#cec07e", "#ccbd7d", "#cabb7c", "#c8b87b", "#c6b67a", "#c3b379", "#c2b078", "#c0ae76", "#beab75", "#bca974", "#baa673", "#b8a472", "#b6a171", "#b39f70", "#b29c6f", "#b0996e", "#ae976d", "#ac946c", "#aa926b", "#a88f6a", "#a68d68", "#a38a67", "#a28766", "#a08565", "#9e8264", "#9c8063", "#9a7d62", "#987b61", "#967860", "#93765f", "#92735e", "#90705d", "#8e6e5b", "#8c6b5a", "#8a6959", "#886658", "#866457", "#836156", "#825f55", "#805c54", "#815d56", "#836058", "#85625b", "#87655e", "#886760", "#8b6a63", "#8d6d66", "#8f6f68", "#91726b", "#93746e", "#957770", "#977973", "#997c76", "#9b7f79", "#9d817b", "#9f847e", "#a18681", "#a38983", "#a58b86", "#a78e89", "#a8908b", "#ab938e", "#ad9691", "#af9893", "#b19b96", "#b39d99", "#b5a09b", "#b7a29e", "#b9a5a1", "#bba7a3", "#bdaaa6", "#bfada9", "#c1afab", "#c3b2ae", "#c4b4b1", "#c7b7b3", "#c8b9b6", "#cbbcb9", "#cdbfbb", "#cfc1be", "#d1c4c1", "#d3c6c4", "#d4c9c6", "#d7cbc9", "#d9cecc", "#dbd0ce", "#ddd3d1", "#dfd6d4", "#e1d8d6", "#e3dbd9", "#e4dddc", "#e7e0de", "#e8e2e1", "#ebe5e4", "#ede7e6", "#efeae9", "#f1edec", "#f3efee", "#f4f2f1", "#f7f4f4", "#f9f7f6", "#fbf9f9", "#fdfcfc", "#ffffff" ], "twilight": [ "#e1d8e2", "#e0d9e2", "#dfd9e1", "#ded9e0", "#ddd9e0", "#dbd8df", "#d9d8de", "#d8d7dd", "#d6d6dc", "#d4d6db", "#d2d5da", "#cfd4d9", "#cdd2d8", "#cad1d7", "#c7d0d6", "#c5cfd4", "#c2cdd3", "#bfccd2", "#bccad1", "#b9c9d0", "#b6c7cf", "#b3c6ce", "#b0c4cd", "#adc3cc", "#aac1cb", "#a7c0ca", "#a4beca", "#a1bcc9", "#9ebbc8", "#9bb9c8", "#98b7c7", "#96b5c6", "#93b4c6", "#90b2c5", "#8eb0c5", "#8baec5", "#89acc4", "#86abc4", "#84a9c3", "#82a7c3", "#80a5c3", "#7ea3c2", "#7ca1c2", "#7a9fc2", "#789dc1", "#769bc1", "#749ac1", "#7398c0", "#7196c0", "#6f94c0", "#6e92bf", "#6d90bf", "#6b8ebf", "#6a8bbe", "#6989be", "#6887be", "#6785bd", "#6683bd", "#6581bd", "#647fbc", "#647dbc", "#637bbb", "#6278bb", "#6276ba", "#6174ba", "#6172b9", "#6070b8", "#606db8", "#606bb7", "#5f69b6", "#5f67b6", "#5f64b5", "#5f62b4", "#5f60b3", "#5e5db2", "#5e5bb1", "#5e59b0", "#5e56af", "#5e54ae", "#5e51ad", "#5e4fac", "#5e4daa", "#5e4aa9", "#5d48a7", "#5d45a6", "#5d43a4", "#5d40a3", "#5d3ea1", "#5c3c9f", "#5c399d", "#5c379b", "#5b3499", "#5b3297", "#5a3095", "#5a2d92", "#592b90", "#59298d", "#58278b", "#572488", "#562285", "#552182", "#541f7f", "#531d7c", "#521b78", "#501a75", "#4f1972", "#4d176e", "#4c166b", "#4a1567", "#491564", "#471460", "#45135d", "#44125a", "#421257", "#401154", "#3e1151", "#3d114e", "#3b114b", "#3a1048", "#381046", "#371043", "#361041", "#34103f", "#33113d", "#32113b", "#32113a", "#301238", "#2f1337", "#2f1336", "#311236", "#321237", "#331137", "#351138", "#361138", "#371139", "#391139", "#3b113a", "#3d113b", "#3f113c", "#41113d", "#43123e", "#45123f", "#471240", "#4a1341", "#4c1342", "#4f1443", "#511444", "#541545", "#561546", "#591647", "#5c1648", "#5e1749", "#61184a", "#63184b", "#66194c", "#691a4c", "#6b1a4d", "#6e1b4e", "#711c4e", "#731d4e", "#761e4f", "#781f4f", "#7b204f", "#7d2150", "#802350", "#822450", "#842550", "#872750", "#892850", "#8b2a50", "#8d2c50", "#902d50", "#922f4f", "#94314f", "#96324f", "#98344f", "#9a364f", "#9b384f", "#9d3a4f", "#9f3c4f", "#a13e4f", "#a2404f", "#a4424f", "#a6444f", "#a7464f", "#a94950", "#aa4b50", "#ac4d50", "#ad4f50", "#af5151", "#b05451", "#b25652", "#b35852", "#b45a53", "#b55d53", "#b65f54", "#b86155", "#b96456", "#ba6657", "#bb6857", "#bc6b59", "#bd6d5a", "#be705b", "#bf725c", "#c0745d", "#c0775f", "#c17960", "#c27c62", "#c37e64", "#c38166", "#c48368", "#c5866a", "#c5886c", "#c68b6e", "#c78d70", "#c78f72", "#c89275", "#c89478", "#c9977a", "#c9997d", "#ca9c80", "#ca9e83", "#cba185", "#cca389", "#cca58c", "#cda88f", "#cdaa92", "#ceac95", "#cfaf99", "#cfb19c", "#d0b39f", "#d1b6a3", "#d2b8a6", "#d3baa9", "#d3bcad", "#d4beb0", "#d5c0b4", "#d6c2b7", "#d7c4bb", "#d8c6be", "#d9c8c1", "#dacac4", "#dbccc8", "#dbcecb", "#dccfcd", "#ddd1d0", "#ded2d3", "#ded3d5", "#dfd5d7", "#dfd6d9", "#e0d6db", "#e0d7dd", "#e1d8de", "#e1d8df", "#e1d8e1", "#e1d8e1" ], "twilight_shifted": [ "#2f1337", "#301238", "#32113a", "#32113b", "#33113d", "#34103f", "#361041", "#371043", "#381046", "#3a1048", "#3b114b", "#3d114e", "#3e1151", "#401154", "#421257", "#44125a", "#45135d", "#471460", "#491564", "#4a1567", "#4c166b", "#4d176e", "#4f1972", "#501a75", "#521b78", "#531d7c", "#541f7f", "#552182", "#562285", "#572488", "#58278b", "#59298d", "#592b90", "#5a2d92", "#5a3095", "#5b3297", "#5b3499", "#5c379b", "#5c399d", "#5c3c9f", "#5d3ea1", "#5d40a3", "#5d43a4", "#5d45a6", "#5d48a7", "#5e4aa9", "#5e4daa", "#5e4fac", "#5e51ad", "#5e54ae", "#5e56af", "#5e59b0", "#5e5bb1", "#5e5db2", "#5f60b3", "#5f62b4", "#5f64b5", "#5f67b6", "#5f69b6", "#606bb7", "#606db8", "#6070b8", "#6172b9", "#6174ba", "#6276ba", "#6278bb", "#637bbb", "#647dbc", "#647fbc", "#6581bd", "#6683bd", "#6785bd", "#6887be", "#6989be", "#6a8bbe", "#6b8ebf", "#6d90bf", "#6e92bf", "#6f94c0", "#7196c0", "#7398c0", "#749ac1", "#769bc1", "#789dc1", "#7a9fc2", "#7ca1c2", "#7ea3c2", "#80a5c3", "#82a7c3", "#84a9c3", "#86abc4", "#89acc4", "#8baec5", "#8eb0c5", "#90b2c5", "#93b4c6", "#96b5c6", "#98b7c7", "#9bb9c8", "#9ebbc8", "#a1bcc9", "#a4beca", "#a7c0ca", "#aac1cb", "#adc3cc", "#b0c4cd", "#b3c6ce", "#b6c7cf", "#b9c9d0", "#bccad1", "#bfccd2", "#c2cdd3", "#c5cfd4", "#c7d0d6", "#cad1d7", "#cdd2d8", "#cfd4d9", "#d2d5da", "#d4d6db", "#d6d6dc", "#d8d7dd", "#d9d8de", "#dbd8df", "#ddd9e0", "#ded9e0", "#dfd9e1", "#e0d9e2", "#e1d8e2", "#e1d8e1", "#e1d8df", "#e1d8de", "#e0d7dd", "#e0d6db", "#dfd6d9", "#dfd5d7", "#ded3d5", "#ded2d3", "#ddd1d0", "#dccfcd", "#dbcecb", "#dbccc8", "#dacac4", "#d9c8c1", "#d8c6be", "#d7c4bb", "#d6c2b7", "#d5c0b4", "#d4beb0", "#d3bcad", "#d3baa9", "#d2b8a6", "#d1b6a3", "#d0b39f", "#cfb19c", "#cfaf99", "#ceac95", "#cdaa92", "#cda88f", "#cca58c", "#cca389", "#cba185", "#ca9e83", "#ca9c80", "#c9997d", "#c9977a", "#c89478", "#c89275", "#c78f72", "#c78d70", "#c68b6e", "#c5886c", "#c5866a", "#c48368", "#c38166", "#c37e64", "#c27c62", "#c17960", "#c0775f", "#c0745d", "#bf725c", "#be705b", "#bd6d5a", "#bc6b59", "#bb6857", "#ba6657", "#b96456", "#b86155", "#b65f54", "#b55d53", "#b45a53", "#b35852", "#b25652", "#b05451", "#af5151", "#ad4f50", "#ac4d50", "#aa4b50", "#a94950", "#a7464f", "#a6444f", "#a4424f", "#a2404f", "#a13e4f", "#9f3c4f", "#9d3a4f", "#9b384f", "#9a364f", "#98344f", "#96324f", "#94314f", "#922f4f", "#902d50", "#8d2c50", "#8b2a50", "#892850", "#872750", "#842550", "#822450", "#802350", "#7d2150", "#7b204f", "#781f4f", "#761e4f", "#731d4e", "#711c4e", "#6e1b4e", "#6b1a4d", "#691a4c", "#66194c", "#63184b", "#61184a", "#5e1749", "#5c1648", "#591647", "#561546", "#541545", "#511444", "#4f1443", "#4c1342", "#4a1341", "#471240", "#45123f", "#43123e", "#41113d", "#3f113c", "#3d113b", "#3b113a", "#391139", "#371139", "#361138", "#351138", "#331137", "#321237", "#311236", "#2f1336", "#2f1436" ], "viridis": [ "#440154", "#440255", "#440357", "#450558", "#45065a", "#45085b", "#46095c", "#460b5e", "#460c5f", "#460e61", "#470f62", "#471163", "#471265", "#471466", "#471567", "#471669", "#47186a", "#48196b", "#481a6c", "#481c6e", "#481d6f", "#481e70", "#482071", "#482172", "#482273", "#482374", "#472575", "#472676", "#472777", "#472878", "#472a79", "#472b7a", "#472c7b", "#462d7c", "#462f7c", "#46307d", "#46317e", "#45327f", "#45347f", "#453580", "#453681", "#443781", "#443982", "#433a83", "#433b83", "#433c84", "#423d84", "#423e85", "#424085", "#414186", "#414286", "#404387", "#404487", "#3f4587", "#3f4788", "#3e4888", "#3e4989", "#3d4a89", "#3d4b89", "#3d4c89", "#3c4d8a", "#3c4e8a", "#3b508a", "#3b518a", "#3a528b", "#3a538b", "#39548b", "#39558b", "#38568b", "#38578c", "#37588c", "#37598c", "#365a8c", "#365b8c", "#355c8c", "#355d8c", "#345e8d", "#345f8d", "#33608d", "#33618d", "#32628d", "#32638d", "#31648d", "#31658d", "#31668d", "#30678d", "#30688d", "#2f698d", "#2f6a8d", "#2e6b8e", "#2e6c8e", "#2e6d8e", "#2d6e8e", "#2d6f8e", "#2c708e", "#2c718e", "#2c728e", "#2b738e", "#2b748e", "#2a758e", "#2a768e", "#2a778e", "#29788e", "#29798e", "#287a8e", "#287a8e", "#287b8e", "#277c8e", "#277d8e", "#277e8e", "#267f8e", "#26808e", "#26818e", "#25828e", "#25838d", "#24848d", "#24858d", "#24868d", "#23878d", "#23888d", "#23898d", "#22898d", "#228a8d", "#228b8d", "#218c8d", "#218d8c", "#218e8c", "#208f8c", "#20908c", "#20918c", "#1f928c", "#1f938b", "#1f948b", "#1f958b", "#1f968b", "#1e978a", "#1e988a", "#1e998a", "#1e998a", "#1e9a89", "#1e9b89", "#1e9c89", "#1e9d88", "#1e9e88", "#1e9f88", "#1ea087", "#1fa187", "#1fa286", "#1fa386", "#20a485", "#20a585", "#21a685", "#21a784", "#22a784", "#23a883", "#23a982", "#24aa82", "#25ab81", "#26ac81", "#27ad80", "#28ae7f", "#29af7f", "#2ab07e", "#2bb17d", "#2cb17d", "#2eb27c", "#2fb37b", "#30b47a", "#32b57a", "#33b679", "#35b778", "#36b877", "#38b976", "#39b976", "#3bba75", "#3dbb74", "#3ebc73", "#40bd72", "#42be71", "#44be70", "#45bf6f", "#47c06e", "#49c16d", "#4bc26c", "#4dc26b", "#4fc369", "#51c468", "#53c567", "#55c666", "#57c665", "#59c764", "#5bc862", "#5ec961", "#60c960", "#62ca5f", "#64cb5d", "#67cc5c", "#69cc5b", "#6bcd59", "#6dce58", "#70ce56", "#72cf55", "#74d054", "#77d052", "#79d151", "#7cd24f", "#7ed24e", "#81d34c", "#83d34b", "#86d449", "#88d547", "#8bd546", "#8dd644", "#90d643", "#92d741", "#95d73f", "#97d83e", "#9ad83c", "#9dd93a", "#9fd938", "#a2da37", "#a5da35", "#a7db33", "#aadb32", "#addc30", "#afdc2e", "#b2dd2c", "#b5dd2b", "#b7dd29", "#bade27", "#bdde26", "#bfdf24", "#c2df22", "#c5df21", "#c7e01f", "#cae01e", "#cde01d", "#cfe11c", "#d2e11b", "#d4e11a", "#d7e219", "#dae218", "#dce218", "#dfe318", "#e1e318", "#e4e318", "#e7e419", "#e9e419", "#ece41a", "#eee51b", "#f1e51c", "#f3e51e", "#f6e61f", "#f8e621", "#fae622", "#fde724" ], "winter": [ "#0000ff", "#0001fe", "#0002fe", "#0003fd", "#0004fd", "#0005fc", "#0006fc", "#0007fb", "#0008fb", "#0009fa", "#000afa", "#000bf9", "#000cf9", "#000df8", "#000ef8", "#000ff7", "#0010f7", "#0011f6", "#0012f6", "#0013f5", "#0014f5", "#0015f4", "#0016f4", "#0017f3", "#0018f3", "#0019f2", "#001af2", "#001bf1", "#001cf1", "#001df0", "#001ef0", "#001fef", "#0020ef", "#0020ee", "#0022ee", "#0023ed", "#0024ed", "#0024ec", "#0026ec", "#0027eb", "#0028eb", "#0028ea", "#002aea", "#002be9", "#002ce9", "#002ce8", "#002ee8", "#002fe7", "#0030e7", "#0030e6", "#0032e6", "#0033e5", "#0034e5", "#0034e4", "#0036e4", "#0037e3", "#0038e3", "#0038e2", "#003ae2", "#003be1", "#003ce1", "#003ce0", "#003ee0", "#003fdf", "#0040df", "#0041de", "#0041de", "#0043dd", "#0044dd", "#0045dc", "#0046dc", "#0047db", "#0048db", "#0049da", "#0049da", "#004bd9", "#004cd9", "#004dd8", "#004ed8", "#004fd7", "#0050d7", "#0051d6", "#0051d6", "#0053d5", "#0054d5", "#0055d4", "#0056d3", "#0057d3", "#0058d3", "#0059d2", "#0059d2", "#005bd1", "#005cd1", "#005dd0", "#005ed0", "#005fcf", "#0060cf", "#0061ce", "#0061ce", "#0063cd", "#0064cd", "#0065cc", "#0066cc", "#0067cb", "#0068cb", "#0069ca", "#0069ca", "#006bc9", "#006cc9", "#006dc8", "#006ec8", "#006fc7", "#0070c7", "#0071c6", "#0071c6", "#0073c5", "#0074c5", "#0075c4", "#0076c3", "#0077c3", "#0078c3", "#0079c2", "#0079c2", "#007bc1", "#007cc1", "#007dc0", "#007ec0", "#007fbf", "#0080bf", "#0081be", "#0082be", "#0083bd", "#0083bd", "#0085bc", "#0086bc", "#0087bb", "#0088bb", "#0089ba", "#008aba", "#008bb9", "#008cb9", "#008db8", "#008eb8", "#008fb7", "#0090b7", "#0091b6", "#0092b6", "#0093b5", "#0093b5", "#0095b4", "#0096b3", "#0097b3", "#0098b3", "#0099b2", "#009ab2", "#009bb1", "#009cb1", "#009db0", "#009eb0", "#009faf", "#00a0af", "#00a1ae", "#00a2ae", "#00a3ad", "#00a3ad", "#00a5ac", "#00a6ac", "#00a7ab", "#00a8ab", "#00a9aa", "#00aaaa", "#00aba9", "#00aca9", "#00ada8", "#00aea8", "#00afa7", "#00b0a7", "#00b1a6", "#00b2a6", "#00b3a5", "#00b3a5", "#00b5a4", "#00b6a3", "#00b7a3", "#00b8a3", "#00b9a2", "#00baa2", "#00bba1", "#00bca1", "#00bda0", "#00bea0", "#00bf9f", "#00c09f", "#00c19e", "#00c29e", "#00c39d", "#00c39d", "#00c59c", "#00c69c", "#00c79b", "#00c89b", "#00c99a", "#00ca9a", "#00cb99", "#00cc99", "#00cd98", "#00ce98", "#00cf97", "#00d097", "#00d196", "#00d296", "#00d395", "#00d395", "#00d594", "#00d693", "#00d793", "#00d893", "#00d992", "#00da92", "#00db91", "#00dc91", "#00dd90", "#00de90", "#00df8f", "#00e08f", "#00e18e", "#00e28e", "#00e38d", "#00e38d", "#00e58c", "#00e68c", "#00e78b", "#00e88b", "#00e98a", "#00ea8a", "#00eb89", "#00ec89", "#00ed88", "#00ee88", "#00ef87", "#00f087", "#00f186", "#00f286", "#00f385", "#00f385", "#00f584", "#00f683", "#00f783", "#00f883", "#00f982", "#00fa82", "#00fb81", "#00fc81", "#00fd80", "#00fe80", "#00ff7f" ] } vedo-2025.5.3/vedo/colors.py000066400000000000000000001047441474667405700155530ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys import time import numpy as np import vedo.vtkclasses as vtki import vedo __docformat__ = "google" __doc__ = """ Colors definitions and printing methods. ![](https://vedo.embl.es/images/basic/colorcubes.png) """ __all__ = [ "printc", "printd", "get_color", "get_color_name", "color_map", "build_palette", "build_lut", ] try: import matplotlib try: matplotlib.colormaps # v3.4 will fail this _has_matplotlib = True cmaps = {} except AttributeError: _has_matplotlib = False except ModuleNotFoundError: from vedo.cmaps import cmaps _has_matplotlib = False # see below, this is dealt with in color_map() # print("colors.py: _has_matplotlib", _has_matplotlib) ######################################################### # handy global shortcuts for terminal printing # Ex.: print(colors.red + "hello" + colors.reset) ######################################################### red = "\x1b[1m\x1b[31;1m" green = "\x1b[1m\x1b[32;1m" yellow = "\x1b[1m\x1b[33;1m" blue = "\x1b[1m\x1b[34;1m" reset = "\x1b[0m" ######################################################### # basic color schemes ######################################################### colors = { # order kind of matters because of pyplot.plot() "blue9": "#a8cbfe", # bootstrap5 colors "blue8": "#81b4fe", "blue7": "#5a9cfe", "blue6": "#3485fd", "blue5": "#0d6efd", "blue4": "#0b5cd5", "blue3": "#094bac", "blue2": "#073984", "blue1": "#05285b", "indigo9": "#c8a9fa", "indigo8": "#af83f8", "indigo7": "#975cf6", "indigo6": "#7e36f4", "indigo5": "#6610f2", "indigo4": "#560dcb", "indigo3": "#450ba5", "indigo2": "#35087e", "indigo1": "#250657", "purple9": "#cbbbe9", "purple8": "#b49ddf", "purple7": "#9d7ed5", "purple6": "#8660cb", "purple5": "#6f42c1", "purple4": "#5d37a2", "purple3": "#4b2d83", "purple2": "#3a2264", "purple1": "#281845", "pink9": "#f0b6d3", "pink8": "#ea95bf", "pink7": "#e374ab", "pink6": "#dd5498", "pink5": "#d63384", "pink4": "#b42b6f", "pink3": "#92235a", "pink2": "#6f1b45", "pink1": "#4d1230", "red9": "#f2b6bc", "red8": "#ed969e", "red7": "#e77681", "red6": "#e25563", "red5": "#dc3545", "red4": "#b92d3a", "red3": "#96242f", "red2": "#721c24", "red1": "#4f1319", "orange9": "#fed1aa", "orange8": "#febc85", "orange7": "#fea75f", "orange6": "#fd933a", "orange5": "#fd7e14", "orange4": "#d56a11", "orange3": "#ac560e", "orange2": "#84420a", "orange1": "#5b2d07", "yellow9": "#ffe9a6", "yellow8": "#ffdf7e", "yellow7": "#ffd556", "yellow6": "#ffcb2f", "yellow5": "#ffc107", "yellow4": "#d6a206", "yellow3": "#ad8305", "yellow2": "#856404", "yellow1": "#5c4503", "green9": "#b2dfbc", "green8": "#8fd19e", "green7": "#6dc381", "green6": "#4ab563", "green5": "#28a745", "green4": "#228c3a", "green3": "#1b722f", "green2": "#155724", "green1": "#0e3c19", "teal9": "#afecda", "teal8": "#8be3c9", "teal7": "#67dab8", "teal6": "#44d2a8", "teal5": "#20c997", "teal4": "#1ba97f", "teal3": "#168967", "teal2": "#11694f", "teal1": "#0c4836", "cyan9": "#abdee5", "cyan8": "#86cfda", "cyan7": "#61c0cf", "cyan6": "#3cb1c3", "cyan5": "#17a2b8", "cyan4": "#13889b", "cyan3": "#106e7d", "cyan2": "#0c5460", "cyan1": "#083a42", "gray9": "#f8f9fa", "gray8": "#e9edef", "gray7": "#dee2e6", "gray6": "#ced4da", "gray5": "#adb5bd", "gray4": "#6c757d", "gray3": "#495057", "gray2": "#343a40", "gray1": "#212529", "aliceblue": "#F0F8FF", # matplotlib scheme "antiquewhite": "#FAEBD7", "aqua": "#00FFFF", "aquamarine": "#7FFFD4", "azure": "#F0FFFF", "beige": "#F5F5DC", "bisque": "#FFE4C4", "black": "#000000", "blanchedalmond": "#FFEBCD", "blue": "#0f00fb", # "0000FF", "blueviolet": "#8A2BE2", "brown": "#A52A2A", "burlywood": "#DEB887", "cadetblue": "#5F9EA0", "chartreuse": "#7FFF00", "chocolate": "#D2691E", "coral": "#FF7F50", "cornflowerblue": "#6495ED", "cornsilk": "#FFF8DC", "crimson": "#DC143C", "cyan": "#00FFFF", "darkblue": "#00008B", "darkcyan": "#008B8B", "darkgoldenrod": "#B8860B", "darkgray": "#A9A9A9", "darkgreen": "#006400", "darkkhaki": "#BDB76B", "darkmagenta": "#8B008B", "darkolivegreen": "#556B2F", "darkorange": "#FF8C00", "darkorchid": "#9932CC", "darkred": "#8B0000", "darksalmon": "#E9967A", "darkseagreen": "#8FBC8F", "darkslateblue": "#483D8B", "darkslategray": "#2F4F4F", "darkturquoise": "#00CED1", "darkviolet": "#9400D3", "deeppink": "#FF1493", "deepskyblue": "#00BFFF", "dimgray": "#696969", "dodgerblue": "#1E90FF", "firebrick": "#B22222", "floralwhite": "#FFFAF0", "forestgreen": "#228B22", "fuchsia": "#FF00FF", "gainsboro": "#DCDCDC", "ghostwhite": "#F8F8FF", "gold": "#FFD700", "goldenrod": "#DAA520", "gray": "#808080", "green": "#047f10", # "#008000", "greenyellow": "#ADFF2F", "honeydew": "#F0FFF0", "hotpink": "#FF69B4", "indianred": "#CD5C5C", "indigo": "#4B0082", "ivory": "#FFFFF0", "khaki": "#F0E68C", "lavender": "#E6E6FA", "lavenderblush": "#FFF0F5", "lawngreen": "#7CFC00", "lemonchiffon": "#FFFACD", "lightblue": "#ADD8E6", "lightcoral": "#F08080", "lightcyan": "#E0FFFF", "lightgray": "#D3D3D3", "lightgreen": "#90EE90", "lightpink": "#FFB6C1", "lightsalmon": "#FFA07A", "lightseagreen": "#20B2AA", "lightskyblue": "#87CEFA", "lightsteelblue": "#B0C4DE", "lightyellow": "#FFFFE0", "lime": "#00FF00", "limegreen": "#32CD32", "linen": "#FAF0E6", "magenta": "#FF00FF", "maroon": "#800000", "mediumaquamarine": "#66CDAA", "mediumblue": "#0000CD", "mediumorchid": "#BA55D3", "mediumpurple": "#9370DB", "mediumseagreen": "#3CB371", "mediumslateblue": "#7B68EE", "mediumspringgreen": "#00FA9A", "mediumturquoise": "#48D1CC", "mediumvioletred": "#C71585", "midnightblue": "#191970", "mintcream": "#F5FFFA", "mistyrose": "#FFE4E1", "moccasin": "#FFE4B5", "navajowhite": "#FFDEAD", "navy": "#000080", "oldlace": "#FDF5E6", "olive": "#808000", "olivedrab": "#6B8E23", "orange": "#FFA500", "orangered": "#FF4500", "orchid": "#DA70D6", "palegoldenrod": "#EEE8AA", "palegreen": "#98FB98", "paleturquoise": "#AFEEEE", "palevioletred": "#DB7093", "papayawhip": "#FFEFD5", "peachpuff": "#FFDAB9", "peru": "#CD853F", "pink": "#FFC0CB", "plum": "#DDA0DD", "powderblue": "#B0E0E6", "purple": "#800080", "rebeccapurple": "#663399", "red": "#fe1e1f", # "#FF0000", "rosybrown": "#BC8F8F", "royalblue": "#4169E1", "saddlebrown": "#8B4513", "salmon": "#FA8072", "sandybrown": "#F4A460", "seagreen": "#2E8B57", "seashell": "#FFF5EE", "sienna": "#A0522D", "silver": "#C0C0C0", "skyblue": "#87CEEB", "slateblue": "#6A5ACD", "slategray": "#708090", "snow": "#FFFAFA", "blackboard": "#393939", "springgreen": "#00FF7F", "steelblue": "#4682B4", "tan": "#D2B48C", "teal": "#008080", "thistle": "#D8BFD8", "tomato": "#FF6347", "turquoise": "#40E0D0", "violet": "#EE82EE", "wheat": "#F5DEB3", "white": "#FFFFFF", "whitesmoke": "#F5F5F5", "yellow": "#ffff36", # "#FFFF00", "yellowgreen": "#9ACD32", } color_nicks = { # color nicknames "bb": "blackboard", "lb": "lightblue", # light "lg": "lightgreen", "lr": "orangered", "lc": "lightcyan", "ls": "lightsalmon", "ly": "lightyellow", "dr": "darkred", # dark "db": "darkblue", "dg": "darkgreen", "dm": "darkmagenta", "dc": "darkcyan", "ds": "darksalmon", "dv": "darkviolet", "b1": "blue1", # bootstrap5 colors "b2": "blue2", "b3": "blue3", "b4": "blue4", "b5": "blue5", "b6": "blue6", "b7": "blue7", "b8": "blue8", "b9": "blue9", "i1": "indigo1", "i2": "indigo2", "i3": "indigo3", "i4": "indigo4", "i5": "indigo5", "i6": "indigo6", "i7": "indigo7", "i8": "indigo8", "i9": "indigo9", "p1": "purple1", "p2": "purple2", "p3": "purple3", "p4": "purple4", "p5": "purple5", "p6": "purple6", "p7": "purple7", "p8": "purple8", "p9": "purple9", "r1": "red1", "r2": "red2", "r3": "red3", "r4": "red4", "r5": "red5", "r6": "red6", "r7": "red7", "r8": "red8", "r9": "red9", "o1": "orange1", "o2": "orange2", "o3": "orange3", "o4": "orange4", "o5": "orange5", "o6": "orange6", "o7": "orange7", "o8": "orange8", "o9": "orange9", "y1": "yellow1", "y2": "yellow2", "y3": "yellow3", "y4": "yellow4", "y5": "yellow5", "y6": "yellow6", "y7": "yellow7", "y8": "yellow8", "y9": "yellow9", "g1": "green1", "g2": "green2", "g3": "green3", "g4": "green4", "g5": "green5", "g6": "green6", "g7": "green7", "g8": "green8", "g9": "green9", "k1": "gray1", "k2": "gray2", "k3": "gray3", "k4": "gray4", "k5": "gray5", "k6": "gray6", "k7": "gray7", "k8": "gray8", "k9": "gray9", "a": "aqua", "b": "blue", "c": "cyan", "d": "gold", "f": "fuchsia", "g": "green", "i": "indigo", "k": "black", "m": "magenta", "n": "navy", "l": "lavender", "o": "orange", "p": "purple", "r": "red", "s": "salmon", "t": "tomato", "v": "violet", "y": "yellow", "w": "white", } # available colormap names: cmaps_names = ( "Accent", "Accent_r", "Blues", "Blues_r", "BrBG", "BrBG_r", "BuGn", "BuGn_r", "BuPu", "BuPu_r", "CMRmap", "CMRmap_r", "Dark2", "Dark2_r", "GnBu", "GnBu_r", "Greens", "Greens_r", "Greys", "Greys_r", "OrRd", "OrRd_r", "Oranges", "Oranges_r", "PRGn", "PRGn_r", "Paired", "Paired_r", "Pastel1", "Pastel1_r", "Pastel2", "Pastel2_r", "PiYG", "PiYG_r", "PuBu", "PuBuGn", "PuBuGn_r", "PuBu_r", "PuOr", "PuOr_r", "PuRd", "PuRd_r", "Purples", "Purples_r", "RdBu", "RdBu_r", "RdGy", "RdGy_r", "RdPu", "RdPu_r", "RdYlBu", "RdYlBu_r", "RdYlGn", "RdYlGn_r", "Reds", "Reds_r", "Set1", "Set1_r", "Set2", "Set2_r", "Set3", "Set3_r", "Spectral", "Spectral_r", "Wistia", "Wistia_r", "YlGn", "YlGnBu", "YlGnBu_r", "YlGn_r", "YlOrBr", "YlOrBr_r", "YlOrRd", "YlOrRd_r", "afmhot", "afmhot_r", "autumn", "autumn_r", "binary", "binary_r", "bone", "bone_r", "brg", "brg_r", "bwr", "bwr_r", "cividis", "cividis_r", "cool", "cool_r", "coolwarm", "coolwarm_r", "copper", "copper_r", "cubehelix", "cubehelix_r", "flag", "flag_r", "gist_earth", "gist_earth_r", "gist_gray", "gist_gray_r", "gist_heat", "gist_heat_r", "gist_ncar", "gist_ncar_r", "gist_rainbow", "gist_rainbow_r", "gist_stern", "gist_stern_r", "gist_yarg", "gist_yarg_r", "gnuplot", "gnuplot2", "gnuplot2_r", "gnuplot_r", "gray_r", "hot", "hot_r", "hsv", "hsv_r", "inferno", "inferno_r", "jet", "jet_r", "magma", "magma_r", "nipy_spectral", "nipy_spectral_r", "ocean", "ocean_r", "pink_r", "plasma", "plasma_r", "prism", "prism_r", "rainbow", "rainbow_r", "seismic", "seismic_r", "spring", "spring_r", "summer", "summer_r", "tab10", "tab10_r", "tab20", "tab20_r", "tab20b", "tab20b_r", "tab20c", "tab20c_r", "terrain", "terrain_r", "twilight", "twilight_r", "twilight_shifted", "twilight_shifted_r", "viridis", "viridis_r", "winter", "winter_r", ) # default color palettes when using an index palettes = ( ( [1. , 0.75686275, 0.02745098], # yellow5 [0.99215686, 0.49411765, 0.07843137], # orange5 [0.8627451 , 0.20784314, 0.27058824], # red5 [0.83921569, 0.2 , 0.51764706], # pink5 [0.1254902 , 0.78823529, 0.59215686], # teal5 [0.15686275, 0.65490196, 0.27058824], # green5 [0.09019608, 0.63529412, 0.72156863], # cyan5 [0.05098039, 0.43137255, 0.99215686], # blue5 [0.4 , 0.0627451 , 0.94901961], # indigo5 [0.67843137, 0.70980392, 0.74117647], # gray5 ), ( (1.0, 0.832, 0.000), # gold (0.960, 0.509, 0.188), (0.901, 0.098, 0.194), (0.235, 0.85, 0.294), (0.46, 0.48, 0.000), (0.274, 0.941, 0.941), (0.0, 0.509, 0.784), (0.1, 0.1, 0.900), (0.902, 0.7, 1.000), (0.941, 0.196, 0.901), ), ( (1.0, 0.832, 0), # gold (0.59, 0.0, 0.09), # dark red (0.5, 0.5, 0), # yellow-green (0.0, 0.66, 0.42), # green blue (0.5, 1.0, 0.0), # green (0.0, 0.18, 0.65), # blue (0.4, 0.0, 0.4), # plum (0.4, 0.0, 0.6), (0.2, 0.4, 0.6), (0.1, 0.3, 0.2), ), ( (0.010, 0.0706, 0.098), # -> black (0.0196, 0.369, 0.447), (0.0745, 0.573, 0.584), (0.584, 0.820, 0.741), (0.914, 0.847, 0.663), (0.929, 0.616, 0.149), (0.788, 0.412, 0.110), (0.729, 0.259, 0.0902), (0.678, 0.153, 0.110), (0.604, 0.153, 0.165), # -> red3 ), ( (0.345, 0.188, 0.071), # -> orange1 (0.498, 0.314, 0.161), (0.573, 0.404, 0.239), (0.651, 0.545, 0.400), (0.714, 0.678, 0.569), (0.761, 0.773, 0.671), (0.643, 0.675, 0.533), (0.396, 0.427, 0.298), (0.255, 0.282, 0.204), (0.200, 0.239, 0.165), # -> blackboard ), ( (0.937, 0.969, 0.820), # -> beige (0.729, 0.851, 0.714), (0.671, 0.639, 0.396), (0.447, 0.180, 0.180), (0.259, 0.055, 0.082), # -> red1 (0.937, 0.969, 0.820), # -> beige (0.729, 0.851, 0.714), (0.671, 0.639, 0.396), (0.447, 0.180, 0.180), (0.259, 0.055, 0.082), # -> red1 ), ( (0.933, 0.298, 0.443), # -> red6 (0.996, 0.824, 0.431), (0.082, 0.835, 0.631), (0.094, 0.537, 0.690), (0.035, 0.231, 0.294), # -> cyan1 (0.933, 0.298, 0.443), # -> red6 (0.996, 0.824, 0.431), (0.082, 0.835, 0.631), (0.094, 0.537, 0.690), (0.035, 0.231, 0.294), # -> cyan1 ), ) emoji = { ":bomb:": "\U0001F4A5", ":sparks:": "\U00002728", ":thumbup:": "\U0001F44D", ":target:": "\U0001F3AF", ":save:": "\U0001F4BE", ":noentry:": "\U000026D4", ":video:": "\U0001F4FD", ":lightning:": "\U000026A1", ":camera:": "\U0001F4F8", ":times:": "\U0000274C", ":world:": "\U0001F30D", ":rainbow:": "\U0001F308", ":idea:": "\U0001F4A1", ":pin:": "\U0001F4CC", ":construction:": "\U0001F6A7", ":rocket:": "\U0001F680", ":hourglass:": "\U000023F3", ":prohibited:": "\U0001F6AB", ":checked:": "\U00002705", ":smile:": "\U0001F642", ":sad:": "\U0001F612", ":star:": "\U00002B50", ":zzz:": "\U0001F4A4", ":mu:": "\U000003BC", ":pi:": "\U000003C0", ":sigma:": "\U000003C3", ":rightarrow:": "\U000027A1", } # terminal or notebook can do color print def _has_colors(stream): try: import IPython return True except: pass if not hasattr(stream, "isatty"): return False if not stream.isatty(): return False return True _terminal_has_colors = _has_colors(sys.stdout) def _is_sequence(arg): # Check if input is iterable. if hasattr(arg, "strip"): return False if hasattr(arg, "__getslice__"): return True if hasattr(arg, "__iter__"): return True return False def get_color(rgb=None, hsv=None): """ Convert a color or list of colors to (r,g,b) format from many different input formats. Set `hsv` to input as (hue, saturation, value). Example: - `RGB = (255, 255, 255)` corresponds to white - `rgb = (1,1,1)` is again white - `hex = #FFFF00` is yellow - `string = 'white'` - `string = 'w'` is white nickname - `string = 'dr'` is darkred - `string = 'red4'` is a shade of red - `int = 7` picks color nr. 7 in a predefined color list - `int = -7` picks color nr. 7 in a different predefined list Examples: - [colorcubes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/colorcubes.py) ![](https://vedo.embl.es/images/basic/colorcubes.png) """ # recursion, return a list if input is list of colors: if _is_sequence(rgb) and (len(rgb) > 3 or _is_sequence(rgb[0])): seqcol = [] for sc in rgb: seqcol.append(get_color(sc)) return seqcol # because they are most common: if isinstance(rgb, str): if rgb == "r": return (0.9960784313725, 0.11764705882352, 0.121568627450980) elif rgb == "g": return (0.0156862745098, 0.49803921568627, 0.062745098039215) elif rgb == "b": return (0.0588235294117, 0.0, 0.984313725490196) if str(rgb).isdigit(): rgb = int(rgb) if hsv: c = hsv2rgb(hsv) else: c = rgb if _is_sequence(c): if c[0] <= 1 and c[1] <= 1 and c[2] <= 1: return c # already rgb if len(c) == 3: return list(np.array(c) / 255.0) # RGB return (c[0] / 255.0, c[1] / 255.0, c[2] / 255.0, c[3]) # RGBA elif isinstance(c, str): # is string c = c.replace("grey", "gray").replace(" ", "") if 0 < len(c) < 3: # single/double letter color if c.lower() in color_nicks: c = color_nicks[c.lower()] else: # vedo.logger.warning( # f"Unknown color nickname {c}\nAvailable abbreviations: {color_nicks}" # ) return (0.5, 0.5, 0.5) if c.lower() in colors: # matplotlib name color c = colors[c.lower()] # from now format is hex! if c.startswith("#"): # hex to rgb h = c.lstrip("#") rgb255 = list(int(h[i : i + 2], 16) for i in (0, 2, 4)) rgbh = np.array(rgb255) / 255.0 if np.sum(rgbh) > 3: vedo.logger.error(f"in get_color(): Wrong hex color {c}") return (0.5, 0.5, 0.5) return tuple(rgbh) else: # vtk name color namedColors = vtki.new("NamedColors") rgba = [0, 0, 0, 0] namedColors.GetColor(c, rgba) return (rgba[0] / 255.0, rgba[1] / 255.0, rgba[2] / 255.0) elif isinstance(c, (int, float)): # color number return palettes[vedo.settings.palette % len(palettes)][abs(int(c)) % 10] return (0.5, 0.5, 0.5) def get_color_name(c) -> str: """Find the name of the closest color.""" c = np.array(get_color(c)) # reformat to rgb mdist = 99.0 kclosest = "" for key in colors: ci = np.array(get_color(key)) d = np.linalg.norm(c - ci) if d < mdist: mdist = d kclosest = str(key) return kclosest def hsv2rgb(hsv: list) -> list: """Convert HSV to RGB color.""" ma = vtki.new("Math") rgb = [0, 0, 0] ma.HSVToRGB(hsv, rgb) return rgb def rgb2hsv(rgb: list) -> list: """Convert RGB to HSV color.""" ma = vtki.new("Math") hsv = [0, 0, 0] ma.RGBToHSV(get_color(rgb), hsv) return hsv def rgb2hex(rgb: list) -> str: """Convert RGB to Hex color.""" h = "#%02x%02x%02x" % (int(rgb[0] * 255), int(rgb[1] * 255), int(rgb[2] * 255)) return h def hex2rgb(hx: str) -> list: """Convert Hex to rgb color.""" h = hx.lstrip("#") rgb255 = [int(h[i : i + 2], 16) for i in (0, 2, 4)] return (rgb255[0] / 255.0, rgb255[1] / 255.0, rgb255[2] / 255.0) def color_map(value, name="jet", vmin=None, vmax=None): """ Map a real value in range [vmin, vmax] to a (r,g,b) color scale. Return the (r,g,b) color, or a list of (r,g,b) colors. Arguments: value : (float, list) scalar value to transform into a color name : (str, matplotlib.colors.LinearSegmentedColormap) color map name Very frequently used color maps are: ![](https://user-images.githubusercontent.com/32848391/50738804-577e1680-11d8-11e9-929e-fca17a8ac6f3.jpg) A more complete color maps list: ![](https://matplotlib.org/1.2.1/_images/show_colormaps.png) .. note:: Can also directly use and customize a matplotlib color map Example: ```python import matplotlib from vedo import color_map rgb = color_map(0.2, matplotlib.colormaps["jet"], 0, 1) print("rgb =", rgb) # [0.0, 0.3, 1.0] ``` Examples: - [plot_bars.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_bars.py) """ cut = _is_sequence(value) # to speed up later if cut: values = np.asarray(value) if vmin is None: vmin = np.min(values) if vmax is None: vmax = np.max(values) values = np.clip(values, vmin, vmax) values = (values - vmin) / (vmax - vmin) else: if vmin is None: vedo.logger.warning("in color_map() you must specify vmin! Assume 0.") vmin = 0 if vmax is None: vedo.logger.warning("in color_map() you must specify vmax! Assume 1.") vmax = 1 if vmax == vmin: values = [value - vmin] else: values = [(value - vmin) / (vmax - vmin)] if _has_matplotlib: # matplotlib is available, use it! ########################### if isinstance(name, str): mp = matplotlib.colormaps[name] else: mp = name # assume matplotlib.colors.LinearSegmentedColormap result = mp(values)[:, [0, 1, 2]] else: # matplotlib not available ################################### invert = False if name.endswith("_r"): invert = True name = name.replace("_r", "") try: cmap = cmaps[name] except KeyError: vedo.logger.error(f"in color_map(), no color map with name {name} or {name}_r") vedo.logger.error(f"Available color maps are:\n{cmaps.keys()}") return np.array([0.5, 0.5, 0.5]) result = [] n = len(cmap) - 1 for v in values: iv = int(v * n) if invert: iv = n - iv rgb = hex2rgb(cmap[iv]) result.append(rgb) result = np.array(result) if cut: return result return result[0] def build_palette(color1, color2, n, hsv=True) -> np.ndarray: """ Generate N colors starting from `color1` to `color2` by linear interpolation in HSV or RGB spaces. Arguments: N : (int) number of output colors. color1 : (color) first color. color2 : (color) second color. hsv : (bool) if `False`, interpolation is calculated in RGB space. Examples: - [mesh_custom.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_custom.py) ![](https://vedo.embl.es/images/basic/mesh_custom.png) """ if hsv: color1 = rgb2hsv(color1) color2 = rgb2hsv(color2) c1 = np.array(get_color(color1)) c2 = np.array(get_color(color2)) cols = [] for f in np.linspace(0, 1, n, endpoint=True): c = c1 * (1 - f) + c2 * f if hsv: c = np.array(hsv2rgb(c)) cols.append(c) return np.array(cols) def build_lut( colorlist, vmin=None, vmax=None, below_color=None, above_color=None, nan_color=None, below_alpha=1, above_alpha=1, nan_alpha=1, interpolate=False, ) -> vtki.vtkLookupTable: """ Generate colors in a lookup table (LUT). Return the `vtkLookupTable` object. This can be fed into `cmap()` method. Arguments: colorlist : (list) a list in the form `[(scalar1, [r,g,b]), (scalar2, 'blue'), ...]`. vmin : (float) specify minimum value of scalar range vmax : (float) specify maximum value of scalar range below_color : (color) color for scalars below the minimum in range below_alpha : (float) opacity for scalars below the minimum in range above_color : (color) color for scalars above the maximum in range above_alpha : (float) alpha for scalars above the maximum in range nan_color : (color) color for invalid (nan) scalars nan_alpha : (float) alpha for invalid (nan) scalars interpolate : (bool) interpolate or not intermediate scalars Examples: - [mesh_lut.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_lut.py) ![](https://vedo.embl.es/images/basic/mesh_lut.png) """ ctf = vtki.new("ColorTransferFunction") ctf.SetColorSpaceToRGB() ctf.SetScaleToLinear() alpha_x, alpha_vals = [], [] for sc in colorlist: if len(sc) >= 3: scalar, col, alf = sc[:3] else: alf = 1 scalar, col = sc r, g, b = get_color(col) ctf.AddRGBPoint(scalar, r, g, b) alpha_x.append(scalar) alpha_vals.append(alf) ncols = 8 * len(colorlist) if not interpolate: ncols = len(colorlist) lut = vtki.new("LookupTable") lut.SetNumberOfTableValues(ncols) x0, x1 = ctf.GetRange() # range of the introduced values if vmin is not None: x0 = vmin if vmax is not None: x1 = vmax ctf.SetRange(x0, x1) lut.SetRange(x0, x1) if below_color is not None: lut.SetBelowRangeColor(list(get_color(below_color)) + [below_alpha]) lut.SetUseBelowRangeColor(True) if above_color is not None: lut.SetAboveRangeColor(list(get_color(above_color)) + [above_alpha]) lut.SetUseAboveRangeColor(True) if nan_color is not None: lut.SetNanColor(list(get_color(nan_color)) + [nan_alpha]) if interpolate: for i in range(ncols): p = i / (ncols-1) x = (1 - p) * x0 + p * x1 alf = np.interp(x, alpha_x, alpha_vals) rgba = list(ctf.GetColor(x)) + [alf] lut.SetTableValue(i, rgba) else: for i in range(ncols): if len(colorlist[i]) > 2: alpha = colorlist[i][2] else: alpha = 1.0 # print("colorlist entry:", colorlist[i]) rgba = list(get_color(colorlist[i][1])) + [alpha] lut.SetTableValue(i, rgba) lut.Build() return lut ######################################################################### def printc( *strings, c=None, bc=None, bold=True, italic=False, blink=False, underline=False, strike=False, dim=False, invert=False, box="", link="", end="\n", flush=True, return_string=False, ): """ Print to terminal in color (any color!). Arguments: c : (color) foreground color name or (r,g,b) bc : (color) background color name or (r,g,b) bold : (bool) boldface [True] italic : (bool) italic [False] blink : (bool) blinking text [False] underline : (bool) underline text [False] strike : (bool) strike through text [False] dim : (bool) make text look dimmer [False] invert : (bool) invert background and forward colors [False] box : (bool) print a box with specified text character [''] link : (str) print a clickable url link (works on Linux) (must press Ctrl+click to open the link) flush : (bool) flush buffer after printing [True] return_string : (bool) return the string without printing it [False] end : (str) the end character to be printed [newline] Example: ```python from vedo.colors import printc printc('anything', c='tomato', bold=False, end=' ') printc('anything', 455.5, c='lightblue') printc(299792.48, c=4) ``` Examples: - [printc.py](https://github.com/marcomusy/vedo/tree/master/examples/other/printc.py) ![](https://user-images.githubusercontent.com/32848391/50739010-2bfc2b80-11da-11e9-94de-011e50a86e61.jpg) """ if not vedo.settings.enable_print_color or not _terminal_has_colors: if return_string: return ''.join(strings) else: print(*strings, end=end, flush=flush) return try: # ------------------------------------------------------------- txt = str() ns = len(strings) - 1 separator = " " offset = 0 for i, s in enumerate(strings): if i == ns: separator = "" if ":" in repr(s): for k in emoji: if k in str(s): s = s.replace(k, emoji[k]) offset += 1 for k, rp in vedo.shapes._reps: # check symbols in shapes._reps if k in str(s): s = s.replace(k, rp) offset += 1 txt += str(s) + separator special, cseq = "", "" oneletter_colors = { "k": "\u001b[30m", # because these are supported by most terminals "r": "\u001b[31m", "g": "\u001b[32m", "y": "\u001b[33m", "b": "\u001b[34m", "m": "\u001b[35m", "c": "\u001b[36m", "w": "\u001b[37m", } if c is not None: if c is True: c = "g" elif c is False: c = "r" if isinstance(c, str) and c in oneletter_colors: cseq += oneletter_colors[c] else: r, g, b = get_color(c) # not all terms support this syntax cseq += f"\x1b[38;2;{int(r*255)};{int(g*255)};{int(b*255)}m" if bc: if bc in oneletter_colors: cseq += oneletter_colors[bc] else: r, g, b = get_color(bc) cseq += f"\x1b[48;2;{int(r*255)};{int(g*255)};{int(b*255)}m" if box is True: box = "-" if underline and not box: special += "\x1b[4m" if strike and not box: special += "\x1b[9m" if dim: special += "\x1b[2m" if invert: special += "\x1b[7m" if bold: special += "\x1b[1m" if italic: special += "\x1b[3m" if blink: special += "\x1b[5m" if box and "\n" not in txt: box = box[0] boxv = box if box in ["_", "=", "-", "+", "~"]: boxv = "|" if box in ("_", "."): outtxt = special + cseq + " " + box * (len(txt) + offset + 2) + " \n" outtxt += boxv + " " * (len(txt) + 2) + boxv + "\n" else: outtxt = special + cseq + box * (len(txt) + offset + 4) + "\n" outtxt += boxv + " " + txt + " " + boxv + "\n" if box == "_": outtxt += "|" + box * (len(txt) + offset + 2) + "|" + reset + end else: outtxt += box * (len(txt) + offset + 4) + reset + end sys.stdout.write(outtxt) else: out = special + cseq + txt + reset if link: # embed a link in the terminal out = f"\x1b]8;;{link}\x1b\\{out}\x1b]8;;\x1b\\" if return_string: return out + end else: sys.stdout.write(out + end) except: # --------------------------------------------------- fallback if return_string: return ''.join(strings) try: print(*strings, end=end) except UnicodeEncodeError as e: print(e, end=end) pass if flush: sys.stdout.flush() def printd(*strings, q=False): """ Print debug information about the environment where the printd() is called. Local variables are printed out with their current values. Use `q` to quit (exit) the python session after the printd call. """ from inspect import currentframe, getframeinfo cf = currentframe().f_back cfi = getframeinfo(cf) fname = os.path.basename(getframeinfo(cf).filename) print("\x1b[7m\x1b[3m\x1b[37m" + fname + " line:\x1b[1m" + str(cfi.lineno) + reset, end="") print("\x1b[3m\x1b[37m\x1b[2m", "\U00002501" * 30, time.ctime(), reset) if strings: print(" \x1b[37m\x1b[1mMessage : ", *strings) print(" \x1b[37m\x1b[1mFunction:\x1b[0m\x1b[37m " + str(cfi.function)) print(" \x1b[1mLocals :" + reset) for loc in cf.f_locals.keys(): obj = cf.f_locals[loc] var = repr(obj) if 'module ' in var: continue if 'function ' in var: continue if 'class ' in var: continue if loc.startswith('_'): continue if hasattr(obj, 'name'): if not obj.name: oname = str(type(obj)) else: oname = obj.name var = oname + ", at " + vedo.utils.precision(obj.GetPosition(), 3) var = var.replace("vtkmodules.", "") print(" \x1b[37m", loc, "\t\t=", var[:60].replace("\n", ""), reset) if vedo.utils.is_sequence(obj) and len(obj) > 4: print(' \x1b[37m\x1b[2m\x1b[3m len:', len(obj), ' min:', vedo.utils.precision(min(obj), 4), ' max:', vedo.utils.precision(max(obj), 4), reset) if q: print(f" \x1b[1m\x1b[37mExiting python now (q={bool(q)}).\x1b[0m\x1b[37m") sys.exit(0) sys.stdout.flush() vedo-2025.5.3/vedo/core.py000066400000000000000000002450461474667405700152030ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np from typing import List, Union, Any from typing_extensions import Self import vedo.vtkclasses as vtki import vedo from vedo import colors from vedo import utils from vedo.transformations import LinearTransform, NonLinearTransform __docformat__ = "google" __doc__ = """ Base classes providing functionality to different vedo objects. ![](https://vedo.embl.es/images/feats/algorithms_illustration.png) """ __all__ = [ "DataArrayHelper", "CommonAlgorithms", "PointAlgorithms", "VolumeAlgorithms", ] ############################################################################### # warnings = dict( # func_name=( # "WARNING: some message" # " (silence this with vedo.core.warnings['func_name']=False)" # ), # ) # ### USAGE # def func_name(self): # """Obsolete, use ... instead.""" # if warnings["func_name"]: # colors.printc(warnings["func_name"], c="y") # warnings["func_name"] = "" # return ############################################################################### class DataArrayHelper: # Internal use only. # Helper class to manage data associated to either points (or vertices) and cells (or faces). def __init__(self, obj, association): self.obj = obj self.association = association def __getitem__(self, key): if self.association == 0: data = self.obj.dataset.GetPointData() elif self.association == 1: data = self.obj.dataset.GetCellData() elif self.association == 2: data = self.obj.dataset.GetFieldData() varr = data.GetAbstractArray(key) if isinstance(varr, vtki.vtkStringArray): if isinstance(key, int): key = data.GetArrayName(key) n = varr.GetNumberOfValues() narr = [varr.GetValue(i) for i in range(n)] return narr ########### else: raise RuntimeError() if isinstance(key, int): key = data.GetArrayName(key) arr = data.GetArray(key) if not arr: return None return utils.vtk2numpy(arr) def __setitem__(self, key, input_array): if self.association == 0: data = self.obj.dataset.GetPointData() n = self.obj.dataset.GetNumberOfPoints() self.obj.mapper.SetScalarModeToUsePointData() elif self.association == 1: data = self.obj.dataset.GetCellData() n = self.obj.dataset.GetNumberOfCells() self.obj.mapper.SetScalarModeToUseCellData() elif self.association == 2: data = self.obj.dataset.GetFieldData() if not utils.is_sequence(input_array): input_array = [input_array] if isinstance(input_array[0], str): varr = vtki.vtkStringArray() varr.SetName(key) varr.SetNumberOfComponents(1) varr.SetNumberOfTuples(len(input_array)) for i, iarr in enumerate(input_array): if isinstance(iarr, np.ndarray): iarr = iarr.tolist() # better format # Note: a string k can be converted to numpy with # import json; k = np.array(json.loads(k)) varr.InsertValue(i, str(iarr)) else: try: varr = utils.numpy2vtk(input_array, name=key) except TypeError as e: vedo.logger.error( f"cannot create metadata with input object:\n" f"{input_array}" f"\n\nAllowed content examples are:\n" f"- flat list of strings ['a','b', 1, [1,2,3], ...]" f" (first item must be a string in this case)\n" f" hint: use k = np.array(json.loads(k)) to convert strings\n" f"- numpy arrays of any shape" ) raise e data.AddArray(varr) return ############ else: raise RuntimeError() if len(input_array) != n: vedo.logger.error( f"Error in point/cell data: length of input {len(input_array)}" f" != {n} nr. of elements" ) raise RuntimeError() input_array = np.asarray(input_array) varr = utils.numpy2vtk(input_array, name=key) data.AddArray(varr) if len(input_array.shape) == 1: # scalars data.SetActiveScalars(key) try: # could be a volume mapper self.obj.mapper.SetScalarRange(data.GetScalars().GetRange()) except AttributeError: pass elif len(input_array.shape) == 2 and input_array.shape[1] == 3: # vectors if key.lower() == "normals": data.SetActiveNormals(key) else: data.SetActiveVectors(key) def keys(self) -> List[str]: """Return the list of available data array names""" if self.association == 0: data = self.obj.dataset.GetPointData() elif self.association == 1: data = self.obj.dataset.GetCellData() elif self.association == 2: data = self.obj.dataset.GetFieldData() arrnames = [] for i in range(data.GetNumberOfArrays()): name = "" if self.association == 2: name = data.GetAbstractArray(i).GetName() else: iarr = data.GetArray(i) if iarr: name = iarr.GetName() if name: arrnames.append(name) return arrnames def items(self) -> List: """Return the list of available data array `(names, values)`.""" if self.association == 0: data = self.obj.dataset.GetPointData() elif self.association == 1: data = self.obj.dataset.GetCellData() elif self.association == 2: data = self.obj.dataset.GetFieldData() arrnames = [] for i in range(data.GetNumberOfArrays()): if self.association == 2: name = data.GetAbstractArray(i).GetName() else: name = data.GetArray(i).GetName() if name: arrnames.append((name, self[name])) return arrnames def todict(self) -> dict: """Return a dictionary of the available data arrays.""" return dict(self.items()) def rename(self, oldname: str, newname: str) -> None: """Rename an array""" if self.association == 0: varr = self.obj.dataset.GetPointData().GetArray(oldname) elif self.association == 1: varr = self.obj.dataset.GetCellData().GetArray(oldname) elif self.association == 2: varr = self.obj.dataset.GetFieldData().GetAbstractArray(oldname) if varr: varr.SetName(newname) else: vedo.logger.warning( f"Cannot rename non existing array {oldname} to {newname}" ) def remove(self, key: Union[int, str]) -> None: """Remove a data array by name or number""" if self.association == 0: self.obj.dataset.GetPointData().RemoveArray(key) elif self.association == 1: self.obj.dataset.GetCellData().RemoveArray(key) elif self.association == 2: self.obj.dataset.GetFieldData().RemoveArray(key) def clear(self) -> None: """Remove all data associated to this object""" if self.association == 0: data = self.obj.dataset.GetPointData() elif self.association == 1: data = self.obj.dataset.GetCellData() elif self.association == 2: data = self.obj.dataset.GetFieldData() for i in range(data.GetNumberOfArrays()): if self.association == 2: name = data.GetAbstractArray(i).GetName() else: name = data.GetArray(i).GetName() data.RemoveArray(name) def select(self, key: Union[int, str]) -> Any: """Select one specific array by its name to make it the `active` one.""" # Default (ColorModeToDefault): unsigned char scalars are treated as colors, # and NOT mapped through the lookup table, while everything else is. # ColorModeToDirectScalar extends ColorModeToDefault such that all integer # types are treated as colors with values in the range 0-255 # and floating types are treated as colors with values in the range 0.0-1.0. # Setting ColorModeToMapScalars means that all scalar data will be mapped # through the lookup table. # (Note that for multi-component scalars, the particular component # to use for mapping can be specified using the SelectColorArray() method.) if self.association == 0: data = self.obj.dataset.GetPointData() self.obj.mapper.SetScalarModeToUsePointData() else: data = self.obj.dataset.GetCellData() self.obj.mapper.SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) arr = data.GetArray(key) if not arr: return self.obj nc = arr.GetNumberOfComponents() # print("GetNumberOfComponents", nc) if nc == 1: data.SetActiveScalars(key) elif nc == 2: data.SetTCoords(arr) elif nc in (3, 4): if "rgb" in key.lower(): # type: ignore data.SetActiveScalars(key) try: # could be a volume mapper self.obj.mapper.SetColorModeToDirectScalars() data.SetActiveVectors(None) # need this to fix bug in #1066 # print("SetColorModeToDirectScalars for", key) except AttributeError: pass else: data.SetActiveVectors(key) elif nc == 9: data.SetActiveTensors(key) else: vedo.logger.error(f"Cannot select array {key} with {nc} components") return self.obj try: # could be a volume mapper self.obj.mapper.SetArrayName(key) self.obj.mapper.ScalarVisibilityOn() except AttributeError: pass return self.obj def select_texture_coords(self, key: Union[int,str]) -> Any: """Select one specific array to be used as texture coordinates.""" if self.association == 0: data = self.obj.dataset.GetPointData() else: vedo.logger.warning("texture coordinates are only available for point data") return if isinstance(key, int): key = data.GetArrayName(key) data.SetTCoords(data.GetArray(key)) return self.obj def select_normals(self, key: Union[int,str]) -> Any: """Select one specific normal array by its name to make it the "active" one.""" if self.association == 0: data = self.obj.dataset.GetPointData() self.obj.mapper.SetScalarModeToUsePointData() else: data = self.obj.dataset.GetCellData() self.obj.mapper.SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) data.SetActiveNormals(key) return self.obj def print(self, **kwargs) -> None: """Print the array names available to terminal""" colors.printc(self.keys(), **kwargs) def __repr__(self) -> str: """Representation""" def _get_str(pd, header): out = f"\x1b[2m\x1b[1m\x1b[7m{header}" if pd.GetNumberOfArrays(): if self.obj.name: out += f" in {self.obj.name}" out += f" contains {pd.GetNumberOfArrays()} array(s)\x1b[0m" for i in range(pd.GetNumberOfArrays()): varr = pd.GetArray(i) out += f"\n\x1b[1m\x1b[4mArray name : {varr.GetName()}\x1b[0m" out += "\nindex".ljust(15) + f": {i}" t = varr.GetDataType() if t in vtki.array_types: out += "\ntype".ljust(15) out += f": {vtki.array_types[t]}" shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) out += "\nshape".ljust(15) + f": {shape}" out += "\nrange".ljust(15) + f": {np.array(varr.GetRange())}" out += "\nmax id".ljust(15) + f": {varr.GetMaxId()}" out += "\nlook up table".ljust(15) + f": {bool(varr.GetLookupTable())}" out += "\nin-memory size".ljust(15) + f": {varr.GetActualMemorySize()} KB" else: out += " is empty.\x1b[0m" return out if self.association == 0: out = _get_str(self.obj.dataset.GetPointData(), "Point Data") elif self.association == 1: out = _get_str(self.obj.dataset.GetCellData(), "Cell Data") elif self.association == 2: pd = self.obj.dataset.GetFieldData() if pd.GetNumberOfArrays(): out = "\x1b[2m\x1b[1m\x1b[7mMeta Data" if self.obj.name: out += f" in {self.obj.name}" out += f" contains {pd.GetNumberOfArrays()} entries\x1b[0m" for i in range(pd.GetNumberOfArrays()): varr = pd.GetAbstractArray(i) out += f"\n\x1b[1m\x1b[4mEntry name : {varr.GetName()}\x1b[0m" out += "\nindex".ljust(15) + f": {i}" shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) out += "\nshape".ljust(15) + f": {shape}" return out ############################################################################### class CommonAlgorithms: """Common algorithms.""" @property def pointdata(self): """ Create and/or return a `numpy.array` associated to points (vertices). A data array can be indexed either as a string or by an integer number. E.g.: `myobj.pointdata["arrayname"]` Usage: `myobj.pointdata.keys()` to return the available data array names `myobj.pointdata.select(name)` to make this array the active one `myobj.pointdata.remove(name)` to remove this array """ return DataArrayHelper(self, 0) @property def celldata(self): """ Create and/or return a `numpy.array` associated to cells (faces). A data array can be indexed either as a string or by an integer number. E.g.: `myobj.celldata["arrayname"]` Usage: `myobj.celldata.keys()` to return the available data array names `myobj.celldata.select(name)` to make this array the active one `myobj.celldata.remove(name)` to remove this array """ return DataArrayHelper(self, 1) @property def metadata(self): """ Create and/or return a `numpy.array` associated to neither cells nor faces. A data array can be indexed either as a string or by an integer number. E.g.: `myobj.metadata["arrayname"]` Usage: `myobj.metadata.keys()` to return the available data array names `myobj.metadata.select(name)` to make this array the active one `myobj.metadata.remove(name)` to remove this array """ return DataArrayHelper(self, 2) def memory_address(self) -> int: """ Return a unique memory address integer which may serve as the ID of the object, or passed to c++ code. """ # https://www.linkedin.com/pulse/speedup-your-code-accessing-python-vtk-objects-from-c-pletzer/ # https://github.com/tfmoraes/polydata_connectivity return int(self.dataset.GetAddressAsString("")[5:], 16) def memory_size(self) -> int: """Return the size in bytes of the object in memory.""" return self.dataset.GetActualMemorySize() def modified(self) -> Self: """Use in conjunction with `tonumpy()` to update any modifications to the image array.""" self.dataset.GetPointData().Modified() scals = self.dataset.GetPointData().GetScalars() if scals: scals.Modified() return self def box(self, scale=1, padding=0) -> "vedo.Mesh": """ Return the bounding box as a new `Mesh` object. Arguments: scale : (float) box size can be scaled by a factor padding : (float, list) a constant padding can be added (can be a list `[padx,pady,padz]`) """ b = self.bounds() if not utils.is_sequence(padding): padding = [padding, padding, padding] length, width, height = b[1] - b[0], b[3] - b[2], b[5] - b[4] tol = (length + width + height) / 30000 # useful for boxing text pos = [(b[0] + b[1]) / 2, (b[3] + b[2]) / 2, (b[5] + b[4]) / 2 - tol] bx = vedo.shapes.Box( pos, length * scale + padding[0], width * scale + padding[1], height * scale + padding[2], c="gray", ) try: pr = vtki.vtkProperty() pr.DeepCopy(self.properties) bx.actor.SetProperty(pr) bx.properties = pr except (AttributeError, TypeError): pass bx.flat().lighting("off").wireframe(True) return bx def update_dataset(self, dataset, **kwargs) -> Self: """Update the dataset of the object with the provided VTK dataset.""" self._update(dataset, **kwargs) return self def bounds(self) -> np.ndarray: """ Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ try: # this is very slow for large meshes pts = self.vertices xmin, ymin, zmin = np.min(pts, axis=0) xmax, ymax, zmax = np.max(pts, axis=0) return np.array([xmin, xmax, ymin, ymax, zmin, zmax]) except (AttributeError, ValueError): return np.array(self.dataset.GetBounds()) def xbounds(self, i=None) -> np.ndarray: """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i is not None: return b[i] return np.array([b[0], b[1]]) def ybounds(self, i=None) -> np.ndarray: """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i == 0: return b[2] if i == 1: return b[3] return np.array([b[2], b[3]]) def zbounds(self, i=None) -> np.ndarray: """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i == 0: return b[4] if i == 1: return b[5] return np.array([b[4], b[5]]) def diagonal_size(self) -> float: """Get the length of the diagonal of the bounding box.""" b = self.bounds() return np.sqrt((b[1] - b[0])**2 + (b[3] - b[2])**2 + (b[5] - b[4])**2) def average_size(self) -> float: """ Calculate and return the average size of the object. This is the mean of the vertex distances from the center of mass. """ coords = self.vertices cm = np.mean(coords, axis=0) if coords.shape[0] == 0: return 0.0 cc = coords - cm return np.mean(np.linalg.norm(cc, axis=1)) def center_of_mass(self) -> np.ndarray: """Get the center of mass of the object.""" if isinstance(self, (vedo.RectilinearGrid, vedo.Volume)): return np.array(self.dataset.GetCenter()) cmf = vtki.new("CenterOfMass") cmf.SetInputData(self.dataset) cmf.Update() c = cmf.GetCenter() return np.array(c) def copy_data_from(self, obj: Any) -> Self: """Copy all data (point and cell data) from this input object""" self.dataset.GetPointData().PassData(obj.dataset.GetPointData()) self.dataset.GetCellData().PassData(obj.dataset.GetCellData()) self.pipeline = utils.OperationNode( "copy_data_from", parents=[self, obj], comment=f"{obj.__class__.__name__}", shape="note", c="#ccc5b9", ) return self def inputdata(self): """Obsolete, use `.dataset` instead.""" colors.printc("WARNING: 'inputdata()' is obsolete, use '.dataset' instead.", c="y") return self.dataset @property def npoints(self): """Retrieve the number of points (or vertices).""" return self.dataset.GetNumberOfPoints() @property def nvertices(self): """Retrieve the number of vertices (or points).""" return self.dataset.GetNumberOfPoints() @property def ncells(self): """Retrieve the number of cells.""" return self.dataset.GetNumberOfCells() def cell_centers(self, copy_arrays=False) -> "vedo.Points": """ Get the coordinates of the cell centers as a `Points` object. Examples: - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) """ vcen = vtki.new("CellCenters") vcen.SetCopyArrays(copy_arrays) vcen.SetVertexCells(copy_arrays) vcen.SetInputData(self.dataset) vcen.Update() vpts = vedo.Points(vcen.GetOutput()) if copy_arrays: vpts.copy_properties_from(self) return vpts @property def lines(self): """ Get lines connectivity ids as a python array formatted as `[[id0,id1], [id3,id4], ...]` See also: `lines_as_flat_array()`. """ # Get cell connettivity ids as a 1D array. The vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. try: arr1d = utils.vtk2numpy(self.dataset.GetLines().GetData()) except AttributeError: return np.array([]) i = 0 conn = [] n = len(arr1d) for _ in range(n): cell = [arr1d[i + k + 1] for k in range(arr1d[i])] conn.append(cell) i += arr1d[i] + 1 if i >= n: break return conn # cannot always make a numpy array of it! @property def lines_as_flat_array(self): """ Get lines connectivity ids as a 1D numpy array. Format is e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] See also: `lines()`. """ try: return utils.vtk2numpy(self.dataset.GetLines().GetData()) except AttributeError: return np.array([]) def mark_boundaries(self) -> Self: """ Mark cells and vertices if they lie on a boundary. A new array called `BoundaryCells` is added to the object. """ mb = vtki.new("MarkBoundaryFilter") mb.SetInputData(self.dataset) mb.Update() self.dataset.DeepCopy(mb.GetOutput()) self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) return self def find_cells_in_bounds(self, xbounds=(), ybounds=(), zbounds=()) -> np.ndarray: """ Find cells that are within the specified bounds. """ try: xbounds = list(xbounds.bounds()) except AttributeError: pass if len(xbounds) == 6: bnds = xbounds else: bnds = list(self.bounds()) if len(xbounds) == 2: bnds[0] = xbounds[0] bnds[1] = xbounds[1] if len(ybounds) == 2: bnds[2] = ybounds[0] bnds[3] = ybounds[1] if len(zbounds) == 2: bnds[4] = zbounds[0] bnds[5] = zbounds[1] cell_ids = vtki.vtkIdList() if not self.cell_locator: self.cell_locator = vtki.new("CellTreeLocator") self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsWithinBounds(bnds, cell_ids) cids = [] for i in range(cell_ids.GetNumberOfIds()): cid = cell_ids.GetId(i) cids.append(cid) return np.array(cids) def find_cells_along_line(self, p0, p1, tol=0.001) -> np.ndarray: """ Find cells that are intersected by a line segment. """ cell_ids = vtki.vtkIdList() if not self.cell_locator: self.cell_locator = vtki.new("CellTreeLocator") self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsAlongLine(p0, p1, tol, cell_ids) cids = [] for i in range(cell_ids.GetNumberOfIds()): cid = cell_ids.GetId(i) cids.append(cid) return np.array(cids) def find_cells_along_plane(self, origin, normal, tol=0.001) -> np.ndarray: """ Find cells that are intersected by a plane. """ cell_ids = vtki.vtkIdList() if not self.cell_locator: self.cell_locator = vtki.new("CellTreeLocator") self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsAlongPlane(origin, normal, tol, cell_ids) cids = [] for i in range(cell_ids.GetNumberOfIds()): cid = cell_ids.GetId(i) cids.append(cid) return np.array(cids) def keep_cell_types(self, types=()): """ Extract cells of a specific type. Check the VTK cell types here: https://vtk.org/doc/nightly/html/vtkCellType_8h.html """ fe = vtki.new("ExtractCellsByType") fe.SetInputData(self.dataset) for t in types: try: if utils.is_integer(t): it = t else: it = vtki.cell_types[t.upper()] except KeyError: vedo.logger.error(f"Cell type '{t}' not recognized") continue fe.AddCellType(it) fe.Update() self._update(fe.GetOutput()) return self def map_cells_to_points(self, arrays=(), move=False) -> Self: """ Interpolate cell data (i.e., data specified per cell or face) into point data (i.e., data specified at each vertex). The method of transformation is based on averaging the data values of all cells using a particular point. A custom list of arrays to be mapped can be passed in input. Set `move=True` to delete the original `celldata` array. """ c2p = vtki.new("CellDataToPointData") c2p.SetInputData(self.dataset) if not move: c2p.PassCellDataOn() if arrays: c2p.ClearCellDataArrays() c2p.ProcessAllArraysOff() for arr in arrays: c2p.AddCellDataArray(arr) else: c2p.ProcessAllArraysOn() c2p.Update() self._update(c2p.GetOutput(), reset_locators=False) self.mapper.SetScalarModeToUsePointData() self.pipeline = utils.OperationNode("map_cells_to_points", parents=[self]) return self @property def vertices(self): """Return the vertices (points) coordinates.""" try: # for polydata and unstructured grid varr = self.dataset.GetPoints().GetData() except (AttributeError, TypeError): try: # for RectilinearGrid, StructuredGrid vpts = vtki.vtkPoints() self.dataset.GetPoints(vpts) varr = vpts.GetData() except (AttributeError, TypeError): try: # for ImageData v2p = vtki.new("ImageToPoints") v2p.SetInputData(self.dataset) v2p.Update() varr = v2p.GetOutput().GetPoints().GetData() except AttributeError: return np.array([]) return utils.vtk2numpy(varr) # setter @vertices.setter def vertices(self, pts): """Set vertices (points) coordinates.""" pts = utils.make3d(pts) arr = utils.numpy2vtk(pts, dtype=np.float32) try: vpts = self.dataset.GetPoints() vpts.SetData(arr) vpts.Modified() except (AttributeError, TypeError): vedo.logger.error(f"Cannot set vertices for {type(self)}") return self # reset mesh to identity matrix position/rotation: self.point_locator = None self.cell_locator = None self.line_locator = None self.transform = LinearTransform() @property def points(self): """Return the vertices (points) coordinates. Same as `vertices`.""" return self.vertices @points.setter def points(self, pts): """Set vertices (points) coordinates. Same as `vertices`.""" self.vertices = pts @property def coordinates(self): """Return the vertices (points) coordinates. Same as `vertices`.""" return self.vertices @coordinates.setter def coordinates(self, pts): """Set vertices (points) coordinates. Same as `vertices`.""" self.vertices = pts @property def cells_as_flat_array(self): """ Get cell connectivity ids as a 1D numpy array. Format is e.g. [3, 10,20,30 4, 10,11,12,13 ...] """ try: # valid for unstructured grid arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) except AttributeError: # valid for polydata arr1d = utils.vtk2numpy(self.dataset.GetPolys().GetData()) return arr1d @property def cells(self): """ Get the cells connectivity ids as a numpy array. The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. """ try: # valid for unstructured grid arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) except AttributeError: try: # valid for polydata arr1d = utils.vtk2numpy(self.dataset.GetPolys().GetData()) except AttributeError: vedo.logger.warning(f"Cannot get cells for {type(self)}") return np.array([]) # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. i = 0 conn = [] n = len(arr1d) if n: while True: cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] conn.append(cell) i += arr1d[i] + 1 if i >= n: break return conn def cell_edge_neighbors(self): """ Get the cell neighbor indices of each cell. Returns a python list of lists. """ def face_to_edges(face): edges = [] size = len(face) for i in range(1, size + 1): if i == size: edges.append([face[i - 1], face[0]]) else: edges.append([face[i - 1], face[i]]) return edges pd = self.dataset pd.BuildLinks() neicells = [] for i, cell in enumerate(self.cells): nn = [] for edge in face_to_edges(cell): neighbors = vtki.vtkIdList() pd.GetCellEdgeNeighbors(i, edge[0], edge[1], neighbors) if neighbors.GetNumberOfIds() > 0: neighbor = neighbors.GetId(0) nn.append(neighbor) neicells.append(nn) return neicells def map_points_to_cells(self, arrays=(), move=False) -> Self: """ Interpolate point data (i.e., data specified per point or vertex) into cell data (i.e., data specified per cell). The method of transformation is based on averaging the data values of all points defining a particular cell. A custom list of arrays to be mapped can be passed in input. Set `move=True` to delete the original `pointdata` array. Examples: - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) """ p2c = vtki.new("PointDataToCellData") p2c.SetInputData(self.dataset) if not move: p2c.PassPointDataOn() if arrays: p2c.ClearPointDataArrays() p2c.ProcessAllArraysOff() for arr in arrays: p2c.AddPointDataArray(arr) else: p2c.ProcessAllArraysOn() p2c.Update() self._update(p2c.GetOutput(), reset_locators=False) self.mapper.SetScalarModeToUseCellData() self.pipeline = utils.OperationNode("map_points_to_cells", parents=[self]) return self def resample_data_from(self, source, tol=None, categorical=False) -> Self: """ Resample point and cell data from another dataset. The output has the same structure but its point data have the resampled values from target. Use `tol` to set the tolerance used to compute whether a point in the source is in a cell of the current object. Points without resampled values, and their cells, are marked as blank. If the data is categorical, then the resulting data will be determined by a nearest neighbor interpolation scheme. Example: ```python from vedo import * m1 = Mesh(dataurl+'bunny.obj')#.add_gaussian_noise(0.1) pts = m1.coordinates ces = m1.cell_centers().coordinates m1.pointdata["xvalues"] = np.power(pts[:,0], 3) m1.celldata["yvalues"] = np.power(ces[:,1], 3) m2 = Mesh(dataurl+'bunny.obj') m2.resample_data_from(m1) # print(m2.pointdata["xvalues"]) show(m1, m2 , N=2, axes=1) ``` """ rs = vtki.new("ResampleWithDataSet") rs.SetInputData(self.dataset) rs.SetSourceData(source.dataset) rs.SetPassPointArrays(True) rs.SetPassCellArrays(True) rs.SetPassFieldArrays(True) rs.SetCategoricalData(categorical) rs.SetComputeTolerance(True) if tol: rs.SetComputeTolerance(False) rs.SetTolerance(tol) rs.Update() self._update(rs.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode( "resample_data_from", comment=f"{source.__class__.__name__}", parents=[self, source], ) return self def interpolate_data_from( self, source, radius=None, n=None, kernel="shepard", exclude=("Normals",), on="points", null_strategy=1, null_value=0, ) -> Self: """ Interpolate over source to port its data onto the current object using various kernels. If n (number of closest points to use) is set then radius value is ignored. Check out also: `probe()` which in many cases can be faster. Arguments: kernel : (str) available kernels are [shepard, gaussian, linear] null_strategy : (int) specify a strategy to use when encountering a "null" point during the interpolation process. Null points occur when the local neighborhood (of nearby points to interpolate from) is empty. - Case 0: an output array is created that marks points as being valid (=1) or null (invalid =0), and the null_value is set as well - Case 1: the output data value(s) are set to the provided null_value - Case 2: simply use the closest point to perform the interpolation. null_value : (float) see above. Examples: - [interpolate_scalar1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_scalar1.py) - [interpolate_scalar3.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_scalar3.py) - [interpolate_scalar4.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_scalar4.py) - [image_probe.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/image_probe.py) ![](https://vedo.embl.es/images/advanced/interpolateMeshArray.png) """ if radius is None and not n: vedo.logger.error("in interpolate_data_from(): please set either radius or n") raise RuntimeError if on == "points": points = source.dataset elif on == "cells": c2p = vtki.new("CellDataToPointData") c2p.SetInputData(source.dataset) c2p.Update() points = c2p.GetOutput() else: vedo.logger.error("in interpolate_data_from(), on must be on points or cells") raise RuntimeError() locator = vtki.new("PointLocator") locator.SetDataSet(points) locator.BuildLocator() if kernel.lower() == "shepard": kern = vtki.new("ShepardKernel") kern.SetPowerParameter(2) elif kernel.lower() == "gaussian": kern = vtki.new("GaussianKernel") kern.SetSharpness(2) elif kernel.lower() == "linear": kern = vtki.new("LinearKernel") else: vedo.logger.error("available kernels are: [shepard, gaussian, linear]") raise RuntimeError() if n: kern.SetNumberOfPoints(n) kern.SetKernelFootprintToNClosest() else: kern.SetRadius(radius) kern.SetKernelFootprintToRadius() interpolator = vtki.new("PointInterpolator") interpolator.SetInputData(self.dataset) interpolator.SetSourceData(points) interpolator.SetKernel(kern) interpolator.SetLocator(locator) interpolator.PassFieldArraysOn() interpolator.SetNullPointsStrategy(null_strategy) interpolator.SetNullValue(null_value) interpolator.SetValidPointsMaskArrayName("ValidPointMask") for ex in exclude: interpolator.AddExcludedArray(ex) # remove arrays that are already present in the source # this is because the interpolator will ignore them otherwise for i in range(self.dataset.GetPointData().GetNumberOfArrays()): name = self.dataset.GetPointData().GetArrayName(i) if name not in exclude: self.dataset.GetPointData().RemoveArray(name) interpolator.Update() if on == "cells": p2c = vtki.new("PointDataToCellData") p2c.SetInputData(interpolator.GetOutput()) p2c.Update() cpoly = p2c.GetOutput() else: cpoly = interpolator.GetOutput() self._update(cpoly, reset_locators=False) self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) return self def add_ids(self) -> Self: """ Generate point and cell ids arrays. Two new arrays are added to the mesh: `PointID` and `CellID`. """ ids = vtki.new("IdFilter") ids.SetInputData(self.dataset) ids.PointIdsOn() ids.CellIdsOn() ids.FieldDataOff() ids.SetPointIdsArrayName("PointID") ids.SetCellIdsArrayName("CellID") ids.Update() self._update(ids.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("add_ids", parents=[self]) return self def gradient(self, input_array=None, on="points", fast=False) -> np.ndarray: """ Compute and return the gradiend of the active scalar field as a numpy array. Arguments: input_array : (str) array of the scalars to compute the gradient, if None the current active array is selected on : (str) compute either on 'points' or 'cells' data fast : (bool) if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). Examples: - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/isolines.py) ![](https://user-images.githubusercontent.com/32848391/72433087-f00a8780-3798-11ea-9778-991f0abeca70.png) """ gra = vtki.new("GradientFilter") if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtki.vtkDataObject.FIELD_ASSOCIATION_POINTS elif on.startswith("c"): varr = self.dataset.GetCellData() tp = vtki.vtkDataObject.FIELD_ASSOCIATION_CELLS else: vedo.logger.error(f"in gradient: unknown option {on}") raise RuntimeError if input_array is None: if varr.GetScalars(): input_array = varr.GetScalars().GetName() else: vedo.logger.error(f"in gradient: no scalars found for {on}") raise RuntimeError gra.SetInputData(self.dataset) gra.SetInputScalars(tp, input_array) gra.SetResultArrayName("Gradient") gra.SetFasterApproximation(fast) gra.ComputeDivergenceOff() gra.ComputeVorticityOff() gra.ComputeGradientOn() gra.Update() # self._update(gra.GetOutput(), reset_locators=False) if on.startswith("p"): gvecs = utils.vtk2numpy(gra.GetOutput().GetPointData().GetArray("Gradient")) else: gvecs = utils.vtk2numpy(gra.GetOutput().GetCellData().GetArray("Gradient")) return gvecs def divergence(self, array_name=None, on="points", fast=False) -> np.ndarray: """ Compute and return the divergence of a vector field as a numpy array. Arguments: array_name : (str) name of the array of vectors to compute the divergence, if None the current active array is selected on : (str) compute either on 'points' or 'cells' data fast : (bool) if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). """ div = vtki.new("GradientFilter") if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtki.vtkDataObject.FIELD_ASSOCIATION_POINTS elif on.startswith("c"): varr = self.dataset.GetCellData() tp = vtki.vtkDataObject.FIELD_ASSOCIATION_CELLS else: vedo.logger.error(f"in divergence(): unknown option {on}") raise RuntimeError if array_name is None: if varr.GetVectors(): array_name = varr.GetVectors().GetName() else: vedo.logger.error(f"in divergence(): no vectors found for {on}") raise RuntimeError div.SetInputData(self.dataset) div.SetInputScalars(tp, array_name) div.ComputeDivergenceOn() div.ComputeGradientOff() div.ComputeVorticityOff() div.SetDivergenceArrayName("Divergence") div.SetFasterApproximation(fast) div.Update() # self._update(div.GetOutput(), reset_locators=False) if on.startswith("p"): dvecs = utils.vtk2numpy(div.GetOutput().GetPointData().GetArray("Divergence")) else: dvecs = utils.vtk2numpy(div.GetOutput().GetCellData().GetArray("Divergence")) return dvecs def vorticity(self, array_name=None, on="points", fast=False) -> np.ndarray: """ Compute and return the vorticity of a vector field as a numpy array. Arguments: array_name : (str) name of the array to compute the vorticity, if None the current active array is selected on : (str) compute either on 'points' or 'cells' data fast : (bool) if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). """ vort = vtki.new("GradientFilter") if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtki.vtkDataObject.FIELD_ASSOCIATION_POINTS elif on.startswith("c"): varr = self.dataset.GetCellData() tp = vtki.vtkDataObject.FIELD_ASSOCIATION_CELLS else: vedo.logger.error(f"in vorticity(): unknown option {on}") raise RuntimeError if array_name is None: if varr.GetVectors(): array_name = varr.GetVectors().GetName() else: vedo.logger.error(f"in vorticity(): no vectors found for {on}") raise RuntimeError vort.SetInputData(self.dataset) vort.SetInputScalars(tp, array_name) vort.ComputeDivergenceOff() vort.ComputeGradientOff() vort.ComputeVorticityOn() vort.SetVorticityArrayName("Vorticity") vort.SetFasterApproximation(fast) vort.Update() if on.startswith("p"): vvecs = utils.vtk2numpy(vort.GetOutput().GetPointData().GetArray("Vorticity")) else: vvecs = utils.vtk2numpy(vort.GetOutput().GetCellData().GetArray("Vorticity")) return vvecs def probe( self, source, categorical=False, snap=False, tol=0, ) -> Self: """ Takes a data set and probes its scalars at the specified points in space. Note that a mask is also output with valid/invalid points which can be accessed with `mesh.pointdata['ValidPointMask']`. Arguments: source : any dataset the data set to probe. categorical : bool control whether the source pointdata is to be treated as categorical. snap : bool snap to the cell with the closest point if no cell was found tol : float the tolerance to use when performing the probe. Check out also: `interpolate_data_from()` and `tovolume()` Examples: - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) ![](https://vedo.embl.es/images/volumetric/probePoints.png) """ probe_filter = vtki.new("ProbeFilter") probe_filter.SetSourceData(source.dataset) probe_filter.SetInputData(self.dataset) probe_filter.PassCellArraysOn() probe_filter.PassFieldArraysOn() probe_filter.PassPointArraysOn() probe_filter.SetCategoricalData(categorical) probe_filter.ComputeToleranceOff() if tol: probe_filter.ComputeToleranceOn() probe_filter.SetTolerance(tol) probe_filter.SetSnapToCellWithClosestPoint(snap) probe_filter.Update() self._update(probe_filter.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("probe", parents=[self, source]) self.pointdata.rename("vtkValidPointMask", "ValidPointMask") return self def compute_cell_size(self) -> Self: """ Add to this object a cell data array containing the area, volume and edge length of the cells (when applicable to the object type). Array names are: `Area`, `Volume`, `Length`. """ csf = vtki.new("CellSizeFilter") csf.SetInputData(self.dataset) csf.SetComputeArea(1) csf.SetComputeVolume(1) csf.SetComputeLength(1) csf.SetComputeVertexCount(0) csf.SetAreaArrayName("Area") csf.SetVolumeArrayName("Volume") csf.SetLengthArrayName("Length") csf.Update() self._update(csf.GetOutput(), reset_locators=False) return self def generate_random_data(self) -> Self: """Fill a dataset with random attributes""" gen = vtki.new("RandomAttributeGenerator") gen.SetInputData(self.dataset) gen.GenerateAllDataOn() gen.SetDataTypeToFloat() gen.GeneratePointNormalsOff() gen.GeneratePointTensorsOn() gen.GenerateCellScalarsOn() gen.Update() self._update(gen.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("generate_random_data", parents=[self]) return self def integrate_data(self) -> dict: """ Integrate point and cell data arrays while computing length, area or volume of the domain. It works for 1D, 2D or 3D cells. For volumetric datasets, this filter ignores all but 3D cells. It will not compute the volume contained in a closed surface. Returns a dictionary with keys: `pointdata`, `celldata`, `metadata`, which contain the integration result for the corresponding attributes. Examples: ```python from vedo import * surf = Sphere(res=100) surf.pointdata['scalars'] = np.ones(surf.npoints) data = surf.integrate_data() print(data['pointdata']['scalars'], "is equal to 4pi", 4*np.pi) ``` ```python from vedo import * xcoords1 = np.arange(0, 2.2, 0.2) xcoords2 = sqrt(np.arange(0, 4.2, 0.2)) ycoords = np.arange(0, 1.2, 0.2) surf1 = Grid(s=(xcoords1, ycoords)).rotate_y(-45).lw(2) surf2 = Grid(s=(xcoords2, ycoords)).rotate_y(-45).lw(2) surf1.pointdata['scalars'] = surf1.vertices[:,2] surf2.pointdata['scalars'] = surf2.vertices[:,2] data1 = surf1.integrate_data() data2 = surf2.integrate_data() print(data1['pointdata']['scalars'], "is equal to", data2['pointdata']['scalars'], "even if the grids are different!", "(= the volume under the surface)" ) show(surf1, surf2, N=2, axes=1).close() ``` """ vinteg = vtki.new("IntegrateAttributes") vinteg.SetInputData(self.dataset) vinteg.Update() ugrid = vedo.UnstructuredGrid(vinteg.GetOutput()) data = dict( pointdata=ugrid.pointdata.todict(), celldata=ugrid.celldata.todict(), metadata=ugrid.metadata.todict(), ) return data def write(self, filename, binary=True) -> None: """Write object to file.""" out = vedo.file_io.write(self, filename, binary) out.pipeline = utils.OperationNode( "write", parents=[self], comment=filename[:15], shape="folder", c="#8a817c" ) def tomesh(self, bounds=(), shrink=0) -> "vedo.Mesh": """ Extract boundary geometry from dataset (or convert data to polygonal type). Two new arrays are added to the mesh: `OriginalCellIds` and `OriginalPointIds` to keep track of the original mesh elements. Arguments: bounds : (list) specify a sub-region to extract shrink : (float) shrink the cells to a fraction of their original size """ geo = vtki.new("GeometryFilter") if shrink: sf = vtki.new("ShrinkFilter") sf.SetInputData(self.dataset) sf.SetShrinkFactor(shrink) sf.Update() geo.SetInputData(sf.GetOutput()) else: geo.SetInputData(self.dataset) geo.SetPassThroughCellIds(1) geo.SetPassThroughPointIds(1) geo.SetOriginalCellIdsName("OriginalCellIds") geo.SetOriginalPointIdsName("OriginalPointIds") geo.SetNonlinearSubdivisionLevel(1) # geo.MergingOff() # crashes on StructuredGrids if bounds: geo.SetExtent(bounds) geo.ExtentClippingOn() geo.Update() msh = vedo.mesh.Mesh(geo.GetOutput()) msh.pipeline = utils.OperationNode("tomesh", parents=[self], c="#9e2a2b") return msh def signed_distance(self, dims=(20, 20, 20), bounds=None, invert=False, max_radius=None) -> "vedo.Volume": """ Compute the `Volume` object whose voxels contains the signed distance from the object. The calling object must have "Normals" defined. Arguments: bounds : (list, actor) bounding box sizes dims : (list) dimensions (nr. of voxels) of the output volume. invert : (bool) flip the sign max_radius : (float) specify how far out to propagate distance calculation Examples: - [distance2mesh.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/distance2mesh.py) ![](https://vedo.embl.es/images/basic/distance2mesh.png) """ if bounds is None: bounds = self.bounds() if max_radius is None: max_radius = self.diagonal_size() / 2 dist = vtki.new("SignedDistance") dist.SetInputData(self.dataset) dist.SetRadius(max_radius) dist.SetBounds(bounds) dist.SetDimensions(dims) dist.Update() img = dist.GetOutput() if invert: mat = vtki.new("ImageMathematics") mat.SetInput1Data(img) mat.SetOperationToMultiplyByK() mat.SetConstantK(-1) mat.Update() img = mat.GetOutput() vol = vedo.Volume(img) vol.name = "SignedDistanceVolume" vol.pipeline = utils.OperationNode( "signed_distance", parents=[self], comment=f"dims={tuple(vol.dimensions())}", c="#e9c46a:#0096c7", ) return vol def unsigned_distance( self, dims=(25,25,25), bounds=(), max_radius=0, cap_value=0) -> "vedo.Volume": """ Compute the `Volume` object whose voxels contains the unsigned distance. """ dist = vtki.new("UnsignedDistance") dist.SetInputData(self.dataset) dist.SetDimensions(dims) if len(bounds) == 6: dist.SetBounds(bounds) # elif bounds == "auto": # dist.AdjustBoundsOn() else: dist.SetBounds(self.bounds()) if not max_radius: max_radius = self.diagonal_size() / 10 dist.SetRadius(max_radius) if self.point_locator: dist.SetLocator(self.point_locator) if cap_value is not None: dist.CappingOn() dist.SetCapValue(cap_value) dist.SetOutputScalarTypeToFloat() dist.Update() vol = vedo.Volume(dist.GetOutput()) vol.name = "UnsignedDistanceVolume" vol.pipeline = utils.OperationNode( "unsigned_distance", parents=[self], c="#e9c46a:#0096c7") return vol def smooth_data(self, niter=10, relaxation_factor=0.1, strategy=0, mask=None, mode="distance2", exclude=("Normals", "TextureCoordinates"), ) -> Self: """ Smooth point attribute data using distance weighted Laplacian kernel. The effect is to blur regions of high variation and emphasize low variation regions. A central concept of this method is the point smoothing stencil. A smoothing stencil for a point p(i) is the list of points p(j) which connect to p(i) via an edge. To smooth the attributes of point p(i), p(i)'s attribute data a(i) are iteratively averaged using the distance weighted average of the attributes of a(j) (the weights w[j] sum to 1). This averaging process is repeated until the maximum number of iterations is reached. The relaxation factor (R) is also important as the smoothing process proceeds in an iterative fashion. The a(i+1) attributes are determined from the a(i) attributes as follows: a(i+1) = (1-R)*a(i) + R*sum(w(j)*a(j)) Convergence occurs faster for larger relaxation factors. Typically a small number of iterations is required for large relaxation factors, and in cases where only points adjacent to the boundary are being smoothed, a single iteration with R=1 may be adequate (i.e., just a distance weighted average is computed). Warning: Certain data attributes cannot be correctly interpolated. For example, surface normals are expected to be |n|=1; after attribute smoothing this constraint is likely to be violated. Other vectors and tensors may suffer from similar issues. In such a situation, specify `exclude=...` which will not be smoothed (and simply passed through to the output). Distance weighting function is based on averaging, 1/r, or 1/r**2 weights, where r is the distance between the point to be smoothed and an edge connected neighbor (defined by the smoothing stencil). The weights are normalized so that sum(w(i))==1. When smoothing based on averaging, the weights are simply 1/n, where n is the number of connected points in the stencil. The smoothing process reduces high frequency information in the data attributes. With excessive smoothing (large numbers of iterations, and/or a large relaxation factor) important details may be lost, and the attributes will move towards an "average" value. While this filter will process any dataset type, if the input data is a 3D image volume, it's likely much faster to use an image-based algorithm to perform data smoothing. To determine boundary points in polygonal data, edges used by only one cell are considered boundary (and hence the associated points defining the edge). Arguments: niter : (int) number of iterations relaxation_factor : (float) relaxation factor controlling the amount of Laplacian smoothing applied strategy : (int) strategy to use for Laplacian smoothing - 0: use all points, all point data attributes are smoothed - 1: smooth all point attribute data except those on the boundary - 2: only point data connected to a boundary point are smoothed mask : (str, np.ndarray) array to be used as a mask (ignore then the strategy keyword) mode : (str) smoothing mode, either "distance2", "distance" or "average" - distance**2 weighted (i.e., 1/r**2 interpolation weights) - distance weighted (i.e., 1/r) approach; - simple average of all connected points in the stencil exclude : (list) list of arrays to be excluded from smoothing """ try: saf = vtki.new("AttributeSmoothingFilter") except: vedo.logger.error("smooth_data() only avaialble in VTK>=9.3.0") return self saf.SetInputData(self.dataset) saf.SetRelaxationFactor(relaxation_factor) saf.SetNumberOfIterations(niter) for ex in exclude: saf.AddExcludedArray(ex) if mode == "distance": saf.SetWeightsTypeToDistance() elif mode == "distance2": saf.SetWeightsTypeToDistance2() elif mode == "average": saf.SetWeightsTypeToAverage() else: vedo.logger.error(f"smooth_data(): unknown mode {mode}") raise TypeError saf.SetSmoothingStrategy(strategy) if mask is not None: saf.SetSmoothingStrategyToSmoothingMask() if isinstance(mask, str): mask_ = self.dataset.GetPointData().GetArray(mask) if not mask_: vedo.logger.error(f"smooth_data(): mask array {mask} not found") return self mask_array = vtki.vtkUnsignedCharArray() mask_array.ShallowCopy(mask_) mask_array.SetName(mask_.GetName()) else: mask_array = utils.numpy2vtk(mask, dtype=np.uint8) saf.SetSmoothingMask(mask_array) saf.Update() self._update(saf.GetOutput()) self.pipeline = utils.OperationNode( "smooth_data", comment=f"strategy {strategy}", parents=[self], c="#9e2a2b" ) return self def compute_streamlines( self, seeds: Any, integrator="rk4", direction="forward", initial_step_size=None, max_propagation=None, max_steps=10000, step_length=0, surface_constrained=False, compute_vorticity=False, ) -> Union["vedo.Lines", None]: """ Integrate a vector field to generate streamlines. Arguments: seeds : (Mesh, Points, list) starting points of the streamlines integrator : (str) type of integration method to be used: - "rk2" (Runge-Kutta 2) - "rk4" (Runge-Kutta 4) - "rk45" (Runge-Kutta 45) direction : (str) direction of integration, either "forward", "backward" or "both" initial_step_size : (float) initial step size used for line integration max_propagation : (float) maximum length of a streamline expressed in absolute units max_steps : (int) maximum number of steps for a streamline step_length : (float) maximum length of a step expressed in absolute units surface_constrained : (bool) whether to stop integrating when the streamline leaves the surface compute_vorticity : (bool) whether to compute the vorticity at each streamline point """ b = self.dataset.GetBounds() size = (b[5]-b[4] + b[3]-b[2] + b[1]-b[0]) / 3 if initial_step_size is None: initial_step_size = size / 1000.0 if max_propagation is None: max_propagation = size * 2 if utils.is_sequence(seeds): seeds = vedo.Points(seeds) sti = vtki.new("StreamTracer") sti.SetSourceData(seeds.dataset) if isinstance(self, vedo.RectilinearGrid): sti.SetInputData(vedo.UnstructuredGrid(self.dataset).dataset) else: sti.SetInputDataObject(self.dataset) sti.SetInitialIntegrationStep(initial_step_size) sti.SetComputeVorticity(compute_vorticity) sti.SetMaximumNumberOfSteps(max_steps) sti.SetMaximumPropagation(max_propagation) sti.SetSurfaceStreamlines(surface_constrained) if step_length: sti.SetMaximumIntegrationStep(step_length) if "for" in direction: sti.SetIntegrationDirectionToForward() elif "back" in direction: sti.SetIntegrationDirectionToBackward() elif "both" in direction: sti.SetIntegrationDirectionToBoth() else: vedo.logger.error(f"in compute_streamlines(), unknown direction {direction}") return None if integrator == "rk2": sti.SetIntegratorTypeToRungeKutta2() elif integrator == "rk4": sti.SetIntegratorTypeToRungeKutta4() elif integrator == "rk45": sti.SetIntegratorTypeToRungeKutta45() else: vedo.logger.error(f"in compute_streamlines(), unknown integrator {integrator}") return None sti.Update() stlines = vedo.shapes.Lines(sti.GetOutput(), lw=4) stlines.name = "StreamLines" self.pipeline = utils.OperationNode( "compute_streamlines", comment=f"{integrator}", parents=[self, seeds], c="#9e2a2b" ) return stlines ############################################################################### class PointAlgorithms(CommonAlgorithms): """Methods for point clouds.""" def apply_transform(self, LT: Any, deep_copy=True) -> Self: """ Apply a linear or non-linear transformation to the mesh polygonal data. Example: ```python from vedo import Cube, show, settings settings.use_parallel_projection = True c1 = Cube().rotate_z(25).pos(2,1).mirror().alpha(0.5) T = c1.transform # rotate by 5 degrees, place at (2,1) c2 = Cube().c('red4').wireframe().lw(10).lighting('off') c2.apply_transform(T) show(c1, c2, "The 2 cubes should overlap!", axes=1).close() ``` ![](https://vedo.embl.es/images/feats/apply_transform.png) """ if self.dataset.GetNumberOfPoints() == 0: return self if isinstance(LT, LinearTransform): LT_is_linear = True tr = LT.T if LT.is_identity(): return self elif isinstance(LT, (vtki.vtkMatrix4x4, vtki.vtkLinearTransform)) or utils.is_sequence(LT): LT_is_linear = True LT = LinearTransform(LT) tr = LT.T if LT.is_identity(): return self elif isinstance(LT, NonLinearTransform): LT_is_linear = False tr = LT.T self.transform = LT # reset elif isinstance(LT, vtki.vtkThinPlateSplineTransform): LT_is_linear = False tr = LT self.transform = NonLinearTransform(LT) # reset else: vedo.logger.error(f"apply_transform(), unknown input type:\n{LT}") return self ################ if LT_is_linear: try: # self.transform might still not be linear self.transform.concatenate(LT) except AttributeError: # in that case reset it self.transform = LinearTransform() ################ if isinstance(self.dataset, vtki.vtkPolyData): tp = vtki.new("TransformPolyDataFilter") elif isinstance(self.dataset, vtki.vtkUnstructuredGrid): tp = vtki.new("TransformFilter") tp.TransformAllInputVectorsOn() # elif isinstance(self.dataset, vtki.vtkImageData): # tp = vtki.new("ImageReslice") # tp.SetInterpolationModeToCubic() # tp.SetResliceTransform(tr) else: vedo.logger.error(f"apply_transform(), unknown input type: {[self.dataset]}") return self tp.SetTransform(tr) tp.SetInputData(self.dataset) tp.Update() out = tp.GetOutput() if deep_copy: self.dataset.DeepCopy(out) else: self.dataset.ShallowCopy(out) # reset the locators self.point_locator = None self.cell_locator = None self.line_locator = None return self def apply_transform_from_actor(self) -> LinearTransform: """ Apply the current transformation of the actor to the data. Useful when manually moving an actor (eg. when pressing "a"). Returns the `LinearTransform` object. Note that this method is automatically called when the window is closed, or the interactor style is changed. """ M = self.actor.GetMatrix() self.apply_transform(M) iden = vtki.vtkMatrix4x4() self.actor.PokeMatrix(iden) return LinearTransform(M) def pos(self, x=None, y=None, z=None) -> Self: """Set/Get object position.""" if x is None: # get functionality return self.transform.position if z is None and y is None: # assume x is of the form (x,y,z) if len(x) == 3: x, y, z = x else: x, y = x z = 0 elif z is None: # assume x,y is of the form x, y z = 0 q = self.transform.position delta = [x, y, z] - q if delta[0] == delta[1] == delta[2] == 0: return self LT = LinearTransform().translate(delta) return self.apply_transform(LT) def shift(self, dx=0, dy=0, dz=0) -> Self: """Add a vector to the current object position.""" if utils.is_sequence(dx): dx, dy, dz = utils.make3d(dx) if dx == dy == dz == 0: return self LT = LinearTransform().translate([dx, dy, dz]) return self.apply_transform(LT) def x(self, val=None) -> Self: """Set/Get object position along x axis.""" p = self.transform.position if val is None: return p[0] self.pos(val, p[1], p[2]) return self def y(self, val=None)-> Self: """Set/Get object position along y axis.""" p = self.transform.position if val is None: return p[1] self.pos(p[0], val, p[2]) return self def z(self, val=None) -> Self: """Set/Get object position along z axis.""" p = self.transform.position if val is None: return p[2] self.pos(p[0], p[1], val) return self def rotate(self, angle: float, axis=(1, 0, 0), point=(0, 0, 0), rad=False) -> Self: """ Rotate around an arbitrary `axis` passing through `point`. Example: ```python from vedo import * c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 v = vector(0.2,1,0) p = vector(1,0,0) # axis passes through this point c2.rotate(90, axis=v, point=p) l = Line(-v+p, v+p).lw(3).c('red') show(c1, l, c2, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ LT = LinearTransform() LT.rotate(angle, axis, point, rad) return self.apply_transform(LT) def rotate_x(self, angle: float, rad=False, around=None) -> Self: """ Rotate around x-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ if angle == 0: return self LT = LinearTransform().rotate_x(angle, rad, around) return self.apply_transform(LT) def rotate_y(self, angle: float, rad=False, around=None) -> Self: """ Rotate around y-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ if angle == 0: return self LT = LinearTransform().rotate_y(angle, rad, around) return self.apply_transform(LT) def rotate_z(self, angle: float, rad=False, around=None) -> Self: """ Rotate around z-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ if angle == 0: return self LT = LinearTransform().rotate_z(angle, rad, around) return self.apply_transform(LT) def reorient(self, initaxis, newaxis, rotation=0, rad=False, xyplane=False) -> Self: """ Reorient the object to point to a new direction from an initial one. If `initaxis` is None, the object will be assumed in its "default" orientation. If `xyplane` is True, the object will be rotated to lie on the xy plane. Use `rotation` to first rotate the object around its `initaxis`. """ q = self.transform.position LT = LinearTransform() LT.reorient(initaxis, newaxis, q, rotation, rad, xyplane) return self.apply_transform(LT) def scale(self, s=None, reset=False, origin=True) -> Union[Self, np.array]: """ Set/get object's scaling factor. Arguments: s : (list, float) scaling factor(s). reset : (bool) if True previous scaling factors are ignored. origin : (bool) if True scaling is applied with respect to object's position, otherwise is applied respect to (0,0,0). Note: use `s=(sx,sy,sz)` to scale differently in the three coordinates. """ if s is None: return np.array(self.transform.T.GetScale()) if not utils.is_sequence(s): s = [s, s, s] LT = LinearTransform() if reset: old_s = np.array(self.transform.T.GetScale()) LT.scale(s / old_s) else: if origin is True: LT.scale(s, origin=self.transform.position) elif origin is False: LT.scale(s, origin=False) else: LT.scale(s, origin=origin) return self.apply_transform(LT) ############################################################################### class VolumeAlgorithms(CommonAlgorithms): """Methods for Volume objects.""" def bounds(self) -> np.ndarray: """ Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ # OVERRIDE CommonAlgorithms.bounds() which is too slow return np.array(self.dataset.GetBounds()) def isosurface(self, value=None, flying_edges=False) -> "vedo.mesh.Mesh": """ Return an `Mesh` isosurface extracted from the `Volume` object. Set `value` as single float or list of values to draw the isosurface(s). Use flying_edges for faster results (but sometimes can interfere with `smooth()`). The isosurface values can be accessed with `mesh.metadata["isovalue"]`. Examples: - [isosurfaces1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces1.py) ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) """ scrange = self.dataset.GetScalarRange() if flying_edges: cf = vtki.new("FlyingEdges3D") cf.InterpolateAttributesOn() else: cf = vtki.new("ContourFilter") cf.UseScalarTreeOn() cf.SetInputData(self.dataset) cf.ComputeNormalsOn() if utils.is_sequence(value): cf.SetNumberOfContours(len(value)) for i, t in enumerate(value): cf.SetValue(i, t) else: if value is None: value = (2 * scrange[0] + scrange[1]) / 3.0 # print("automatic isosurface value =", value) cf.SetValue(0, value) cf.Update() poly = cf.GetOutput() out = vedo.mesh.Mesh(poly, c=None).phong() out.mapper.SetScalarRange(scrange[0], scrange[1]) out.metadata["isovalue"] = value out.pipeline = utils.OperationNode( "isosurface", parents=[self], comment=f"#pts {out.dataset.GetNumberOfPoints()}", c="#4cc9f0:#e9c46a", ) return out def isosurface_discrete( self, values, background_label=None, internal_boundaries=True, use_quads=False, nsmooth=0, ) -> "vedo.mesh.Mesh": """ Create boundary/isocontour surfaces from a label map (e.g., a segmented image) using a threaded, 3D version of the multiple objects/labels Surface Nets algorithm. The input is a 3D image (i.e., volume) where each voxel is labeled (integer labels are preferred to real values), and the output data is a polygonal mesh separating labeled regions / objects. (Note that on output each region [corresponding to a different segmented object] will share points/edges on a common boundary, i.e., two neighboring objects will share the boundary that separates them). Besides output geometry defining the surface net, the filter outputs a two-component celldata array indicating the labels on either side of the polygons composing the output Mesh. (This can be used for advanced operations like extracting shared/contacting boundaries between two objects. The name of this celldata array is "BoundaryLabels"). The values can be accessed with `mesh.metadata["isovalue"]`. Arguments: value : (float, list) single value or list of values to draw the isosurface(s). background_label : (float) this value specifies the label value to use when referencing the background region outside of any of the specified regions. boundaries : (bool, list) if True, the output will only contain the boundary surface. Internal surfaces will be removed. If a list of integers is provided, only the boundaries between the specified labels will be extracted. use_quads : (bool) if True, the output polygons will be quads. If False, the output polygons will be triangles. nsmooth : (int) number of iterations of smoothing (0 means no smoothing). Examples: - [isosurfaces2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces2.py) """ logger = vtki.get_class("Logger") logger.SetStderrVerbosity(logger.VERBOSITY_ERROR) snets = vtki.new("SurfaceNets3D") snets.SetInputData(self.dataset) if nsmooth: snets.SmoothingOn() snets.AutomaticSmoothingConstraintsOn() snets.GetSmoother().SetNumberOfIterations(nsmooth) # snets.GetSmoother().SetRelaxationFactor(relaxation_factor) # snets.GetSmoother().SetConstraintDistance(constraint_distance) else: snets.SmoothingOff() if internal_boundaries is False: snets.SetOutputStyleToBoundary() elif internal_boundaries is True: snets.SetOutputStyleToDefault() elif utils.is_sequence(internal_boundaries): snets.SetOutputStyleToSelected() snets.InitializeSelectedLabelsList() for val in internal_boundaries: snets.AddSelectedLabel(val) else: vedo.logger.error("isosurface_discrete(): unknown boundaries option") n = len(values) snets.SetNumberOfContours(n) snets.SetNumberOfLabels(n) if background_label is not None: snets.SetBackgroundLabel(background_label) for i, val in enumerate(values): snets.SetValue(i, val) if use_quads: snets.SetOutputMeshTypeToQuads() else: snets.SetOutputMeshTypeToTriangles() snets.Update() out = vedo.mesh.Mesh(snets.GetOutput()) out.metadata["isovalue"] = values out.pipeline = utils.OperationNode( "isosurface_discrete", parents=[self], comment=f"#pts {out.dataset.GetNumberOfPoints()}", c="#4cc9f0:#e9c46a", ) logger.SetStderrVerbosity(logger.VERBOSITY_INFO) return out def legosurface( self, vmin=None, vmax=None, invert=False, boundary=True, array_name="input_scalars", ) -> "vedo.mesh.Mesh": """ Represent an object - typically a `Volume` - as lego blocks (voxels). By default colors correspond to the volume's scalar. Returns an `Mesh` object. Arguments: vmin : (float) the lower threshold, voxels below this value are not shown. vmax : (float) the upper threshold, voxels above this value are not shown. boundary : (bool) controls whether to include cells that are partially inside array_name : (int, str) name or index of the scalar array to be considered Examples: - [legosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/legosurface.py) ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) """ imp_dataset = vtki.new("ImplicitDataSet") imp_dataset.SetDataSet(self.dataset) window = vtki.new("ImplicitWindowFunction") window.SetImplicitFunction(imp_dataset) srng = list(self.dataset.GetScalarRange()) if vmin is not None: srng[0] = vmin if vmax is not None: srng[1] = vmax if not boundary: tol = 0.00001 * (srng[1] - srng[0]) srng[0] -= tol srng[1] += tol window.SetWindowRange(srng) # print("legosurface window range:", srng) extract = vtki.new("ExtractGeometry") extract.SetInputData(self.dataset) extract.SetImplicitFunction(window) extract.SetExtractInside(invert) extract.SetExtractBoundaryCells(boundary) extract.Update() gf = vtki.new("GeometryFilter") gf.SetInputData(extract.GetOutput()) gf.Update() m = vedo.mesh.Mesh(gf.GetOutput()).lw(0.1).flat() m.map_points_to_cells() m.celldata.select(array_name) m.pipeline = utils.OperationNode( "legosurface", parents=[self], comment=f"array: {array_name}", c="#4cc9f0:#e9c46a", ) return m def tomesh(self, fill=True, shrink=1.0) -> "vedo.mesh.Mesh": """ Build a polygonal Mesh from the current object. If `fill=True`, the interior faces of all the cells are created. (setting a `shrink` value slightly smaller than the default 1.0 can avoid flickering due to internal adjacent faces). If `fill=False`, only the boundary faces will be generated. """ gf = vtki.new("GeometryFilter") if fill: sf = vtki.new("ShrinkFilter") sf.SetInputData(self.dataset) sf.SetShrinkFactor(shrink) sf.Update() gf.SetInputData(sf.GetOutput()) gf.Update() poly = gf.GetOutput() if shrink == 1.0: clean_poly = vtki.new("CleanPolyData") clean_poly.PointMergingOn() clean_poly.ConvertLinesToPointsOn() clean_poly.ConvertPolysToLinesOn() clean_poly.ConvertStripsToPolysOn() clean_poly.SetInputData(poly) clean_poly.Update() poly = clean_poly.GetOutput() else: gf.SetInputData(self.dataset) gf.Update() poly = gf.GetOutput() msh = vedo.mesh.Mesh(poly).flat() msh.scalarbar = self.scalarbar lut = utils.ctf2lut(self) if lut: msh.mapper.SetLookupTable(lut) msh.pipeline = utils.OperationNode( "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" ) return msh vedo-2025.5.3/vedo/dolfin.py000066400000000000000000000641611474667405700155230ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np import vedo.vtkclasses as vtki import vedo from vedo.colors import printc from vedo import utils from vedo import shapes from vedo.mesh import Mesh from vedo.plotter import show __docformat__ = "google" __doc__ = """ Submodule for support of the [FEniCS/Dolfin](https://fenicsproject.org) library. Example: ```python import dolfin from vedo import dataurl, download from vedo.dolfin import plot fname = download(dataurl+"dolfin_fine.xml") mesh = dolfin.Mesh(fname) plot(mesh) ``` ![](https://user-images.githubusercontent.com/32848391/53026243-d2d31900-3462-11e9-9dde-518218c241b6.jpg) .. note:: Find many more examples in directory [vedo/examples/dolfin](https://github.com/marcomusy/vedo/blob/master/examples/other/dolfin). """ __all__ = ["plot"] ########################################################################## def _inputsort(obj): import dolfin u = None mesh = None if not utils.is_sequence(obj): obj = [obj] for ob in obj: inputtype = str(type(ob)) # printc('inputtype is', inputtype, c=2) if "vedo" in inputtype: # skip vtk objects, will be added later continue if "dolfin" in inputtype or "ufl" in inputtype: if "MeshFunction" in inputtype: mesh = ob.mesh() if ob.dim() > 0: printc("MeshFunction of dim>0 not supported.", c="r") printc('Try e.g.: MeshFunction("size_t", mesh, 0)', c="r", italic=1) printc('instead of MeshFunction("size_t", mesh, 1)', c="r", strike=1) else: # printc(ob.dim(), mesh.num_cells(), len(mesh.coordinates()), len(ob.array())) V = dolfin.FunctionSpace(mesh, "CG", 1) u = dolfin.Function(V) v2d = dolfin.vertex_to_dof_map(V) u.vector()[v2d] = ob.array() elif "Function" in inputtype or "Expression" in inputtype: u = ob elif "ufl.mathfunctions" in inputtype: # not working u = ob elif "Mesh" in inputtype: mesh = ob elif "algebra" in inputtype: mesh = ob.ufl_domain() # print('algebra', ob.ufl_domain()) if u and not mesh and hasattr(u, "function_space"): V = u.function_space() if V: mesh = V.mesh() if u and not mesh and hasattr(u, "mesh"): mesh = u.mesh() # printc('------------------------------------') # printc('mesh.topology dim=', mesh.topology().dim()) # printc('mesh.geometry dim=', mesh.geometry().dim()) # if u: printc('u.value_rank()', u.value_rank()) # if u and u.value_rank(): printc('u.value_dimension()', u.value_dimension(0)) # axis=0 ##if u: printc('u.value_shape()', u.value_shape()) return (mesh, u) def _compute_uvalues(u, mesh): # the whole purpose of this function is # to have a scalar (or vector) for each point of the mesh if not u: return np.array([]) # print('u',u) if hasattr(u, "compute_vertex_values"): # old dolfin, works fine u_values = u.compute_vertex_values(mesh) if u.value_rank() and u.value_dimension(0) > 1: l = u_values.shape[0] u_values = u_values.reshape(u.value_dimension(0), int(l / u.value_dimension(0))).T elif hasattr(u, "compute_point_values"): # dolfinx u_values = u.compute_point_values() try: from dolfin import fem fvec = u.vector except RuntimeError: fspace = u.function_space try: fspace = fspace.collapse() except RuntimeError: return [] fvec = fem.interpolate(u, fspace).vector tdim = mesh.topology.dim # print('fvec.getSize', fvec.getSize(), mesh.num_entities(tdim)) if fvec.getSize() == mesh.num_entities(tdim): # DG0 cellwise function C = fvec.get_local() if C.dtype.type is np.complex128: print("Plotting real part of complex data") C = np.real(C) u_values = C else: u_values = [] if hasattr(mesh, "coordinates"): coords = mesh.coordinates() else: coords = mesh.geometry.points if u_values.shape[0] != coords.shape[0]: vedo.logger.warning("mismatch in vedo.dolfin._compute_uvalues") u_values = np.array([u(p) for p in coords]) return u_values def plot(*inputobj, **options): """ Plot the object(s) provided. Input can be any combination of: `Mesh`, `Volume`, `dolfin.Mesh`, `dolfin.MeshFunction`, `dolfin.Expression` or `dolfin.Function`. Return the current `Plotter` class instance. Arguments: mode : (str) one or more of the following can be combined in any order - `mesh`/`color`, will plot the mesh, by default colored with a scalar if available - `displacement` show displaced mesh by solution - `arrows`, mesh displacements are plotted as scaled arrows. - `lines`, mesh displacements are plotted as scaled lines. - `tensors`, to be implemented add : (bool) add the input objects without clearing the already plotted ones density : (float) show only a subset of lines or arrows [0-1] wire[frame] : (bool) visualize mesh as wireframe [False] c[olor] : (color) set mesh color [None] exterior : (bool) only show the outer surface of the mesh [False] alpha : (float) set object's transparency [1] lw : (int) line width of the mesh (set to zero to hide mesh) [0.1] ps : int set point size of mesh vertices [None] z : (float) add a constant to z-coordinate (useful to show 2D slices as function of time) legend : (str) add a legend to the top-right of window [None] scalarbar : (bool) add a scalarbar to the window ['vertical'] vmin : (float) set the minimum for the range of the scalar [None] vmax : (float) set the maximum for the range of the scalar [None] scale : (float) add a scaling factor to arrows and lines sizes [1] cmap : (str) choose a color map for scalars shading : (str) mesh shading ['flat', 'phong'] text : (str) add a gray text comment to the top-left of the window [None] isolines : (dict) dictionary of isolines properties - n, (int) - add this number of isolines to the mesh - c, - isoline color - lw, (float) - isoline width - z, (float) - add to the isoline z coordinate to make them more visible warp_zfactor : (float) elevate z-axis by scalar value (useful for 2D geometries) warp_yfactor : (float) elevate z-axis by scalar value (useful for 1D geometries) scale_mesh_factors : (list) rescale mesh by these factors [1,1,1] new : (bool) spawn a new instance of Plotter class, pops up a new window at : (int) renderer number to plot to shape : (list) subdvide window in (n,m) rows and columns N : (int) automatically subdvide window in N renderers pos : (list) (x,y) coordinates of the window position on screen size : (list) window size (x,y) title : (str) window title bg : (color) background color name of window bg2 : (color) second background color name to create a color gradient style : (int) choose a predefined style [0-4] - 0, `vedo`, style (blackboard background, rainbow color map) - 1, `matplotlib`, style (white background, viridis color map) - 2, `paraview`, style - 3, `meshlab`, style - 4, `bw`, black and white style. axes : (int) Axes type number. Axes type-1 can be fully customized by passing a dictionary `axes=dict()`. - 0, no axes, - 1, draw customizable grid axes (see below). - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a simple ruler at the bottom of the window - 8, show the `vtkCubeAxesActor` object, - 9, show the bounding box outLine, - 10, show three circles representing the maximum bounding box, - 11, show a large grid on the x-y plane (use with zoom=8) - 12, show polar axes. infinity : (bool) if True fugue point is set at infinity (no perspective effects) sharecam : (bool) if False each renderer will have an independent vtkCamera interactive : (bool) if True will stop after show() to allow interaction w/ window offscreen : (bool) if True will not show the rendering window zoom : (float) camera zooming factor viewup : (list), str camera view-up direction ['x','y','z', or a vector direction] azimuth : (float) add azimuth rotation of the scene, in degrees elevation : (float) add elevation rotation of the scene, in degrees roll : (float) add roll-type rotation of the scene, in degrees camera : (dict) Camera parameters can further be specified with a dictionary assigned to the `camera` keyword: (E.g. `show(camera={'pos':(1,2,3), 'thickness':1000,})`) - `pos`, `(list)`, the position of the camera in world coordinates - `focal_point`, `(list)`, the focal point of the camera in world coordinates - `viewup`, `(list)`, the view up direction for the camera - `distance`, `(float)`, set the focal point to the specified distance from the camera position. - `clipping_range`, `(float)`, distance of the near and far clipping planes along the direction of projection. - `parallel_scale`, `(float)`, scaling used for a parallel projection, i.e. the height of the viewport in world-coordinate distances. The default is 1. Note that the "scale" parameter works as an "inverse scale", larger numbers produce smaller images. This method has no effect in perspective projection mode. - `thickness`, `(float)`, set the distance between clipping planes. This method adjusts the far clipping plane to be set a distance 'thickness' beyond the near clipping plane. - `view_angle`, `(float)`, the camera view angle, which is the angular height of the camera view measured in degrees. The default angle is 30 degrees. This method has no effect in parallel projection mode. The formula for setting the angle up for perfect perspective viewing is: angle = 2*atan((h/2)/d) where h is the height of the RenderWindow (measured by holding a ruler up to your screen) and d is the distance from your eyes to the screen. """ if len(inputobj) == 0: vedo.plotter_instance.interactive() return None if "numpy" in str(type(inputobj[0])): from vedo.pyplot import plot as pyplot_plot return pyplot_plot(*inputobj, **options) mesh, u = _inputsort(inputobj) mode = options.pop("mode", "mesh") ttime = options.pop("z", None) add = options.pop("add", False) wire = options.pop("wireframe", None) c = options.pop("c", None) color = options.pop("color", None) if color is not None: c = color lc = options.pop("lc", None) alpha = options.pop("alpha", 1) lw = options.pop("lw", 0.5) ps = options.pop("ps", None) legend = options.pop("legend", None) scbar = options.pop("scalarbar", "v") vmin = options.pop("vmin", None) vmax = options.pop("vmax", None) cmap = options.pop("cmap", None) scale = options.pop("scale", 1) scale_mesh_factors = options.pop("scale_mesh_factors", [1, 1, 1]) shading = options.pop("shading", "phong") text = options.pop("text", None) style = options.pop("style", "vtk") isolns = options.pop("isolines", {}) warp_zfactor = options.pop("warp_zfactor", None) warp_yfactor = options.pop("warp_yfactor", None) lighting = options.pop("lighting", None) exterior = options.pop("exterior", False) returnActorsNoShow = options.pop("returnActorsNoShow", False) at = options.pop("at", 0) # refresh axes titles for axes type = 8 (vtkCubeAxesActor) xtitle = options.pop("xtitle", "x") ytitle = options.pop("ytitle", "y") ztitle = options.pop("ztitle", "z") if vedo.plotter_instance: if xtitle != "x": aet = vedo.plotter_instance.axes_instances if len(aet) > at and isinstance(aet[at], vtki.get_class("CubeAxesActor")): aet[at].SetXTitle(xtitle) if ytitle != "y": aet = vedo.plotter_instance.axes_instances if len(aet) > at and isinstance(aet[at], vtki.get_class("CubeAxesActor")): aet[at].SetYTitle(ytitle) if ztitle != "z": aet = vedo.plotter_instance.axes_instances if len(aet) > at and isinstance(aet[at], vtki.get_class("CubeAxesActor")): aet[at].SetZTitle(ztitle) # change some default to emulate standard behaviours if style in (0, "vtk"): axes = options.pop("axes", None) if axes is None: options["axes"] = {"xygrid": False, "yzgrid": False, "zxgrid": False} else: options["axes"] = axes # put back if cmap is None: cmap = "rainbow" elif style in (1, "matplotlib"): bg = options.pop("bg", None) if bg is None: options["bg"] = "white" else: options["bg"] = bg axes = options.pop("axes", None) if axes is None: options["axes"] = {"xygrid": False, "yzgrid": False, "zxgrid": False} else: options["axes"] = axes # put back if cmap is None: cmap = "viridis" elif style in (2, "paraview"): bg = options.pop("bg", None) if bg is None: options["bg"] = (82, 87, 110) else: options["bg"] = bg if cmap is None: cmap = "coolwarm" elif style in (3, "meshlab"): bg = options.pop("bg", None) if bg is None: options["bg"] = (8, 8, 16) options["bg2"] = (117, 117, 234) else: options["bg"] = bg axes = options.pop("axes", None) if axes is None: options["axes"] = 10 else: options["axes"] = axes # put back if cmap is None: cmap = "afmhot" elif style in (4, "bw"): bg = options.pop("bg", None) if bg is None: options["bg"] = (217, 255, 238) else: options["bg"] = bg axes = options.pop("axes", None) if axes is None: options["axes"] = {"xygrid": False, "yzgrid": False, "zxgrid": False} else: options["axes"] = axes # put back if cmap is None: cmap = "binary" ################################################################# actors = [] if vedo.plotter_instance: if add: actors = vedo.plotter_instance.actors if mesh and ("mesh" in mode or "color" in mode or "displace" in mode): msh = IMesh(u, mesh, exterior=exterior) msh.wireframe(wire) msh.scale(scale_mesh_factors) if lighting: msh.lighting(lighting) if ttime: msh.z(ttime) if legend: msh.legend(legend) if c: msh.color(c) if lc: msh.linecolor(lc) if alpha: alpha = min(alpha, 1) msh.alpha(alpha * alpha) if lw: msh.linewidth(lw) if wire and alpha: lw1 = min(lw, 1) msh.alpha(alpha * lw1) if ps: msh.point_size(ps) if shading: if shading == "phong": msh.phong() elif shading == "flat": msh.flat() elif shading[0] == "g": msh.phong() if "displace" in mode: msh.move(u) if cmap and (msh.u_values is not None) and len(msh.u_values)>0 and c is None: if msh.u_values.ndim > 1: msh.cmap(cmap, utils.mag(msh.u_values), vmin=vmin, vmax=vmax) else: msh.cmap(cmap, msh.u_values, vmin=vmin, vmax=vmax) if warp_yfactor: scals = msh.pointdata[0] if len(scals) > 0: pts_act = msh.coordinates pts_act[:, 1] = scals * warp_yfactor * scale_mesh_factors[1] if warp_zfactor: scals = msh.pointdata[0] if len(scals) > 0: pts_act = msh.coordinates pts_act[:, 2] = scals * warp_zfactor * scale_mesh_factors[2] if warp_yfactor or warp_zfactor: # msh.points(pts_act) msh.coordinates = pts_act if vmin is not None and vmax is not None: msh.mapper.SetScalarRange(vmin, vmax) if scbar and c is None: if "3d" in scbar: msh.add_scalarbar3d() elif "h" in scbar: msh.add_scalarbar(horizontal=True) else: msh.add_scalarbar(horizontal=False) if len(isolns) > 0: ison = isolns.pop("n", 10) isocol = isolns.pop("c", "black") isoalpha = isolns.pop("alpha", 1) isolw = isolns.pop("lw", 1) isos = msh.isolines(n=ison).color(isocol).lw(isolw).alpha(isoalpha) isoz = isolns.pop("z", None) if isoz is not None: # kind of hack to make isolines visible on flat meshes d = isoz else: d = msh.diagonal_size() / 400 isos.z(msh.z() + d) actors.append(isos) actors.append(msh) ################################################################# if "arrow" in mode or "line" in mode: if "arrow" in mode: arrs = create_arrows(u, scale=scale) else: arrs = create_lines(u, scale=scale) if arrs: if legend and "mesh" not in mode: arrs.legend(legend) if c: arrs.color(c) arrs.color(c) if alpha: arrs.alpha(alpha) actors.append(arrs) ################################################################# for ob in inputobj: inputtype = str(type(ob)) if "vedo" in inputtype: actors.append(ob) if text: actors.append(text) if "at" in options and "interactive" not in options: if vedo.plotter_instance: N = vedo.plotter_instance.shape[0] * vedo.plotter_instance.shape[1] if options["at"] == N - 1: options["interactive"] = True if len(actors) == 0: print('Warning: no objects to show, check mode in plot(mode="...")') if returnActorsNoShow: return actors return show(actors, **options) ################################################################################### class IMesh(Mesh): """Interface Mesh representation for dolfin.""" def __init__(self, *inputobj, **options): """A `vedo.Mesh` derived object for dolfin support.""" c = options.pop("c", None) alpha = options.pop("alpha", 1) exterior = options.pop("exterior", False) compute_normals = options.pop("compute_normals", False) mesh, u = _inputsort(inputobj) if not mesh: return if exterior: import dolfin meshc = dolfin.BoundaryMesh(mesh, "exterior") else: meshc = mesh if hasattr(mesh, "coordinates"): coords = mesh.coordinates() else: coords = mesh.geometry.points cells = meshc.cells() if cells.shape[1] == 4: poly = vtki.vtkPolyData() source_points = vtki.vtkPoints() source_points.SetData(utils.numpy2vtk(coords, dtype=np.float32)) poly.SetPoints(source_points) source_polygons = vtki.vtkCellArray() for f in cells: # do not use vtkTetra() because it fails # with dolfin faces orientation ele0 = vtki.vtkTriangle() ele1 = vtki.vtkTriangle() ele2 = vtki.vtkTriangle() ele3 = vtki.vtkTriangle() f0, f1, f2, f3 = f pid0 = ele0.GetPointIds() pid1 = ele1.GetPointIds() pid2 = ele2.GetPointIds() pid3 = ele3.GetPointIds() pid0.SetId(0, f0) pid0.SetId(1, f1) pid0.SetId(2, f2) pid1.SetId(0, f0) pid1.SetId(1, f1) pid1.SetId(2, f3) pid2.SetId(0, f1) pid2.SetId(1, f2) pid2.SetId(2, f3) pid3.SetId(0, f2) pid3.SetId(1, f3) pid3.SetId(2, f0) source_polygons.InsertNextCell(ele0) source_polygons.InsertNextCell(ele1) source_polygons.InsertNextCell(ele2) source_polygons.InsertNextCell(ele3) poly.SetPolys(source_polygons) else: poly = utils.buildPolyData(coords, cells) super().__init__(poly, c, alpha) if compute_normals: self.compute_normals() self.mesh = mesh # holds a dolfin Mesh obj self.u = u # holds a dolfin function_data # holds the actual values of u on the mesh self.u_values = _compute_uvalues(u, mesh) ##################################### def move(self, u=None, deltas=None): """Move mesh according to solution `u` or from calculated vertex displacements `deltas`.""" if u is None: u = self.u if deltas is None: if self.u_values is not None: deltas = self.u_values else: deltas = _compute_uvalues(u, self.mesh) self.u_values = deltas if hasattr(self.mesh, "coordinates"): coords = self.mesh.coordinates() else: coords = self.mesh.geometry.points if coords.shape != deltas.shape: vedo.logger.error( f"Try to move mesh with wrong solution type shape {coords.shape} vs {deltas.shape}" ) vedo.logger.error("Mesh is not moved. Try mode='color' in plot().") return movedpts = coords + deltas if movedpts.shape[1] == 2: # 2d movedpts = np.c_[movedpts, np.zeros(movedpts.shape[0])] self.dataset.GetPoints().SetData(utils.numpy2vtk(movedpts, dtype=np.float32)) self.dataset.GetPoints().Modified() ################################################################################### def create_lines(*inputobj, **options): """ Build the line segments between two lists of points `start_points` and `end_points`. `start_points` can be also passed in the form `[[point1, point2], ...]`. A dolfin `Mesh` that was deformed/modified by a function can be passed together as inputs. Use `scale` to apply a rescaling factor to the length """ scale = options.pop("scale", 1) lw = options.pop("lw", 1) c = options.pop("c", "grey") alpha = options.pop("alpha", 1) mesh, u = _inputsort(inputobj) if not mesh: return None if hasattr(mesh, "coordinates"): start_points = mesh.coordinates() else: start_points = mesh.geometry.points u_values = _compute_uvalues(u, mesh) if not utils.is_sequence(u_values[0]): vedo.logger.error("cannot show Lines for 1D scalar values") raise RuntimeError() end_points = start_points + u_values if u_values.shape[1] == 2: # u_values is 2D u_values = np.insert(u_values, 2, 0, axis=1) # make it 3d start_points = np.insert(start_points, 2, 0, axis=1) # make it 3d end_points = np.insert(end_points, 2, 0, axis=1) # make it 3d lines = shapes.Lines(start_points, end_points, scale=scale, lw=lw, c=c, alpha=alpha) lines.mesh = mesh lines.u = u lines.u_values = u_values return lines ################################################################################### def create_arrows(*inputobj, **options): """Build arrows representing displacements.""" s = options.pop("s", None) c = options.pop("c", "k3") scale = options.pop("scale", 1) alpha = options.pop("alpha", 1) res = options.pop("res", 12) mesh, u = _inputsort(inputobj) if not mesh: return None if hasattr(mesh, "coordinates"): start_points = mesh.coordinates() else: start_points = mesh.geometry.points u_values = _compute_uvalues(u, mesh) if not utils.is_sequence(u_values[0]): vedo.logger.error("cannot show Arrows for 1D scalar values") raise RuntimeError() end_points = start_points + u_values * scale if u_values.shape[1] == 2: # u_values is 2D u_values = np.insert(u_values, 2, 0, axis=1) # make it 3d start_points = np.insert(start_points, 2, 0, axis=1) # make it 3d end_points = np.insert(end_points, 2, 0, axis=1) # make it 3d obj = shapes.Arrows(start_points, end_points, s=s, alpha=alpha, c=c, res=res) obj.mesh = mesh obj.u = u obj.u_values = u_values return obj vedo-2025.5.3/vedo/file_io.py000066400000000000000000002267421474667405700156630ustar00rootroot00000000000000import glob import os import time from tempfile import NamedTemporaryFile, TemporaryDirectory from typing import Any, List, Tuple, Union import numpy as np import vedo.vtkclasses as vtki # a wrapper for lazy imports import vedo from vedo import settings from vedo import colors from vedo import utils from vedo.assembly import Assembly from vedo.image import Image from vedo.pointcloud import Points from vedo.mesh import Mesh from vedo.volume import Volume __docformat__ = "google" __doc__ = """ Submodule to read/write meshes and other objects in different formats, and other I/O functionalities. """ __all__ = [ "load", "read", "download", "gunzip", "loadStructuredPoints", "loadStructuredGrid", "write", "save", "export_window", "import_window", "load_obj", "screenshot", "ask", "Video", ] # example web page for X3D _x3d_html_template = """ vedo with x3d

Example html generated by vedo

This example loads a 3D scene from file ~fileoutput generated by vedo (see export_x3d.py).

Nothing shows up above this line?

Enable your browser to load local files:
Firefox: type about:config in the URL bar and change privacy.file_unique_origin from True to False
Chrome: from terminal type: google-chrome --enable-webgl --allow-file-access-from-files (see here)

Controls:

Examine Mode (activate with key 'e'):

Button Function
Left Button / Left Button + Shift Rotate
Mid Button / Left Button + Ctl Pan
Right Button / Wheel / Left Button + Alt Zoom
Left double click Set center of rotation

Walk Mode (activate with key 'w'):

Button Function
Left Button Move forward
Right Button Move backward

Fly Mode (activate with key 'f'):

Button Function
Left Button Move forward
Right Button Move backward

Non-interactive camera movement

Key Function
r reset view
a show all
u upright
""" ######################################################################## def load(inputobj: Union[list, str, os.PathLike], unpack=True, force=False) -> Any: """ Load any vedo objects from file or from the web. The output will depend on the file extension. See examples below. Unzip is made on the fly, if file ends with `.gz`. Can load an object directly from a URL address. Arguments: unpack : (bool) unpack MultiBlockData into a flat list of objects. force : (bool) when downloading a file ignore any previous cached downloads and force a new one. Example: ```python from vedo import dataurl, load, show # Return a list of 2 meshes g = load([dataurl+'250.vtk', dataurl+'270.vtk']) show(g) # Return a list of meshes by reading all files in a directory # (if directory contains DICOM files then a Volume is returned) g = load('mydicomdir/') show(g) ``` """ if isinstance(inputobj, list): inputobj = [str(f) for f in inputobj] else: inputobj = str(inputobj) acts = [] if utils.is_sequence(inputobj): flist = inputobj elif isinstance(inputobj, str) and inputobj.startswith("https://"): flist = [inputobj] else: flist = utils.humansort(glob.glob(inputobj)) for fod in flist: if fod.startswith("https://"): fod = download(fod, force=force, verbose=False) if os.path.isfile(fod): ### it's a file if fod.endswith(".gz"): fod = gunzip(fod) a = _load_file(fod, unpack) acts.append(a) elif os.path.isdir(fod): ### it's a directory or DICOM flist = os.listdir(fod) if ".dcm" in flist[0]: ### it's DICOM reader = vtki.new("DICOMImageReader") reader.SetDirectoryName(fod) reader.Update() image = reader.GetOutput() vol = Volume(image) try: vol.metadata["PixelSpacing"] = reader.GetPixelSpacing() vol.metadata["Width"] = reader.GetWidth() vol.metadata["Height"] = reader.GetHeight() vol.metadata["PositionPatient"] = reader.GetImagePositionPatient() vol.metadata["OrientationPatient"] = reader.GetImageOrientationPatient() vol.metadata["BitsAllocated"] = reader.GetBitsAllocated() vol.metadata["PixelRepresentation"] = reader.GetPixelRepresentation() vol.metadata["NumberOfComponents"] = reader.GetNumberOfComponents() vol.metadata["TransferSyntaxUID"] = reader.GetTransferSyntaxUID() vol.metadata["RescaleSlope"] = reader.GetRescaleSlope() vol.metadata["RescaleOffset"] = reader.GetRescaleOffset() vol.metadata["PatientName"] = reader.GetPatientName() vol.metadata["StudyUID"] = reader.GetStudyUID() vol.metadata["StudyID"] = reader.GetStudyID() vol.metadata["GantryAngle"] = reader.GetGantryAngle() except Exception as e: vedo.logger.warning(f"Cannot read DICOM metadata: {e}") acts.append(vol) else: ### it's a normal directory utils.humansort(flist) for ifile in flist: a = _load_file(fod + "/" + ifile, unpack) acts.append(a) else: vedo.logger.error(f"in load(), cannot find {fod}") if len(acts) == 1: if "numpy" in str(type(acts[0])): return acts[0] if not acts[0]: vedo.logger.error(f"in load(), cannot load {inputobj}") return acts[0] if len(acts) == 0: vedo.logger.error(f"in load(), cannot load {inputobj}") return None else: return acts ######################################################################## def _load_file(filename, unpack): fl = filename.lower() ########################################################## other formats: if fl.endswith(".xml") or fl.endswith(".xml.gz") or fl.endswith(".xdmf"): # Fenics tetrahedral file objt = loadDolfin(filename) elif fl.endswith(".neutral") or fl.endswith(".neu"): # neutral tets objt = loadNeutral(filename) elif fl.endswith(".gmsh"): # gmesh file objt = loadGmesh(filename) elif fl.endswith(".pcd"): # PCL point-cloud format objt = loadPCD(filename) objt.properties.SetPointSize(2) elif fl.endswith(".off"): objt = loadOFF(filename) elif fl.endswith(".3ds"): # 3ds format objt = load3DS(filename) elif fl.endswith(".wrl"): importer = vtki.new("VRMLImporter") importer.SetFileName(filename) importer.Read() importer.Update() actors = importer.GetRenderer().GetActors() # vtkActorCollection actors.InitTraversal() wacts = [] for i in range(actors.GetNumberOfItems()): act = actors.GetNextActor() m = Mesh(act.GetMapper().GetInput()) m.actor = act wacts.append(m) objt = Assembly(wacts) ######################################################## volumetric: elif ( fl.endswith(".tif") or fl.endswith(".tiff") or fl.endswith(".slc") or fl.endswith(".vti") or fl.endswith(".mhd") or fl.endswith(".nrrd") or fl.endswith(".nii") or fl.endswith(".dem") ): img = loadImageData(filename) objt = Volume(img) ######################################################### 2D images: elif ( fl.endswith(".png") or fl.endswith(".jpg") or fl.endswith(".bmp") or fl.endswith(".jpeg") or fl.endswith(".gif") ): if ".png" in fl: picr = vtki.new("PNGReader") elif ".jpg" in fl or ".jpeg" in fl: picr = vtki.new("JPEGReader") elif ".bmp" in fl: picr = vtki.new("BMPReader") elif ".gif" in fl: from PIL import Image as PILImage, ImageSequence img = PILImage.open(filename) frames = [] for frame in ImageSequence.Iterator(img): a = np.array(frame.convert("RGB").getdata(), dtype=np.uint8) a = a.reshape([frame.size[1], frame.size[0], 3]) frames.append(Image(a)) return frames picr.SetFileName(filename) picr.Update() objt = Image(picr.GetOutput()) ######################################################### multiblock: elif fl.endswith(".vtm") or fl.endswith(".vtmb"): read = vtki.new("XMLMultiBlockDataReader") read.SetFileName(filename) read.Update() mb = read.GetOutput() if unpack: acts = [] for i in range(mb.GetNumberOfBlocks()): b = mb.GetBlock(i) if isinstance( b, ( vtki.vtkPolyData, vtki.vtkStructuredGrid, vtki.vtkRectilinearGrid, ), ): acts.append(Mesh(b)) elif isinstance(b, vtki.vtkImageData): acts.append(Volume(b)) elif isinstance(b, vtki.vtkUnstructuredGrid): acts.append(vedo.UnstructuredGrid(b)) return acts return mb ######################################################### assembly: elif fl.endswith(".npy"): data = np.load(filename, allow_pickle=True) try: # old format with a single object meshs = [from_numpy(dd) for dd in data] except TypeError: data = data.item() meshs = [] for ad in data["objects"][0]["parts"]: obb = from_numpy(ad) meshs.append(obb) return Assembly(meshs) ########################################################### elif fl.endswith(".geojson"): return loadGeoJSON(filename) elif fl.endswith(".pvd"): return loadPVD(filename) ########################################################### polygonal mesh: else: if fl.endswith(".vtk"): # read all legacy vtk types reader = vtki.new("DataSetReader") reader.ReadAllScalarsOn() reader.ReadAllVectorsOn() reader.ReadAllTensorsOn() reader.ReadAllFieldsOn() reader.ReadAllNormalsOn() reader.ReadAllColorScalarsOn() elif fl.endswith(".ply"): reader = vtki.new("PLYReader") elif fl.endswith(".obj"): reader = vtki.new("OBJReader") reader.SetGlobalWarningDisplay(0) # suppress warnings issue #980 elif fl.endswith(".stl"): reader = vtki.new("STLReader") elif fl.endswith(".byu") or fl.endswith(".g"): reader = vtki.new("BYUReader") elif fl.endswith(".foam"): # OpenFoam reader = vtki.new("OpenFOAMReader") elif fl.endswith(".pvd"): reader = vtki.new("XMLGenericDataObjectReader") elif fl.endswith(".vtp"): reader = vtki.new("XMLPolyDataReader") elif fl.endswith(".vts"): reader = vtki.new("XMLStructuredGridReader") elif fl.endswith(".vtu"): reader = vtki.new("XMLUnstructuredGridReader") elif fl.endswith(".vtr"): reader = vtki.new("XMLRectilinearGridReader") elif fl.endswith(".pvtr"): reader = vtki.new("XMLPRectilinearGridReader") elif fl.endswith("pvtu"): reader = vtki.new("XMLPUnstructuredGridReader") elif fl.endswith(".txt") or fl.endswith(".xyz") or fl.endswith(".dat"): reader = vtki.new("ParticleReader") # (format is x, y, z, scalar) elif fl.endswith(".facet"): reader = vtki.new("FacetReader") else: return None reader.SetFileName(filename) reader.Update() routput = reader.GetOutput() if not routput: vedo.logger.error(f"unable to load {filename}") return None if isinstance(routput, vtki.vtkUnstructuredGrid): objt = vedo.UnstructuredGrid(routput) else: objt = Mesh(routput) if fl.endswith(".txt") or fl.endswith(".xyz") or fl.endswith(".dat"): objt.point_size(4) objt.filename = filename objt.file_size, objt.created = file_info(filename) return objt def download(url: str, force=False, verbose=True) -> str: """ Retrieve a file from a URL, save it locally and return its path. Use `force=True` to force a reload and discard cached copies. """ if not url.startswith("https://"): # assume it's a file so no need to download return url url = url.replace("www.dropbox", "dl.dropbox") if "github.com" in url: url = url.replace("/blob/", "/raw/") basename = os.path.basename(url) if "?" in basename: basename = basename.split("?")[0] home_directory = os.path.expanduser("~") cachedir = os.path.join(home_directory, settings.cache_directory, "vedo") fname = os.path.join(cachedir, basename) # Create the directory if it does not exist if not os.path.exists(cachedir): os.makedirs(cachedir) if not force and os.path.exists(fname): if verbose: colors.printc("reusing cached file:", fname) return fname try: from urllib.request import urlopen, Request req = Request(url, headers={"User-Agent": "Mozilla/5.0"}) if verbose: colors.printc("reading", basename, "from", url.split("/")[2][:40], "...", end="") except ImportError: import urllib2 import contextlib urlopen = lambda url_: contextlib.closing(urllib2.urlopen(url_)) req = url if verbose: colors.printc("reading", basename, "from", url.split("/")[2][:40], "...", end="") with urlopen(req) as response, open(fname, "wb") as output: output.write(response.read()) if verbose: colors.printc(" done.") return fname ######################################################################## # def download_new(url, to_local_file="", force=False, verbose=True): # """ # Downloads a file from `url` to `to_local_file` if the local copy is outdated. # Arguments: # url : (str) # The URL to download the file from. # to_local_file : (str) # The local file name to save the file to. # If not specified, the file name will be the same as the remote file name # in the directory specified by `settings.cache_directory + "/vedo"`. # force : (bool) # Force a new download even if the local file is up to date. # verbose : (bool) # Print verbose messages. # """ # if not url.startswith("https://"): # if os.path.exists(url): # # Assume the url is already the local file path # return url # else: # raise FileNotFoundError(f"File not found: {url}") # from datetime import datetime # import requests # url = url.replace("www.dropbox", "dl.dropbox") # if "github.com" in url: # url = url.replace("/blob/", "/raw/") # # Get the user's home directory # home_directory = os.path.expanduser("~") # # Define the path for the cache directory # cachedir = os.path.join(home_directory, settings.cache_directory, "vedo") # # Create the directory if it does not exist # if not os.path.exists(cachedir): # os.makedirs(cachedir) # if not to_local_file: # basename = os.path.basename(url) # if "?" in basename: # basename = basename.split("?")[0] # to_local_file = os.path.join(cachedir, basename) # if verbose: print(f"Using local file name: {to_local_file}") # # Check if the local file exists and get its last modified time # if os.path.exists(to_local_file): # to_local_file_modified_time = os.path.getmtime(to_local_file) # else: # to_local_file_modified_time = 0 # # Send a HEAD request to get last modified time of the remote file # response = requests.head(url) # if 'Last-Modified' in response.headers: # remote_file_modified_time = datetime.strptime( # response.headers['Last-Modified'], '%a, %d %b %Y %H:%M:%S GMT' # ).timestamp() # else: # # If the Last-Modified header not available, assume file needs to be downloaded # remote_file_modified_time = float('inf') # # Download the file if the remote file is newer # if force or remote_file_modified_time > to_local_file_modified_time: # response = requests.get(url) # with open(to_local_file, 'wb') as file: # file.write(response.content) # if verbose: print(f"Downloaded file from {url} -> {to_local_file}") # else: # if verbose: print("Local file is up to date.") # return to_local_file ######################################################################## def gunzip(filename: str) -> str: """Unzip a `.gz` file to a temporary file and returns its path.""" if not filename.endswith(".gz"): # colors.printc("gunzip() error: file must end with .gz", c='r') return filename import gzip tmp_file = NamedTemporaryFile(delete=False) tmp_file.name = os.path.join( os.path.dirname(tmp_file.name), os.path.basename(filename).replace(".gz", "") ) inF = gzip.open(filename, "rb") with open(tmp_file.name, "wb") as outF: outF.write(inF.read()) inF.close() return tmp_file.name ######################################################################## def file_info(file_path: str) -> Tuple[str, str]: """Return the file size and creation time of input file""" siz, created = "", "" if os.path.isfile(file_path): f_info = os.stat(file_path) num = f_info.st_size for x in ["B", "KB", "MB", "GB", "TB"]: if num < 1024.0: break num /= 1024.0 siz = "%3.1f%s" % (num, x) created = time.ctime(os.path.getmtime(file_path)) return siz, created ################################################################### def loadStructuredPoints(filename: Union[str, os.PathLike], as_points=True): """ Load and return a `vtkStructuredPoints` object from file. If `as_points` is True, return a `Points` object instead of a `vtkStructuredPoints`. """ filename = str(filename) reader = vtki.new("StructuredPointsReader") reader.SetFileName(filename) reader.Update() if as_points: v2p = vtki.new("ImageToPoints") v2p.SetInputData(reader.GetOutput()) v2p.Update() pts = Points(v2p.GetOutput()) return pts return reader.GetOutput() ######################################################################## def loadStructuredGrid(filename: Union[str, os.PathLike]): """Load and return a `vtkStructuredGrid` object from file.""" filename = str(filename) if filename.endswith(".vts"): reader = vtki.new("XMLStructuredGridReader") else: reader = vtki.new("StructuredGridReader") reader.SetFileName(filename) reader.Update() return reader.GetOutput() ################################################################### def load3DS(filename: Union[str, os.PathLike]) -> Assembly: """Load `3DS` file format from file.""" filename = str(filename) renderer = vtki.vtkRenderer() renWin = vtki.vtkRenderWindow() renWin.AddRenderer(renderer) importer = vtki.new("3DSImporter") importer.SetFileName(filename) importer.ComputeNormalsOn() importer.SetRenderWindow(renWin) importer.Update() actors = renderer.GetActors() # vtkActorCollection acts = [] for i in range(actors.GetNumberOfItems()): a = actors.GetItemAsObject(i) acts.append(a) del renWin wrapped_acts = [] for a in acts: try: newa = Mesh(a.GetMapper().GetInput()) newa.actor = a wrapped_acts.append(newa) # print("loaded 3DS object", [a]) except: print("ERROR: cannot load 3DS object part", [a]) return vedo.Assembly(wrapped_acts) ######################################################################## def loadOFF(filename: Union[str, os.PathLike]) -> Mesh: """Read the OFF file format (polygonal mesh).""" filename = str(filename) with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() vertices = [] faces = [] NumberOfVertices = 0 i = -1 for text in lines: if len(text) == 0: continue if text == "\n": continue if "#" in text: continue if "OFF" in text: continue ts = text.split() n = len(ts) if not NumberOfVertices and n > 1: NumberOfVertices, NumberOfFaces = int(ts[0]), int(ts[1]) continue i += 1 if i < NumberOfVertices and n == 3: x, y, z = float(ts[0]), float(ts[1]), float(ts[2]) vertices.append([x, y, z]) ids = [] if NumberOfVertices <= i < (NumberOfVertices + NumberOfFaces + 1) and n > 2: ids += [int(xx) for xx in ts[1:]] faces.append(ids) return Mesh(utils.buildPolyData(vertices, faces)) ######################################################################## def loadGeoJSON(filename: Union[str, os.PathLike]) -> Mesh: """Load GeoJSON files.""" filename = str(filename) jr = vtki.new("GeoJSONReader") jr.SetFileName(filename) jr.Update() return Mesh(jr.GetOutput()) ######################################################################## def loadDolfin(filename: Union[str, os.PathLike]) -> Union[Mesh, "vedo.TetMesh", None]: """ Reads a `Fenics/Dolfin` file format (.xml or .xdmf). Return a `Mesh` or a `TetMesh` object. """ filename = str(filename) try: import dolfin except ImportError: vedo.logger.error("loadDolfin(): dolfin module not found. Install with:") vedo.logger.error(" conda create -n fenics -c conda-forge fenics") vedo.logger.error(" conda install conda-forge::mshr") vedo.logger.error(" conda activate fenics") return None if filename.lower().endswith(".xdmf"): f = dolfin.XDMFFile(filename) m = dolfin.Mesh() f.read(m) else: m = dolfin.Mesh(filename) cells = m.cells() verts = m.coordinates() if cells.size and verts.size: if len(cells[0]) == 4: # tetrahedral mesh return vedo.TetMesh([verts, cells]) elif len(cells[0]) == 3: # triangular mesh return Mesh([verts, cells]) return None ######################################################################## def loadPVD(filename: Union[str, os.PathLike]) -> Union[List[Any], None]: """Read paraview files.""" filename = str(filename) import xml.etree.ElementTree as et tree = et.parse(filename) dname = os.path.dirname(filename) if not dname: dname = "." listofobjs = [] for coll in tree.getroot(): for dataset in coll: fname = dataset.get("file") if not fname: continue ob = load(dname + "/" + fname) tm = dataset.get("timestep") if tm: ob.time = tm listofobjs.append(ob) if len(listofobjs) == 1: return listofobjs[0] if len(listofobjs) == 0: return None return listofobjs ######################################################################## def loadNeutral(filename: Union[str, os.PathLike]) -> "vedo.TetMesh": """ Reads a `Neutral` tetrahedral file format. Returns an `TetMesh` object. """ filename = str(filename) with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() ncoords = int(lines[0]) coords = [] for i in range(1, ncoords + 1): x, y, z = lines[i].split() coords.append([float(x), float(y), float(z)]) ntets = int(lines[ncoords + 1]) idolf_tets = [] for i in range(ncoords + 2, ncoords + ntets + 2): text = lines[i].split() v0, v1, v2, v3 = int(text[1])-1, int(text[2])-1, int(text[3])-1, int(text[4])-1 idolf_tets.append([v0, v1, v2, v3]) return vedo.TetMesh([coords, idolf_tets]) ######################################################################## def loadGmesh(filename: Union[str, os.PathLike]) -> Mesh: """Reads a `gmesh` file format. Return an `Mesh` object.""" filename = str(filename) with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() nnodes = 0 index_nodes = 0 for i, line in enumerate(lines): if "$Nodes" in line: index_nodes = i + 1 nnodes = int(lines[index_nodes]) break node_coords = [] for i in range(index_nodes + 1, index_nodes + 1 + nnodes): cn = lines[i].split() node_coords.append([float(cn[1]), float(cn[2]), float(cn[3])]) nelements = 0 index_elements = 0 for i, line in enumerate(lines): if "$Elements" in line: index_elements = i + 1 nelements = int(lines[index_elements]) break elements = [] for i in range(index_elements + 1, index_elements + 1 + nelements): ele = lines[i].split() elements.append([int(ele[-3]), int(ele[-2]), int(ele[-1])]) poly = utils.buildPolyData(node_coords, elements, index_offset=1) return Mesh(poly) ######################################################################## def loadPCD(filename: Union[str, os.PathLike]) -> Points: """Return a `Mesh` made of only vertex points from the `PointCloud` library file format. Returns an `Points` object. """ filename = str(filename) with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() start = False pts = [] N, expN = 0, 0 for text in lines: if start: if N >= expN: break l = text.split() pts.append([float(l[0]), float(l[1]), float(l[2])]) N += 1 if not start and "POINTS" in text: expN = int(text.split()[1]) if not start and "DATA ascii" in text: start = True if expN != N: vedo.logger.warning(f"Mismatch in PCD file {expN} != {len(pts)}") poly = utils.buildPolyData(pts) return Points(poly).point_size(4) ######################################################################### def from_numpy(d: dict) -> Mesh: # recreate a mesh from numpy arrays keys = d.keys() points = d["points"] cells = d["cells"] if "cells" in keys else None lines = d["lines"] if "lines" in keys else None msh = Mesh([points, cells, lines]) if "pointdata" in keys and isinstance(d["pointdata"], dict): for arrname, arr in d["pointdata"].items(): msh.pointdata[arrname] = arr if "celldata" in keys and isinstance(d["celldata"], dict): for arrname, arr in d["celldata"].items(): msh.celldata[arrname] = arr if "metadata" in keys and isinstance(d["metadata"], dict): for arrname, arr in d["metadata"].items(): msh.metadata[arrname] = arr prp = msh.properties prp.SetAmbient(d['ambient']) prp.SetDiffuse(d['diffuse']) prp.SetSpecular(d['specular']) prp.SetSpecularPower(d['specularpower']) prp.SetSpecularColor(d['specularcolor']) prp.SetInterpolation(0) # prp.SetInterpolation(d['shading']) prp.SetOpacity(d['alpha']) prp.SetRepresentation(d['representation']) prp.SetPointSize(d['pointsize']) if d['color'] is not None: msh.color(d['color']) if "lighting_is_on" in d.keys(): prp.SetLighting(d['lighting_is_on']) # Must check keys for backwards compatibility: if "linecolor" in d.keys() and d['linecolor'] is not None: msh.linecolor(d['linecolor']) if "backcolor" in d.keys() and d['backcolor'] is not None: msh.backcolor(d['backcolor']) if d['linewidth'] is not None: msh.linewidth(d['linewidth']) if "edge_visibility" in d.keys(): prp.SetEdgeVisibility(d['edge_visibility']) # new lut_list = d["LUT"] lut_range = d["LUT_range"] ncols = len(lut_list) lut = vtki.vtkLookupTable() lut.SetNumberOfTableValues(ncols) lut.SetRange(lut_range) for i in range(ncols): r, g, b, a = lut_list[i] lut.SetTableValue(i, r, g, b, a) lut.Build() msh.mapper.SetLookupTable(lut) msh.mapper.SetScalarRange(lut_range) try: # NEW in vedo 5.0 arname = d["array_name_to_color_by"] msh.mapper.SetArrayName(arname) msh.mapper.SetInterpolateScalarsBeforeMapping( d["interpolate_scalars_before_mapping"]) msh.mapper.SetUseLookupTableScalarRange( d["use_lookup_table_scalar_range"]) msh.mapper.SetScalarRange(d["scalar_range"]) msh.mapper.SetScalarVisibility(d["scalar_visibility"]) msh.mapper.SetScalarMode(d["scalar_mode"]) msh.mapper.SetColorMode(d["color_mode"]) if d["scalar_visibility"]: if d["scalar_mode"] == 1: msh.dataset.GetPointData().SetActiveScalars(arname) if d["scalar_mode"] == 2: msh.dataset.GetCellData().SetActiveScalars(arname) if "texture_array" in keys and d["texture_array"] is not None: # recreate a vtkTexture object from numpy arrays: t = vtki.vtkTexture() t.SetInterpolate(d["texture_interpolate"]) t.SetRepeat(d["texture_repeat"]) t.SetQuality(d["texture_quality"]) t.SetColorMode(d["texture_color_mode"]) t.SetMipmap(d["texture_mipmap"]) t.SetBlendingMode(d["texture_blending_mode"]) t.SetEdgeClamp(d["texture_edge_clamp"]) t.SetBorderColor(d["texture_border_color"]) msh.actor.SetTexture(t) tcarray = None for arrname in msh.pointdata.keys(): if "Texture" in arrname or "TCoord" in arrname: tcarray = arrname break if tcarray is not None: t.SetInputData(vedo.Image(d["texture_array"]).dataset) msh.pointdata.select_texture_coords(tcarray) # print("color_mode", d["color_mode"]) # print("scalar_mode", d["scalar_mode"]) # print("scalar_range", d["scalar_range"]) # print("scalar_visibility", d["scalar_visibility"]) # print("array_name_to_color_by", arname) except KeyError: pass if "time" in keys: msh.time = d["time"] if "name" in keys: msh.name = d["name"] # if "info" in keys: msh.info = d["info"] if "filename" in keys: msh.filename = d["filename"] if "pickable" in keys: msh.pickable(d["pickable"]) if "dragable" in keys: msh.draggable(d["dragable"]) return msh ############################################################################# def _import_npy(fileinput: Union[str, os.PathLike]) -> "vedo.Plotter": """Import a vedo scene from numpy format.""" fileinput = str(fileinput) fileinput = download(fileinput, verbose=False, force=True) if fileinput.endswith(".npy"): data = np.load(fileinput, allow_pickle=True, encoding="latin1").flatten()[0] elif fileinput.endswith(".npz"): data = np.load(fileinput, allow_pickle=True)["vedo_scenes"][0] if "use_parallel_projection" in data.keys(): vedo.settings.use_parallel_projection = data["use_parallel_projection"] if "use_polygon_offset" in data.keys(): vedo.settings.use_polygon_offset = data["use_polygon_offset"] if "polygon_offset_factor" in data.keys(): vedo.settings.polygon_offset_factor = data["polygon_offset_factor"] if "polygon_offset_units" in data.keys(): vedo.settings.polygon_offset_units = data["polygon_offset_units"] if "interpolate_scalars_before_mapping" in data.keys(): vedo.settings.interpolate_scalars_before_mapping = data["interpolate_scalars_before_mapping"] if "default_font" in data.keys(): vedo.settings.default_font = data["default_font"] if "use_depth_peeling" in data.keys(): vedo.settings.use_depth_peeling = data["use_depth_peeling"] axes = data.pop("axes", 4) # UNUSED title = data.pop("title", "") backgrcol = data.pop("backgrcol", "white") backgrcol2 = data.pop("backgrcol2", None) cam = data.pop("camera", None) if data["shape"] != (1, 1): data["size"] = "auto" # disable size plt = vedo.Plotter( size=data["size"], # not necessarily a good idea to set it axes=axes, # must be zero to avoid recreating the axes title=title, bg=backgrcol, bg2=backgrcol2, ) if cam: if "pos" in cam.keys(): plt.camera.SetPosition(cam["pos"]) if "focalPoint" in cam.keys(): # obsolete plt.camera.SetFocalPoint(cam["focalPoint"]) if "focal_point" in cam.keys(): plt.camera.SetFocalPoint(cam["focal_point"]) if "viewup" in cam.keys(): plt.camera.SetViewUp(cam["viewup"]) if "distance" in cam.keys(): plt.camera.SetDistance(cam["distance"]) if "clippingRange" in cam.keys(): # obsolete plt.camera.SetClippingRange(cam["clippingRange"]) if "clipping_range" in cam.keys(): plt.camera.SetClippingRange(cam["clipping_range"]) if "parallel_scale" in cam.keys(): plt.camera.SetParallelScale(cam["parallel_scale"]) ############################################## objs = [] for d in data["objects"]: ### Mesh if d['type'].lower() == 'mesh': obj = from_numpy(d) ### Assembly elif d['type'].lower() == 'assembly': assacts = [] for ad in d["actors"]: assacts.append(from_numpy(ad)) obj = Assembly(assacts) obj.SetScale(d["scale"]) obj.SetPosition(d["position"]) obj.SetOrientation(d["orientation"]) obj.SetOrigin(d["origin"]) ### Volume elif d['type'].lower() == 'volume': obj = Volume(d["array"]) obj.spacing(d["spacing"]) obj.origin(d["origin"]) if "jittering" in d.keys(): obj.jittering(d["jittering"]) obj.mode(d["mode"]) obj.color(d["color"]) obj.alpha(d["alpha"]) obj.alpha_gradient(d["alphagrad"]) ### TetMesh elif d['type'].lower() == 'tetmesh': raise NotImplementedError("TetMesh not supported yet") ### ScalarBar2D elif d['type'].lower() == 'scalarbar2d': raise NotImplementedError("ScalarBar2D not supported yet") ### Image elif d['type'].lower() == 'image': obj = Image(d["array"]) obj.alpha(d["alpha"]) obj.actor.SetScale(d["scale"]) obj.actor.SetPosition(d["position"]) obj.actor.SetOrientation(d["orientation"]) obj.actor.SetOrigin(d["origin"]) ### Text2D elif d['type'].lower() == 'text2d': obj = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]) obj.pos(d["position"]).size(d["size"]) obj.background(d["bgcol"], d["alpha"]) if d["frame"]: obj.frame(d["bgcol"]) else: obj = None # vedo.logger.warning(f"Cannot import object {d}") pass if obj: keys = d.keys() if "time" in keys: obj.time = d["time"] if "name" in keys: obj.name = d["name"] # if "info" in keys: obj.info = d["info"] if "filename" in keys: obj.filename = d["filename"] objs.append(obj) plt.add(objs) plt.resetcam = False return plt ########################################################### def loadImageData(filename: Union[str, os.PathLike]) -> Union[vtki.vtkImageData, None]: """Read and return a `vtkImageData` object from file.""" filename = str(filename) if ".tif" in filename.lower(): reader = vtki.new("TIFFReader") # print("GetOrientationType ", reader.GetOrientationType()) reader.SetOrientationType(vedo.settings.tiff_orientation_type) elif ".slc" in filename.lower(): reader = vtki.new("SLCReader") if not reader.CanReadFile(filename): vedo.logger.error(f"sorry, bad SLC file {filename}") return None elif ".vti" in filename.lower(): reader = vtki.new("XMLImageDataReader") elif ".mhd" in filename.lower(): reader = vtki.new("MetaImageReader") elif ".dem" in filename.lower(): reader = vtki.new("DEMReader") elif ".nii" in filename.lower(): reader = vtki.new("NIFTIImageReader") elif ".nrrd" in filename.lower(): reader = vtki.new("NrrdReader") if not reader.CanReadFile(filename): vedo.logger.error(f"sorry, bad NRRD file {filename}") return None else: vedo.logger.error(f"cannot read file {filename}") return None reader.SetFileName(filename) reader.Update() return reader.GetOutput() ########################################################### def write(objct: Any, fileoutput: Union[str, os.PathLike], binary=True) -> Any: """ Write object to file. Same as `save()`. Supported extensions are: - `vtk, vti, ply, obj, stl, byu, vtp, vti, mhd, xyz, xml, tif, png, bmp` """ fileoutput = str(fileoutput) ############################### if isinstance(objct, Assembly): dd = to_numpy(objct) sdict = {"objects": [dd]} np.save(fileoutput, sdict) return objct ############################### obj = objct.dataset try: # check if obj is a Mesh.actor and has a transform M = objct.actor.GetMatrix() if M and not M.IsIdentity(): obj = objct.apply_transform_from_actor() obj = objct.dataset vedo.logger.info( f"object '{objct.name}' " "was manually moved. Writing uses current position." ) except: pass fr = fileoutput.lower() if fr.endswith(".vtk"): writer = vtki.new("DataSetWriter") elif fr.endswith(".ply"): writer = vtki.new("PLYWriter") writer.AddComment("PLY file generated by vedo") lut = objct.mapper.GetLookupTable() if lut: pscal = obj.GetPointData().GetScalars() if not pscal: pscal = obj.GetCellData().GetScalars() if pscal and pscal.GetName(): writer.SetArrayName(pscal.GetName()) writer.SetLookupTable(lut) elif fr.endswith(".stl"): writer = vtki.new("STLWriter") elif fr.endswith(".vtp"): writer = vtki.new("XMLPolyDataWriter") elif fr.endswith(".vtu"): writer = vtki.new("XMLUnstructuredGridWriter") elif fr.endswith(".xyz"): writer = vtki.new("SimplePointsWriter") elif fr.endswith(".facet"): writer = vtki.new("FacetWriter") elif fr.endswith(".vti"): writer = vtki.new("XMLImageDataWriter") elif fr.endswith(".vtr"): writer = vtki.new("XMLRectilinearGridWriter") elif fr.endswith(".vtm"): g = vtki.new("MultiBlockDataGroupFilter") for ob in objct: try: g.AddInputData(ob) except TypeError: vedo.logger.warning("cannot save object of type", type(ob)) g.Update() mb = g.GetOutputDataObject(0) wri = vtki.new("vtkXMLMultiBlockDataWriter") wri.SetInputData(mb) wri.SetFileName(fileoutput) wri.Write() return objct elif fr.endswith(".mhd"): writer = vtki.new("MetaImageWriter") elif fr.endswith(".nii"): writer = vtki.new("NIFTIImageWriter") elif fr.endswith(".png"): writer = vtki.new("PNGWriter") elif fr.endswith(".jpg"): writer = vtki.new("JPEGWriter") elif fr.endswith(".bmp"): writer = vtki.new("BMPWriter") elif fr.endswith(".tif") or fr.endswith(".tiff"): writer = vtki.new("TIFFWriter") writer.SetFileDimensionality(len(obj.GetDimensions())) elif fr.endswith(".obj"): with open(fileoutput, "w", encoding="UTF-8") as outF: outF.write("# OBJ file format with ext .obj\n") outF.write("# File generated by vedo\n") for p in objct.vertices: outF.write("v {:.8g} {:.8g} {:.8g}\n".format(*p)) ptxt = objct.dataset.GetPointData().GetTCoords() if ptxt: ntxt = utils.vtk2numpy(ptxt) for vt in ntxt: outF.write("vt " + str(vt[0]) + " " + str(vt[1]) + " 0.0\n") if isinstance(objct, Mesh): for i, f in enumerate(objct.cells): fs = "" for fi in f: if ptxt: fs += f" {fi+1}/{fi+1}" else: fs += f" {fi+1}" outF.write(f"f{fs}\n") for l in objct.lines: ls = "" for li in l: ls += str(li + 1) + " " outF.write(f"l {ls}\n") return objct elif fr.endswith(".off"): with open(fileoutput, "w", encoding="UTF-8") as outF: outF.write("OFF\n") outF.write(str(objct.npoints) + " " + str(objct.ncells) + " 0\n\n") for p in objct.vertices: outF.write(" ".join([str(i) for i in p]) + "\n") for c in objct.cells: outF.write(str(len(c)) + " " + " ".join([str(i) for i in c]) + "\n") return objct elif fr.endswith(".xml"): # write tetrahedral dolfin xml vertices = objct.vertices.astype(str) faces = np.array(objct.cells).astype(str) ncoords = vertices.shape[0] with open(fileoutput, "w", encoding="UTF-8") as outF: outF.write('\n') outF.write('\n') if len(faces[0]) == 4: # write tetrahedral mesh ntets = faces.shape[0] outF.write(' \n') outF.write(' \n') for i in range(ncoords): x, y, z = vertices[i] outF.write(' \n') outF.write(' \n') outF.write(' \n') for i in range(ntets): v0, v1, v2, v3 = faces[i] outF.write(' \n') elif len(faces[0]) == 3: # write triangle mesh ntri = faces.shape[0] outF.write(' \n') outF.write(' \n') for i in range(ncoords): x, y, _ = vertices[i] outF.write(' \n') outF.write(' \n') outF.write(' \n') for i in range(ntri): v0, v1, v2 = faces[i] outF.write(' \n') outF.write(" \n") outF.write(" \n") outF.write("\n") return objct else: vedo.logger.error(f"Unknown format {fileoutput}, file not saved") return objct try: if binary: writer.SetFileTypeToBinary() else: writer.SetFileTypeToASCII() except AttributeError: pass try: writer.SetInputData(obj) writer.SetFileName(fileoutput) writer.Write() except: vedo.logger.error(f"could not save {fileoutput}") return objct def save(obj: Any, fileoutput="out.png", binary=True) -> Any: """Save an object to file. Same as `write()`.""" return write(obj, fileoutput, binary) def read(obj: Any, unpack=True, force=False) -> Any: """Read an object from file. Same as `load()`.""" return load(obj, unpack, force) ############################################################################### def export_window(fileoutput: Union[str, os.PathLike], binary=False, plt=None) -> "vedo.Plotter": """ Exporter which writes out the rendered scene into an HTML, X3D or Numpy file. Example: - [export_x3d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/export_x3d.py) Check out the HTML generated webpage [here](https://vedo.embl.es/examples/embryo.html). .. note:: the rendering window can also be exported to `numpy` file `scene.npz` by pressing `E` key at any moment during visualization. """ fileoutput = str(fileoutput) if plt is None: plt = vedo.plotter_instance fr = fileoutput.lower() #################################################################### if fr.endswith(".npy") or fr.endswith(".npz"): _export_npy(plt, fileoutput) #################################################################### elif fr.endswith(".x3d"): # obj = plt.get_actors() # if plt.axes_instances: # obj.append(plt.axes_instances[0]) # for a in obj: # if isinstance(a, Assembly): # plt.remove(a) # plt.add(a.unpack()) plt.render() exporter = vtki.new("X3DExporter") exporter.SetBinary(binary) exporter.FastestOff() exporter.SetInput(plt.window) exporter.SetFileName(fileoutput) # exporter.WriteToOutputStringOn() exporter.Update() exporter.Write() wsize = plt.window.GetSize() x3d_html = _x3d_html_template.replace("~fileoutput", fileoutput) x3d_html = x3d_html.replace("~width", str(wsize[0])) x3d_html = x3d_html.replace("~height", str(wsize[1])) with open(fileoutput.replace(".x3d", ".html"), "w", encoding="UTF-8") as outF: outF.write(x3d_html) #################################################################### elif fr.endswith(".html"): savebk = vedo.notebook_backend vedo.notebook_backend = "k3d" vedo.settings.default_backend = "k3d" # acts = plt.get_actors() plt = vedo.backends.get_notebook_backend(plt.objects) with open(fileoutput, "w", encoding="UTF-8") as fp: fp.write(plt.get_snapshot()) vedo.notebook_backend = savebk vedo.settings.default_backend = savebk else: vedo.logger.error(f"export extension {fr.split('.')[-1]} is not supported") return plt ######################################################################### def to_numpy(act: Any) -> dict: """Encode a vedo object to numpy format.""" ######################################################## def _fillcommon(obj, adict): adict["filename"] = obj.filename adict["name"] = obj.name adict["time"] = obj.time adict["rendered_at"] = obj.rendered_at try: adict["transform"] = obj.transform.matrix except AttributeError: adict["transform"] = np.eye(4) #################################################################### try: obj = act.retrieve_object() except AttributeError: obj = act adict = {} adict["type"] = "unknown" ######################################################## Points/Mesh if isinstance(obj, (Points, vedo.UnstructuredGrid)): adict["type"] = "Mesh" _fillcommon(obj, adict) if isinstance(obj, vedo.UnstructuredGrid): # adict["type"] = "UnstructuredGrid" # adict["cells"] = obj.cells_as_flat_array poly = obj._actor.GetMapper().GetInput() mapper = obj._actor.GetMapper() else: poly = obj.dataset mapper = obj.mapper adict["points"] = obj.vertices.astype(float) adict["cells"] = None if poly.GetNumberOfPolys(): adict["cells"] = obj.cells_as_flat_array adict["lines"] = None if poly.GetNumberOfLines(): adict["lines"] = obj.lines#_as_flat_array adict["pointdata"] = {} for iname in obj.pointdata.keys(): if "normals" in iname.lower(): continue adict["pointdata"][iname] = obj.pointdata[iname] adict["celldata"] = {} for iname in obj.celldata.keys(): if "normals" in iname.lower(): continue adict["celldata"][iname] = obj.celldata[iname] adict["metadata"] = {} for iname in obj.metadata.keys(): adict["metadata"][iname] = obj.metadata[iname] # NEW in vedo 5.0 adict["scalar_mode"] = mapper.GetScalarMode() adict["array_name_to_color_by"] = mapper.GetArrayName() adict["color_mode"] = mapper.GetColorMode() adict["interpolate_scalars_before_mapping"] = mapper.GetInterpolateScalarsBeforeMapping() adict["use_lookup_table_scalar_range"] = mapper.GetUseLookupTableScalarRange() adict["scalar_range"] = mapper.GetScalarRange() adict["scalar_visibility"] = mapper.GetScalarVisibility() adict["pickable"] = obj.actor.GetPickable() adict["dragable"] = obj.actor.GetDragable() # adict["color_map_colors"] = mapper.GetColorMapColors() #vtkUnsignedCharArray # adict["color_coordinates"] = mapper.GetColorCoordinates() #vtkFloatArray texmap = mapper.GetColorTextureMap() #vtkImageData if texmap: adict["color_texture_map"] = vedo.Image(texmap).tonumpy() # print("color_texture_map", adict["color_texture_map"].shape) adict["texture_array"] = None texture = obj.actor.GetTexture() if texture: adict["texture_array"] = vedo.Image(texture.GetInput()).tonumpy() adict["texture_interpolate"] = texture.GetInterpolate() adict["texture_repeat"] = texture.GetRepeat() adict["texture_quality"] = texture.GetQuality() adict["texture_color_mode"] = texture.GetColorMode() adict["texture_mipmap"] = texture.GetMipmap() adict["texture_blending_mode"] = texture.GetBlendingMode() adict["texture_edge_clamp"] = texture.GetEdgeClamp() adict["texture_border_color"] = texture.GetBorderColor() # print("tonumpy: texture", obj.name, adict["texture_array"].shape) adict["LUT"] = None adict["LUT_range"] = None lut = mapper.GetLookupTable() if lut: nlut = lut.GetNumberOfTableValues() lutvals = [] for i in range(nlut): v4 = lut.GetTableValue(i) # (r, g, b, alpha) lutvals.append(v4) adict["LUT"] = np.array(lutvals, dtype=np.float32) adict["LUT_range"] = np.array(lut.GetRange()) prp = obj.properties adict["alpha"] = prp.GetOpacity() adict["representation"] = prp.GetRepresentation() adict["pointsize"] = prp.GetPointSize() adict["linecolor"] = None adict["linewidth"] = None adict["edge_visibility"] = prp.GetEdgeVisibility() # new in vedo 5.0 if prp.GetEdgeVisibility(): adict["linewidth"] = prp.GetLineWidth() adict["linecolor"] = prp.GetEdgeColor() adict["ambient"] = prp.GetAmbient() adict["diffuse"] = prp.GetDiffuse() adict["specular"] = prp.GetSpecular() adict["specularpower"] = prp.GetSpecularPower() adict["specularcolor"] = prp.GetSpecularColor() adict["shading"] = prp.GetInterpolation() # flat phong..: adict["color"] = prp.GetColor() adict["lighting_is_on"] = prp.GetLighting() adict["backcolor"] = None if obj.actor.GetBackfaceProperty(): adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() ######################################################## Volume elif isinstance(obj, Volume): adict["type"] = "Volume" _fillcommon(obj, adict) adict["array"] = obj.tonumpy() adict["mode"] = obj.mode() adict["spacing"] = obj.spacing() adict["origin"] = obj.origin() prp = obj.properties ctf = prp.GetRGBTransferFunction() otf = prp.GetScalarOpacity() gotf = prp.GetGradientOpacity() smin, smax = ctf.GetRange() xs = np.linspace(smin, smax, num=256, endpoint=True) cols, als, algrs = [], [], [] for x in xs: cols.append(ctf.GetColor(x)) als.append(otf.GetValue(x)) if gotf: algrs.append(gotf.GetValue(x)) adict["color"] = cols adict["alpha"] = als adict["alphagrad"] = algrs ######################################################## Image elif isinstance(obj, Image): adict["type"] = "Image" _fillcommon(obj, adict) adict["array"] = obj.tonumpy() adict["scale"] = obj.actor.GetScale() adict["position"] = obj.actor.GetPosition() adict["orientation"] = obj.actor.GetOrientation() adict['origin'] = obj.actor.GetOrigin() adict["alpha"] = obj.alpha() ######################################################## Text2D elif isinstance(obj, vedo.Text2D): adict["type"] = "Text2D" adict["rendered_at"] = obj.rendered_at adict["text"] = obj.text() adict["position"] = obj.GetPosition() adict["color"] = obj.properties.GetColor() adict["font"] = obj.fontname adict["size"] = obj.properties.GetFontSize() / 22.5 adict["bgcol"] = obj.properties.GetBackgroundColor() adict["alpha"] = obj.properties.GetBackgroundOpacity() adict["frame"] = obj.properties.GetFrame() ######################################################## Assembly elif isinstance(obj, Assembly): adict["type"] = "Assembly" _fillcommon(obj, adict) adict["parts"] = [] for a in obj.unpack(): adict["parts"].append(to_numpy(a)) else: # vedo.logger.warning(f"to_numpy: cannot export object of type {type(obj)}") pass return adict ######################################################################### def _export_npy(plt, fileoutput="scene.npz") -> None: fileoutput = str(fileoutput) sdict = {} sdict["shape"] = plt.shape sdict["sharecam"] = plt.sharecam sdict["camera"] = dict( pos=plt.camera.GetPosition(), focal_point=plt.camera.GetFocalPoint(), viewup=plt.camera.GetViewUp(), distance=plt.camera.GetDistance(), clipping_range=plt.camera.GetClippingRange(), parallel_scale=plt.camera.GetParallelScale(), ) sdict["position"] = plt.pos sdict["size"] = plt.size sdict["axes"] = 0 sdict["title"] = plt.title sdict["backgrcol"] = colors.get_color(plt.renderer.GetBackground()) sdict["backgrcol2"] = None if plt.renderer.GetGradientBackground(): sdict["backgrcol2"] = plt.renderer.GetBackground2() sdict["use_depth_peeling"] = plt.renderer.GetUseDepthPeeling() sdict["use_parallel_projection"] = plt.camera.GetParallelProjection() sdict["default_font"] = vedo.settings.default_font sdict["objects"] = [] actors = plt.get_actors(include_non_pickables=True) # this ^ also retrieves Actors2D allobjs = [] for i, a in enumerate(actors): if not a.GetVisibility(): continue try: ob = a.retrieve_object() # print("get_actors",[ob], ob.name) if isinstance(ob, Assembly): asse_scale = ob.GetScale() asse_pos = ob.GetPosition() asse_ori = ob.GetOrientation() asse_org = ob.GetOrigin() for elem in ob.unpack(): elem.name = f"ASSEMBLY{i}_{ob.name}_{elem.name}" # elem.info.update({"assembly": ob.name}) # TODO # elem.info.update({"assembly_scale": asse_scale}) # elem.info.update({"assembly_position": asse_pos}) # elem.info.update({"assembly_orientation": asse_ori}) # elem.info.update({"assembly_origin": asse_org}) elem.metadata["assembly"] = ob.name elem.metadata["assembly_scale"] = asse_scale elem.metadata["assembly_position"] = asse_pos elem.metadata["assembly_orientation"] = asse_ori elem.metadata["assembly_origin"] = asse_org allobjs.append(elem) else: allobjs.append(ob) except AttributeError: # print() # vedo.logger.warning(f"Cannot retrieve object of type {type(a)}") pass for a in allobjs: # print("to_numpy(): dumping", [a], a.name) # try: npobj = to_numpy(a) sdict["objects"].append(npobj) # except AttributeError: # vedo.logger.warning(f"Cannot export object of type {type(a)}") if fileoutput.endswith(".npz"): np.savez_compressed(fileoutput, vedo_scenes=[sdict]) else: np.save(fileoutput, [sdict]) ######################################################################## def import_window(fileinput: Union[str, os.PathLike]) -> Union["vedo.Plotter", None]: """ Import a whole scene from a Numpy NPZ file. Returns: `vedo.Plotter` instance """ fileinput = str(fileinput) if fileinput.endswith(".npy") or fileinput.endswith(".npz"): return _import_npy(fileinput) # elif ".obj" in fileinput.lower(): # meshes = load_obj(fileinput, mtl_file, texture_path) # plt = vedo.Plotter() # plt.add(meshes) # return plt # elif fileinput.endswith(".h5") or fileinput.endswith(".hdf5"): # return _import_hdf5(fileinput) # in store/file_io_HDF5.py return None def load_obj(fileinput: Union[str, os.PathLike], mtl_file=None, texture_path=None) -> List[Mesh]: """ Import a set of meshes from a OBJ wavefront file. Arguments: mtl_file : (str) MTL file for OBJ wavefront files texture_path : (str) path of the texture files directory Returns: `list(Mesh)` """ fileinput = str(fileinput) window = vtki.vtkRenderWindow() window.SetOffScreenRendering(1) renderer = vtki.vtkRenderer() window.AddRenderer(renderer) importer = vtki.new("OBJImporter") importer.SetFileName(fileinput) if mtl_file is None: mtl_file = fileinput.replace(".obj", ".mtl").replace(".OBJ", ".MTL") if os.path.isfile(mtl_file): importer.SetFileNameMTL(mtl_file) if texture_path is None: texture_path = fileinput.replace(".obj", ".txt").replace(".OBJ", ".TXT") # since the texture_path may be a directory which contains textures if os.path.exists(texture_path): importer.SetTexturePath(texture_path) importer.SetRenderWindow(window) importer.Update() actors = renderer.GetActors() actors.InitTraversal() objs = [] for _ in range(actors.GetNumberOfItems()): vactor = actors.GetNextActor() msh = Mesh(vactor) msh.name = "OBJMesh" tx = vactor.GetTexture() if tx: msh.texture(tx) objs.append(msh) return objs ########################################################## def screenshot(filename="screenshot.png", scale=1, asarray=False) -> Union["vedo.Plotter", np.ndarray, None]: """ Save a screenshot of the current rendering window. Alternatively, press key `Shift-S` in the rendering window to save a screenshot. You can also use keyword `screenshot` in `show(..., screenshot="pic.png")`. Arguments: scale : (int) Set image magnification as an integer multiplicative factor. E.g. setting a magnification of 2 produces an image twice as large, but 10x slower to generate. asarray : (bool) Return a numpy array of the image """ filename = str(filename) # print("calling screenshot", filename, scale, asarray) if not vedo.plotter_instance or not vedo.plotter_instance.window: # vedo.logger.error("in screenshot(), rendering window is not present, skip.") return vedo.plotter_instance ########## if vedo.plotter_instance.renderer: vedo.plotter_instance.renderer.ResetCameraClippingRange() if asarray and scale == 1 and not vedo.plotter_instance.offscreen: nx, ny = vedo.plotter_instance.window.GetSize() arr = vtki.vtkUnsignedCharArray() vedo.plotter_instance.window.GetRGBACharPixelData(0, 0, nx-1, ny-1, 0, arr) narr = vedo.vtk2numpy(arr).T[:3].T.reshape([ny, nx, 3]) narr = np.flip(narr, axis=0) return narr ########## ########################### if filename.endswith(".pdf"): writer = vtki.new("GL2PSExporter") writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() writer.SetSortToBSP() writer.SetFileFormatToPDF() writer.SetFilePrefix(filename.replace(".pdf", "")) writer.Write() return vedo.plotter_instance ########## elif filename.endswith(".svg"): writer = vtki.new("GL2PSExporter") writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() writer.SetSortToBSP() writer.SetFileFormatToSVG() writer.SetFilePrefix(filename.replace(".svg", "")) writer.Write() return vedo.plotter_instance ########## elif filename.endswith(".eps"): writer = vtki.new("GL2PSExporter") writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() writer.SetSortToBSP() writer.SetFileFormatToEPS() writer.SetFilePrefix(filename.replace(".eps", "")) writer.Write() return vedo.plotter_instance ########## if settings.screeshot_large_image: w2if = vtki.new("RenderLargeImage") w2if.SetInput(vedo.plotter_instance.renderer) w2if.SetMagnification(scale) else: w2if = vtki.new("WindowToImageFilter") w2if.SetInput(vedo.plotter_instance.window) if hasattr(w2if, "SetScale"): w2if.SetScale(int(scale), int(scale)) if settings.screenshot_transparent_background: w2if.SetInputBufferTypeToRGBA() w2if.ReadFrontBufferOff() # read from the back buffer w2if.Update() if asarray: pd = w2if.GetOutput().GetPointData() npdata = utils.vtk2numpy(pd.GetArray("ImageScalars")) # npdata = npdata[:, [0, 1, 2]] # remove alpha channel, issue #1199 ydim, xdim, _ = w2if.GetOutput().GetDimensions() npdata = npdata.reshape([xdim, ydim, -1]) npdata = np.flip(npdata, axis=0) return npdata ########################### if filename.lower().endswith(".png"): writer = vtki.new("PNGWriter") writer.SetFileName(filename) writer.SetInputData(w2if.GetOutput()) writer.Write() elif filename.lower().endswith(".jpg") or filename.lower().endswith(".jpeg"): writer = vtki.new("JPEGWriter") writer.SetFileName(filename) writer.SetInputData(w2if.GetOutput()) writer.Write() else: # add .png writer = vtki.new("PNGWriter") writer.SetFileName(filename + ".png") writer.SetInputData(w2if.GetOutput()) writer.Write() return vedo.plotter_instance def ask(*question, **kwarg) -> str: """ Ask a question from command line. Return the answer as a string. See function `colors.printc()` for the description of the keyword options. Arguments: options : (list) a python list of possible answers to choose from. default : (str) the default answer when just hitting return. Example: ```python import vedo res = vedo.ask("Continue?", options=['Y','n'], default='Y', c='g') print(res) ``` """ kwarg.update({"end": " "}) if "invert" not in kwarg: kwarg.update({"invert": True}) if "box" in kwarg: kwarg.update({"box": ""}) options = kwarg.pop("options", []) default = kwarg.pop("default", "") if options: opt = "[" for o in options: opt += o + "/" opt = opt[:-1] + "]" colors.printc(*question, opt, **kwarg) else: colors.printc(*question, **kwarg) try: resp = input() except Exception: resp = "" return resp if options: if resp not in options: if default and str(repr(resp)) == "''": return default colors.printc("Please choose one option in:", opt, italic=True, bold=False) kwarg["options"] = options return ask(*question, **kwarg) # ask again return resp ############################################################################################## class Video: """ Generate a video from a rendering window. """ def __init__(self, name="movie.mp4", duration=None, fps=24, scale=1, backend="imageio"): """ Class to generate a video from the specified rendering window. Program `ffmpeg` is used to create video from each generated frame. Arguments: name : (Union[str, os.PathLike]) name of the output file. duration : (float) set the total `duration` of the video and recalculates `fps` accordingly. fps : (int) set the number of frames per second. scale : (int) set the image magnification as an integer multiplicative factor. backend : (str) the backend engine to be used `['imageio', 'ffmpeg', 'cv']` Examples: - [make_video.py](https://github.com/marcomusy/vedo/tree/master/examples/other/make_video.py) ![](https://user-images.githubusercontent.com/32848391/50739007-2bfc2b80-11da-11e9-97e6-620a3541a6fa.jpg) """ self.name = str(name) self.duration = duration self.backend = backend self.fps = float(fps) self.command = "ffmpeg -loglevel panic -y -r" self.options = "-b:v 8000k" self.scale = scale self.frames = [] self.tmp_dir = TemporaryDirectory() self.get_filename = lambda x: os.path.join(self.tmp_dir.name, x) colors.printc(":video: Video file", self.name, "is open... ", c="m", end="") def add_frame(self) -> "Video": """Add frame to current video.""" fr = self.get_filename(str(len(self.frames)) + ".png") screenshot(fr, scale=self.scale) self.frames.append(fr) return self def pause(self, pause=0) -> "Video": """Insert a `pause`, in seconds.""" fr = self.frames[-1] n = int(self.fps * pause) for _ in range(n): fr2 = self.get_filename(str(len(self.frames)) + ".png") self.frames.append(fr2) os.system("cp -f %s %s" % (fr, fr2)) return self def action(self, elevation=(0, 80), azimuth=(0, 359), cameras=(), resetcam=False) -> "Video": """ Automatic shooting of a static scene by specifying rotation and elevation ranges. Arguments: elevation : list initial and final elevation angles azimuth_range : list initial and final azimuth angles cameras : list list of cameras to go through, each camera can be dictionary or a vtkCamera """ if not self.duration: self.duration = 5 plt = vedo.plotter_instance if not plt: vedo.logger.error("No vedo plotter found, cannot make video.") return self n = int(self.fps * self.duration) cams = [] for cm in cameras: cams.append(utils.camera_from_dict(cm)) nc = len(cams) plt.show(resetcam=resetcam, interactive=False) if nc: for i in range(n): plt.move_camera(cams, i / (n-1)) plt.render() self.add_frame() else: ######################################## for i in range(n): plt.camera.Elevation((elevation[1] - elevation[0]) / n) plt.camera.Azimuth((azimuth[1] - azimuth[0]) / n) plt.render() self.add_frame() return self def close(self) -> None: """ Render the video and write it to file. """ if self.duration: self.fps = int(len(self.frames) / float(self.duration) + 0.5) colors.printc("recalculated fps:", self.fps, c="m", end="") else: self.fps = int(self.fps) ######################################## if self.backend == "ffmpeg": out = os.system( self.command + " " + str(self.fps) + " -i " + f"'{self.tmp_dir.name}'" + os.sep + "%01d.png " + self.options + " " + f"'{self.name}'" ) if out: vedo.logger.error(f":noentry: backend {self.backend} returning error: {out}") else: colors.printc(f":save: saved to {self.name}", c="m") ######################################## elif "cv" in self.backend: try: import cv2 except ImportError: vedo.logger.error("opencv is not installed") return cap = cv2.VideoCapture(os.path.join(self.tmp_dir.name, "%1d.png")) fourcc = cv2.VideoWriter_fourcc(*"mp4v") if vedo.plotter_instance: w, h = vedo.plotter_instance.window.GetSize() writer = cv2.VideoWriter(self.name, fourcc, self.fps, (w, h), True) else: vedo.logger.error("No vedo plotter found, cannot make video.") return while True: ret, frame = cap.read() if not ret: break writer.write(frame) cap.release() writer.release() ######################################## elif "imageio" in self.backend: try: import imageio except ImportError: vedo.logger.error("Please install imageio with:\n pip install imageio[ffmpeg]") return if self.name.endswith(".mp4"): writer = imageio.get_writer(self.name, fps=self.fps) elif self.name.endswith(".gif"): writer = imageio.get_writer(self.name, mode="I", duration=1 / self.fps) elif self.name.endswith(".webm"): writer = imageio.get_writer(self.name, format="webm", fps=self.fps) else: vedo.logger.error(f"Unknown format of {self.name}.") return for f in utils.humansort(self.frames): image = imageio.v3.imread(f) try: writer.append_data(image) except TypeError: vedo.logger.error(f"Could not append data to video {self.name}") vedo.logger.error("Please install imageio with: pip install imageio[ffmpeg]") break try: writer.close() colors.printc(f"... saved as {self.name}", c="m") except: colors.printc(f":noentry: Could not save video {self.name}", c="r") # finalize cleanup self.tmp_dir.cleanup() def split_frames(self, output_dir="video_frames", prefix="frame_", format="png") -> None: """Split an existing video file into frames.""" try: import imageio except ImportError: vedo.logger.error("\nPlease install imageio with:\n pip install imageio") return # Create the output directory if it doesn't exist if not os.path.exists(output_dir): os.makedirs(output_dir) # Create a reader object to read the video reader = imageio.get_reader(self.name) # Loop through each frame of the video and save it as image print() for i, frame in utils.progressbar( enumerate(reader), title=f"writing {format} frames", c="m", width=20 ): output_file = os.path.join(output_dir, f"{prefix}{str(i).zfill(5)}.{format}") imageio.imwrite(output_file, frame, format=format) vedo-2025.5.3/vedo/fonts/000077500000000000000000000000001474667405700150175ustar00rootroot00000000000000vedo-2025.5.3/vedo/fonts/Bongas.npz000066400000000000000000001767601474667405700170020ustar00rootroot00000000000000PK!C}jfont.npyj̽y|0YFHH ,!$H!@ ɐg5 bDDTĈ(qQ\PQQ^FwL'\*3=U~NU>zz3@Bro7kK’9 -|a]`Ysd\_dcw^k_B^(Z|y}G]9OLSN `<OHִi{B EV'L T~<Odִ 5>[4cƌDuO=]𒞞hUbQqOWi+qZ O=Kx2{:<`uv&q@E*P 6` hC+JDO:gW'% E7J0Z)Jɓw\Ɖ`@I@DL(DF !Q!QP"3!|{23}2;LFMl^XRB->*< 7&6Y%z}?Gֱ|Zba3և@8@Ec$PQHo'$($6ItHRJ‹vE6`@Bc\[INi`e]IQҕJ0`h{( \d7J%[d)J/Ip AM?% 0| e>ހ0υ^*Ph,P0|h)zx{{&螉X,WaS"WFd WdQj0##=kAk/b[ه}'X`3_ۮ/aED'3nx,d{(ΩF e @py$@ChwE0{!Ape~ y2ʃG#F*cTB6R)6Rm6HV&BCL6[)6[ HJ)B;E )02tV20000m20 0)ЎX gFf> SήI-3*I-Jv Cw=Vij3s4Kj5gUQu6Q}ѽ;C{RŘn~e.ԇg;̗f QɵNL֑&RAiF3~DxO?Ag,K !>a6iXqFq^!n#6LqJ|+b> ȳr(DX,BcEhX~*sëZE8"6Z1FPFQ,$D,{~5ֱ/[a,/BI$ gEt1.bAQ[\1]ZY_ˣQ.>o~4i$ s]+:2JM:|~ujkSws^MPv2` ɘBoYvd\+ҝUGUE[N2"#qu-C/{b_\|VL/⩩ԶUqIbF-i 1>& ?iƕSԾ̋5o{QHaB' uoW4JF`(Q$q'O 8-^% VʠX b zUgH)^ j`X( h( b4He2EP(Zpp:R.X_\ ..Q@;%B;[le>V^<'cA{*f>>/oЪ @b.]w(Tih79Вr8+G&hFZUӠ偠bn"n(R`:NrӠn RMCq7 zy* u*Rr)zeH癣{涋y2;< $eI⑮~q?&]/psC+elMx=!ey랫ڇDjga5rHո@rZ*2$W/RܯKE.]#Qd)LiUX3-(:'7uӎd[=T>Xﹶ}Z(sxZϯS%aćG"0fǠ|OgjDEJ|X^_l+@ȷpmYQF^Jsc;nþYՎ[yZB#*Y?\s$/cHYfk;]?v||_?~\XX8!j~mNaU'x˝Y]﹵yMr9-)=l!b\Ma'n`yLXǚY>ϱ~ϊK5$[#b)i~xDFqr:m_:Q.)K˒&2%D,nuOA%I!u^2F O(u[OVI  dܡ;hphPj L\C]B$X,`4&D~ܻ<ԑ2 ׍@6OI& ~0h PE1pE&50h={6=YxTJU\WV[Nh_Iwp奴VxJq7nv;XBjM4. gn6O st l3={or4O8.W+P7sPj\a爼mQ9ڽ:Wۢ;kaFQh(zՎ>K֮F>k?;Usn`ߓw}9ޞ$9I?T2G+!hcKE$AC{<'uG8%"#'DnusI5U,'+.ĆмCn:RO^mR;-?1GO=O|?3Ls9Iy qQ9]:!Db3rmC9[žlK~%ok99ofLK4/꧵U$t%̣<6tCk5mZ{5?Ԫ85[+IW^/2zs }.4!rc7ZY&<%IZIwAS@g!ţbہ#XO᷀Gnl+Y\|ӏUVb~gԅYU>g]i0/ F_pbP+Y|&^[A'vA9JI݅"Ud6:ɚ|۾I~!-7\g6rp1#Q$^-bԪѸV E/`( PrAE`+\E`KdZ)td RLA0=S r`t=ug F#틤ZIFCQ37a(BPW?1@%jԫ @-3[Gw*ZTz'yO8`z9@o<@Wo8 M1z~d`O5~+sAldH9PfyHw ɘKq@/':z>3/]KOxk]K92ケQoh+ ( _\p^a!ɂL`FBxQv?Te1uT 1 #id=d=HDv_<ҪuGV$kQ<*\"4'EG/Hyܬ77{t ar)[ ,/'|#I ;y6:vߐ'r2I1.9îO*Th-A#RmYe[sTXQ5lMBü&}N,uGYOޗ| '"REc~'ū7 QY /]lD#^bl [ eftW$׷ Θe̱qH+/Q$t gvK;(-v(@fe2;Ѥ΀' zIhTSeZ|B03g\8w2<%^(zH I(P $HB! A $pAxJMW$ W$^R(uBiݯ֎;Wi?UWfqs׃@?ol] 3l-]ZTz c3']¾" %gh!CIf NZ~Fw4^$7gd/YOStYʙx۠>B<'PaԉΈr9犷͏Yf\G~#/LVŗ` i zhU e7\-\{k˴3DH\ j; F461S+(h-|n@m1C sG~9ɽ+| 5`'Ԁqw&^e SQ "KC6Yf>r{$cosxG_G2RFAssbv@I1X*!cfˆ^ s  Z- P w,@;M.gf 0)5]RwL(S=)ANT2ipm V\[>O>+ܗiav4 I6ܖH{:Z.v2" q[Puh%!9'^ !Qa;g9czp/{8{" iF2۴[Ftv11]b&|b7X9a|Udvc0e&LzGHf gb;G<ܯjmWMrYmb4%d 8@OӟbNd7Iw`Bi7G.([H%]HEƺPEVV1JƕFQ%MPXE)چj¤a)L :^G{P bzA7j>e^: uj$dIXOB])$i2(AEücSQ 6V'K*hkZ~eh2/5X'cCfXwRyQ 򕙩2 -`ޡ=o243V0 Gxt7b'>@-C?$Ɏډjsޢ}gAr?JΛ/S V?Ybh1N-)_T3Hr3(Dv{ bƓ Oډŀf,L14\ ZM9]բLzsˏsߝ!U!{+_ytw/WWg[O%6Z'#ZK :&2+VsD!IGi+%8;oz+v~1䢐Z2 ")xj jM(3w^:@Il֮65$44.Ӡ$4$4$4Կ RUP84mXj{ayKhad0;ObvւI] T\=ΨGOHy"OāJx8tWe?_c??F] ?хu;a @iY=@$@4$zUU^*C5Α2mɳ +Y=cZEl3q+fq<;ص,_`XM5X,@:lTBNKh3=OYz9Obhf G5o֙rt~uxAzkN2bܕj%`'/kj?L9Z`m1V_c֛keuD_Fco!ʶ,8$N l3˥oyoϊ;.*b&4H.;.wS|53p}2"i/b\b8I'jQw[C#9mh*Bc3Yo"jk6m9+UzzF9˥hǃa^OKq$UZ4\x4 iEMi[2 %cJ([2Fؒ1͵te-tC@&.|j)ꎦZ*Ւj<x"dE,Ұ':=QiD`O=QDzR)a˱#ld16k0b5@rp Vc D98@Aboc$'F0a`L=Fq(Ǣ GV]d`UX: 2k:)31J9X`6+.daY`YY-Nʊ YQ ЍEgLVo]u@YcQ=YN&2 +ʰ Kʰ zeXV6 ~AHNRл`r)@Yh6{lgw:f Km )|M2k 30{ ŝj.U\b4Szٵ}gդ_yFP3l;Byt*M?x&9DDb?1XD2Ef1&Dgя(kh0('ﵖϮ譚b-nH2$>VՍXd+F)d#Dag( U=X]"WIXZP|D]QhtE.Z_4z3ۓޙhgАCay  "pʆ~. P@XHA" M M M4+N \ES>V(7+XGc b~qax,㒁| \c"E0_^D#W ]D /_l^eOmc5ƈRnpoVZO *J)]Cڟh+^R⵶Qߎgdxc`<`&y]]㽮v=p +ۧFmߡICޛph7r=[p[/OoPg@ r u.YG 1uzG<-}մc̰ˬC DtjP|"m!!,|LUV=.c=m6wcn{,XUbk-|-$i:Ob, a>In?" ~?mn#kU&ͼB^E'sqB oWٴ|Ss>kfiG#88'.&9_aD>5'>ȷbuƠQg$X+}ǵecO ʞGSPPgh2&)v/?YP&uwb /W'\EX?I~3Cte|*,9=oe;G{Gb"y_BDGww%4昌{>ֽ̨7qs6ZO_hT?.!g̟h&{f#X: g'v=%g\f!㉓"-F | &H-yo넱fs5I='z][ڙӝm鵦lԗk?V5+԰vw/6" @KzdujV4YH,s1x\5nׅ>NO=^t|?3:&O<;ó&- ~E(E(MMdhdb=QKOyYGޠObil6`N4;{_DIvRuQ[DTpb}0 ivA=9mٿNhaU{]ۍXcQĢ~b,X,>Puxz@.Qv%恨ZP뒭Q(lx9P PO'?W_NI(f&`IГIhq N_8ǀQT ]9Je n邻.ЫQj}%aGK}rWbCk|ܮuPR>1| %I?y6YJ@7G8*)sQ8$hx.(GY(ůRpr9z rgD5RY -(%Ŵjrcĉ^#kk6*^\pu++^P(WzBO* 4~pJ̒NMvRn ڕ-j+۔&Ve @ٻ>] \׮Qn(k]Nh(wAFYnh(@FN(wPP:N\r6w mHlwޤ8KrosRf[sLӠm|7#|)|'m O/ĮlKJfsA g'N?s=29/m,KQ{9wy#Mp֤j9Y?jV>zI+w!g{0PB%'ݰ1.c5莇TȂNhvٗ_ddddd2c2c!N4[Yg򐬗`:2`:2O擇i(0 =4;Lڊ44 гLC0 4jKq2@i,栱LbK(.0Џ} qxC}0Z2]hOkyvǍTv+Wm|B&7dUT_1Pay)cy,*Χo>\9l$ Eֲ3,Fpi7n9^J=ݦkׁk ;kUeWX%^[ uj=C8{%8&S$S;c}S?hW#⟝0 wYNXނ>F-ЮK D錪3(cURi]s1_l :רKurpGK,AKrVHFW֭a,\l=bom.whHroN#џҒ1'㘻UEeqt"泬3jW#mYum/H¼l2en6 koJqh+ۇMڥ\K,sy;2cJiX=+ݞxNg_X=NYѤWd-ηdeC#`y<FXBқ{cs"l3!,q-n_у9:Q$AgKͲd/-o߸/pӿ44e?CqXf4p&Ixgc@dDs?s S-ќCYüp^@3"ZLx Ȝ,w?cyL:WY SդW+ê?, u|Gh߸2կtOT~5CD4~Ev)D!ϙLsn(i1Udw+5zxt !VDu|ÉU$VZ&Um~\0fX5yH}ֽYڬ#c{#\ kXXGW8g|ƹ'z;g:\~oM 6HLaER 9iVUw0ʷc3%u wP,|no$i;J'7,1Hx(ƶ~P9ݩXΕRn=0y$4RK 胅5RQ؛H|'#q(E8͈ye?ͰTT4RQiH^@D2o"N{c]YICЫccvVIᝄ3(@dDx?§ؓfOJp;Le Nżg6ZuV(:`Mms94Yxg#~N>~<밑7}m[ eޙ̪NVtk[kCa8t]tm4ӏIgH048v2*{V_[Y;O#ci.E77^77":=^_iiAbYMb]EF38Zifz1Vojoԙfy>ᯫSg(o;x#.swwk{8uݺ=Oi̖&6/9# PapXN`W^f1D<# 0iH, a(/JҽPHgno,m_,mWMcq:e#rl4B4n^\lr' ;j@1[:'4,xJQ]T%aW |sSֹK%d Ͱn˭sbAd5[<-fKAauٴײN%8K2{spsvK>^xm:Ov.n {tFQtF"x־RDW&Mކ;iT;gcaʼ\,'[@z%QO;ėT _IoE}\NaZ1#8Q菪k.á^gDrUk֢VBb/H:<^]Ǩg!=k &t9kVޠ"i#t;-6{;\rpȵ5GܕZrg9J6x2;m$M5D _T[E:!H7sYsўKDM6ڏV)mo xD$QT`GHH)HmwlݍAaVf:B|xl/ Ęϟ 7阩xoFLX[pW/6r9{vkV~iQ?I/+kTFg 5MʹaVuw VuOhnn{ p 7vH1tJIT mc3d<!t,uӛWI˨ȋKast_bFoi%uUݵK':sUub.2RP/WtcQi5SɄcUN64o*j[ZkkX{\bXfz+9r/{i=|IZ."qX!֊;EeYEұ_[| [Eԡy%ŏaG$]&]8˝S&՛aspaW5c0KPF9|Ϟϴ˜X9v<;C/iͷWuyI.`o瞀/ouJW&y+roߋ I'i7>w7wE<@+/}qNj4AQ El ~pHUyVAJܥ"TSxvۀ,?0TM c;!7he_J*⛿Ps@_kI1l:\nS\L:&UywwkYrM8tC1qr;uYG'X8JҥlTe\]ĽF+WQM-4 =<ÄrhD;D|Zxo& g#k svlCP+} pPu= lTp p|yPnpa 0\< )ExxW! XW Kؤ/D_"E|!B bÅ.,1+ב4t02M-{Zl; [o'#~pmQBvxY ">6( ' jQk]e:a@h+$0m.KM r5+LDIDIDID!c/cN=a n^0#6HxW Vn vG:(t(R1 }^pE޷WI =nɮ\qzDvw cC ϱ팰l O?!{{2Ve=aN5" gk@Q|:|zfHcyV{`ͥ{IY4Zܢgsj;2$U.Dlbϵtk5ؤ}~V}{o?pO BbW@^1|&aq ,A8/\ & ~9zEnP)BuSSE* Eej˳qa埬#JM(_Z'@yLA_Z?(- &_`tk!3=moCu,Ͼj=Ơ}(dcVruwߘl{|2Q.x"IA1%)`V Z)X8_-R 1+3} d5WD7^Y%#dʕ5۴÷]c%$5SzQ0V(Yu6^D,rNu{; rV!QAH dDx }=`1^m1 FcUXk jGUSDUT:CC!QcQ.g~RM/E++=2y rǵQdc0N:S:aX/+@޽˞yZLGDE[)}vbOSGqW{8{=$m??kߙEm'Ea((LTigmb!yYRpO[ZAMA E#!7P]&\;MveK_SqiK*=e~ZTsVM$ KvRsW֜t'uZѺzXLx5Z Rx; `K7tr ǗVl^+fS|%Ѩbr]~t`\Dm/KB,#oG;YoO-6}jD:,6T[I돑:Z^j8*-\_j=&ZJZous_=-b53E2E7:q ?Xq L?dw g( 1[Pxqhvy"y=B{:#m4/hj[ww77B`ajz;iShdr"oZ})'Rip*s*3 Q >Op2G Y-66n(U׷.6ֺGR^i,1VQv?ZEcԎ4`S Eͱx6mF ܀w=AKi5iӢ̖.6XF$`s v'fg8 YwM-4zL}ڸ Dcֹo/`h+n.^95}bϘelcD#v&DK`(?[t/ԗ^Zkz/i2ER:InGBNg < n.)JBy ŧxɻ(Sn`اh:0Z'QeTA`r͎hvpoz#@o:i-Ƿ!@TJ҃86Ù$M dI_ p,@}P[ =o諒ѷ׸Fk$OgTM /Y ވƠj %WJ)>Ӣjw[=H&-Mflvpҁ lY;Et-:|O`>[w+p/_@ٓbY3Fwy{ǵRdj`w66+ hۃWOE8P8(ovspjP[@q<Vr0 (IdHCJv]g Y] ԳL@TT🧂<R4=^n Ol S~h~OnICur{+V@נּ[[Q[]ۀ޷;} w,z@Ml[LDZ}FkE]v)?ēoƢQ HNz8 Wx*E[ɛ#Րjr>g~ܔ,3'5et; ody ?EzH".B?jQZ綜\7 [K-NbY,&դ謶K+ӊt(X?=cc%i=`YGBH)y<=yx4[2q~?;ag[u)밖?ٟ Gߨ sƒx^j ) g- @S8@Z =R-*?HMT}Zn`nݰ 켧 PuB!Int ^SgwXgiAjrHV WhM;U*c9T PZB!K9H=GC!L787;['AӁ]nG8r;2"^]/`뽀  {B CL> Q&DX P?Az8HFy [۸apn:zg!J0lK&D*CYKwxJ<G%3s3zx{{ExL 4A?'[<ҜTQծQMVQ$l%/(v@%>>vѯ?4-TZ-eNԡšG?:֭omǖ\#3g-3f̔ļX*t7["i *:i|>`{'PtPc$?)r6]{frqp"oś7*F(p8;4+zŽ:EΤTȌv-nƭtKoK<RB #["7w?fYVWԁ]~0_*h4O/OZ,Q6} @_ DȻ ,L=zēAv0{ڜ$q>ILf#i{.Q(JZsMIR"ѐFl0pVZ}8c!^;(6(6(6(6z+.h炛a)((MuEEW :Mtz+(E J/XxG%>%<'TVFx3H6Gy;/)*Xk|*.&7X5rpXvJJRuۡèOn0NtPs svAv_q}l|6g v 4pjF躝)QW \"0;%ҖPIoDt/  s)$WL먹y^Csd\Y`؋itâaWq:anG Ȍ  $ѸHXns׫iiܠ1Zh{`aԣWQ%VtNi/DI:oO$.9C3h:Ы>FT7Q'5$v}:biE?E51#6&̵@{8Jޔ؏R7i/6l7eyz gyY<oIFiK747T81yX8L mL*/sp74p+]Ql7[5i Zkkmɓܱ%펗 1v5gevdJ.I+.vU]P-VoL+?N Cl1+ #tT=Qmwo tv+eX@'ڭP>.'=e и!n7'†6@%!r,D3х<_ΫgQg*:Ё9ByflM_Tb(ߋ/H!yig:Zƿ>fOVJNz"q7|~iy?x=[oѼH`c,1.a XSXrZa}j}iz9M % c`9{7U<)[xI-@7lΒ }ٶm$n+)c?ս'_#i4@4wHIUqvBs~>pɫy ΋[Χ96逻 wPpvEgѶи:E %- SgRJJ7,Wmx>"ҏ92`^+;^:IRY7{ןZ+r%/? CÈwo #'|/h-7x)_^܎cIBm4$n acl3g芜4>K8'I <1( =ߐ5R* w#87 pf+m-%Wm*ASIߖ,G .8kp8pdAEgtQA]!mWD#+J#uBV*KUZa%m 4kkx/^@Qp>a (gs=Wam`n-ꞯ4^:.i}q6MC; ׶3|I/nWhy D0lg  ߼Bmʛ6>{s7oD9}s`́79́7oXypKa|{ɱ8>[n  Bw!hݒ8#>ॵP ??˄øL9%.nR疸_p;'2IG,-(B -G5yy1%p;\JУZ_m(=DIWV^`g_?sF*Ӽug,}~_ $->ViV.QBa ˝40@^2V^[pCL; nevQ js[:E HJjtD/YxH€G`}61@J'8, \ Eke/dzl҅edzػF_~g=g{ѷ5Ǣꌃmy{=*Oҙ4k»">N'x/d Jz汍ʟw `a0ַ[yz%F|H(]J̿vtRS O+TXgx()7m!FTNS լ>wl? :A^ (= -V[ Zޥȱ?.]z-Zk%uS@1n)A`K̷C [Ho "C-{ 3^P^(yg7vu 'Qp 'Qp Pp Q} gR}DjʒdldD'Q7O@s,,IE&mMƹS(onG~f-]\]*|ٻ[-dzJ2! r3ɯ&=ٝ蒾g4`p _쮛*lDNPPKnҵJ ul篍(WJQ U9Q nąfs̽}N`|&&v8V%#9ijTCH,M5: B2X WlE{4Ur@eb򿲳I]' L#'>Vs;sD z0|jvۊ6E|@ &l(`5QS%;)\TN'(%/SeðFGG?U :}N(Ϗgi7{hkC=c8RR?[?OViom/kM_i hFenz^_t)_Z&iR0%MlOi|?\53`ND||3u:Ra> MYozk7~.xyq"A쐾uiuP$,ofMi<[fHgb~S։<<9|/^s6m]YI3 Θ@X59oDx jc}qoㄅJ6@O\+/Y4vW_D8[ҋ,Bo0݋N[H]K 3N:"@)o]ZU0)\QsЂTm ]K`/2B6n3$;P{QaP(^X 5,n({Ѕ[=}=,`Op:J4ݧEj'z) j#xz7Ix:RoGh"$6kPMn.5-bA\+FbmJMyXLh=3bk+>=vhy]N'v/8jTej-mOŃ Ebt6t<+ zz=z(kCDxB?wI޹}{$;_,ְUbBMMC@uDŽ>YbA $R91jF7h2墁FD@MsEѴB-²܂~g9Op[CrK 廩/ityknC6EkiYYJ F3npLs۶Pv,. 3SG@P֊_̀ (I~|oA^o Ҿ;qh6f*DfsSnud'lyA9v~V2Jq+X\4L\g %[ۄ:ۆ^-t$xOFpCҒի;«S졓=>ZAo\Vv cA1%d]@WѾA+UM i3Ay?NKǵ *vhgm6(O4Q6MҦб#KhZʺ'&>CŜTl2>H񀁍Fx^h(H⸾xbMIwۥ³me%`j5ݩ=OG<}-QӇ{5,C^G&u,LhwvbmWm=t{-1؂b %v0J>QP۪8E31cz{4nfOLxxzWZ_[,o~ЛmTeb" hK}--wt }uYY846Z=/iI+?|v\Jcd #.Mf]b%wW[~%}ro^`74)#I:::CT%ۀmWⶺ P@CCq}[ކP6ă! -]vflf@h7owx*;v)eWGXQ+$E4[h&l2̮6 sKpPGY^ |h_8띌gxrC$ߑE+0gU=❊%y%BoD[{-&/ֈozXa 1"bH0afœwy 0ѡo7*I\}_7"ƑI?Sjvn ޅWw]> 4` 0 uDL 蜫K^І2;͡b8uxeQICĬXJkK 6x=ŶFVQ8*s?bJIY .dmRLdHJ*9>oɵV V|JCZ| $ŧKiHO?CRHBR0H-IIf. *Aϙ@N(yy@$x,h&ߒ[JxZEy]4G{mh`TV +Y_?{|D~O1akVdsz:CwY2d'定F~dY<R* I2+|_m۰?%^L(eޒߋh#Xurhl""SD' IXנ{;2H}Pջ +A@+pNlwk<|$@pk) ]@tY5[,Ikh`ŀN-?}:7cy5={Zh=Z=hQ|4P||U0::!GK Х;) 'OU(PXmnu6R`}(3+T4Cwѱ,oֿ?Og='z[̼ :cq<߰}mvʮ@ }7eZ M(ޞmInkMξ֙D"x9.8)y1HmtQ47Lmt7l6z>[! d*ҩ&z\$$zQ FoqJCE010xs^k#vՐp'<1o/,ϕ1缷^:|rY@t'}.^O;brtV,$1Z{_Ɛ_|k/㸄>K|;7UCx6+gϾ')3$礍UMgi>ꂒQ/TJn}4.!V9ŏ m͖h-=W1iK=:}V#n4ոFȒǼ^bgoN=QV!oKb7fw.cU<%^;+58&NȟN||H;kG>HMnmpu;k߫E?2RoB:bY߱cPGxkx7voU5k68ݾ'vv^j Ϗy?*դi I+juryr@NܣUfZu4fzDcHT1v2}$x8iф\Q4Hѡ6:&R@".*;M}qՂ47Ti=TFFmM[ l w|gi -Hܶ q-} 8>ܬ},ɍL#G;mY,nbˌ`+Tf'Dd&& fʑcks\rʓc|r>x^ H X'+1%LrQWL.%\wO xV9*?z*m{m3䓘vye\E\䕹Lye;䕹f+s)u|3w͑W*W+]8uqw+ABy;u;]P^9OѺ[,d.uwW%:y"ͶXm6((D4 oW+>_ ST*LJ_ ',iH1_%,3RyH.FKP~b a.dj^V%xP9]*FMi:s`)quimکrv-]yK[iga9`0vej Ukx̂cJ.N>Sy@gXKZJVi{ ;v` yG gjb EvA{ 2~fY>D{)gRJ<'K[(`dKB06"ca߳;Xe4M/Rf̗:%B#xI/_zG}J/뙋wի,{U,]L '(gA.?f)!E f6ųXւugIEy|!#(gO"rGIV Z{]Bf"U,_Y)zc}+.-?Aޠ:#i‹J)iǼOHސ3Y<}GY2.؇(H~ZH z\U.kEWc1\h6~{9z?:TJ}:Ejk4LU@!GMJBq|z*Hgp~+ez0{dI#J Ϳ8 2,WdԐ? ;6qCN3>whHn )։*h#``%, 7D: $Ր aҞnpR1N*>tw l/b4SVj_kIԾch}Ag}x9zj A6$lH  a3@fȻ\8&z4Ui+Iyw|KمgX 1XIWC[xR*Ր269ΐWyj<5sSl9!TywRt+)ʻyr+%Ty7_w˧Xu \(%"B)'˻rO~D~>Kooow/]:Β|9.Yukr=$\, y*YGuQy58e> )x\ixFmgaVM{%;V+| m{w{^e5Z 4\Kl9.܈Y3=ϒ\vgժծGc&9yy &zԒ82^Ҏk-)JV/I56ȟϙ&J5VMRdlm6 F8$ Xb0c1ZL'a"XkB}Q/N'UTznx=dhkly6Z p8@&Q@c^;:"_fAqj!W%('$:I঳쭰dȦi\H]8ܒY @pV]OR~1j9㺁i`%u[: BSH )A@2@p[t#+h#Y&C70l!.򢃀_6_~I^$H"Rm &FjOڥ~%boV[֜dґFA;Њر Vg?̬ILy|AR49CѴKh\Cӆ#(T~7fXJ5T+EcbC@iP7\UzX37q`ZۻM@ cF;TFTkLQ.5ƃr(19BEi4[`N9aUz?{_:wa},O0(*;VG:vWVpjnPGE Vɣr%d24h:-F[ssC"*F!k+5,e~رWCOT0F>kGQJЇ[,wԫpQFfwwdGJ$}~'?H|_/'=HKHHKu&{Og9FX #v֙a;x9[ jy^o#ِ-H%0,?^S/_kr'X\5Rƛ I< uIh #IuJ_FCQd [8XL˨Xȗ&eP09Ri*x.Ghʻ[m Sw4ɭOpw[FA h`49 9ZWWWW9}+#)3_ XGsu4 nl7Xy'<f=l|5$ϝ|` S|7Z("cpc0~y/J=kx& ovo 6to9Qeus{}CA?6|}IcyMѣtN$ɛvd/Rd;P*^7m/If-E]ORU(4?Է7C&-p_dX"LC!/Իz/|>G[\8?Rh^%-D13&ظxx(7ҍǍR=`.i[K;i՘?8v/_@'Q[9HEƚR7E@ ` QR A`DŽygCU6`ᴅxIrBTA8HNyQ)X;A-N m* -&RǦ@A I@R 8BIg NPpفPH|vnZoˊU:iD*~GvVp!sd#jhm`:o2y<;Y*&1bpqЄ 0褯N0G5afL u^|\P|=X[4]ҵ5 mmv*I(h:B P2< i@Bݠ]7(M~ruDn{=UT@PuAA:tQ?}hQ&r--We79vuF Ln\ k#EV_9Zrm &p2:M3 ȼ̻+ s('9dӞ8[%$LlΘ]}䐮/̡VCX[ X`:]=ulwmѴ?+fJQ^l~ \&^KChQhZN4"LKj>Qhrgwp9[7xf݀OO,>[ęc;r8v?]~̑ck/?>Wv|5{pa}Z6'^n *4Qg!WW]jZ=g$ UdPfkmۂޓ_vLC'˖J+H#JpDI66a CFfɾj?O? .Y._INYS Q$ŒJip_z==̩0[8+T;MZߦp{-k>/P&TY#QN`T QE392N͂j~,ܡ9YrZdm=O/W{!{YmvѺk %7J;/5= gw:Gq4oEMEk9agYW –InZ,ogy~Y5+"kb,7ʌیIqJԉ9`r?wρ7_g==ְ=!Wd՜ 2-Iᰭa3ö  JK Sgq iaq*,Q ڂY$NIDÊt@rSavF<ɰas%J͕ +YZ"â#!#-CyGKL-Μ`Azq{%aԅ\ڄ-Oxdu/{J;}gˍųI=G7ZZJ[Foi^gرyFO\|-~e t -#?\sI"<<9Sqj)6:q\!XjmC,P87:c12 _\dlcLӥI6M҈ΣěX.V"G+tgz@EƢo:hTGIZ^i҈KI-.%;%{#Sf௾dKm deG8T1J?L mh`U "cD`X'C',~3^{}^{=ũQwڲQLwWi {Ӵ2K rmf#+ya Mw%{>-I-$IRGzfGH_{zz"<]={=޾ǘd'A/w܌.2?d~Ay[X++h8 BbɁVsD~h!h#=;V.hlj}VdŢ'zo+}[|ǎƃg4<шh)g.͠5^|4S4r Uo ߐ5cJĎ9R[q.=;eVˮ0w{fg;KC;|oClۢ ?įĮtzUmV~}8F Yikn|=6-0j{T'x?;T[E>#CTc)v~2]Qm|wT;(]|T{_MF{:k%YY6]kF}hZx?n/ Tt~*Vz!NZC;h%9?2}i+}|}*2+#ةx𝎊wȩA<-ݮ)G";K4Yx;9񭿰Q:RK;u3gr\(#].g(u7Tf,Ld6DIdAe~PI4EUʷXV6w/ƷwwؗKH1ӗUVy~k_bN᜾s?9 $1ꢣH_PQXFpEcW FpuX `t>O$JF4d,M{]o;&ʏ_hɾ~FJJX%_}4Rr\)L (2L#UM-hZmƫW=WEW8+}[B_4ȱ0X}|UZ k v`5|ARݰ-bh,-:J8FX&6'6٫Pġt/kYMg0_ɐ`J *F* * +&Zc_hy !X@}<@X{NsJ@zЩr}~K#X$KV?c=iKJz {":HI> ik4@sooo/x8igl41AO2n W|aȮVDVdT+7}Wp̶Hp;DCopJSƨ23b9'#]\0@Ca~{'V(1Q-! D (T]P@DB! U죙F[k'F+[Wt8ۻـƛFt1"2ułu SwL]c glkgxK-Z"Y9E?ՂXC'zNeC 5h 0fi:&ԅ2:\Ty=NfoyC/Sn~9{wLԩ/%)b5|FaO'y>  -VIh_1B4K:JC$8W9,P 7U8vͅ0@$+ZDjCRēcM$3 KV.r3id[d\wJ׿cZRgWz+9*պk:ۤFe(=*d3ɥ zR!k`֞?tzigct*CI>v bi5-i)|pU~WiuEU򼢧rJ:UJHyg;)sO_0o&ii.O2@uޞxOsbo7dBmN } V09t ٽF{E3'6Ű`LchpVO"y0aP~"]ð5wg ]Dlk$۽ҥHfE®芆(a+O{nluì hJHd4.&c}2ј&dt$?aF|4?;4棱1 )QX9!+'$O)BVQ L L LT L#|l>&(ڥ``A#` ./Q[2LmzW*U妲=Kݤ(P-R\b!mE+U5_UO7+勼>x=.bRcQ[;lSkG,o{&o5vUXqfh.pla Gs!6j.B`b7l+y-A{2`eVׇ|o|RHEܾbni^K킆s[ =:ErfM[?5|ߥ6f.Ci]bwj9m-n--M^(͖~TTInvVr*#j,Se#]IkF7Źg_bĒ*h#AE<ɮd%UElqRK)pFa<&+@u&e5EӵԲjmHGc,=z&71WmU4W=/{ iPiQbЯ0 JzBXI__{>EjA>0b&TcB=GOx"z֭WI)0Ƶx~Y9!ƶa%`Cf="q;b$.SB|J;viiVItCA;ɶ.serZd2lz=VS ˍj6娡a>h>:D h{FUizi.rQm4TVo sJ#=*?i7?O6NyyVY!-Ή- O^m/Ü"k(X ۓ[Өfjp WUT3,i9IaVnhCMXdXdXdX`{ o.4 䞮XT-Hm,vV;m$~I]KB(gCh{0M.vݬ֫ߪDۭ^B]Zv}vc#̞b[F]̊`vn&ħtxUiֳĽ|gVұndLuIK2W$/s!xV#9RT Q rgIgeT9*9Pn}`EJR[OVdאqww!?.#]ThN_B|~^mF?}=u{=x~6,@ QVeu11=>m)K'xݣvlWRKS,EUڀwA zl/ã=mߌR"wB>o_GzT:c:˔b+(δ b8}888p9##c?TTwzCu]p?Ͻ(@cy(ԝpLT0Xdb /3}C1щPxoe$)rq<@ӱhl {C`gq&a bX@ o `V/֜/B-C8#aCRsM;w ك`Go#-KYM/c)5LPQ|Ωu.~;x m;GQ/R 0! ̓&P|QŇ|sXCbzF]Vzqi<Wt5=E ͿiGiȎX2O@T[)GDQ1\Kpo(Eܗ Ʃ0xz)g6iEŎK},uLT%Gu0ڗmjZ)mߖjX~fr%=zt ۔HrCvMi\>~]ZK ._y -BCZvMފ* r R00F9<ȓ\0 c0aOFa ,sh胫UYߪp'=IQ`FMeD=)XV'!j.`i*)RzQ>H]Huq0n?)\ޟX_p)y7_JʥOӒ>H3\]e J +Y%pϵ2\2U*Vv厂ݚJ潚$';!pAY:@'g3n3%KKMrZNk4)\;*NHkգp#}Ҝ{l[^Q}f,7Lr%;ɱStF5Lm ۯ6/ԛX+m4A wm$LW|:q[0ܾzTސUB[c.HdRV&w9D^C1`Ү"bF໷ѹlt`sOGO'1bN(c`6q4$6V[5`I&t(z>ZۡJژ״4aCM @z%{g}Vh9U?Jr75}&3DIW J( H%װ):ە+gi(Y%*o ؃v0Ɖu,4L:&cy:cy:a F ? Pè0K(;6rgΝQ7 3.rݐqlnjGL'1() )i+("dgtD[ʞXk*;&y{vm9f[zmVɪ5IW[(D)eqlzzRfWяq{Fy4٫ԑtAIN/,v?FO'UoFcTm\Rf."l2{B R89B}Y~D^ tK[K}hW{>*o{EyiS۽~tϘKG=nObd9.Hv zDz[O.-4*."r<殭BpGcbtjkL}1"2RV6W-*a8eo("Rbt zc0A.՝Twb0#bt?81}1+d Y;Sk0k`kgn%![K8uCqYX>s8;kK5 *[,ڣ&l'{ZfyZ94*;>:9㐄㛥pۇ [>\>Ԛ`Yl,zf..D (K8pX©C($}%Փ4uЯG$FН4G= =F窚*sy=2QS$H^$/$)5B \!_pp;Q6bf(FiV\BW/7ek$uS/R/GҷϕRԖfwִL'mI#q!IRVۮ+]Gj=(Tu+饮aYT ~G,LL!o?iLe"q.kh)ɸ~K[;KeRkUҘhZr=н`=Wښ={ wG]'{̎c`1H2$Rq׫I}֨E Q!Ro0FZ-QԚXw,GT/6O)'ԥTZ}~XA@F?Q%e]ܳ;}#Dql,8'OX^ ݆7/J&8 dp G 3[L m-L[yVkwXǿFI@^zgEE xi¶΋z $Q׋B^#ya̅q\XP[i"^f-u,-e)g#SL9˖Bd?a Dbd4ǧxIWoT,WjH\)+/HGʆJ<؈OqnB\E_a7FO%I.]'SrI$wCA)%]^墕yt"!4)̓XVvoYJT(MUr{;]W]u5ΆՏY|rTJ.R?RjӴ4}R^s'p"iK{>t3.bMY5Z1uA`sVUW\eFrw붂 FȀJưyq V@L{EahW"^a(D&wvގfp !]H,IgX޾ Am2".F)B\ZtFiaO Z{03 S/RG5dǖ 8F^#Ma⹜&1 810] `r#H J6ZPSP#bƋ"о^7 kP0_R&)e 納[Kp7 rߌ^b- |AV9pɈB߭Yݎ;C,EX&N 5ǯjy;D>.T&rPppX:pF}6᠗mwmc =H{9x|<^x,Mb @S戝G[o.G߆ J;NBFy8]-pvnsu)Mlh C G(E#dC)A$dMppft2躾DOw'2=Pl}^5Œ_|}n>K';0.|ƹ]x,)x2;r>Sٹx*"xb<7`e<^/+ctk>[')F~m&O lE0U3d<3"=j#Pl$fٗt=]L3FRX9GryzpƔ.Y(-)zeCN JOzLZZGGE(1fy&9$I.KɞrG4C[:&Mk ozx9t:}d 2uj3YtpЎX MoSxooԗ8C[\)egwpVil(qt:ձ<]K!.aӖ39zKO;~xiL rR,=Wby4ǫxp2oEXòJX(KF7+ȷ$U鴑Q |¤*qE/g(U"h]K ]T6EEr7iF)U\ ]3@J".N[Of%5D˖tu<Иf]ٺҲ]G Hîݥ+O:䈒 jbX,hO. !М9.v pLK$Wy\|-$sVg:>Glw2!u AxF (ږ ~is#Vg<(3:cVNXPJN}n#`7۳Z[\TVWKx0reBK,ÓP <<ҋK ,gAUsigϲX~N􈇈 KNVH9}8;9Vve_Ǭv"0݋mt7Kv|\͊)-4lcї }Kk Kc J6c! Ki,˕ JK_ _.pǺj7e[x汗):\,*RF{œ4(q%KF# S62%RO2))P^,!++~FPJga%ʇR|w3#wZsj%rneCK߸6~.ٯy)nԺ }k8 ~fިW{XoNQ5BRk>pmUX|ҟql [YIL@lg9Ϯ6yGrnT͎T]2#B 5إR>]-7*e ކFF`r]iD۩Ch~ օm9a|@ T(^<]V&J )4bVv -|}y=nT>iRz(xyb򱫵SyDnjVMkӴ6jV2fKsl{͇sqؕHiv^$Hz1tz p@v-05V4 C,Q8x83YZ pgtr#y/o!/#yQQ5">5nu(&#Wmf,G+ [QpN}1ɪiLGoV_Yj\&֞ [- +!}ifF F rC95a^x -OUvbi/å%vG-%RTtc~EW.uv]IA{X4',+Ti ^IeeIJEFRzRFӯlF$UxKL OkqV0֣XB ܗWc] R645T,9[W>UJ#^iRBطKdam^Kzr</8R?e*ˎ+G(<.s0a=VŜ**MLnVɢdѳm2a> цģ1I0ͳ4$r ?'|8y#O{ijz!YL9J]ݩo}e:w PR庶H&sU_IzJ-Ж'j"}:J>vAV|m>(`CSM *@oh  {5[OsHZ<ݰcEE.kghJqhv]vK5d5{پf9si?Ǽf;l!)J9HS._7Fzr _+W)v$6^(]Tx=Lc;]ByѻP콒%%RQPQ~%R2GjHrZrIKGBu<Ŷ Ī]CPfx˵JeuTuiyZg5fe3sH7,KM$[=!eqaW=@dK0mmmQZ>H!A;bnl'|+*$3ֹTrXh( @ B"`1!pOH)?R3cC"QnF'e$pZfaEDdtxι(;32ad%YM V{X>$'G/E@i=At Gpԣg ȴA-j 5opߎ!Bx[0D;BF6Dӣ,62|\^Pgѿ,{i)]^quvO{WJerIBh6mC#Q0򬒪yr(2.9O+іCԩRױ1 7wgJTY'˵,*j 9vyP=iy+"/*bZϭ99HwxO}!A40륕pXµ5ι3C WK܆! Ag[%!Q/X n|fp}2Xf;"bEcDUmp jE?Qhr @0 0*0Cm6>ǂFr'nu۝ci :ll_T7HĜ!isWv_ 7H rl`Vif wv6^KS3 l8s6kX/Y/_?t q͙?پAE8"h 8q8DB"!8A S2)ghO٨RY{"Y{ vl[ѬZ."^fiz8֤! -k=`=INq-r_%֪$-ca=: QD35ՍPX؇=C+w8X폫4K);;$Ԗ%&^ (*ʏeei^>'jvP5:F+͡2d.;;2Ԗ1J9"s3IT S6Qj%ySe3?N1Hvb䈗/5N ~b4˫ V^';A&a7;;:C7Œmkq3_2Ę$;g'Ɣ1Hs*>?N:Qh'Fxb|RQ֒ŲUAqDcQ9='Ki5"ZkrWj'6kgHuh->ح,cQ `kዖ ww o)]hWmAtI-hMx08q+cGl0%|kNއLKb* $sj5UALgApJn57վEe|w9*HC_T~t\7g <*pbLKԹC+)^Ku&kĊeי$!A-/WZ,3G(#2E ybB֛q!gAKU)N+ǀ#Mo)WJ,[V|(B,-w~.,8$4B~Q+}[]=捗˷(S1rU$GI u.Mki -JR>ay/;')w_u4L*C?ic/՝CP5OFk۴G5% pPτ3kz~XF0Rq=rs,>WTz}_o/wjl6^[u13vow-]3}|_R*J+^1߼*WTfŭ+^X[qRѩ""MI!F8PmT\mReZEzHrYvVd H54,Ԕ8Wk5 ,}'(Y;MF5/?Z(W-B/g+1S~OPt fn0n9\f~:J̯o󄔺P[5g[Q^7R=(S_Fc9M>>:zuRY ;Y$o+UEK3%jC?#[RVҽF6=ձ$jx{׹lI]6A*k\yE٨Jґ&j B\:jڤ,J^ΒkZ֖k3 -0{̜7Gkkw`+2ow *^kTÆ [{zWk8Jgxg;=]%} 7[`lHݬX` I b8+qOοޟIT& @5wbV;#Ik hbLD K܁oVLF|2dg 3bYffC"&ĝ]c31W7D>#{ q0lGa8%#>23yn&Ff68{raL4#{]0Nn2<8 4|M&FtNyTً/;Fm IzE*+O)k/GS} za _cҧJO;U=tcX__a,Ukm%D"Wz*̵ Nc;v t׹ :=;6*Vp4[7D  '5p7@ȃW 0G$]="JD vpDXy)` -(_QvxiLg:L6'>5 "/ӇIrp&8$yO5 Ë~22^bEZMK]DII"֭UOe8ke41ݩحwR}yNLҒYJ~ j%Leg<e%5X[':=󆴖\$k,mCcCBɺDrC:mH&*$D煺|jkyx yuC.$g+8A5΀͔Cm*7[uk\[ҷbkro awwE[? >ޫ{/q,nqq=x^L}zq+Ư53'.DN U܍V]L !3e]yzE͌# F4xFs\{߄<<<.Tp@oB?*DuD OzV4 A]NU[d>IP׀967Al!?'>UmQm='}@4x)VWWX_6?~EFtkzg '%$ܜ˞eq,SǤt׉5bg]lWV}Ucv϶K/"iMPz-њЪ#0<~^tSh5QR$^&'p 8>kFבoОof1ќj]bLXMb_fŎ[c'rb̃Nl8̩u:YdYI5h%Yӭ \|c7I?*Z|C~ZD݄HKr=f>r+Lj8-erIw>B :Z,]>7yLەIvZ7RPhtB,O :!p'u3D `uq?qeÒ`<*-@0a ؕؗ*%,LeWc{K!9EmLʓV9*2e.UD5)O RzEH#RݙdP؛WtpX6" )cu1p++U% h*8?`ey;DuY̖dOrmlJ"h9R4SQ29rd{ٔMؔyM"ehUa9%yq? 'b'B>ݟtJk)$gZ)-ѸPUI7ņv0Y,.qv:u6ڟ,%;Gd=kgVԢ&ľn$˥kڙ#3I OI gɯkoϰسz) fr#d/{ _h oo9͍5NhxH<'6.B%#W+6ߒ=QX5 lnbYq $6?_s z/ -[J@|6o28ɨ{$<$ْF U"\E:,I9 ,TQu] @},` jz=*^qQ(j#b(*V2֛" 'hQ,NC1>F_%7r7%`ry.W{-Yw6K*5TrYMb O{sita:fY,dIݹD^ ]LJsd3޾z2T¨3/s;I/wuwH9dZU(Ԉdso[SɕVK;O8sYlc9o~VGI*Ҵ b<ێuqL]@#u:hVKE'c<6._l!פ+P olsVI\.`ZAW]u>Jeh+ CwcGXjĽTy\JF\g0 #**{"\1\G @Fg#г |,(f]) \D9iǡr#GUVKKXՑI X|>XC}9J .ƺ;Ec_&ywR_qr3YwTˬ DqO}LOL*O){W9ko:Ht솞&aFɣވ;iYhr:ΦǝΧFoӻK^G+)W3t' P2K'$Z1MSbW>M $U?=]_+\볡0/W͓  .]vI9; ֕Q{Fm=-n$pBLc[?pac۽b4PK!C}jfont.npyPK6vedo-2025.5.3/vedo/fonts/Bongas.ttf000066400000000000000000001022101474667405700167430ustar00rootroot00000000000000DSIGFFTM_zGDEF)+zGPOSD1/{ NGSUB\$OS/2\hg`cmapu#gaspzglyf, cxhead6hheaVT$hmtx2loca'n hNmaxpoCx nameƄp0postc vpreph `B8k[(_< L,\  &&@@VXDX2  #MYFO@ R XMA\Ai9bdb!)Ay&D"20_ >V=N6,2&AA{AB" E7GG(C!Y<H0 3 "A " >6('uAuU!?b o2C;@<-p9-+[(npx#X,4 AU&b^s2%A{D"2-I Ayl-D- 2z----GGGG!!X!!&  3 " " " " "A 6666E!!!!!! !b oooo>p-pppppA{p((((x#?x#b b (!!YEYC;;H@ 3-"/ > >- >-[['X,_kxiL.$3 ( (&&NW"G^#.0FA{H%AKGAUA{A{A{ 77--*\7\77v77W67f@&~ )58DTYax~7    " & 0 : D !"!&"""""""+"H"`"e%  '07?RV^x}7    & 0 9 D !"!&"""""""+"H"`"d%njW%K5c[޲ޯK!   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`absefjyqlwkthx   m}do n~czr{:hz.BTn0V&D^~,H,b8^~>\  : \ v < f . V l & L | . V p 4J0n2|Nb Pd Fl$XF"NH~P,ZZ,~F ,R.f  J | !(!P!!!"*"p""#2#|##$$ $.$b$$$%,%P%x%%%&&N&&''F'v''(>(()$)^))**&*>*X*p*****++B+l++++++,,,@,v,,--0-F-Z--..N.f..../ /F/|//00000j00000011 121J1j111A7&47'64'^2 w ĕ4d%%Q7 '67'6%l\l\ ug ugi/7&'&'#67"'67#72767#72767636"636 qD<8: D<68 t "FqV+ )X*V (V t D&!DB# {@nsn?c^N JnK,nZZ ;l}!VA9*''64&"'67&'73254&'&546d6Fq ( TLD6 d XC=T4%$*KisO^&>+"*/03OxS9H E1o;N(]mAY %,32654#&462#32654#&462#%'7*'@HK@R2`*'@HK@R2M@t)N%D9%YRdrN%D9%YRdr(:'.&'#"&5467&546267654&27&'Li9Qi><7dK#? 7@VA@ *m$ /9+%81H7SC/N/]E[^CSF!1*<-P-= ,5Q5Q($@,0,'6%l\ ugd G 7&547\aF5`$0ؿ.*c6T!  4'7'6}\aF5`$0ؿ.c6T)7*67.'&'>7&"&4762&'6 3<&(Q-L7"  4?<>9-; (+(Q@!C +".3 "K5V$"6 @&#*s+m,$M,ddL3bq0W[oSJF>62"''264&"'6654#"'zazZtd7#fP2N-"iq'4Y@\'RQ4rn -=)g#O $>_%"'47#'&'6367#fw6@4xk2:U QQ;irN GsV"2'654&#"'6P_fx;* >:8n UNFl2P$ ./$=2"&5476676264&"+>^wg4/--0D&=-!8Zq~h9LB ~?NDY*N ''6 +v4Yq  l6#&47&462&64&&'664&vPAzc])3v1/ D0 .!+0%!jH<|w>`GN1H|n(=,-;#,1:8 051,7"&54632'67'27654&"McVE:%_WF//;-D?%qN`7kHCcpn- KDX6!027'64''64'    #m$ LQ&#m$ LQ& '64''6   D\#m$ LQ,[S 77$7$ $mg}aKr;oJ{z%2&#%2&#{d\Qd\Q x c x S '67&'7 gmg}aKr;oJ&2'&4>764&#"'6'64'MX# "-U (4' /e\^ w cK#0( '0& =?;+)cPd%%Q"f 1:".4>2#"&'#"&46324'3264&'&"327&"3267=l>Alj>sU/E 07M:B ."&62264&#}@7R?5'"]ܬmqpA &624&#"6E Tz7" ?q= Ǒ"pvjB"&62&'#327&'64&#P&<"%# @7) \5'"]ܬu340*mq--Rp>6'632&'64&"> nwXw[_`?Vh1P0 x;4pfvmrG_ךgT.R&64&"#"'&'73264.'&462. $9&PP: yLZ=,%aE'(2T.5zs1B+8$F24.14ZkL7R/d[q6V3\{\gI 4 "%&&54654''664&546794cxL4'uD=VVyk(1snQm>m);fZyd B;YL// $'6 P 0 m"4654&'756654&547&94cxL4'uD=VVpk(1snQm?m);fZyd B;YL//U62327#"&"'amw%X4XoU>?/pq*9S]2* &'6'&472 w C4d%%Qb"64&#"327'67&&4667&5/%7J+B d .99,d*/ b,.6[i5t 3? <*V}qv<:R`X$2'654#"63"67'667'677M=Eb#+IBm;+ .11 /$H-kQ" N_S5n eC9N $-T%77&47&'76267&'"'3264&T G'`*+3-64H19iU:"40U53 03&Z#w;K0>1-%0(a$2-l4iU>"$Slq4edH$75'7''7&'6763"63"'&E9 v$1 BI xJ=5o)5&= F'W0p D ( D P e z~K+KE> $ '5'6QP P ];ޜ@'36&47&5462'64&"#"'&'73265474'&'6`3)~s| #5+_2(xTS=2aH8(r d f6/8]my,)%9,/NQeCV9+4biF9B/{2:, 8+s{'64''64' _  _ T 15T 152 -#"&6 27654&""327"&46632'NaE2dux{,!-iFP Q9 / j~fr]ܬ,W~y2[FHLas["$B f62''"&46754"'277'@i2JH3X:+ US!{MP|.U>.3}' &'67&'6i$:.5`C@Mi$:.5`C@MZ\iD)Mk`Z\iD)Mk{ %2'655&#{dT x@# @$ %!B"72&#" l 2 &0#"&6 27654&"'64'62&'6654#"NaE2dux,HP_00J])/&~fr]ܬ,W~\"@9D=>G33^;# R-f72&#-3,03{ b  =264&""&462_!?+!@*\O\O ;@8DiK~hKyo&"'&5'676762%2&#5gFtf Ft4d\QTJZ U> x \K IK x -?63&"'664#"'6769z"K!bU&BrHB)-=,DXJ13Q:0(-}2#"''264&"'664#"'6*BJ #`@# 162=F!1,A}8'9')=AR" @0!$B0'67-qG6_9JY '&'#"''67&5473267&47zc 74 l t + ՞i *+QI + q3R:< '64'"&54!2&''654  P ]Ebg2 P JzsO7 Lz @2'64'  #m$ MPz632"'73264&"'67  "3B9E.#*Q/+-%B9- '&47'67 d8,.{Jf77!'5Og3264#"47632#"r b6->8B;{767654'327&47MX#"-U (4' /e\^ w cK#0( %0& =?;+)cP6d%%Q %''7&'7a&?p-b_6G  Z3992Y %''7'67a&?pF-qG6_  Z39JY %''7&''6a&?pMDF:422:H  Z3U,.#,+Q %''7"&"'632327a&?pf:;8)<(5<<  Z3[G U  %''7'64''64'a&?pW _  _   Z3T 24T 24 %''7264&""&462a&?pQ))Fe=Fe=  Z3(',&0J5XJ5"6767#'&''6747qaLhCWyUtu;z_Y{p< nx5n'4d 6"32667632"'73264&"'67&&5476632'4'& ,B\' dY "3B9E.[`:eAP$  ?T-0* y*Q/+-%:,rEY56*CM !G&763"6767#&'7KqaLhCWyUtP-b_6G{p< nx5n'I92YG&763"6767#'67KqaLhCWyUt -qG6_{p< nx5n'9JYG!&763"6767#&''6KqaLhCWyUt DF:422:H{p< nx5n'U,.#,+QG&&763"6767#'64''64'KqaLhCWyUt _  _ {p< nx5n'T 24T 24 '&77&'7 -b_6Gt Iw92YXF '&77'67 #-qG6_t I>9JY;'&77&''6 0DF:422:Ht IU,.#,+Q&.'&77'64''64' & _  _ t IT 24T 24 $2#"'67#'27&'6264&#"2&#u@[v  &a;.[A-,#',eyl"zlaU3!'''&54'6"&"'632327pRucO7:;8)<(5<</s % >:B .G U "&62264&'7}@7R?5'B-b_6G"]ܬmqp92Y"&62264&#''67}@7R?5'-qG6_"]ܬmqp9JY"&62264&#&''6}@7R?5'DF:422:H"]ܬmqpPU,.#,+Q"&62264&#"&"'632327}@7R?5':;8)<(5<<"]ܬmqpG U " &62264&#'64''64'}@7R?5', _  _ "]ܬmqp9T 24T 24J767&'767&'.G`NrdHctBUE2`0U>ZpLaJtDUK.M'46267"''7&2654''67&#""=0,@;;?CM*BdY ,IdX3-C6T80(AGOmVh)N|{%|./!oO6726764'"&547&'7.?&  "3|-b_6G4R8.QΔ;NDD7` r92Y6726764'"&547'67.?&  "3|A-qG6_4R8.QΔ;NDD7` 99JY6#726764'"&547&''6.?&  "3|:DF:422:H4R8.QΔ;NDD7` U,.#,+Q6 (726764'"&547'64''64'.?&  "3|: _  _ 4R8.QΔ;NDD7` T 24T 2475'67'&'67}FS.tJh 1-qG6_Mz p ZE]9JYE2'&76"664&Wu =H7RǑ"Q I 14u &bViB2'675462#"'72654&&'&4654&#"'&H  .\Y4A I/C#,-J  p3Z,xf6M 'A'GP(G $'#hl5@`T !Z"62''"&46754#"'3277&'7=TA T/b@yO&\Y&/0-b_6Gumqз AzXO5" T'92Y!"62''"&46754#"'3277'67=TA T/b@yO&\Y&/0;-qG6_umqз AzXO5" T'9JY!d'62''"&46754#"'3277&''6=TA T/b@yO&\Y&/04DF:422:Humqз AzXO5" T'U,.#,+Q!q+62''"&46754#"'3277"&"'632327=TA T/b@yO&\Y&/0:;8)<(5<<umqз AzXO5" T'G U !Z$,62''"&46754#"'3277'64''64'=TA T/b@yO&\Y&/0* _  _ umqз AzXO5" T'T 15T 15!Z$,62''"&46754#"'3277264&""&462=TA T/b@yO&\Y&/0"))Fe=Fe=umqз AzXO5" T'',&0J5XJ5! %,462632327"'"&46754#"'%"6743277=Ty#(:7& P&+L#Fb'+@yO&\a#5'&/0um-()D1](0I-!.*-"AzXO5" TX: } T' Y064&#"327632"'73264&"'67&&547662%7J8_ "3B9E.5E GnI ,.6[i5*Q/+-%@/ YOba5DpD_!'727#"&547662"6747&'7&+L#F+?V%KO0 P%#5'(-b_6GHI-!.*k[hZ/;<&$0'(03X: }92Yz!'727#"&547662"674''67&+L#F+?V%KO0 P%#5'5-qG6_HI-!.*k[hZ/;<&$0'(03X: }9JY_!,727#"&547662"674&''6&+L#F+?V%KO0 P%#5', ''67Err&-qG6_ 9JY '&''6ErrDF:422:H U,.#,+Q ''64''64'Err _  _  T 15T 15s("&546632&''67&'7674'&#"326szM F*A4/5X)-. 3 &%.0xY4~f .'9>0 ? !!8cr-$2'64#"'&4766"&"'632327 u !2u J ::;8)<(5<<t rM)k U9tG U h 732654#"47662#"&'72*!u&IZA!YP-b_6Gq:6]Y-9)"COmV92Yo 732654#"47662#"'672*!u&IZA!YP-qG6_q:6]Y-9)"COm9JYh "732654#"47662#"&''62*!u&IZA!YPDF:422:Hq:6]Y-9)"COmU,.#,+Qh &732654#"47662#""&"'6323272*!u&IZA!YPB:;8)<(5<3267"''7265"67&.'I.?' *(2"Y*6.!9/ /"9- >1z]Z9*)1"9,7Om)VmJQI4ABV<0('&'"&5473267&477&'7zc 7oBt + -b_6G՞i *+QLC q3R:<]92Y('&'"&5473267&47''67zc 7oBt + D-qG6_՞i *+QLC q3R:<$9JY("'&'"&5473267&47'&''6zc 7oBt + KDF:422:H՞i *+QLC q3R:<U,.#,+Q(''&'"&5473267&47''64''64'zc 7oBt + U _  _ ՞i *+QLC q3R:<T 15T 15# '67&6''67`SWn%`p!.I-qG6_8W O ֫9JY? 2"''763264&#"10/CV"u r CC & &jcj o šjN od,# '67&6'64''64'`SWn%`p!.< _  _ 8W O 1T 15T 15 &"32667#"&5476632'4'&''67 ,B\' g\lu:eAP$  -qG6_?T-0* {~EY56*CM !9JY q 64&#"327"&547662'67%7JQr[ GnI -qG6_,.6[i5IVZ\ba5DpD 9JY +"32667#"&5476632'4'&7'&'767 ,B\' g\lu:eAP$  DF:422:H?T-0* {~EY56*CM !U,.#,+Q `%64&#"327"&547662'&'767%7JQr[ GnI gDF:422:H,.6[i5IVZ\ba5DpDU,.#,+Q''2&''&'#"&463207#'&"3267w67!Y+2MER h $<)% |@ /3'''&54/67pRucO-qG6_/s % >:B .9JY-2'64#"'&476''67 u !2u J :2-qG6_t rM)k U9t'9JY"("&63263"6767#'4&5264&#bbD4wePnFZUt5X@7R?5'"]+{p< nx5n' ,mqp'(/62632327"'#"54732654#"%"674RIk(+=7% P&+L#F^')4&O2*! #5'9*.)D1](0I-!.*$)]Yq:X: }>6'632&'64&"'67> nwXw[_`?Vh1P0-qG6_ x;4pfvmrG_ךgT.R9JY>  6'632&'64&"'6> nwXw[_`?Vh1P0q)(4 x;4pfvmrG_ךgT.Rv$C3f 1"'654'632&'6*tK 12)q)(4ijFP bi$\ Z$C3f>$6'632&'64&"'&'767> nwXw[_`?Vh1P0qDF:422:H x;4pfvmrG_ךgT.RU,.#,+Q?"'654'632&''&'767*tK 12)HDF:422:HijFP bi$\ U,.#,+Q:64&"632"'73264&"'67&'73264.'&462. $9&PP: pJ "3B9E.uRaE'(2T.5zs1B+8$F24.14Wi*Q/+-%:*/ _  _ Mz p ZE].T 24T 24'762&"'7'6%'&'767$v]q{Xg{"DF:422:Hzwi,uWU,.#,+Q,Z6232&"'677'&'7677P(XV0A? >d[q6V3DF:422:H\{\gI U,.#,+Q (2'654#"63""'7327667'67766W0=b 5; H']y.-#) 1: vNs7 ;O(3:]kJQk0ZEAU/V,E!M6I%O6'64'+ n Q 15$"4&"'67&6267'&'65S@Bu!8D7+)2[jO~gfrQ3 j [;ѢU3 j )/l'677"'64''&v*{y3 rF# r ce `Sl eRB %2&#\Q  P % &!0  P  '6Ufv) t$|('67fv) t$|'67|fv)l t$| q '67'6Ufv)fv) t$| t$|(x '67'67fv)fv) t$| t$|g '67'67|fv)fv)l t$| t$|&|767&''&5#&TA?\ bS ZolB͔ A&| 727547#'767&'&''&'#&=Mb TA?\VA=]b%S*lS Zollt a'64' Wco!WK7'64''64''64'      #m$ MP #m$ LQ #m$ MP %/8?32654#&462#32654#&462#32654#&462#%'7*'@HK@R2`*'@HK@R2=*'@HK@R2TM@t)N%D9%YRdrN%D9%YRdrN%D9%YRdr( &'6i$:.5`C@MZ\iD)Mk 7'67&'7i$:.5`C@MZ\iD)Mk'7[M@t(G&"63'&76"'654'632&pbpDpY*tK 12){n wjFP bi$\ (62'4#"63"63"3267#"&''77'7UjUq8-ibrl|cOJ# n5[i *! :xN WN; K K<3 fD)D^p &&47'67"7'&4767'67#'&&'/ 5 N} ~OV?o&B@,hm60G6S `+<]J#o!2&#"'62#"&547662654#"#>*>Q~g2.Q4^I0J%*@*[PEte^%VG"&53254462'4#" &Nv;S&Nw:SyVJ.xOmRJ*dU_!62327#"&"'62327#"&"'amw%X4XoU>?/p mw%X4XoU>?/pq*9S]2* q*9S]2* {x%67&'32&"'7#5277#{J?0_!&E?Dx9\Q!4'_5X.Tu8c=A)8x c x [A4cxd{q7%2&#7$7${d\Q 6h n PmXb}<>Ro9{b7%2&#'67&'7{d\QF h n mXb}<>Ro9M  ' iib- Hc7 '64' n Q 247 %0'467#""&"#"'&546322632b@_7zN,R=Ahwd U#XkDbr7.+R>i 8m Vg!"P?aq4y/.462'4&"63'"'&''67Gl[f(C,QPrrd< u 2xf )2ZO S K Z#46327'&7&#"63"'&''67GlY?-av7$,58E' u  .82kR h7ZbV] Z-'64'  'w% QX-f72&#-3,03{ b * '6Eq)(4=$C3f7%&'7%-b_6G792Y7%'67d-qG6_9JY7` &''6DF:422:HU,.#,+Q7 ?'64''64' _  _ T 24T 247` '&'767DF:422:HU,.#,+Q6264&""&462|))Fe=Fe=&',&0J5XJ57 c"&"'632327`:;8)<(5<<YG U >! /   -     B  A  [ ^{ & & 2  1 4QCopyright (c) 2011, John Vargas Beltran (www.johnvargasbeltran.com|john.vargasbeltran@gmail.com), with Reserved Font Name "Boogaloo".BoogalooRegularJohnVargasBeltran: Boogaloo: 2011Version 1.001Boogaloo-RegularBoogaloo is a trademark of John Vargas Beltran.John Vargas Beltranwww.johnvargasbeltran.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFLCopyright (c) 2011, John Vargas Beltran (www.johnvargasbeltran.com|john.vargasbeltran@gmail.com), with Reserved Font Name "Boogaloo".BoogalooRegularJohnVargasBeltran: Boogaloo: 2011Version 1.001Boogaloo-RegularBoogaloo is a trademark of John Vargas Beltran.John Vargas Beltranwww.johnvargasbeltran.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL_O&  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()uni0011nbspace sfthyphendslashhbarItildeitildeIdotIJij Jcircumflex jcircumflex kcommaaccent kgreenlandic LdotaccentldotNacutenacuteRacute Rcommaaccent rcommaaccentRcaronrcarondotlessj dotaccentcmbEuro incrementdotaccentcmb.capNULLCRmiddot overscore commaaccent grave.cap acute.capcircumflex.cap dieresis.cap caron.capring.cap tilde.capɉo1L % $2DFLTlatnkernd-J`nv6Xz<*x @n \\ -%&'(*+,./03468:;<=>JORSVZ[]n~'+.38=RSV  %8<=n~%%n~%%n~%%%8EIMn~%%8n~%%n~%% n~%%~%% % %%EIRSW]~%mm%%%Y]n%~%%%#%EGIMSVWY[]n"%%%EISY]%%%EISVY]~~%%%%%%%EIMSYn%% n~%%X[]n~%3333%] n~%%%JZ[]n%~%%%%%%%n~%%%% %%n~%%%%%%  8<=n~%% n~%%%%n%~%%% n~%%n~%%A UK#KU n~%% -#--%8:;=]n~%%%.8:;<=JRV[%]%%&'(*+,./03468:<=>RSV]%!%%&%'%(%*%+%,%.%/%0%3%4%6%;<%>%J%R%S%V%[%]%%%%%%%%%%%%&'(*+,./03468=RSV[] ""DFLTlatnvedo-2025.5.3/vedo/fonts/Calco.npz000066400000000000000000001777231474667405700166120ustar00rootroot00000000000000PK!~#Mfont.npyMy|7H d! b$ -K-=, aSF@EE "*** 墢rEŝIy?&>U3]U}:uj<\6v}E' 6̠p~:=r?ků3cւb>3/1gzT ϼbvcpolP_´ DQ D`@cLĘk-HEQ& ݰ@KgcL;- ď?~EC21КݠN$-옢LLRTQcLu)VJ@FKWز2hқ!w st9-'G\꧷h{VgKSRï{ycZuNjWuUC"g[Gm|m|}˭W9뼽V5X7XD.c tZ A CG(J-%h,q@[(-)i+5HR&M4Iiii*$i*鐦*m!MU2 MU2!MUA4Uɂ4Ui iiGJ.Ў@;A4hgH.vthwH]]u^f|g@Y`)ˆ~[*ѫ zg9b?E=_,J REwL{@F](m 79[ o\U E+nCtwj圪k ,=YbyWvlk ^9rqTi82 OⷨnҬOR)'5<@@g`uJ"ѤHhplptWZw{"F!״kZ!ϴBމ hq"ߤ 4y|ri@Ӂcwrf=!MM Lh0g`h`F~z0z|cdv{هuA=5-W]I],_M}.>hL29|ʷ,PW[q#oI,-gC ̧aNe&K֍=O~5f3z'^q%d:2ٝjß6d~\f2syL{"i\EMMratcǍu/'=?jd]AD I_wSN'/_SL~V_bƛF 44\ahs F8^( T)@m;gq8%p FZo’,8iaš͂|l!xCjrqGhuANX'Nkq@;4 u%-ԁpR|"VnnŐsB> `+Rnr h?229 -c|6h" 0 a`?rc# 8 ȍ5r5@'o,s'a5@C V6.OȪr>^zi@UWhZ@ 1[BD X 5$HMIh0e*)@/tЩt73Wӕ+LӁ΂tTlTVmAmrU,:~X\ (WA@Ye !]R(\64 00JtPg !` }~Ӆqؤg> Xt] e˸>W/jS#@%|V Kfbh= h+&6zs=WxyϽՖQ-zi2ͣ5i*NX26v& ֞Hv$&xNxO e3nU?^7!uj %z3EK?wEH0e׵U>7³4USz~W/R]fGD10;,9\qUyb\o ,:Wj•./rJ!*=В9:i5} ?Q"ߪM2"K? nڤR[Mz=bզosb~[=޿Rv?~9?ؿnyf9,٦?&NE94L}wd;˖iNMkXv3TDtֵ2r#% .,oFZ@@ 8ilhYPB@VAS" <X/;0A <mot6n-:o輒8?GΑjW ƿ8,KhSw*J}&Jm%:cErE-Zi+eG;d#;cF<.{xRT/hCkȳ IHYM(>F7@R/Fד:r>PD 梋Q:3rmbDfܓkOm:1Td:=8~mǝP|X;w]}^5q^c^>ivsw:Ts|;v5v;iђggEK#: KD!LDK OX)zi<*W} |8% .p1𹬴$2\YqW9oBs>'zWku p}S*wwGH?w^CݥNP npLPR#jm6Ji &l{(vj~;L ׆;Al6[6XA,]f(k0B;Ԥ =Csd1Z߭ok}ȄwH:3{fᵮ>we:̹5lW~}GF/x-ޓOcEr5)0iowg{ K>^S J~y;ڽ#{1:׼H6ZwcHi'C.sy̼硞]d"'yp"A4%8 k 'ߊyN胮>胾># P1ݦ}mW i_tE'j_ӾD w4}jeZ>qާwL gܐ:#DOFbG8/DN 8mDݦNqԉS':L?4.HQ g *83^@o׊y^rLJ 3ޭ(5yY%!^ ~B:@E-Q+r &c$CY$ A&h1T64-+j @x Cۂ+h6|2i~g^?=F{r_ ][Tϱn֬?LkE#]~X%fX2> Va=IUE+U?vq @N1GSt7m^eE|-_a1o6Mtfg6}< `i9l0GefyE B(# #YGo@XdHKݔrS"lO[#E1m,C$P4P+ k"F`2h C$*HIGCP`EG#PґǠ]Й)''''' @ Trv2 7f e e* (A(ݔ@3` vyj3W !W۹| 2S0WrBH&=Ē;b2Q uujgW_Px{ .ug7fkkK;h v/gȿ ' 9 >wy$c;',Mf_t Ff+?LjSk*4i[ayٝ]~2>eGe jk V.C}\ ZP 0>VE}8q\B+V.C\Z rj2 \ڹhP QCAA.tt ZW'<+p³r:P1Yi:X`.2ZfCl."u$ Tdd[ǦLu^üuOt*g&5N3L1Wbxv~/ubE:/gKЌïZb"9Ȉa_GsǔKcz;Td/&G)X*72u{Z7v_g:E+V/ N6yO|3څa^^;\-]EJ4Ж_yF;Æ:.eࠐa{`(\Br\mg.gs8JivCN@ z"EHgM۳Mf&=Itg{.{ uO?G0BD؁"T"Ti*"8!BC &dX/9I^7btVy2~"@wj}w'Ipekc{$B]Q4GO,L7qv2~95351QsY fJ)f~5/Պ7Ui>F^ ߍ$e"#i=^)d\O7"D> pһGի }~%2Ydw1X?LWXb'iarWDD@(F; =XO`]=2 Zh{3nb(Nbb=C[XbOģ5͈x4#Q1^*ޭx pT(#[tDw@GtأBQSPڡ`v8 [<瀲Qc͇9X 5cSsEP ͎"8h/8S"PQQQQQD8uQzFhor( -Ǡrȍ:Lr -Pr (Prip42˜fQEQg7& oHވX+| l{{3̯^ԄRTA'V3ouz,A#%x5!-+҃n,|}^yUY鲢G~JHm7ѫ{rOƸ0tZ} ~ K1l=-gueC}iz,0298zc ],`tve3Lgv1͇,^Ctf}X[ .?T%+$KԪ3|7$2eP7)t}; ^Upog0#DƊ\oM!?ݹ\Z.'k)^@Ix#t=Xg2FRH\D$pdSLMBſЀʊB#* o_'ʊ{hX"'ESA J(8@BF:H1f 1Cc# h`ƁYӄё3ِF*8@#Ёí ?_* WЫr%{3wm0@+`UT%U@y}"E님1/b^_<Adm.60T hbVCR_-Eh)GK=ZRt194T>:J t1c0ԏIQ:UQC: F."I gfp &: RL Bʔِ2Ŕ)s!eWCB8س^2js}vY5[-z=OϹ.q(OF5,Pe 癩tb(3DQ:[X?}b{v%oGsYcGN6b7`~=2(ac}hAj̎f/2D&GUXCm-}fB9Y |35Kvw;h7fАapkDF,sQEqWJ)D*)c7Lh?^P?]HoyXo Nރǟ`!cqA|/prs;iMHZ_;.^deIvmk1oQa7lTX[t-Fkt&8D6+2dMV'iޒ-m1%[2Q!E#ۡSyb-.W;P].+B|tWXKb(ZN3!PKт(EQ+EA+E+E+E+ABJMQ&l~ ̉aV¹a`=H .GY]kS2.[o?(,x#>B\vݷ%V)TOL9kC V>E\'BJ苑E1:*4ɫ@ :T Ύ*U/V 7 (dt4U8Q3oCoK߉~pWP#=U\GzR46\b6tWawi,s ypo`]m Rk7hH o>WKv<8\F;M (݄n[dvKX[|o}ַ**v}gߣ&n}R{7L1i~ y~O22wkeHGwcO7|eg7GVVA³䜞m\Ю 1uZ{LVr(?`@p#9JIʵZ\?fԐh$k"75zsrg&IWC7'pcT}A^;}uT 5d.]YIp"/e_L>>*h="̋TP99992Vi?S!id@S¢ԁ`_TT`\&,CТ0ޣP: WɎѸw%+ykqX[L*B:xq%x܆ T\hE)nbY|r܏LwNN^k_G><$pNAK#cd YO |=GoM6gAp; T2 Cr?xk օױ&\:^ l0[N^Cy9z 76X~HI?ֶ$0{`Է}ý}>}ծ:) | OW4}]}շ_5yE֓s C[t-Z_xs7c'1v ,V!+HvJr@Kq`J*AyξJ tL{^ۦW.hiHۏ86֙^XֱnƧ kV&$@[0c<D_0#t,bU'e4כUn6CWf?͏'syſbi:IMeÕ7{!M*o!fa)hF `EȠh)$[4Nk\GIFqt"Tg[%XKipiR; @Y[/%3kE̊ j ՀpAn8o9 Tnt w[ tSrw)l9E,U&t ŗ!7Mn30]A,Y@7N+)O'Ozl.lslY@x6n@0~9|Hgx6:g P1wvp]v}OJ(5HK'Y|Uii4kښtQG83CpWM ĪO٥CYip= H9BFJkE" ݞp Dq@BCb?7-}.oihR=` TiU|1=d |:NX4c~ZSw}Ozy_b/?d~]MDȻ O`1v[X| !6MD\ "9i[1B)%~4\` Q1hH,d"kw ܳJ`q{zɵ@AA) \iHv\0"[@.7xوs)Ds g.C2Wc;/Ž1ȸ}ѴZ @b3>GxrwU@9tAM~hTCR%Gm@ G.P˧> Q {`;7Yއ9gjɾd;YO~MB J&답xu:{sݪOvO֧.]Fj$xBПh ~uj|~RПo5Fb]0LyV{35y[̜n>f/4 L|y~`*JO'̏M0oXkwXPzmɧe8fs=w[ׇ&bOߵdc=nM`9Fw` \glOD~ /Mv!|K(o7މ8 bx( @-\%־ָZJ&ڠM68'dT$U6F8l]\W-A] !wEE -R O6]T>h@ZT?8Z+@18m < aWbbbbb}wtP#h uFCHUG4rpܖQn/ۋI%xB`DHFEZ|)$&!-"- 2Br/{/}-s{y6̤q h3> hGEjem3yw~ ggVzLY#w1zKmPRo7x}d*}axVlEw{SJFY>enuOw-`?4mj RhLjDAU3̢.^EE`_5̯*h^0ҷUΠ/Of nvh;У#ku)/kTyF''f04Ϡ 6hVd_QbGŞ={>*|bCsˑ~t#9A/Gz9r!0%XЧY8Gp g!CavPf]lw aħêu(IeĪ8X3jKa bo:!7B6ʼnXdxDx17 Qܑ排1occCmIs,1,*(uX:ŢqXx{s'zjZ{s67FN{ąnZ+i[Sik:5C/1 r}k ~,ŁdKָ P3Y  `Ãϖ7ӈ73GL yM[Bny'-]]i_(y)RhA-nq-7oYbb"YRyU\:gX^*VI`V" RE4-4ho:{Ӯ.zo&(V/ݫh+ P-o ! 4S sIo{Y-7cb[ۻ淇vC&wQwY~HDY䪴D3xV}VzzVskU #єjs+dC chjsMss'ko?m܇VކK4wJdelM K6WG Y!{-5+lA5@(=[~vU9._g>l[++ ߇e*&Sə/Mk#,9d':urz :tON/Q(}|UeX5,2:,dv/x?>ܱ^> X ?-<7, $*&QMbYnE[-x$1]nUڐ,ܶn!vI+b .b RqTTFRQ2JEew*@C r±'B xtf &c[O9(K0o "cJlWA2A$VLb%nęJI;Jf$PPγJtUg.B1a $88g⌢(nD&,5([䫭WH*MۣIuLU@nWbAV p&gL?}ezD#a<@a|y9̫62' 3y3hctv64= nǦ?j; 󸔟𜏵о":m%D (*,?Q8n\}OV(wi(B"IYfJîM{\T&^vQ:B.W_Wk%?O.c-*rPO '6r.;얽43W yV* 1*?FĥaG7cD(b!vV4T,Af2!:6JqaDl<ʯ1b0ۙBa\nu`H>oW>>:Y2R'u-|W@rz+0}?Ü ;-s|͓]'Zy1*.^:rqw;Oc7J\?GcG{|D't49=/Yda{Q ܑȿ_^w1N9! گګ)n4J;E1vkju Yp V2(k˙,-^KP [@@;,,,TXY.,te( 炲pSG/EH0 *,VtY}q {鋁}vqF+TUը,O%:*3 7aFJ*i|-иK^ 4[JP?BJxp.|-x@^|x5j@EK yՏ5Rk0إ7Qkj0ܥC]>&ƏQi(%4HpdP1=/`0&_0hPSa0Sk#+qmd%ĠJyJ%} 8K8qЮv_ ֝=OLL-\dcxn;-#T,'gҷq~ O~l[ G=Ͼau iMqPPVx @зGcC|&]Wv%PE6t Mݎd;c;߰#6X,pK9KpɨzQ'-[ NPЖIo0P3X!fd༲X!1"n k E'"y  wGϊ_+&B"!" q7 j枉{ڹwWߕJjW,,l2ɗ]-7i rL"hNQwgw?c]G^! z>?u/1na!ZBہu8ї t%Oh Ǧi2;N1zUjțB{W%hZvv7 Ը[Suk_{xthiڽg^4F; ={'i~ڰӝ}@}ygU@Iq%zH~IN(YD߀uï#+|Dc|t'ѝNqJ Dig"ka{RF[gLerqPv7]6YK[2B2J~>#t}Vw"IQ۫zN4mW1j V3x7xq}}ؽS ~Mޭd;v\nYv띗To MD[RC{8>% 0v;.Ž[ֈ _j@ q;"ntD!b /g6KC7drQv؏q}d >M.I._ⳜK|QQ(㉉mFٸ>.Jry-cčƢKZzg[b٭pD3ZGٚ K꒢l>dٌt*kVcyosݛ0ΐU\L4,S-S\[6x+)fzӰ(lfݟ'V[1A8"PS%>I' Cг3^2l-Y:eo%GvKc,ϧY+s=ĨT}dCR+&@(@rI֗uʼnw1O]A'l+H[ʩ2!wTqxi)X.c8]/oo0S$!\b'hOgV'eXe=d%X~ϰAK"Lm5#т zz77,æۛV!U7_i==VJTmDw5vX{aU]ڴ?8wc1Y"j 84_p(6޴aX;, R(b1Y.RfԿ՟|oApV5ޤ1ܱX8;,D[M ٙ2ʽ< XvMs3`-6ioDY]VWf4f$ ~ vo#b9>YxDPdA ЛoO x{~{T˰Xne3N{XG +aKe/I۝,˝N_-&k Yaӛg`37cnV7#jr6Sj|Bvx8i<U5ڛ1G;˝gob#{ocei\e_ #x6cduWcu3KSY\M.1^E/YR,Z;\b"XƲ#nMXۻ%t{ji,GwފEm۱;w_J,ۣUx{woo,v {Om~ި٣IU =L6al}J^;!-jgϽ(a\jR?tݬ~Vk`m1v,qW:iuv0NcQ7 )brI ۱60⿟>w՞rFF ډ 2&au)QWOiWC>?,`ܩ#nJ ?Bz`[XO>^+:|, <8?2 By $)IGJ) d jC(lrqE^*2L(Y oJÑ++L(ltn)hG9ndRC3RE貿#p޸HUBETdp_"tq[k9ᜪXU崻{hxU=~_QU:r!-Q! #al>z}],n{ّ8?;gGH:hC(}MW%_EyH35:@n٧c;wZgבZ~Vv f0A:>HjRifr6c 3Є.{x]2 4ʖő9~S]Τ9tyUirmvwyj+ t:T1j+;y 5qޫ=OzǪ_f5Vt|*뎽!Q}TM>KYW½ *WcϞmP~/S' lV ~.^Ȯ}vOTh3sR6a (3WDo緇?y^ NĠHow&}ޖ\Z”%h. bRt6*7IIGJG"B”B 5c (@IBˀ 1JGJGv:N;'qσ|y\D%te7ԙP'%Tz#JP{-ȥԝ%B0(L/څ%ٮ^鬱5>\;n$_Bz^oQWio]E} }W߬jTm֫PS3ecX#*ߛ}# @BH 5Bd_rY{f.eEDDDEDA@TW@@PI@DET]UM&9=3wW(M/Y7xMֺ$T)Ƴ̏edL_6Y&r>LkƢ4BkT3|Y9BW6bgiN>c _s6ψ|3?^mg=bh]5gٙ*v!ɇRX踺rՁL,M+)]Ü#;q71W1eT/Ɉ q t*"N7C4Dn-qcP#uOg`~R`(Ȇ kqDzaԵm0ǖ3j_gYy8g᜕'`[{yʯvQ$KP HEhc7c3젝 iZ lvXGX)fK;Kff@yw$-cO*drQ'(t3ݡmnw-2:%3ڄ!d2M67*UiGQO*`uH4,ɣPm,=uL2{B3Lvyvy 1lP.K]ΝVW89KQա*_Z|˹uwl~|VGEVbUǯӠWg#>WtEL'>|׎mk.0޶2W#YjVs [jWi! z@lCܚ-_+PAe+kH,Gzg\d\^0 \'ںž3[$2"jOWEXEi[,V,V,V!#q<[UD^D'ňLxg\±؍t#z'}·xҀO_JC=dݩ'3vfjv_XfqlPߤՓ~KߢߡSg=`lcֈ5A˜gT3NgTx/؆SY^B"ck4y"R$X֍#n"' akˈ>7_XEX<~b *bvM-Q;@fK6 7s @HG40؛_co#7H$ډ;с!iyLBjH(CdU~RG+!J#;O1)&byUT9A}Zܭ݇gwB]/F5*.+Kݝ\ozd?y4D'=uŻ7$Wcr<)ʽH'5k+hi>`3GۍY@w[=t(MiZ1yh>fgCHZ뭭'CAz-[{ݠ*cG5M `}>Hº:5Y;z"2uPl,O`,^jK-~ }sV媞':=>i3Yד ':X٠N[ջ5vM#%) kYeujg^y{|TBwr,9,ux{[EHf{h}ץQ;FWg4cxcy̅Õ J5| '$5TBX {T-;cTnնjpyZ*=jG>#<ɬsLaG&,"K igkޮPӪJOU=رSN xǜ:)>jCwQ*3GVe:8ȸʦǜ͋H?/!$).~4e5B(DFPCCnq(b7@o fb: cd&"J*"5|rmW806? Vg1Q$,B앍u 9x{n.8suŀnhou9IyG%c.H1ZV 埼Ae__ZЗ%m|`TJ`TRK`tQ+-eɣGbQXZ1-Z'#ˠ~28ǫ+DPdJ? ڔA2v\n3{8tbys cйЎuO8*Jÿ'q1D0ģxtbiI[n26pwfL7?LqG^f8qB;q/s |BhsBxp,AC.r,!hb/v,b#Ŏe>X2 8p[X a;V~5ˡ]']X. _림p>!dş(+.raKEY.k˓~'-P;C5,Ćt8ABj fT@R{{`f|M)ab*p%棱$XCm#kyj+[bt*?e^a >*Oݭ~s +@K:su =lj8X`Ve(XT0ƨ7aQIv LD AõDԃRp*J0y֒3$Ah DwcwEjɠAE*JrABDU}ʋjD6pOiQ:QTQw4n_XUBfwFT5w;1)?~]ߨ?"%ehq1x n$A$jGEjMd׷"kqI".Il-2I [;֫R'Yfc|غkۇ/A<~">~x|5Z^J.\=%yl(@SJX{Ͻn҅T+ )-ɿK6Fwѧ~6t?{]!dyjrߝ>|pL5쫴fV5:#V'|﫺Tu敚]NUͥ[ԓHrQ(G[IRws/gA /vW2,3;#;HTKuRmŠwm3P#$d#uҾa)YVHmLˮ.ArsjEy;ΡQ<>Co ^ڕݬXžiHͷ:܋l5ĨL{C{fY-I~O{Mz_%b.:Z- y %[}x0uĬsiaxҐƚb6E=6%vkLr9F;m0i+~9F~#wrW=Z.[nm0&Α]}Sp ᫚Eж}\2km=s ˠ:oFbbJqڬႢWr5I}OdRleS}KZ&(u rmV=d),GaFsۭ Ϻݺjim ;?bA~V}3$fߘdTQk8¾qבӃd @ݥ`wq2 /}PY%OэPFi!+΁Nuttwc/0r[һ6x8Kd,\Z E-] fLg?Y-_B4Ci:@x|Ayu~Ą=bg4HY3ϸg@qX<6 oGa{\BnK1ԩ=z#L{ ǣps4Mu 8 8΀7 TQhXc ߔUEG$ rj<CcY8 c 5u,9L -q>A͸xN< _Vk2Yg5GՋ,,(?:Azϱz - u/.&)#hmt: '`O3$&v-HɁuY!6ėlg)%a&@;w HS 45D(Fr1,8P!O1ם A256 Y-]K8[``0"L-WxpFL xYX &W|х([VхSpֱ$Vdiv6.h6l6f*D1 2h򓵁 !P< Q'*u(>q(*GhXcwKX_DswkVI9cZ,,;sr(β3lvYwlͮΫo8D_EG[:8Y ƫ{6׻8[e&_DQmpkkN|v qf<?n9ulf ͵ٽ! ̷[ |Vmۡ"ϕ;r_Ӟf]ʾ-v=Ț2!mɋjJ"t ,kXkMFHG , UсaoU,*`k\êu>׃vbϪ:̿җ!`>hP$PaU֫+fwp\MĪ54TS5CC7a$%v2X*G}@˄?q.:<MKβ4=%=)waAZ(#OLϙЋR{ WO2A=Lٟt4X*I: m?TI9LenڍwA.PsxeD_\J<%B^)G**T'2PE b4\yS+r|JQn+/+f5ߨ}54īLeN 4̠ookbo2F92}b4D{M;YvhGȃ9/OmB =:t9ה*__>skgT!$']D.`7qW)11d+qC&q BHL#aaT\(,iB0O Q$%!&`=VEWzIA)({SPh,8b$U4GU9Г vQP0 *%pT 0ڻ3FwXȈwp$$x$rVXn-9:bBGRQ 1#w$ aBbaB/aT-aBVċǪ8^CT8DECT8DEmw6 p8<>, Q% Q0>/G/\$NPL6DA.( [TT Bi1_`wWru꼜4gV|eʙwOk}=>3v s#>糁6A\bh ?D.CϽn*=.vpCG jgk)FL8D\uj9ٓj˓DHkZŨYmLdKnwYJ&u2|;(q vKvezAB6e2e$EbrKv]vwo3{# 6{npv}|שS:޾jHwv8AhMϓ9'9\s:dVqbFOz*ߪWut<>y{~/>ELk][5IU[ pzCo;N&zՆ`&8Fb}cSdw;͠MEHem Jj1(bpҋAyG3^T7?l_DG[- .?sk0֡%´v`^O@\ VR@?G)g>f@ ۣYBX ңY6 3G_ȬUya|KglL,EIS>e12zURYHP1z[*ilO3U+o=1xCL6H9vtH*-3RVu.0稇Be%v$dwZ(IE6c$,O|fT)CiKJ0l3pƒl!I,jb26J™]؁_iV}}^䕈sE8LUa\W>譐_ӱh2lg&ڐm/zujb.&'ZyIT턫L{+V/caba ^חZ]~pܙZ \ۭ5FHCr^r\y/hK"o[w`]kB-X|#ܯ8Y3I&lhFx#@y(/}%gLa8OI iе@y)u3M36Ӷ6qkj+ ;ÚI92:iRw4b_/h[l$'H&XSo^sെL$t4 l0t"^<^djP /SݢF2č%l ɿ798 Y矈"^[ܴQJt8$vq*qcY@- ; rb'<꺶I))(RQdt;%㴟~2B'C2P4E1DغmѾlmv@7>aIiv ..E,`;QaK/>oW=5&FA1مdFP ESb' 0QȔ)CŅ@)\̴E퍢B/8G ,\0"d1L3sG* c s'=~v~VkM^D-OMeTM%" "}i};-$4ewhU'mJL +cZ6y ;zF)W rzANf Mf&iIki5AOg*$%/i*2/q46gH"+SJBo"3d,N>!_ Y!7HHr|C2E`tSȹRW+߬z˦ C 2R{ G^kq _i;%x>V^Oj"-04L,Za]On~"DVZB@G ˃h7Bk|# n؍[#v3a8I&q%,ġ(OWo?ivAj'nbxz ]݄N BzQ,waՠӠ.U+c`[ ǧPXITI>Adm]KZIkZ۠}#7t+*x=@om:UO|3Yo]/\JlA7 Wdj.Z&"cxث7DBc~,a~<$@%~Rb(U قGN SXp2`}}4hP hpPQ iNh l`e m6YB~!/j4i/B;O}βtm˲كlȤQ }KYP.J,xźݮN< 6{X>S/͔3ݕmrCGƖXvA v#ݡΥWڧmw6iϱ!l)}<,*ԁk'U(2}>.&9{JEî^۵@~eBpMSXʳq]!Fh q qNm,$)D}(.^%<%^LAy.MFZk."d}X** chrrU8HA^9އc0]{8nǖ !4Dk(z וh'ZՆ_dFj٨˶Cm#=\oZ} $Jh[EY]PEGB8K; U? RqtpC{pmZ[q[q[q[q[qp-<'B2qyv0{y硣!<\2}<ս9 a#:Lxw#v Ds}VcW҃d9-̑V%cN rW&Y&J7y~5CgzsJd'YiJwqz UYMܩ4Z͖Iʽ8yUSLA'IlUt#FmʷJSuڒ MFƢnmpt76 큆h4Dnm\upX^kah>sf8rnߒ'qƍBҜ%"Z0qCMD/ ([{\9߶osHi>ssJx-mhwD`GtvD`rY19797979797g7'POqzDκYO*[g}Oq2d(` ;G:Eǹ;oC79 \g]IR'NwrZ+ov쑤gr|rIUɫdW^Oo4>FI SP*_ȕ2T}JY%WZLɞheIHɝ4SZ; ֊mkh}He+g ޱZ4|{%݁UcdJ:(1p_3qzk$:^f?zD~Jҽe9nuJ#7Υnjh,T7 q5FW<}E^_߫O_Vv(jE_ra+wp(!^>'8g+ww2'2吼YV5bw/Jx䉯'⪚U}/-FyOڣӎ6;r9tfh#zOI'4$v s ۑfԒH;P_ﶯ)]* mhfh(xJ`:VLAy$Iʓ'DZhzoWfzdK>NƥGK"-qoR8ӷÙ1OFIp ʍ@ hZ@[mQnEk 2W2!r#Fʍ8 #G2y5k;`LbH?ûc,~<Jf|~ARہK t( mơifC H3ž9(hsh@Hj1f4c`uq3X;ҋU# x_֋J*ֈpLwpaw]p5e[Sp5ЖAk*q;+3`_p5WSp5^h+.xlhr lhv\h90 {-Qh>ܡ:lR ;a{lwM?cBi]x7\#o/{s.Žv4O<||AAA TWҎ1inPе1C*Ph-09f=v*^;=^ZS S&i fIo*NB1b\]x6 9=h'E[n],u.'3A?UJ<Tm&KOk?9!ҤMU=lp=e*&w'='8]nc/8=hz3-S =aE":ų|fCGū()d@(ǭF^/$?wԟ#iARiY3嬒b @dϬ.=팓fJ6-Vh0PF IU%Tr-0;ιN)Y.blvZKC0[뻔gC紻$m)-'ԓd$I&312XSm6I׊\dΩzIj 9S NM γ`gUͫˢMgaKD؃ l,&]Ldiw!X|"P\쪄ů-REsQj֎Zzo\h*0{tz扽Dhe Y9;al;\eCߒUT(Hyւ VCG 胱 },:h!Y. D;h93w$CGpta]>DZM>>UPYP`771Z^\ZHv*U@;U4P xj hd7<㡝.΍vn8dPp4~ua<M܍#r7p4AQGPFBUZǝp$0 ٰWAa ثg9 dl{%v`Uf9~RHnv|EU$5|9 dIr< ]< ܅ݞRJt|OO_ؓdB / L0OO]%7y ̿ SV{b=sxK IkmBU´]8YFVѕ`Hn'Z;fi6LU:'d5}2A".:u$yV}ݬ7~F{c5 WYK-ިo4VcZe3Vjez` 2.{-rov N S84OR@05猕_8i(}пv4k5w EgX|ts`|wXTFu[5t4 ť^KzєjY}eȩŰCKttDЖv-|H.PYcEPB%^1;ym1-V)jҍbQ[p]0 &+źDr^[~7B4Q>J@ 14_`r'j>J|qq)8( ?knDn ڄ$9 P  {:KޚXAi1i97%Qڥg𢝄뽄{9&U,vz+|-r ˻s^s?gϽܯx _p><܉\a̡|K(4P܉x\ogzG:p4Zs1  c7tՏE~,Mch"r<M=oF]DvO&%-anFyyΉ|./Q*E #RmyQPIQ"<$&H i&Şƪ)㔾J[_8~L_!.z|5lĎϪk%14NAB¶'g1 Aݍ6&=XFfustAOYMi}̾eZvvdz3})#Zw';GؽC`; ~`}]}p2-[m}~]vA?~|m"rzjר /=_x>@Og,SΔ`Ngi9of`0`uC} @vawuv '@$\[ Kup~Dp]_l1 EhqOy_4} ;jzUʹlnInO} (2'qe>cK:ҚLg (7"RBQU(ݔJ9%QűsqNokL2*9Ah'yOFy/Kzϵlvߦ_O`sadco_%VAA<>. ָB"6',5V'ՑLq19QiX`0 |ΓUƨ4Fէ1Hߦ{hX[7- ^^1F;#Ќ-z gTδRI3PGSHEhX7_~snt74f|f`8WZ)Q+F\mL7 `nl,sv's,gi8TB KKVbXFr^H׿XTKc|(&>5&*D!gA|ˮ[Ij Xo/a>NiS\Nq|Zj%[]#cb;!4EWT aN;~~oUyz/h$ؗ@˧ p+@վ P/5yOŞG@pE? $TP ~ vC'T;Tۡ]жê@b|*΄v $6Doc񶂘m*v;1ĤYd=[no'\q<v[NxW([lK)*ſtz|jWU_Pk$-ô]S{DZcm)b'qZBC<]ɯ Ҋ]~L>/+2hiQj;*pwf{^ٟx`Y+=بR#)sk+le߽?,G ylK幮2^pG;98s]ˣf7~!'Oq-k٫v,--Xȴufѵf" =.B%x׊pb C}8 اbB"p \E)5Kst*&C6!f8 %N-Q0Y$-QGI(*y~ p 1R!q^8mY{|/ؗz_6DeeBF3> s 9 masSЇF4FvЏBrT% FW[Tk`F|@۫%>߫6s[\Hld6H<`|!6@fC{JDDPHa~}B%*~֥%&Y5?DD/# -$vDJ[5l9Ƿ>#D~er^"9T>$#oRtRC&yd=BAB2 lo2y$V_q8.V:e'dV4:Yvb≀c?DdzUd555UzSU}+TYgs-Ã!W֯'@וhc)VU mcT*wq0lA&F&TqEXXXXcq\c֎E#*`n_j_&E~у}L`| 1R!k.)RVzc ^h{$11V\#͢;] C>4 0 8Z)_3SN?Dq`-BѷۑprJTVbV,^[i|Nվb]F?iLwt&Fd{;EK)Zc)(S1ߑbH2nGz[=}6ZcBDߨwӿnBP D⿿#ltQ H2sJ &hx g4;I5jW'cOTշbWO `O~5d`57( 0 G!NΘQG3 hJ(Q8GQ=\rp D6Ѳve6b[~0~`wBT[E n:ӀÜ,QGO~{Tۣ=<=Np<9sџ~\?6^]J6m\9;p'¬`]Bȏ.+{dMZD7ߙq{zsm_cuZ3|\W[`Ve$J#s^s0sg>x@G*sOK qDHYbK8+C*=Q~pCU~^:X4y7wGSi3}%nS8}2 aVe.gxo>Do"﷥ٍ "<$N,&"0aBf" [D]듎͸vc%a>m,vp,bxVgÒw~&)z ^Tl&k6-Yb,M(=@?=ySt552AgkQ% 쮫Fd;|0%šLUr')ryJ]G~P>!!h?^y&OJ mrL@?(]WԳj(LS_RPCH*i)|pVzkN ]O` pp`pmFeȩ]TmƢ=W c B= (+M CXQ;ZZN]tuNi$v~F bH4N e!ppHSOµ)~AA t͢1%iwiӑ4cm`YLvS 0asVmZmSXS. To՗v>G{~ MLnsf10 Q^M."0G)Cл|3<) T?gJ5)a |X,2Ӛ ofal\MF,+ytZN;.;C7EM6-8Tt␏D}-_\jƠWd@˽"g(uİ:q!"xv* HŀTTRP^tyrP9J#ڠc^~Ń'<ypB[ R~9Z+-GPk%T B&s K62ʐvM+H| c\l2d('>CJ3Iy}@S*+RRgP:&~4ꚮe3,9b7Kt4}vqx¥~MS '}.]?RHlξtL"QR\g:=՟|+?`3\ffˬ2\fX04+=?}_O9>Õ{:LJ*S6biJ| uxC : ?#Z+Ƈrc-6@sW(3v+ (.Q(ej1QWrTy@ȨEAh-f"O/Ѐ tf% 9@ z*M,08?@ xA=Qpy%G81 |ꍆRo |-: gG|g||^ zYŬJ^(+zƚZzcBo {.)a@ L_P@^p4Z-GBrU'EޙeRyW{Hۂ>t1<=XCOɧXSh?uHTL)0' F!17s7;֐/ >_7 SA0`馡"X0@6 `8_2b>;lO]֞m{9jJqcx~9?/YRmf I{iqy|.eG^!*[ V <^CGg𾾰ї{8+!EynX8Nv4H7^{;{w=`ۊEkgkg1Z'{V+=ONlLZӴ\\ݩ It65y>UyPx}JH^Wf*R׼{yGy{zzWy_xo/Ǽgzxό o+c:@ DTPMĘ,wBNP(2[:cNKqD_q(~w$?8<W^TXݪ)Oyj1|RX&{yh1Bt'O?{>Yv=~;Hncvz{z2Uq ^Qn? }b#cBx?8(.aCF;1ZGh[8u&HڜcrE¶0V:_-0ˎiZZj]kޞ G9h5GpxPl߳90-Qvʏ]Qm7꿇aVG*v(^7Cئx Z/1RΛaAK ͧjtKAl,vHtD &-vD|LT,DN##T|&y VsWaXi9rZnqۧp"xp-"|"-r8q6Κk#g%9+Q 1ZջtqK Qyd^^I?o.#ʷ iWSt7i(Nof2[ S}4H fѠ_'jXT/*bqwH FV@#ik:0ՁX%T u-~[^e/33g0e!dy=z?VnR7l c+yUYDzl!m*vf:#hd8G+crx)G<nUm9R@Z')oZMr,G6_IR&?0EƑBrHW*Yy"H3Gv|S}oX#av=^ڷU\~-eo[WKЖFj'LW32}Y=DI{mmZ{=^Q^Q%2qWG({o1vO}b2x(UT27X#\xtMЗ}>Mmh't(Q;HG =JG_P:DhQ"YioV \_%~nYhnYV\?Q:0v o1}ܻB_0Dz⾝2h9ʕrSP!.GOq9V VCt9& ra6 ߆Ęg?(:O $N!6Gg!ˋ/0xS\qɛIC%=C#|[ ii=Ùiy> ^E\+^[-{uXDxuZD Eg^xoc_`^z= @j7/E?qx3? !C}Q*iLŠڲ ')SFw$f7/<Ex[\=u=Sʷ o z|J;߁=d?݅~ ? ++]^]&5rH[-&ҽO~ZLdU6hbLE$5Iӓ LtBC,xCW.n ~1_E4,o`Agߚl籢KXoK t) bnZb]a%,Ϛhchgq⡟SRXsr^ZVG&mQúڌYs6XQunR_zˆ~!RXZ|+mhf^B$jgHx"8C$9Fk;;KP|6bT%⌖.ލo)g%~],㰺8, 㰖0kEeKn35*~wa)4 kOgHbzh|+Ƿ‚ބxE -n}PC6WdQfVeO|Um?UAUA5@⬻Zn>>{M[elC"ESn)di9$AA8$s,Qnű>DPT3ԭpeppi_η@ }pKqjZCGє.J'h=J O ֖/ePy'syV )I dU JLMգ)z4CT#Q=*bњJ'O]p ٮ2A{kp)&V|3b+|ʥO7]85_/X-@+ n?B[Khp S) k"*=_> |ˇ%_>t#f.}y {?ybtc!Id/,׿P,x C az ^ XXEhC5,_Ƃ6',xKbg!YZ1q]9daN!S./q!.\J\#IJ lҶ$ ))>v#'>}&ZKOCgy|ҍb_Ir$Yž(T]@3QA.?!~ N2[*AX~f#@(`MG'x]|kVe]ECgǦHRNT^Frd:)FHRT*HRNgWНtos%3H9[`,08b겞S#(1"d'pZxz0vMYޥvڛnom)xԘ[ioOssݜ6-3xtir_2ki?U_YQFP&Jæ~x/;?@Q^R+k$ndQ-nʮfilqz[Ϳjqo{PKb|1}^fj)oڡVJ3u{76=4gKMA1OԷ?{CNIo\3TK{(`n ns7s{N'vLᩏI +LHόp>p>p> ӯ4\j>GQM蘍D6 xc_/ΚSنG4,: j[VmЪ8=,{:u®e%FX]L%>6*yۦ 0 >]$#-<0? T"D$YqH3a.,гʨ?6qv'ݸȅn<Ȕk" YJ۹G٣,-񽪬U7S_&FB ?WNŗRj3x, S\MC tHe~ o(fk١ڕjSLnYa tPl/iZwȷ"PohٲR2,RV2iĥ< NF(eTa4*ً֗t' G#;␽qkK` mި2y6`=5b' p+t.rn rj&٭mѭ|SxO꼓S.:vwBtrrS+$m; N+)MNd[nE/r:s[|Y=/ܤ[AA_miU8i󁶁ONe?:uؖAlV(;z0:(&C6Doe)ybaR9Tȋ[&yjğC vl6gʅ\. s!B4΅e.\-s!V=G-'àb)2nN~RH-["p!JB(> !B-D-RPA>^e~7$IARJ+*S4O'Ze8kۍP $w$lnyBܞQ9N4H %%׶Pgv9==F=F'=Ft2T/>2Js'Y)\iZ)yZh ^xvg>`YWuX`4d^v-{b5f6Vr?do%>Wuob{ZVuܲVTy ]1*&x,ѿ$f^AJ}ieM C7 mV4deygsy%a~^zͼ$#he٭lԞQK;zZǂƹn r$sYQi0|eeӫW:׀p"3;K*uun{}(}{ rcV%;!1f`27k3:s:M5{2[B -\ӅX Gn8-58Y2!s9@H9yP }SBu!8P: 2hAhaB9BA@ d 2L n)pC/!+ʨؘ lLb Ș d%$C-, BA!KE^sx%q>*|Q)NVBpT/ReAr(ˡ8n루BT{P)T]謘ʱTP ԅ_+ˀ_5ETJG7'Z5cK{@mP*sr_-'W}?z+7*_(MFW͇k/zT>HKH[/KǕ5gFvG2]m^5 (>|0[c0!P]ۯw76::ԨW{IBF߽b!em[IQն){y<9~gD3ͻ\[Ua9"Ÿfi }[oܦ<^gr? *#_GȾ'\\cp 9LWb;\syeI!,9a1 9zb*T7+;ƈHܩIKAT8.!P=md ;P2=Ilj E|-pL @T-,nP $5Hgm!l30PVҺlbIOS>N>r[m*%6Z"tK:ˠ ǵ.t֒Ш T@(ׁtl j j ꀠ%,ASE *J?TY!fp k\XҞ ,ƂْȮqcuX,`!c>kP,Ƃ0݀aƂ/`, ,7nva*{` I"D8ej$洩?  Ic%;Y%­ܸT;*p wƜmj}.BXKN-' $v )Vw)b$ U1.S1MYH4|?Ʈ ^Q~SxueyZ1xFQFk1M?vxvu_^y0IDPEhg(-5eքNXX[CCBׇF>6BYQڡ]PP^1sU=O5 {(v$@Nkc\&{b6ٻbP̑nh0ax-L}йsAۢQ #L2AjqaIVucpny f{ǁOqI``;$"p)ۅ8m1F1cԅf5qAg]kפdEۨ04Ll'{28^+H"!{,9;B37jϵ~ZQoM^cC_YCCB IMB)/ϸ?~eݵ3z?}D_AˍOK2|d 矕8o_ 8_jm: Bti%҂KdJ)/]Rz6QGG>?}<GGORHHHHa ->Jx9ݯ :^IW.'̟̟̟Ng>BT Ot<6s=gS983=7q&:LٞtYHٞEtQ9c?fGbGK~ |@2b9(&Pr=5 a]JYa =\ƟX$XP<%T:7̳f3+zA9_ Ɯu\0m3ڜ{[VΚo)s:1YIۯF]NeLvc25NHck-a]eppnU{XV YiZ~iV'ݬ/z:[f񒶝Py3+ӆ#ƧlQ7%f2ޱJ?yw>QS=HT 9UzH V:8/[;6>ʘ~6,z! kg E3ͩf󀹃67WPs1Px]{]bjq6|W_7r1s$5Ppaa1fu^V">di=k)5Ab+LZ4G.n#)fin#c  2l?jK;M45ld߮%n;K2ZZ=c_>$$<2 tUX `Mߜ~ٙκ 5%T:2QW:[놔~H)z _O녔~ CF+}-0_8l 8[7}'{ noa-M#|䰟?9ſss8a}d>mⰈXE:_%كc,8,*ܿEYgܥgj'>VCdѱݱ8݃:nGpWޫ&!egw)N}KAc=AzרWqvoEW<`EsJffc]^\b-[ۭzݤ+JS A_Ig_`SY kjX wFsww_ĵtBq_g]&hGHO\1r%r;ggcu6sh#\'!ܖiPLI 0A&aLX’dS ֘x@tpP6fXK.Wr[@a L-m%n L-0):[abJl,Rb#J]BG{(|L7ۥ 270b]LLՠqMR=tVԝʔþzGj?=_]5t~Rs_[<ܧ,?`ӕiF֨jl7&,5 Msy!{NyoYdN77Av %6|F6<I{eҳn!m˅9S:b|a'jXwXyfwkJn#ٱFC+}?Y\ʿ>n >y` eRE{LƓF K6_.]b>f0A7(rT V9d9J'o|℥`¬M ѲFe˚2> VU\(Y<6.{8u6m7ev=UnR۪Wմ}ZS`,a4'Qs>/;{oLy7s(onN0AO/aGXW^D-q;0rh9$c0$c 0Ngag>s*'J a^Cxމ:h8h2Es4JhFӰLQ0::#+nBW5A&D&Ф!Ն8 0\bD w| iT̳# `q uk 'ETcom\^`` ʦNXBvbb`AQ)Fs̅yI.sr"h0::`lҏ`%tǃL&A{"ymI:t.S,yQA8 Q(G Dy40ȷ:;ͪ&[3ܧ6.gi\w4~?L\dƙqh[̦̚CEg^[=򰹉; in.>ʳLaﱦl! lfmU y{>a*7!\)V  sa!3;Oڬ3(r 71͵dOG_.HpkDˠ!R9T _Ua\&b 0 s˿dȺ)x(\.f\syHT |Oc.:xno 6TW[,jeQC@g6x(3@W!*pn$r Hd;g3oϝ1׺ss9w/BDJ9·y$A" $ ܹPrgߘ; Ewѳdahnqsb9 K0 a(z.pN-y ȹrx ]}xN7.DsnI4 ].y1 zfWVIY Y#Id{$>\⊃%EȏR C"qcm]blWn݊-m.rn|f`gI=t}o$BpECKߊ'nغ b6 7-T[/|t6Jv1SΉp )tU a^}.}^ ]F%{{l1C F_|y7y%l9Ï~, L=Y+W\Rn)TiOoab쇧;e?0KDs. 2|-2uYaI)KԖ~^ 'F:`Xd\my[jM g{)6.a؋Nȿq:4mwԞusVjI[X^ ت/gwi|.m7aWkM#𶿎}-~7ԼQy]P$LIj/hn-v,Ġ >6V p>-D} ?3KYMBNO0>P?#`6go+h+k>hw _dӄJSf͙*()r;FJuB3}M*uylLgص$tCovz: 𼛪.?.?T%~ARgQu4uQg%_t,Ӝ~)$#ؘOT)MExZAidbG@jRLJ,6Y=#@RAuEK3w1ׁKWu`Rg"NH8JH,B֣x1ʏGT&ͥ#bsöb뮋:}#R/vS`GL1FPQFM+b(ʄsԤR؆F!ib򣰕BG ؇A/8t8e7 p7Уr2<>gsffooHE`]urB٧U5&Y;FV~aټ t;SX{(1F>9|IrsܜnP <x{bǽՇjgv›v`ZϴC+T]p3(߽J157[.y\3[ś[خnSlC }F㦑we߽;馑$IR>I;o4F>M#ߣ F|馑d}&6h[I#Oi$Ⱦ2 SP!🦔vC?|聯dDmn)g9FqHtZZIGA"'@D١С-P 8G\4tXE/>Pg Ա(1]9=Ct&$}f|d g, f,4ewJdǹhj34Qqbh\6_|@ r򿑊+2p!"-r BvE8|X99ʳ'Л8aHK^g3  CqVhL)72ʹН1 ظJ>؎\t@:5#ՉW<^gmqi7 #f^R,Ю:kI3I>?ϯ]|"͔3S-ҕD3J.=V&ؑvz@v*j:; ng=qaxjg^UVolG/k&?6ņJS,߂[yt\Ͽ5{tM_TQ)|=wɼ ÿ` YκݣReDiR(_+guCZ]BX=z| uk=HCZ'w嬶okw)V{ȚnjcK[鼈Xw?kkvCtw#gȮm͔]W qD5gڡ[c$!P܏G_,pԔzdMgL},tӱmmC,nrR1ȆbF,F2S"*UB=@o)3]gR1b ߍT`L*&X I֤k)' I$q9&cڐd*! > B xmi jEeC*G𧱛`xI"77e!o!orjj)Q#3O1qV3ԏT+ffj23\ET+{=b% y5_#ԭz' S,_SBjcxcqHd5yM~9n79Ή7ݓyf xΑ|b޲}L;4`EcJ^LIRZo_;3,PfJMU' xG>=/& }}v+nh- 'GO`%SS "dFbRMLG"?l6H&@K`X0F,X:NDضD+d,Ll0fAvcdYC訲lHeK:fa΂2 ,KdIwtvSS:tmC,R 'ՑGuYfnh|_sAQO' Of|/4:“C7|ѾvկO ug e([Ţ2v??0`ldϮO7杦c |0}Е;-Dfo/w+"s>3Mn]e{ўn=MI:-w ׭ %uB|Thk8ͳ4@r=*us59W oš,"SeL%"S=o v;3UV,{b{>褾n K3Z^4 ^VWTF^w3%A ܠSwKJO]wߊ"0~lhy:|Gkڬ+Ͼ`]$ti4ۛ > eLs6n6 !4nVXovsn%qHpvzvgZG*ȵܵܵ*=R=t*Ca#J5HwH=dh28__ lC:Bw`7 < \f2 Ux#딞"G]KJ[cW.Q=k5j:_VP*Ot,Oq>cۈEfF|&of4/5im6Ohb2uq:MoFSi l=[?c+8oCڼlJpkuPP~Ebuݪ*^BmO=Y'֏ Y(x,`HU7 5f!C38s9 RșfN3Oz1K?ilq6(6>Yo*\3tG "qahbABU+7٣QwǢ /_d^d3&01U']+s }  ~F_dNFN]STM"$AHT2`LeL\GsDDm$qXF̡ dD(Q tA/!'Ό')&g"kL E&b%%0%0Q h{Xnyr8O*HBN։RSw"0lپlsmfȱc{ mlJoLV5 X_6o&e yXvٺ{7 , 4V*ՍbmQԮ˴Z?Y=jO~V7z}ά5)[9}"=c6vj|fY͎M9=~$ycfKČ#!ٚoL5Ftlm%TO*+&uc1+_eFZ7Z=hVhk9l`F"a?DŽ~#Vs.`2Y)~Mz-d]elXˌV >[Ʈ0[3aYVcQTd/NDdB0/ .BԀL*ĞsJ6J˩@@kI1gE@f`6Bow4,5/zG@ j#c];N(P@Ae@[`h#v0qG f#8{+bWA(~6謇g(\,u(F 0J`YBpn^EbaSº@b'ŧ%g&=CkѰ#`9TG"6tҠMRDhmL t*Q/^N}+@RtJET3*:ΤBTd 5Hvp \CgK_Oȧo"= tmCZyH3iq!-<řGXY[\Dv+Еڭv*o:A2]t~n*,n *{VR³ʕT/m }k=q>:j::O՞t\MX6sM37s1msOK,X2?.JrO0U7!(aav5QaZU{sڼƬjߛ⬭\ŋyeJ'i:eTa^:wT/,;7&OjZV)VV#ʺXF/՘zc񼱍Ƿ׵vsE\ IjHIR@OV fgZ>cZ?ZCVZ(%u*۷śZ2`[0ޡyG3:ZVbu3WS7R|x0.7|Eq.[ζq.W Xzv뾓vs8B9r-]k.sH< "my)MɍX6A-FmEd 5Z1f9rec}G̥ұSHg k:2g'lt g's 8E|\˧ދ^^={+w+7m%7># l[Q_Y>&|1a¢1F0χQ>(޺c/i,q`,T;\;wqv]G uYأ.]jm63Xokwǘo,幽 ǻ+c=+s)#@X G$vbdB=ݍ[hAq7^Y}|q[ffXgo:-?eH\k5df}?*]nx&w8qWgX @qU :Ut7--Dr7aY#Qw 7nn*w$jwqnNm=.qݸ(pF,FFl;PSbDvTݸgÍle}gz/H#w[E|g?9Tݸ=9HY G!BGu#F>z>ƽnaY%YyMѸe㺿;ڬao|iEiE֮TC\+s̝MG2(=J~M6͋uWPFTH dհeiLfwy1sg1o;|o):)?+Wkw/)tnN)ub吏Kqg /S?PPT#QIQ)?X]&jh{eJZ^eduWF2[Ě ,8>eSؓ|"?鼋y4m3ǯawxm3ˍl${~g|2it{X'i|*/5Y}R0o[bXZ}ȡnFE5%ѿMݢ}a6FRR/V(j@;&__NLOZoX$ux{~q豃ej8`h`ТRSM`ԗ|JRhXPVVP~>j+ˣ 2iYF7*ʹk3}VX-lw1i1T-އR.yeWZxX;!eU6Bf׫ z%֪ z ޫO3 D,0kPp&>$#LbIl0&1a#Lb&+={c 4eɖZ`B~15 ]a 94gm5kODOj &.СueJY 3&%n n2cT8J39_!ҙr@C]%=s1˨iE^6A*E^Ȼ ܽg^XE1R,<µ/}}Kg^*GPٍ~*#nh>98֗qݵ*-fz/|-/2X gi!a7qֱ Мm_g4_'4ͫSV^T*sү}{_) `QqVQKs|{V*)%4Pn lTQ'm~%Ÿ ܫkSh f5jӴO?oG<Ϛfk0㻼urwrw_D)PGYʨŎ-\66I['fq4"7Ƃ5{+Xܦ4x6V`eKQ6|DlE#БG|U>>Xc#R?%K@K8c͢s?YI/^~sˌeۘTzMb##]zUƴUEQlGNjVw54FH,^$.>,RC㝆fT({+ ^w{IF|c-CxxWk&5sEk6 ٯ%LnB6nH*Lwm֕ 9bU]o8њhyBS_W=!˪fT3v *nXiFg\xg.BFb {`a%5$Q(E Ev&np"M"T H6f_E76>lbmhiW|WqTgi37~P+u#Krzv}~bNaDѕ=lYFW}X4qwP_َ~hGَLAdsZp*rE]EFp죱R Gw VrJns|]"1C1./6{Z*_Q\[I Dc6>4>vdzoE_*_wgݫ$rho;ۇzmиq\E嚬|h4NzGnU>Q*Oz}Ad_wZYcemm3jeENpCm >jw%jw3ɼ~u֞hhucގIV749Ғ>2U$cow?:uU}E=.g}OQK^UX"%}sy܌R\3>)5>M;,Yi ^ϬjKxYExV *jUMfзn vy}*(9ERuu5QjJɾ{RPj{uĖln;KhʹZH}MaçUhji[?f߲8~60?ersM(zfU~ cxމkgI+f;.[TT!\PU?34@5Dsqx ,kc,4inOT >O'bH r'F3) *IK,i"6_s!F"F$5Nj3H V%Y99@,n\4DDP޷5ent}<]OHHRME"ՔH>ɧz dK ^"s X<¿y#o`쬊eʈ"sp#"wkGV#pzG ;>U/-W#T*ve5*US{3ǐiE3ɩnEݫ!&}Y x *ŢZ1@\qy D1@zA#ܰ 冽ђǀJ7NbaeX~%'H}u`Z>UBO7_??/'RVݣn֪=yoF#³M:>&Gz#C~ E',ym]!Խ}ishw33J79ecicb\R/׆[cMPt-[PR撴8Buu\>3gy3k|=įaoC3m̊i]fN2fo3\uTsOW'Kw4Ay@QW6յW˕l?*Sn7Zn |%+WS{<Ƶ!W}U]ߦuҾTR?cQjV+rʫ1r( .Hv~Ui6!I#Hc])Й"*ZFw@L ` `Db. ډTkS*Du(4&B< `HX$ g1Gp=rv;]n kG N2apIl;a]L=iiſJ#T7},FL ;]L|=h+2N^*EҜz@]:Azirri*FW`+@2: te1T;Jvp[ux|1_Ǎx{$ Y.Yƺӎԉ訚1cTsxM4945l$BB/kd:N8[+BwoqwbKⷺ;;sͯԹ'5ŧ\ƺ[[bu>k`B^oww;Q23tnNj2B8>c}mߍzy\n*YjT{|ose2SӼB VQcߋs7rgFcLDU46Fn@=F؛M,ނUM|Hαǃ i1~wINEMt ݴcCV$v1[o ֜%"t8gвoF1eMBVڱtGшD‘tUk;ƫ1iTZOKgɊݷ6]~n jЎ]tD?7@/{ sava^+|Gw\U6'rk!,Qperebn2 ŀvRQuW VM.oƜ:iI#]d*82tGLGb<6@uťP5pCax&u)F/Q(0Pߥ0U9h,\CFFqR' QQeWc1Msz/n-ˮPK!~#Mfont.npyPK6vedo-2025.5.3/vedo/fonts/Calco.ttf000066400000000000000000001777701474667405700166020ustar00rootroot00000000000000 DSIGGDEF X ,>GPOSnXlGSUB^b@ vOS/2>o`cmap)vccvt AZ<fpgmA| mgasp4glyf'l&0bhead 6Ҕ6hheaa]$hmtx"دlocangE2ڔmaxpQx name!jޘpostE prepe34< . DFLTlatn : AZE DCAT NCRT XKAZ bMOL lNLD vROM TAT TRK     markmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmkmkmkmkmkmkmkmk mkmkmkmkmkmk$mkmk,mkmk4mkmk R j D R J P jR J V jR J \ jR J b jR J \ jR J h jR J P jR J \ jR J n jR J t jR J z jR j jR j jR j jR j j j j j jR j j j j j j j j R j j j j j j j j j j j j j j j jR B R B R B R B R B R B R B R B R B R B R B R j jR j R j R j j V j j \ j j \ j j V j j  j j j j j  j  j j j  j  jR j j j  j  j  " j  j R ( . jR ( 4 jR ( : jR ( 4 jR ( @ jR ( 4 jR ( 4 jR ( F jR ( . jR ( L jR ( R jR j jR j jR j jR j jR j jR j jR j jR j jR j jR j jR j jR j jR j X jR j ^ jR j ^ jR j d jR j^ j=/=)=6=#====%R)R6TP)P6T%P 3)6u)u6u#uu u== ='s)s6hhB)B6=R)))6R=%/L)L6L /////{/V/BBH=NNR%N3DDDDDDD{hFFFFFF{EFZZqqF= F====={--;99;%;q%55555{5V5JJJH %=%& > fllllllllflrFLRRRRRX^djpv||V{h= ={==?==V?  DFLTlatn. !,7BValw: AZE VCAT tCRT KAZ MOL NLD ROM  TAT (TRK F  "-8CWbmx  #.9DMXcny $/:ENYdoz %0;FOZep{ &1<GP[fq| '2=HQ\gr} (3>IR]hs~ )4?JS^it *5@KT_ju  +6ALU`kvaaltaaltaaltaalt&aalt.aalt6aalt>aaltFaaltNaaltVaalt^caltfcaltlcaltrcaltxcalt~caltcaltcaltcaltcaltcaltcasecasecasecasecasecasecasecasecasecasecaseccmpccmpccmpccmpccmpccmpccmpccmpccmpccmp ccmp&dlig,dlig2dlig8dlig>dligDdligJdligPdligVdlig\dligbdlighdnomndnomtdnomzdnomdnomdnomdnomdnomdnomdnomdnomfracfracfracfracfracfracfracfracfracfrac fraclocllocl$locl*locl0locl6locl4]&efgnopqrsxyz{$   ' 9 bh  %&'()*+,-.efgCnopqrsxyz{ $*4>HR\fpz9/%:0&;1'<2(=3) >4*!?5+"@6,#A7-$B8.R9 AUUx    %&'()*+,-./8U=`gcC/8%.JDU[_hijklmtuvw|}~'8J`g/012345678U[_chijklmtuvw|}~8=J/012345678{33W  P {dhrm@ fH  Z`\almSXv]cWb^%&+.8;=CDJVXY]dituz{jTkdhi INmVR  _[|}Y TUut~C~  U "/124KMOjln~@> /~1~7 (8    " & 0 : D p y !!! !"!&!.!T!^!""""""""+"H"`"e% 047 &5    & 0 9 D p t !!! !"!&!.!S!U!""""""""+"H"`"d%%yeSPk3~Eߩߙ߆zX:|6X Z`\almSXv]cWb^%&+.8;=CDJVXY]dituz{jTkdhi[ |w;<U: }GDH_   " 4/12IOKMTNRnjlm|W  #!$('*)-,75063:<>@?ABEGFHQLPUZ\[^a`_gfespkroqw}~SbhyvxutV  'T!-H@EJHGU`P"""-",(&!!'- + 54676654&#"354632654&#"3T+9'dSW_L6427,1!F))(( "/?3FRXP35/++"'5%( (( (L/H +@( JfKL  +3#!##f9fHdL/6"{B B3+L/#"{B B3+L/6"{B B3+L/"yB B3+L/6"{B B3+L/"{B B3+L%/HC@@JfKK_"L$!+327#"&5467!#3##j?22"5$h{QVc9f;t7 m^JEZHunL/"{B B3+L/%"yB B3+bH@@=Ie e]K]L +!!!!!!!##nlÁ`HJf>b6"B B3+H =@:Je]K]L) +!2#!2654&##2654&#!˴9||yyHI@ipohPs{}s"`6@3~|_K_L$"&+&54632#&&#"32673#cc͡ uu 54힚6"B B3+6"B B3+%`"6"B B3+ "B B3+H &@#]K]L   & +!2#!%26654&&##?ss1OOH׍ii)H6@3e]K]L&! +#53!2#!%26654&&##3#?ss1OOZZ׍ii:96"]B B3+)HH )@&e]K]L+!!!!!!'}HP"6"B B3+#"B B3+6"B B3+6"B B3+"B B3+ "B B3+6"B B3+"B B3+%HG@DJe ]K]K_"L%$$ +!!!#327#"&54675!!;?22"5$h{IM'P"un67 m^FAHH #@ e]KL+!!!!#&} HFj` wJKPX@'~e_K_L@+~e_KK_LY@ $"% +4632#&&#"3267!5!#'##IdΡ(if0yb[5{wؐ7w{j#"&{B B3+j6"&{B B3+j`"&{j "&{B B3+H !@eKL+3!3#!#HDq)RH;@8  e   eK L +#5353!533##!#5!ooooq6"+{B B3+H #@ ]K]L+7!!5!!!!H3H͓!ߓ6".{B B3+#".{B B3+6".{B B3+".yB B3+ ".{B B3+6".{B B3+".{B B3+%HA@>  J ]K]K_"L%$$ +!!327#"&54675!5!!5!Hu1#5$iz/3H3ߓ>_, pi=|E!%".yB B3+qH.@+~]K_L"+&55332!5!#I؟1scNAq6"8B B3+q6"8B B3+BH @ JKL+333###ţ  HnJfBH";H@K^L+3!!HK6"=B B3+H !@]K^L+3!!3#bkHKHH"='H"=eB333+'H ,@) JK^L +%!573ɣ pp%lH(@% J~KL+333##### R H1%H @JKL+333### H'6"D{B B3+6"D{B B3+H"D{=H3@0 J IKK_L!#+##53255##33㲤ff HK^'H%"DyB B3+j`,@)_K_L&+&54632#6#"3ddΡcc΢65ʕj6"J{B B3+j#"J{B B3+j6"J{B B3+j"JyB B3+j6"J{B B3+j6"J{B B3+j"J{B B3+B9u'@@= %# J HG_K_L'&%)&+77&46327#"'&#"4'#3BvNdΡoXpvMc΢nXI"J15pJʕqkwp.kB96"R{B B3+j%"JyB B3+7jH5@2e]K]L& + &5463!!!!!!ttmB|JJ|**Jr緷qH *@'e]KL   $ +!2#!#2654&##HǾxzyxH .@+eeKL  $!+3!2#!#2654&##ͤ HǾxzzxjb`*sJKPX@&~|_K`L@#~|d_LY@*)%#"))+&55&4632326553##"3dΡcUUUUbASX5%>^``^H 2@/Je]KL    +! ###2654&##%||H:Rpxxo16"YgB B3+6"YgB B3+H"Y`*6@3~|_K_L*)","+&'332654&''&&546632#&&#"#n~cnb}ye}mp}boiƊijjs{n\j#)s[Um`gui]h#)y\6"]{B B3+6"]{B B3+%`"]{6"]{B B3+`"]{=`/[@ !JKPX@_K_L@_KK_LY@ /.#/$+&'732654&&'.5467&&# #4632#y/)Pf]c":3;R:zzygr%92CP3'EF):+ AjLj:[ZZ"R*<(&AiOfH@]KL+!5!!#z{LfH)@&e]KL+#53!5!!3##z{ZƔ:f6"d{B B3+f%H@  JK PX@+p|]K K`"L@,~|]K K`"LY@$%$! +!32#"&'732654&##7#!5!!w-aj}u=m#!P)8=59TCz{IHPX^##!LfH"d{H!@K_L#+&5332653#gѣ}jV6"i{B B3+#"i{B B3+6"i{B B3+"iyB B3+6"i{B B3+6"i{B B3+"i{B B3+%H#8@5  JK_K_"L###$(+327#"&5475#"&533265wy?22"5$h{{ѣ}HV(wm67 m^uj"i{B B3+%"iyB B3+fH@JKL+333#f+ +HR-NH!@ JKL+33333###- H-N6"u{B B3+-N6"u{B B3+-N"uyB B3+-N6"u{B B3+X#H @ JKL+333### ٴnJ+X#H @JKL+333#l) )lm+%X#6"{{B B3+X#6"{{B B3+X#"{yB B3+X#6"{{B B3+H )@&J]K]L+7!5!!!@l{9{Ɠ6"B B3+6"B B3+ "B B3+(JKPX@(~e_ K _L@,~e_ KK _LY@('#!"#% +&&5463!54&#"#6632#'##>55!"3bOȽzxbtɱɍ 0uxRlsdZI[LrtLJo\gMQQMHQ"m"m"m"k"m{"m%"7V"m"k\.5@e@b*J~~  g _ K _ L66//6@6?;9/5/531.-"!%"#&+&&54663354&#"#663236632!3273#"'##&&#"655#"3}CQgHOBJ _w "uV+uyP$ZLNOLTR^LAHWaKE|rNPRVVR4554&&#"3^^|j' %qn}DD}S}}좠`XfR_dTm1mUö.=@: J Hg_L.-'%&+&&5466327&''7&'77#>54&&#"3mfs`*+D]G{CFzBBzPPzBBzPsҊwQJuFJ^amuVN__OO_^Os'x JKPX@#]K_ K _L@']K_ KK _LY@'&" & +&&54663233#'##3#66554&&#"3^^|j' %qpbk'}DD}S}}좠`XfR_dTm1mUösf+r JKPX@%eK_ K _L@)eK_ KK _LY@(&$&$ +##'##"&&5466323!5!5334&&#"32665f %q~^^|j'1D}S}}S}Du_d좠`XCmUöTm?@<~e_ K_L!#$ +432!!273#&&#"t?>,ϡss  k"""""""{"%&-R@OJ~ e_ K_K`"L'''-'-%$'$&! +!!273327#"&54675#"432'&&#"?>'UFCq2"5$iz567<ߪsswFTAw md?xA   \70@-~e_KL!#+!5!54632#&#"!!#^\;Ǥklq%s3?Kh@e& Jg g_ K_K  _ "L@@44@K@JFC4?4>:832.+%# +&5475&&54675&&54663276633#"#"'332#654&#"354&##"3Y>GE@BE]|_n>N5T]|\B'+=6Z{{on{{n^X%8V>?e)[iO1Zd\TiO='.2cYYddYYcSLXTVVq%s"[q%s"[q%sh"]q%s"['@$JK_ KL#$+336632#4&#"#,mfdRGY_ú}}xxMV5@2 JeK_ KL#$ +#5353!!36632#4&#"#',mfdRGY_ú}}xxMV"B 3+" !@]K]L+7!!5!!!XX͍""""""{"% (X@UJ _K]K] K_"L ( ('&%$#"!  $ +&54632#327#"&54675!5!!5!! PP;_, pi={F͍"%~"0%X.@+~]K_"L"+&553325!5!#\!%5!ˍ%"0%D"0% #@ JKKL+333###ߠB3{8%"% @ JKL+333###ߠB3B8R.@+~]K_L"+&5!5!32553#J_R" 3+R>@;~]K]K_L"+&5!5!32553#3#9bkJ_R"R"U  3+R"Ls!NIKPX@_KL@K_ KLY@ "#$#+336323632#4&#"#4#"#s{2GX5hd36BKhCKzHK/NLm^^Ӛl_^DJKPX@_KL@K_ KLY#$+336632#4&#"# +qfdRG_dú}}xxMV"{ ""{"=XJKPX@_KK_L@K_ KK_LY@ %$$ +3254&#"#336632##dfdRG +qfxxMV_dú"y ,@)_ K_L   $+5432#6654&#"3jԅ 򔿺"{"{"{"y"{"{{"{b%@@= #! J HG_ K_L%$%(%+77&54327#"'&#"654'#3boFӬk^goFԬj^Bmz`Am+} ZnX}[olBePĿfNAb"{"ym$4;X@U  J~   e _ K _ L55%%5;5;97%4%3-+$#"#%$+3236632!32673#"&'##>54&&#"3&&#"Zs v['[\9E\y sZ?E E9;FF;wMPPM  QWWQ*<DERVWQMNNMۛ=#`JKPX@_K_KL@ K_ K_KLY@#"%&$+336632#"&'##654&#"3 %q~^^|j'1}S}DD}S_d졡`Y>öUm1mT=#8@5JK_ K_KL#"%&$+336632#"&'##654&#"3'j|^^|j'1}S}DD}SX`젡`Y>öUm1mTs=#hJKPX@_ K_KL@!K_ K_KLY@#"&$+##"&&54663237366554&&#"31'j|^^~q% }DD}S}}=cY`졡d_V>Tm1mUöRJKPX@~_KL@~K_ KLY#$+336632#54&#"#ݍ +nibN{E^eúq|MV"""k'6@3~|_ K_L'&"+"+&'332654&''&&54632#&&#"# pwWeɴ qaevXeCFPN&2K1)@.'CiKRH8@5~K]K_L" +&5!5!3!!32553#<aJ_RHH@E ~ eK]K _   L +&55#535!5!3!!3#32553#<aJ_RB@?~eK]K _   L" +3#&5!5!3!!32553# bkݲ<KaJ_R%H"RH"DJKPX@K_L@KK_LY#$+!#'##"&53326653ǎ +rfdRG_dúwxMVA"s"s"s"q"s"s{"s%"@V"s"qw@JKL+333#w -N!@ JKL+33333###-   -N"{-N"{-N"y-N"{X# @ JKL+33## xm%1@. J~K`"L"+&553326677333#}+9/3}!N%XqM%y) MHTfy7%"{%"{%"y%"{ )@&J]K]L+7!5!!!\\on"""=`c{<@9~ e_K] L!# +#5354632#&#"!3!53!#Ͳ^\A_Ǥkl㍍{/@,e]K_L#!"# +#535463!33#"&5#"3##Ͳ̠׍נ'+JKPX@/~e  a_?K _ >L@4~~e  g  a_?LY@+*)('&"""% +&&5463354#"#6632#'##>55#"3!!zCN` (aguCSYPH3Z=rMy9=:|܉JT=jAB=9@ 5@2ga_?L    $ +&54632#6654&#"3!!jmlkjmmj3ZቘX#H 0@-JU]M   +73!%#X5u-u^`#.@+!JgU]M&&' +735&546323!5654&#"!^qmpӒplq{illi{ 8ɘ 1߷ϋ=/#<@9!JW_O&### +3326653327#"&55##"'##a]KtA# 08UW (`y9 vyLWA*$ZY]fTtw7+E@B  JI~eW_O#% +&5!#5663!#3267#KlCY-7rh&2%7>plZ9- j7 &=@:g_K_L &%    $ +32#6#"3&&546632#N𛒑&?$$?&;O$@&K]]K$?&&@$O;&?$ ?JKPX@K^L@^LY+7!'%3!!X5{X͑bn7.@+J~_K]L$&+76654&#"#546632!! OHwyh}dYif\{RJp|9p^_zfkbs7+G@D$J~~g_K_L+*#$!$" +&&'332654&##532654&#"#46632#m|fftpe}}ejȈZrjurqtnkm}uhpZYoNQv]j P JKPX@eKL@e]LY@  +!533###Y PJ6V$t@ JKPX@&~g]K_L@$~eg_LY@$#$&"+&&'3326654&&#"'!!6632#¾spUFFUQ2J-0T{dlɊVqbsFWVE64/X01hj%\ JKPX@hK_L@h_LY@%$$+&&546736632#>54&&#"3o3FC(p;maoʄSEESS~EE~Sk^v!%ivkE}RR~EE~RR}E8JKPX@]KL@eLY+!5!#;Pa`o 7'55@2.'J_K_L(((5(4!++&&5475&546632#654&&#"6654&'3lgglђn>vQQu>m^EE^YnegfXXfgenYtf>`77`>ft8eBmyymBe87%6@3 Jg_KL%$$+#'#"&&54663326654&&#o3FN(oZ Z3+?Z Z3+@Z Z3+AZ Z3+BZ Z3+)R *@'g_L   $+&54632#6654&#"3JDDJJCDI {gppggppgJ0m m3+=+(@% Jg]L&(&+%%6654&#"#546632!!=* =67<=pKr3>3m#1(./+ >]2pa7U.u+9&E@B J~~gg_L&%"#!$" +&5332654&##53254&#"#4632#?@=DJ~eg_L#$"+&'332654&#"'!!632#Ό B6@CD?U(w+2ai{ d[""6225')Lu5pajw5R ] JK PX@nh_L@h_LY@ #+&&546773632#6654&#"3{B'/)1Cf8BzR?HH??II? 7gE5_?2[=9:3#1(./+ >]2pa7U.u+9+&} JK#PX@-~~c_K_ L@+~~gc_ LY@&%"#!$" +&5332654&##53254&#"#4632#?@=D=9:L   # +&5! #6654&#"3rsnggnmhhm-ꎞ) #@ J^8L +!'%3!!1NyH#Ru^}5(@% Jg]8L'(& +6654&#"#546632!!@2]SU[QdfOG[lE7O/ELMG S}DDWMxL5(E@B!J~~gg_>L('"$!$" +&'332654&##532654&#"#4632#f`^i\gnnQUYWfPVnCFF?F?A>?@}|=sN21U}C) R JK#PX@]:K8L@f8LY@   +!533###0ʞ }ۇhs) A@>J~eg_>L $$" +&'332654&#"'!!6632#dQcedd?^({7X #qG[Nv26TRST #-Շ&*LZ) 6@3 Jh_>L # +&&54673632#6654&#"3ԤY'12]XLZlchhcbhhbM]FkDoGV^NVRQWWQRV)@Je8L +!5!#Dw5!-2@/'Jg_>L"""-",* +&54675&54632#654#"654&'3[YY[Ƴc\\bqklppkkp~Tp1uu1pT~(B:yy:B oBAA>>AAB5!4@1 Jgg8L! $ +#'#"&&5466332654&#Z'1 E/XLYkbhhbbiib5M\FlDXGV]NVRRVVRRV'j0+ VdwDJ\w=`j#0#' Cl#(3#0Cl+#1"C(3j#)"C0j+#2#)Cm#*#0Cm+"C#1*m+#2"C*m#3"C*j#+#0Cj#4"C+o#-#0Co+#-"C2o#4#-Co#6#-Cmd*@'  JU]M+''%5%773%%#XjXA))AXjX)%ꚢu院uy@L+3`f@W_O&+&&546632#M++M/0M+,L0,M/0M++M0/M,#X5KPX@ _L@W_OY@ &+&&546632#JJOPJJPJPPIIPPJ,@)_ K_L&+&&546632#&&546632#M++M/0L,,L0/M++M/0M+,L0,M//M,,M//M,7,M/0M++M0/M,`N7@JG_L%%+667#"&546632`y  H[)J.VaZi;rZF-I)wsÐ'5F #/@,_L #"   $ +&54632# &54632# &54632#PP<;PP;APP;54&#"#54632#&&546632#MJ@Cwknuʻv_#TS>;1G((G++F((F+5OT;2GA)\gsn!PaKhbC2:0'(G++G((G++G(25@2 J~d_ L21%#&+#"&&54663326553#"&&54667>553G((G++F((F+\ MI@Cwkotʻv`#US=<(G++F((F++G(4PS;2HA)\fro PbKhbC1;0'yH@]L+3#3#)w)wH??H@]L+3#)wH?`N$1@.J$G_ K_L&+&&546632#667#"&546632M++M/0L,,L0݁y  H[)J.VaZi,M//M,,M//M,;rZF-I)wsÐ'y@L+3#`{` dD@U]M+D!!{{L@W_O&+&&546632#M++M/0L,,L0,M//M,,M//M,`,@)_K]L&+#"&&54663#iF((F,+F((F+0==`(F++G((G++F(d`_` `3+1`#JK#PX@gc_L@!ggW_OY@10/-!(!(+&547654&##532654'&54633#"33# anFFna iV ZZZZ Vi鰷BKO0m`{`m0OKB}p{3HK>rr>KH3{q}1c JK#PX@gc_L@!ggW_OY@10(&%#!+532654'&54675&&547654&##53233#"#V ZZZZ Vi anFFna }q{3HK>rr>KH3{p}BKD;m`{`m;DKBP>KPX@a]L@eU]MY+!!!!P\@})}+FKPX@a]L@eU]MY@ +5!!5!@\}}/0+$54$7ן)ʛvvߛyx222s 0+6654&'5vvߛ)ʞ29:222& h==3+& i==3+P; j==3+;+ k==3+1l==3+s1m==3+{@U]M+!!{{@U]M+!!{{@U]M+!!3v`{tNN3+{`uNN3+T@U]M+!!3TzT  0+55}1}duuduT  0+7'5%7'5|} ddDR0+5DObhR70+%5hP1zN#`%B@ J%HKPX@ _L@W_OY$+$$+632#"&54667632#"&54667)%ASSCT^Th%ASSCT^Th;} N??Plg(^;} N??Plg({`%#@ J%G_L$+$$+667#"&54632%667#"&54632{%ASSCT^Th%ASSCT^Th;} N??Plg'^;} N??Plg'`9@ JHKPX@ _L@W_OY$$+632#"&54667~$ARRCU^Ti;} N??Plg(f`@JG_L$$+667#"&54632f%ARRCT^Th;} N??Plg'fN@JG_L$$+667#"&54632f%ARRCT^Th;} N??Plg(J|3+J}3+DL~3+h7L3+R@ JK PX@(n~|o`LKPX@&~|`L@,~|W`PYY@ +%&547'3#&'673##,,#qjjq+    T ;?+B@? J HGc_L+*),)+77&547'76327'#"'6654&&#"3;AAgYwxYfBBfZwvZ_55_=<_55_<_vw^f::f_vtag99)7b@@b77b@@b7R")1@#0)1JKPX@ ~|KLK!PX@ ~|]L@%~|U_OYY@ +%&&'3'&&5467'3#&&'#654&&' SG7S[Mag'TK+ + BP y+  `OHP`O6D-T7)W@T~ ~e   e_K _  L)(&%#!"#+&&'#735#73>32#&&#"!!!!32673#c-f-oe%o[nxfoxo[o%bѧzz`kfzzelRo7 B@?Jec_L ### +'73267!7!76632&#"!!#J ?Jph 0 ʫVG 7RRd2/  q0iW9>@;J~eU]M"! +53267!5!&&##5!!3##)tdf7T^e^e >| 70@ JKPX@-~pe_K^L@.~~e_K^LY@ #5"( +76654'#57&&546632#&&#"!!!26553#!w'Ֆ&*\zϤxpjw"/DI/"R^'y oA_wMz;pUhmob,fjSMZ2 !-5d[Qbe JKPX@ f  eK  L@ f  e  LY@! +!5!5!5!5333!!!!#BBt tBBtt^7tt@W_O& +&&546632# U11U23U11U31U22U11U22U1@t +3#?Vw &@#Ue]M+!5!3!!#}} }w @U]M +!!ws  0+75f56f5f!55g6gg6w=o#;@8geW_O#"&+&&546632#!!&&546632#@%%@&&A%%A&:s@%%@&&A%%A&X%@&&A%%A&&@%1%A&&@%%@&&A%N^"@eU]M+!!!!ee^/}lK PX@)n ofU]M@' fU]MY@ +#5!7!5!33!!!#j1L΃N)0+75j)0+5jTZ "@HU]M +%5%5!!VEEݞŇuTZ (@%HU]M   +55!EVE;ݞTd 0@-eeU]M+!5!3!!#!!iie?k3O@Lg g  g  W _  O320/-+'%#" $"$ +&'&&#"#663232673#&'&&#"#663232673#a;2;%9: uA`:4:&88 qCa;2;%9: uA`:2;'88 q06.$U_16.#U_T06.$U_16.#U_w%4dD@)gW`P&!&+D&&'.#"#32326673#EF242'&1,EF232(&1<7:1-ti<792-ti`w@U]M+!5!#=:Z BZ9R )D@A '& J HGgW_O!!!)!(%*& +77&5466327#"&'&#"6654'3B|`{ۉS=w`}a{ۊS77.#"3654&#"3|{Vy1-Y|{Vy1 ,Y29%+A-:?>;1?>;)9$ +A-V^V^V^V^.FF'5?.d]]ed]]f.EH'5?.57@4JgW_O$%$ +'532654632&&#"#+;-SIE8-SI jwg jx^`X#H  @U]M +!#!#uӤw +@(JeU]M +5!!!!yL^no\\ ,@)J~U]M +33!##\jaqd`,I@F JggW_O,+%##&& +&&546632365!"'632#667654&&#"3q`s|b.fTq.@sIUG7dBdvwMI3gsȔ Di:OYNs==/j+"C#/% ;m+ '3?K@ JK#PX@/  g  g_K  _L@-g  g  g  _LY@2@@44(( @K@JFD4?4>:8(3(2.,'&"   $+&54632#6654&#"3&54632# &54632#$654&#"3 654&#"3xxx?<`7E?@0J~|c_L76$" "+&&'332654&''&&54675&546632#&&#"#654&''[ _HUeP^idVk]Z _HUeP^idWleP^^eP^AvM6=XJBK1"pW/S`NAvM6=XJBK1"pW.S`NcCBK-cCBK-9{B`7hdD@]~|gg   g W ` P  7 64320,*)(&$& +D$&54632#>54&&#"3&&54632#&#"3273#}}鞟}}|__||__|yy|ivZ?99?Zvi{n{袡zz顢{quulwxluup9{B`+4hdD@]%J~g  g e W _ O-,31,4-4+*)('&" & +D$&54632#>54&&#"332###2654&##}}鞟}}|__||__|၏@z4004[{n{袡zz顢{B#k)++)9{B`*3W@T~gg g W _ O,+20+3,3*)(&" & +$&54632#>54&&#"332###2654&##}}鞟}}|__||__|orrol{3113j{n{袡zz顢{:b__ab,,-+H:@7 J~U]M +#5!##333#####jn`aj r-sgaa XL%`8dD@-gW_O&+D&&546632#>54&&#"3UU\\UU\3O--O32P,,P2T[[TT[[T0T54T00T45T0@t+3#"@eU]M+3#3#^ H #@ K]L+53%%#RRq_q(@@=(J~gW_O%#(+ +&55'67463232553#54&#"ղO*9_SdN𸺜XMTV)-/\QkhJ_ ah|/ H2@/  eK]L +%553%%%%#RRRRhHH_?V 3N@K1$#J~geW_O!!!3!3+) )& +&54632!"326673#254'.#"3aJE{Y{a3  XPH] #.T6/O.Jp<  X@6U-  d` '+@  JKPX@%  g  e]KL@)  g  eK_KLY@+*)('&  $ +&54632#333###6654&&#"3!![[ee\\e }obo""""jB%Td&YPPY&&YPPY&w{!dD@Jt+D3### \/R'7@ 40*JK PX@3~  |  |gW]  MK PX@:~  |  | ~gW_ OK PX@A~~  |  | ~gW_ OK PX@:~  |  | ~gW_ OKPX@A~~  |  | ~gW_ OKPX@:~  |  | ~gW_ OKPX@A~~  |  | ~gW_ OKPX@:~  |  | ~gW_ OKPX@A~~  |  | ~gW_ OKPX@:~  |  | ~gW_ OKPX@A~~  |  | ~gW_ OKPX@:~  |  | ~gW_ O@A~~  |  | ~gW_ OYYYYYYYYYYYY@7632/.-,)('&"+" +&'332654&''&&54632#&&#"#333#####jk2.+1&*;MEeVRbj*#&*&*;MEk^/a`ks-r fXP&*+%(Q>Q]SK!%*&(R>P\cL%H%`333+y 2dD@'W_O   $+D&54632# &54632#II65JJ5dJJ56II6J56II65JJ56II65J7N &dD@W_O $+D&54632#PP;36GVHJVbnz.: $r:FR^jv H N ".,8d p>J:FR>JVbn  d p | ! !!"!.!:!\!!!!!!".":"F"R"^"""""##@#$$D$$%4%%&&v&'0''(2(((((((() ))*)f)v)**B**++h+x++,F,--n-..z./*/T//0<0011`1111222 202@2P2`2p2222233"3N3344N445N5x56@6b6z6677.7j7z78d88899&949B9P9^9l9999999::":F:^:v::;,;j;;;;;<<<<==>T>?(????@@8@@AA&A>AjAABHBBCCCCCDD:DhDDDEEFF.F`FFFGGHGpGI~J=?@DiAkljBCnmDEFoEFGGHpHIrsJqKLIJMNOKPQLtRvwSuTUVMWXYNZ[O\]^_PQ`abcdxRye{|zfgh}STUijkVlmnWopqrX~stuvwxYZyz{|[\}~] ?" B^`>@  !a# _ACNULLAbreveAmacronAogonekAEacute Ccircumflex CdotaccentDcaronDcroatEbreveEcaron EdotaccentEmacronEogonek Gcircumflex Gcommaaccent GdotaccentHbar HcircumflexIbreveImacronIogonekItilde uni00A40301 Jcircumflex KcommaaccentLacuteLcaron LcommaaccentLdotNacuteNcaron NcommaaccentEngObreve OhungarumlautOmacron OslashacuteRacuteRcaron RcommaaccentSacute Scircumflex Scommaaccentuni1E9ETbarTcaronuni0162uni021AUbreve UhungarumlautUmacronUogonekUringUtildeWacute Wcircumflex WdieresisWgrave YcircumflexYgraveZacute Zdotaccentabreveamacronaogonekaeacute ccircumflex cdotaccentdcaronebreveecaron edotaccentemacroneogonek gcircumflex gcommaaccent gdotaccenthbar hcircumflexibreve i.loclTRKimacroniogonekitildeuni0237 uni006A0301 jcircumflex kcommaaccent kgreenlandiclacutelcaron lcommaaccentldotnacute napostrophencaron ncommaaccentengobreve ohungarumlautomacron oslashacuteracutercaron rcommaaccentsacute scircumflex scommaaccenttbartcaronuni0163uni021Bubreve uhungarumlautumacronuogonekuringutildewacute wcircumflex wdieresiswgrave ycircumflexygravezacute zdotaccentgermandbls.caltuni0394uni03A9uni03BCuni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089 zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numruni2070uni00B9uni00B2uni00B3uni2074uni2075uni2076uni2077uni2078uni2079uni2153uni2154uni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsperiodcentered.caseexclamdown.casequestiondown.casebraceleft.casebraceright.casebracketleft.casebracketright.caseparenleft.caseparenright.caseuni00AD emdash.case endash.case hyphen.case uni00AD.caseguillemotleft.caseguillemotright.caseguilsinglleft.caseguilsinglright.caseuni00A0Eurouni20B9uni2219uni2215emptysetuni2126uni2206uni00B5arrowupuni2197 arrowrightuni2198 arrowdownuni2199 arrowleftuni2196 arrowboth arrowupdnuniF8FFuni2117uni2113 estimateduni2116uni2120at.caseuni0308uni0307 gravecomb acutecombuni030Buni0302uni030Cuni0306uni030A tildecombuni0304uni0312uni0326uni0327uni0328uni0335uni0336uni0337uni0338uni02BCuni02C9H=`%==H=5%2222, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcEEX!%YR[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY% CcRXK PX! CKPX!Kac CcbYYdaY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #BEX CEc C`Ec*! C +0%&QX`PaRYX#Y!Y @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BYCJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B%B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CGCG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`++"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-),# bfc`KTX# .]!!Y-*,# bfc`KTX# .q!!Y-+,# bfc&`KTX# .r!!Y-, +ETX#B E #B #`B `aBB`++"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX EB/*EX0Y"Y-1, +ETX EB/*EX0Y"Y-2, 5`-3, EBEcb PX@`Yfc+ Ccb PX@`Yfc+D>#82*!-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,#B%%G#G#a B C+e.# <8-9,#B%% .G#G#a #B B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:,#B & .G#G#a#<8-;,#B #B F#G+#a8-<,#B%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=,#B C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FCXPRYX +-o,:+?+-p,:+@+-q,:+>+-r,:+?+-s,:+@+-t,;+..+-u,;+>+-v,;+?+-w,;+@+-x,;+>+-y,;+?+-z,;+@+-{,<+..+-|,<+>+-},<+?+-~,<+@+-,<+>+-,<+?+-,<+@+-,=+..+-,=+>+-,=+?+-,=+@+-,=+>+-,=+?+-,=+@+-, EX!#!YB+e$PxEX0Y-KRXYcpB@0 *B@ E5%*B@ G=-* B  *B@@@@ *D$QX@XdD&QX@cTXDYYYY@ G7' *DdDDvedo-2025.5.3/vedo/fonts/Comae.npz000066400000000000000000003713611474667405700166070ustar00rootroot00000000000000PK!  kfont.npyk} xUpe'! IȞB !BB6t:饪f ,QG@AqAqqApTEEQT 2θญΩ۝ in5A,kP\]pe7GLVaIuIO/gUW,qrtmŞp/JDwjp9uv`"¡՗O!|8Ed\BQF=$qlM`A$I% Z0qaB/,L2>m\cђAbZKC_(#Kk,b#%4͕,v ܵ` c%XǕ .@ p$U[-Ĺ.g۫3mɖTks~#/'~VN 5#'yLmpVI ԣJzJO^u#?)+O)ei^eYtjtFV{@{Bۧp|);@ye2^iz!]R:T蟑TMm07H|z6M ӞQr%K][lANKIuٽb*xQ"&ɧ͗,X)F|J̹TR L~ЮeTWv(ϫxY.z~Z,PY5?+IwY5Aџ¯ZV`ĒA:u+ɖM3MGrt]ͼn3 "mCdUHc$C 'L,$X*(#v=#Y Jd?zHN")?X 2$(G&I? R"DٍOG? Jddlc݌2, CJPFsp41ntVS rPʯK%*Us@o$RHhk Lϓ"T8Α> XN#I(OF3L#f:1FALg@3m|"ۙ ߴD3гs"1C+|/pŸoQaƤ~x69%624d@Qdc8t$}dK 2` w)K.v9+R ,c%ˠ @95.Cb= ЮְЮo\ rh]ckMlkUlx=p[ 5 ^56h|[`$N?3qJ-njd& 25K ]RRm a3Rz8T-],.fy1Fy|\Y:)ޥ2F |5G+@.v-R@}J}W}CH}X^iR%~% j 9D̑|琶CrHfG}H"ᣁh!2M9Cb^p #=+g*+gIC&C9| 2I$M"4L$2dO O%V&Id thg$ کg·*WM' @ DcM0d1)' ȼ H7t€̣9g|2DvڈۈȜc#ro#o#Ror.D;6 /F^4u49dXM:lDQoX@@zn9x]tAƝ%@_JD)#Kd}d5=l8 2==a{.}d$nO:X^ObXk781ܗt/e^.Wo%>w׃ IΙΡΩ4 fI sqB?o6Is8ӝMpM\& `y>.3'8xAF]?jkjڝhmI'<1dNN\H2ڏȫndiF©i6i^ϲtLu8J('F4"i2wO#d4ԝIp4(?'Fni}ӡhzcMdtv7qcu~ܸ'nx#\EZUFFYd>4xz CtLI$ƛHHxHxHxM2w9|NE;ʂ Ϲ·Ɉ7\#2pĽýF}7Gώq ʷ N>m_X7YӬ7V[n;E'})&J3%&ȝRhxx8OlqxU)o׋xa^e(.kml6?glr%z0q'mIH_: οݢ:SHm-S*)O*5S-RVU3V}^JL Т _VjS5H[VijBg Owzϻ;U {hxAF_=7wjxN@]-PݷvQ6[;pRw J'E ePF $d(z>`$1XAӥXڱ IɄ)ԩiKO$2ԉd$H.=+!B<x!B!$]^w16{$p0d.x2T٠d6!A-@+&]N:(HDϽ7dn"G4M3Gy`EOh"1 ,qY &,x7 Ğd) gmsᾋ-B݂qKp?CbR((_*}LNC%\s 1Nq/\q;=wo##Z|.y[ h?= /|h^e_T!i\}[Rz|Kt9hۤW.8Gۿp?_Q(0X\Qا`Nœ A(N3E@N_kiC@Y"F(8 =N Z[|π󩤟x6=F.,$]W<;̷SDw\C WO ]c+sifL !Ýr8 w܏o-'qv#]w(j #-wYX_%ZO~'’mAzpGmz/(o3}0_yo{eұ'߶k~?CjkMSMu͚Qkmm0ܮ?Oud/>-gi3OE]c1"H?6<>s 02 '_$3)4YnSL=du?&h{>~_9'E9+`1dA8NB=h$."ݭ _$ +ZݒѰdC?-\4Aqʒvu_c:~?lqcGJhp;7:+rw ;}!>v:G8xUHfWiqf)][HzꥺQ ;awﺽ >է-5[dGJ FB +C +C0 fֿn3]݈XXXQ\FA? =A.vKp/ujq3 p]TPIi| ?<>Q*Jѣil1ZN3b{G*/ٵC£B8tultwG  >qfm5QW- >Ěj ou9ީUl׾v~d5NU~%U.R8ӹ`morkHܚi+r'Xw31"~~z57[Z x\w/ \] hs1{1Ĉ8,tQ|)@\"ݻxCb06 $\Dp0 Ar 4|A 8}1/rػb E"} RRDE`\BMH\Ƣ*7bRm5ׯ~ S^1I/&>`1@?vÖ(Ogr9KW塸\~Cz[~k ֶvlC赘x͏p-X.GtJtԮujOjŚI Jf Q%5KgݿwӃ8 _a 'O {O %JgzK#Kf86&: UEUEUEUC&bqt@4~ 'ިMh'#~lpip"z)?( 5E ZEkR||ZTReBcby||BP5לg$+$%qAkڑ =7a5"f`o[Åvh܆88+C(̃M F3lQB@&C/AK$OQR5p\5L]i #kזBlv0yjzDΫ:Iavo92Z|G#hM B%=~:Պk{%*|LGxX,דJؖf$S je0Zdj0#S9A=KF !t~D5ԭ hH H?0w  ,ߖ4;,JzGi@$T'b2,eP\ zx1x?k@_$8|8>{0H)PЫ&.#'Bw<Dv]hvAz1r9B)xX /dn2x(sLZ^Y|'#1a+n(\F#1ChJA5rX7Ҧ@ hqrQ>*GQ5J5)Y^xl6o b˩'r"yO Ig82:Z?ta_|Aԩj^ '%Hu  Pꔜ|-"T0f '%4L<ăbQ x% `n9FxHO4ق0Se%e1%P@QW(Qh* z۵IxB*]P(MGJ#*m/;Ro3K=ń8X46.R&Pl3`bB6i IPע q@}aQmuΆW[F>ɞ/vQ">'_eZFA _D4-$:iQNHZ 9P4+r\Jnv$sErq3ܩatsr8dZ8r*߳BDM dכOS;Jߑ.{YxE)E^`aS6/mBCto]rK^kdIC&u_JoKۥbgbN yFV쾛K8BJGըk4ZzwDH&gxZH _.? E|Z 0pЫP:}Q (SH37HL4Mi& &S1Jd$\1޾t莗P"&Ɛ$cZ4hѤQ@Jȏ0tWնƮg\Y(ذNi3N+{3KXXGoooF Zv=j$J$-HZ:CYro|Xh$=c'g#8v2M:~ǃ#FX!1fS(DKFw8 1{b("r}q,$-1p%^a~ \Q BR$ ZIN'88R:9-Ӊ_J'nNtIPNFQm_b|Dh%LIij&#CYё&Hn"&DlDLUl!'+b$(g  i-'[Zx2ȢpI*@hTDkCsTd!YQ ZQR"Z"(GEDz*K%+*]%f/%/+ ȮZ Ȯ,Z Ȣ,Z Ȣ,Z Ȣ,Z\y\fwr"s{[qi-0  A @ig&xSg.eu%V+>Rq <^?;tAMLqqvy. 5[KT\Ef1?%a|H}N[yTNR/߃O'A+˞E4s"6Mn&Qx_?*Dzx8ޣH"#dDI-&$b:H?;#f4h"dd&WgO k^I⻧ki7Y,#p,\R· ߰BgѠAu:ܥt(YoIY?;YICʸ:{_Fz7x.ge&$!)zBq $)PmߙK ,ky}j{!S76!lZkĦulTӨ^Fiæ(vhiQ9;ɷ1u{!ڈuװ3ϵl|0aUX;_tw?ݷH׳ɍf*1LºL2d| Ek$C_z s,;_#uGݳ3adsQg&b+LD2ڼoiQ<:Оf:z.K>kS2Kbuj+y)a= ū~?X<7l3"Mo羅=w"Э>JS .MIz=#IH6$ ֧ 1I:$HW`V13"f0?hvzۺKv/;v{;b?n6muPя|}G;*6&0i8Mvnptc+$k?βcnĬf}gsth4q{mg_NM;pi]ufzlv쓳;gΉ}vs}U;fZ\_k.\\"*6 hj\Kf>۵Wg*Eh%L=-ߠ-7))8cz u|cN GK.}~E3eL ۷S jZ7(>(Ojx׻9>p(H^Bf|޸}h.odɷNhZ|bcdzw{o;;koΏt~xR#/VT :29Z-FɮyߴZ+ p9|cxZLoxW>>E^/,?!6)8Z:n'=s "KaY9hERRxPZꎓ֣^d"(!J9 $%j DE 8IT(:ӈ#98㈁đG|xP# XYMu$;2fZ-8Rb?z~GAZ"U+ѣ#;9UaFPO ^C7Qt*a&Tnkћ4Z#Ma6K[wIТ Kx2@[C DXl=0ݷ`%|K Ԩ.+镓59=_;yEO#v0-GO_De/Zh3-zL_˥Ae}1UA_m%ȟvyVS-Tx5yЏh2kz^O/7P1 Un2@/f/—MnX%y p [VhRK,|Mnn v n;Nhnwڻ{  _> # QhvG7vv~wqO| I)== p/Ǡ}pǠ{>;p?<>Ͻo܋_;9;Dގv <QxQcD>Ab룷8*(AZH-_KѢ4yDݭ>ޡ&r"߬^b~?;fsT[/m98 W-FNoEjm1 N(O0g igyӫ0R=?(`6woZb) gۖzVAyÉ/24=(#&XDR70g#c\~o~:3DQIMNΏb2T+Z%z,2fY$zIrcO)agFiTF _LlC=1sL-wJˤ +~[қR||B͘Y\_q;8k+Id%Ŷui-VkhuR308%\İY/ĩzPe 9#o+: F  \r6ї^;S՟ T;zi/h4"WlJ)9ŦĂ C#ѥg `Jň"fVGqi(Fh@ z PY$21q}fFG*Hd"I 4D`&&&7`cQ<Y<Y8}[<#GK /yG‹` S$tJJCqy+H!:h&@3I ԳTz bm#L0pXXS n`QH[n"cBÑ; ,*}۽=т޸`#avp<Gy3ThMPyMКjv\jiZ&kVYXPՊ)p|ݡn9YJ|2-\ei[5qiX\8&&<{,2LXsHH<˿oE{5o&Ewi^.o˳TX4]]]+Y`(Úh+1uZ;5+K*+=/jg_a-k^ϖG;Bc!)UYޠVoAQ=?̜6._4JYg!^(}%0OlUދQO]٘]MC(2Nߎ+RI¨39(1A&/O89pJ"ӫQN'J(mL]b (9=ȸа%DjbG-2^Ђ.%]@ bʠm r;hYQgi.ej4My1i1RLk7!A%[=t K7(PǙ@ę@=497ϫ*S|CPdJiO>xA8DUWiX+ed^K4f!], W]5oPxԺ͜N>Ϟ*./q+fѷR~5RqAu>2dwZKrFf`-5Ur',_aMXS*J~MiM0oA7W+>,`]!M+06+ թ)c1LZ &){/ZCidM(#݇㽈5F3fYBDPr!W硔-=Pr6XEݍɓ<cf*fj rxɟb1v z-=ݾ&{kLL\s aFӀxk-,' IBe9ય i=#M\2f"%'v:% %O W$ؤ)C,NeXܾH]M'_OGwoDuOo*)F:Gt i2 'ΊR*,UP'<ՃRI%!G;=7oɣi *eB^\h~b2s!׈8zhһq3p6ÈټdҼdy8p n]&{_} f0GƟF?xcexBÑcɡs݇w/Bc8'@XקKdsd/N28Cxh,tݏ$A$ b''nf׌#Cⶢ9TbQ--F.VӠtdO!p#`<ƹ8VX-,'+o/cBpV?w@Uf8~>%O +(QX4.h7⾯*1ї*?b'9%:;pقwWX;< |[8vJW۫mN7 Q4%e2MR6}N\&c2zXcI%S Ԁ%i8\",y1-Q$ƗA7nbQ U:@fRCi0%=zcADCv5+5t2SvSDW&&rsj9pᦱ35V 0n0NHgHvF#*@P7hX@0ؽa^&XZԾ80ڕ@h{hz"x zȴ>VzB&)ۈCY b|:N'Cϓ*a"xfɴلIC~lc(|3pcځC.!+y܄#V.aAoYưT.= 3~n3n bzKXt){+}qE+ӘҒ@D]LLe"Y,H<;r2Ʃ 42k|by\+*}(fZPki)-\-.55SLpn.\*:}凴ӳ^姿E[U#:n[\=;4T(˕4.bU,e{{b*C)-#ڏG)E t"%@f*'e]NNnv~[|mG^bBv4w.6wz@{r'r?4GnQuRuʗeb)YA Iu `J^:\{m&''OO7p<~<~<Ѻ3QcsGes<"zn UcV*QY4)dzٽ$fyvӒxʸ$9Ks4$aKs\^m& !7ئޭf53BT=6\cLGչ":~,?|J@eVj>ukuCtlsenl*Xk.oWEc:gsN(s-zzַW+?"Kr|nZkьt]T+VؖZ#[􊏜#۫w>yf9Ǧz?MT}-_Vz(\VlFWw(i>^9>un E[,vIvNaERXaBnMm*.owkk,׆" %?(jK!wK$]"%./Ej5 LjMxWM/A\&7L$nH0a"EԖD J(p(ҋDFc)h,TlTKaٺBڀRѺB*ZW L/*J,*J,*TL3*"J2*4"*`WDIFEf4` " ΰzWG<30O)z*c.儌ƥ"*^m S4G|S(o{c n~b }z9|iG]*'(GJVl 30z-m-HH^^*ޔ9ŗr=UoI`t_ ^`倳=,2ؐNCȁf[7BXTo dRo!YOBqm_"EU'̨IT^6v aʠnI~KGV$ $[q۩l)$.I*]_3h 18 H20Z>- Qo qyKX7$Q8A%7'ЁBa|9&hED`U,"EB I.$L!B"3r7 ^&Zo; C0d9.آ˭Wۼm!Ju)wOHXr9a{5+C[eS;/x9 W_OK6]~M*nQ_p"8B&?ho޵X[='Ot\l˅z\gR!&ߔ?<j@"J_I2errXx1޹.,HbG̑$i҇R\&ur+#=, &iE j^/jOo,~$>OkQL/qA575hŔֽDۨ=}BKx.'~&R~F;ޡwLGݩ.Sԫj+eRa1#Hq" 9{om]/:m2ޟtv՟ 'џ do==i{$ D4D!i:@z(342QH#L42T=K$,%5cB.HE _E1=lԘ8PJZX,6̢c>6ҵun*I#7fUSqZDŽ^R( 6 "S(g Ksַj4FJhfB;$$ d$3H&A2OR :`8zN艔,q\#Uf:T"dTP!#:rH!C`>ylm̔,}q(EJti;(ҜEJtHi"%:,R"𝓴>&zc:>)[H@?c껱ЗޡJTWK;Cm:iT,JŇC]]&tq.D.wH?jj~n\d/z/ػ Õ?[,iKޔ gq~Z qlұ a #0%0<_}ݍf)Boo6hҠ}m""n}yMzb>ڿU%a2f5E'|sY&"P۾ERyCAULv~aGC:ZKp- =߹æo&;uN6#0@Bݽr(W_q4??l(9$wqk/";.IGV=];ZEl,ŝ/F;d4 v6ŲdCoUÚs_|m!*>uF(Z p=#(Ȏ vqāF=@#_I7Z$6Xl. jnW}EstV#씺|N)_z]g(wq9$ӑZ.H^5=6wFq]u[Qksr vc<'(_-8Ȁ!A{{#CPoȷa;ҿ2I !B B zIM3skzka a׮k[ Y{þbYsgΐl{'Ϝ{Ns=oPR!S|V*8h"ʁɳ)ȴ\4y5VJFG[H4o`D,X+H/-m9 #%5nf /oV-dcZZxi9by'lo>evuRiٟ8ӮTac}|m}CV{ISkO6ea09sr;gևV”WP9[_A|O_5?v2%s>@ʋhox=4]};lZN]L]LQmEM>WMv`ojj 5K2k)l[lGP4;AV ewEZ(-p[ tp7%#b0ɇBqlk )d[Sȶ?ƣw鵱PZM?68rOW\NX) lm{T}B?}d}M2iaf o ҈R%}W'8(T^S_yNu}5,) V{zsWĎ]`zm mM1]05*%w ]Fɪ'Rk}ng*Ө3 -]r0(r (ZXYHiA#s\1({0v|ކa(rՂT:JjP2e3AA(J}3ߛ)Mg΢]=NcLR.ZU+ [p95{a1]KK?>٬GPX{:v8>Hy(ŞF}wLP[npU$5XWO!r}a j_"84$4L4ѫN8 DL&D!731v>;$2L pxKSºDae KA2H9]%Q)^>hI A$ć A](>P*~+pV(Ll #D&uPk,pc֫ Vw `JNHQ0&ѤV=o4c#>6d^ش{6 k=څew/|ig!\I! iFpVA7$LRPQJES䬖cVYT4MRz9 2pc+bQݼDDKŃͫ%֝}/ݾ'7ou'2Ubz̦;L>E*t jfD5sPB*G@jR^)н,ʿrgK(2e|2 F2WQcd\7d(uGvR1z{Z^|O6s1OA TҨSWS׉IZɢ<|yGD 76%Ƶƞ7yv}v=w$kBDp"hl΄Ec&*}nM,Gča9tu9 y&nR9NpIs L&ΐUGǓ]3U8ד Tm} fH~%nV]ƅz\2Qָ#2 2цμjX2[b#9aiWq{ĽD0v{#+jB{<iDA'DNɘSR$UGhEX~IɡӃoq8hxoEfoخ(Oj˭ 4kXmhMpxla[X?8Rʩ꒟&g(@SbҚɠS"Hm.՚ÄȂ]+}[ӰiX4p+G*k#{~] 1n]|׳sƲ-Wm-*l|>}szz7Qbʧ;^g]{ެm}>[έOгWsUw~RZ.ZGykh +5`(˚hEsZ4^01{~:[;u/>yK͎u!!](wY)fKPT͉%^PP/KhnOO879Η{~_!Z߫SΛcQ[r[A6tw2/De5tt<}, P69ý>1{juꯑv-n:ykA b's;G1dN}{*n4}9%<%ڌ"U͋&Œ}7Ѵ7FX0_4>4Y̓|iM[WZY*:g*E%g}'I ^nϵd]qwܟmT\. ߮FbC'kZ\acnP)o\MXCw4%;L1nIGz'޸  wLV؉s^H5s$n= VfpR er>8C3B%*DpVA |61PPB9C%(A@ 2J!P| _&soAݒ[UpAcw(d"!Ġ/]ITg@)Xw}u:;liz$Jp=SRXDH\-p4,Tp7&bۉi}AakM6} ITUq2bMW^jSkZ{<rJԚj5.pXTQp\{LƗD}R$Z2(](H?JP$ A.T\\\\\[+#>٢߁Z3Ih3=4rB8)B@Ϣw1,8:8br\2B 1>D`0 DB4 DDvf~hf~h#Bgqt wHU Jz#!Io X,<,4pUoNwwzf+j=bS=PӶmzzo@c_cz L ͨΨRuS5= s-r6P~@8<P}9"tylf- }, 00' \%C1@{g i  Ci쿞99;O8"#wb]'4z{BD>({B`u&} `gTgA-ϩ>- 0lnkSu Ō~ݜoGғlj}HTRfTv6%NBD{*rɱ*^zQ5'3 4vS^V]Y4홖pOfݘ*D,adidӪ$JٿR) z]K[QawzF#l^ jϽ `|z~ܧ-sy>OL߉ش;Oc?M0g`l0<q\dNPdW@04Rnцk{(-lys-)-()ڏSzaHNva3%Z25TƢ+d?[Ud=Ȝ[gY v&C+L;OAQ缇O?;:owU}ONOcP(W} 'p9,fݖFH}:Z*mJRl=Y$U$&";t^DF:L 66ƴl=Л#+ά4`́rrQ1F;hKGW6a6=.7.GK4r$0$:ˡqKq>U3c_ d0nd;~pvG{zR}Y>e5WW |, n _ hWGF˧ >GoYdkoֳֶ;n;rG}qKU{PEW7T6Dm:mzl3_a07ο%(+UX|-˷qr!aq/OQ>Y` yQ7C='cߞ}{2رO&!~Npbs5ڼ0tV3>^3ˤћћ0iJ0hmHh?F0 TO+}.5EC̥љ;iPjOC՞= mI5'ЖTO/|C?G;?w~3E?->BٖS(AVY8hchUsK͠y8Qϳɲo΍G'ju~#փ~M)'S<+boӰNMc1~׃fS]o}qs?.T7T=Ĕ/BYױr T#i,c@?k2a;\.߈eCD†E@ր7!60rh ؚc봆B5p[FpQ[R42 Z#ӌ1HF03Aw8U>>7˞3b7L̯0]sI LW"@LI/DAqmY HM㋁^c!b`.ujӜv\r5{-ҕZn﷋Ol(8ԓJmBn LI -[\QMht !'2Llއܷ䭒bVq;DۑJ;$Eq"{fWJXVk_(w[c:$(87Vvrc;.g 6=}DEc)K-NfGwFH6=ON̋-uoSڞQ\͏eBX `3Tw', iJR, !<t8t n9>G+[YwYzR$W'V_i[w{FTBM*M*(Y?hj ;U%e=kuъ`k QyZ3-vu02\@q"J +J?xxxY2᮱JЂSE,Iypej{0 na] R}鞄peIy9V=I |a4$z0g&5釣5^!ZB&V3f@Kua4{;4;D١r]a]fP_4R=瑔~?.Gx8 !|imMr(\PHRJW?Ư ԏtFW+r 2Ek !@[vxUWuDe['7wFKW+lmIX XʉRNS1SQ*b9/eܫ䌊p2 kbl)LjS7rUZݷf9FĘ3ٗV59~ɩ]X;Y'NYmg7Zxde|m7$:GE Xz׼w$|wv66Y*z}~~yڹ۹Y,r:.1{QdÚ/6|.RB70;6;(7/05ZXdc9\C[oG&?BWhw+MDZ+PO5S%LL{e534kI !%hћAXTtp[@R'\ ٞtoh<4nq5ܬM8]E|i*Km?U~rXt.Eԩ'A4r܉W=%Ԭ8ʔH&~aC z@ǮjM-0r1TE8aԩ 4NXF]zϥѷ+g1-clzhjit| i-qo1|Ѹw<@ l PeʢO_lYj4h,:zƤ*&U)0J*wޭRxJ*wޭi[JՓsT:Wrw!HcQQOvQSxI-'ZN+'W njQ_٢Uv}epSCHg^6q%! 5^ou'ʔ4NGNw1ߘ2_9ߵ#?30-Z7=JlZ0({g]57n&i ?5478S^@>1HQA4>dzXr**%XU>E.eZ_&bSJ~(/.3*V-cZ<"ôa~i*ȆE* u=vo"iESV΀b. 0t9#!0 sLMA[NC N4+C92$!] &CBe0`2 2 eB>4 p{2U,),٪XX=!1og>8L/Hd9 סrK+r+ULLbb]3^qdI>Md})2\D QVDjg"3HWAԠ·fp앨,J 8˄oA\%ĂZ Hzvq,H_7G706634ϛTM=%֧5ݴ56_6TzѰ^?\j&.Z?Yv[]l6Ϝf_n%׉gZͭnV 5$)N2L4͋1};9Wb.s5yrɛLah@\Q5|4#y&ٹf9j@vp~3O\:%.d,ʡh1 4zMF)fS%h65 ͦF(W`q&h{{:u\/ij]H>:9\hV?jHU7*B f/ 5^uyGs9Ⱦ500X}Lo}an2aL5VPS_@WՂ sqv8KG25t?O49f9֜`4my8 ?NDaKl63ŊY_Y}ֆl|NoЖ$XQ{Evu#laf3f)1;c{Td^fv'v>xOzic.i1<5d6`2%4/j/iy㈩6vM^q2Зkת,w\ Xr7H2[d:Vm n3[30|4Kҕ;"߰q6*)&IpI*vo6CadFѧEH~4zB1Mݍ35~$z>4ٵNۏ4߱wo-poluci썭w>{mvyFvA8χY5Rjh䚭hؐF (Wz@,B#Ӑ.Fg:1A#w#HoSBr*Pnx ~rʭR҇uFgJ̹Ұ F}+e#U{4E—G7?_ҽy<%ѫ#ojñ0[H>0݊p~OX}[>_h5Fm.G^[Tk%oos|`Lvh#ѱ*pƟʧ OaoW9wbj7&b$hNĥv+MB @0<4΃b /T`,!_!7AzXrk5t> |f~`~sA=P)jNO==ՎA|ll$m&NMovNCЛ ?FFNjBDŖ(ds}ލ'LS~`ŷQܚ*:yJ##AՓIZ ͬC:]MY8654yrNum vo ]ZqĂ0hc ZwUbvYZ( 1T!9cQ8KQ#";YD(hE=Lmn]R{=2*Gq/RxmO!4Fj%pQȁf nvnv`T~;Fe4sꃝv>i`Cz} xNw=2SJxگh?#ͽMc"2[IM1-@=_=y!ȿZ@ty)Ag@/dW1]fۥXBʾLZ~yW&|{4߼ԹY<,q*iS6R"9GѻuƹF5sYtVt3y/)\n93̳ǍXQϒy[\mb6NSG ĵ;S&E͏Ȉ*!n'M-)KOmTҴ1#)*R6}ϗ ;Av^V{'χ>dwDxHdxHT"HMQ:0dKe8z 9: [&C=i%IO2ҲEh3^F?Q'1p |Ⱦzwkwo\:^#I[U R 2@Q~}$ ' _#YMXpJ螐P/y;Kg֊5+xkz:4_bɊ*d& k kP)r>1{=ߕ]#QӏB/{LMExs ,6f*, ^$|6Yx<Ϸr4{E&]fAל1F:ZcV C9Wv$:}<*|6Cc4||PM>U>^¢3DWG`-W/Dx |f3ΧI*Od8=2=SzJMsobnLORF][yF>8vRtGDdG><#N^F!]Xu1H߭v1O {H顺mC;jG|mnmzms,BRSyع4u]Ntژyao~]V{wk*rg^H?uG61؏XT39;%zqZh'ȩFo4IN:7jHU>S.M\j&lIx))ҬI@ X3h(ث( ;WHuY e[ɆgϸK `[@l=p5  G6 2:Das.'x;AZST)B8sF>^ 8{#Y|.0F" :{d"U,)U5H,5q |i-A>9`E㹒Zڤ*y=}!.Z9)2.Kld*FPˋxx]G#z' B]x!)S}n[v*~_~15 _j.+ZH%9,RԷ+@ zeΕeLn'Gx]@vQPZWZ7UvWī y99&vV?BĎ Q(Dg뼇87I`aFYօt;!1$f! =U'XO0ЌXTTΡUUV{D߀YdpCdѬTY[_=35cqj\g Ѻ==ZE*K K[}KJeKK6刵~Fz4b{};v$;,&7 Pُj8 15!XJaa#?jzP5eHa~*L2#o9 gΣa' 2 6? tƕ7%#*pKm"ҾȟZY5;#:ϤRϥc Pc!vݾ ~ f_P}AbIQ%샥=\c|t1f':d^jCF~[?'V8UݫN ~\ j'TWMB&&2"{.RC^73Yz1ea7Z??[OsԼ||0Wifg}ݜi-kGc-&+\1(5 }s;:F%ձrIaIƧ*h%$J hoC`n &Oۈ*:&7 ^ "2|[[Q:p\x61*tZfkoo!t\v v7ԞB>˱_6Z'[C;$A:czWWmf[P42W{^w Ý9dyTdJjXL_$[7ɖ}zie"]Q~v\=dC.=yٗFb; s#C_跇ih\¬$&3Qz`li`l=fM4)\k5ZmZ_UPި/T<9!U@nck.f,22כ9# f/%/{˴eUUm,ѳbD.Gj~Tm=µ3Cv`ebɀO󟴲m@]'s&9ݝ6NW*:ֽCѳ%u;E{לS92g)Ov6S'uu+ <@[&j[#G?W9 *W͓K>K U5Zې[URB7U(թ /xnyԡ&(wB2ۤ9(B*@Jc|,xeA2r@PAND>=yPȼRW1@#MO3YMHqgȩbibҌ |3ѩB(Rs%ʘaE1bQh+e!U1Pz9UPNc,'5OeY4Vѱ ?)T)Wy<@ ǥ͚/BʢHtzWg13Bs`~aC>~_-j~~x@H?Vv[ VJ$ H<$ITja)նu7$#ƇP62_7o1l2Ӎ덝J}JS{[f dG"Y6z\[ VDN ko/Gn̎rSw\ozLOÍB/ilV %&kEZE!=™x%W;l*Nu]hHf[?3Vre[V17T7v,N+ڳCmFtus sK6JZI A$/f)XJAdmb][zKڝS"F鑳ßiU?\}qM@kt|}`Fh~ੁ5U:85'r#} mDžG>#t^N_ߣj#Ȑc>m!c44G3_c̹_3rs6I돌<%y$KquuˣV {W۶B:{OlW=ΚSv}wӾgؿnjݬo-^?{϶]mkF'B5kQ}M:W XL\Yfx60:\۱61G[[]>c瑶NZakI<{+Y.$ R_'u+f↚W0j4Y+qS*fO8XF;ă āhBkM4Ә՟ԮGݯyV~dZ(T!X K~#*"%21MpM[ 7"Yr$dU.#3̋/,YF<+ޕ+z8!#1Nқs4f(#8@M9$-mg} (4SVO:*}i\JB Xwxgq@ŖTl Vqo%C2W;sh-Gs}\j:^@4^HNjhƋhk|qwt\㻔ѸxxZ::]IǵtƵ4^Mkhw-xm㵾x:nZ7qF:nDǍw 7@[i軍[}xoI4n"7z ;9z+X9ObAϗA?^ ?>=d`f(2.?23d{'~#Ƈr#ͬ6Z_]̱#qm+Qm5 ~g8kh~;b4cJk6HbwWc..P/}IR2I^lYpFfDŽ*nPq0.EP֦cP{H"V  D]{ w 9^ rL%^i]+&&KBR;l>^c 'ޱ:YO~zaY:whf_h_ڒUOSE^|E٧CBs1xQO]H ~KQx )@̎ e琽bη9:'vSVk?rOq|__s3vG{dIJ)nx^k #ߪ3+HO{~1;vMlBl}F.gzٱv}71:3G?̋dZ|+G""˴V0Z^kh"B[֘o_n6.;hh8JtYl}yKR#z1ܸS-֥&rk^\chip%|[7L),2 |5֙$f{^d8; o߯;`gUMҽ^Ol@Wa$@WKĒ);1*VWglWB 1DШB%bVL:ZPX2ѓȂBeKuMZ(U8:;+Rw<:N-ѥp-EߡӠPt*pYu:T3hd)U*U*JcԨخ^N*T I 9PX:ԨHZAW*.Ŋ.]Ub: uR.:u r(VHBuTQSH=ԩu4^EǫX" 5PP6"uԩ Pu@g7/u_hw]h7Hq`S pcj`k2T_"q"&Lv63=c?# }L".L0ďf?D5sOFH7;Q[Ylv65kSa `u(j?L;^1ǘ- sSg SA/3d'f2.{fU"[SK6)i;LY#/]JT]BfEd:f39h)y2?lHv^Gy-!3!g#] g ˬ=&lTzv s{z^°%0}fFb W4 Fq,m!Kѕ 4RwX`I@Ț+E2-W`uwc' @#h`3vtMLBU持4rwS#hs{Hጻ܇\ǰ*MBF]-FDE+բ]s[GrJCbDTX!CcJr==TIȟSir3ǢK砢+tЦ!AB&lKSܞ,PUp:kJgPy>YsZ>|A]\sRRMJ0@]WbKϯ|n_'?֋j_o~E]W{ o{R#50͏ S-@ .>IɀH=(v[jwoi6Χv0 kEv{ /J"'e2y|Vj"Jm1ۋ73[[OvIZN|^= wTV/NnJ.<'4HDU¾,Yl/] |%tBv!Ծ/e*Q' $\/-Dm&^hA Y4}85ɩRUnt^~x w 7=Fc/+=0>'T?yM/:S-XXb؅ ,L]mڊ|MpC־a:7 Su,y>ΤBvԊFEzQuVhӌqs:_{M<65It\ GOP >*&%D{`DN -dCg9Dx=g '8xOojl 1NmɟJ *Y|/ղedM/BKe^пL2䞒I2zZ_joNj[HP_݅t;4"^xK8FOYa}M"pϴnl#4n2Idx ͨ=e|ڼ ?a~V8~_TN%r6Il&ssBJi '%~b U}V򽞥 B`għE!o|]oo~ʾ@45ͻ xJ.Ϗ*9d]mpy6^tK6V zb~4^4c %ϯ;؛K+lΧW[bZFKmR."#UT6)Md>Z$|qY,'A,6 &C: ҸiШxj 6 EܸSy}AP'pO]02onި(Bk"TE`"l@EpaO=B[|jGT;%%)K1vɴ굥|I瑗HzH=PM>(?עQѾU\R94h6ʴNuRT:?89_Z묃mf/s=jW,Wo3^βo?33Ϛbmw:LG;._bM.Uw,UT!"=wwfl|> ]nPTtɶMQV  KpˆY"= θ8?p!||||ӗ=蓻1@iJZKF1P뇦`[l-ӚF6a/Sf*('6IHPy:>lLAQt]k? nQp B(F%vys{z)RaR*JRR럦\ͱ.塟sbb2]'Fh@W7~~t+z &'v7RYX}Ccwh?!nwMTQ\=#ahs>+s;s?RyopoU܏yG7Wp#7Ow%%0=s#(=nhxɨ '{/ys3/f;.Ax$)q?cJNmNR-H'`;C/@|%/x[]\Eqt^xk*$:xz}mH~u0@{Q@ٰ|*H-Q>oI:Lm &'I)? p(ádPN<(ypAσ6-3]];dRpCnxtt%qt)AEYwO=ǣIX%z,ܧD$%""#kiVi"2z}ѣH-'oGŦfѣ[ў}}Z4O>)8 Ԝ,y=Tqۄ gC~|6!#5LQo>g&ۜt͜g;;CT[*;f6Yy"*9q֑)G|ԩw7@[Ofp\efw.M`+Ӧ{*4DNSwnY83@1-q*5,QXddAe>@'qC\1ϊVkʂa%#2P@#K,} GD9*rr6KV*&Tf8-8_s r5#sHjb:,i1ԭ42HKd 2/߾2瞅;[*',4% D&]oIAbKbXx5M[S̘TΫzLK1XQcaMS;y JΟ̳ឋɩ<SZ pƿ6o;5ftxm ? R٘Y*췎D))Dfg8>Pe|#E"F(0 I F:{F2٘9NN%Ș(Y1&|Nq20' /sϽKwkq\a9/U])կH>W{L3Uv!+|o#.v^6kO;I,BN^o[vɾgSFQnOw4qحn+ck>n4OM}2*7L^UsGuzGDϜ_ڵNڎ۝d\u.ss>uܩ/($d="tpg6isW['=tcu0o}kX zX!{9 ʥ=j]Lw伜\j7CG6TJ'Z7 |~mڹpFj䡶Wsyj5fyƢ]dU7 Eg/J^#>ȯ\}dg"!L@M4-zf{u |MR:9T;nr'<0G8yYaOG~:΃uS ; vmȋЫ/ӷgϳ _0γ'S1MFX[X{d?u J~7VRocFgOI_քNRSwZc;sɏv:kgxoFXِ! &7g HLcĹY Ά3o"NM\| E\_43~0(7@ 7)pa  |K1 C VY|M'St(3 i ?D~NtG!DGa:+D#p}>-4S D+ @tOGtGмqVP r:-tNo(L6Ԅ*4I#q*4J,-~. x7 q~Mw dq$+*ZgX]mw/z {]b/ۙvӘi&^b^bzW+sF quPo}^?tw?ǟʴ 5ߡ@y}+mBh}ZoYa^I5t Z|V݇}w6e7==GF{hoh'DFr:!,gd57i" v&E3T7' /Zӓ "ЙI?[ﴁtrŒICl3fXe${+DhȳX9NCP)pBaᥑQ8|8r|rF $2ɢSIaQ_FD::tI@4|S# eBj颢﹖&hf&Hf,dޗxΧc4~1h"_eȰ|~ͿȻθ+hde4z'{o*ݮEiɠKDb5";4<cn~Pwl#>|Q"t][z3oۓn.---Wg?yOO5cQ 9C8 ӻ]:[nȷ*@cze 8Wyu0 O5H=H"* ȳq+7Gy4ȀȀȀȀQj#胭c@!{Bj"sd\EEEEX7 "УFaa? 1/CͶ"4rznQYsnz^ (0zm՘xl_P&}C.&^Xk]vUvP+x+Rണ=hܯfCԮZ1yA싍 QTߡCW%Yd,"D+!ir~~WM ПosƖG~L=7~>. 8npe-CBB1304!|Sxg \濹%qI_%8!txEõh$oݫ4At+&140"TX%D%E]Ԫ=N?6騙H;rh޺9D;6oT#4dnVطox@+xbQNt K:Dр/z1HߑTkLs_B##LS*nk.Yyݭ9o&nnМfL2?7vF"s9A{Z;Kߤ"oaS_EdˮW,qHLsL OsiҖ4m\wܚG\wqI53sRqc'-ƨ8Rwѽc=zdiѣiHc}ar4$LaH)n.͹ 4C#2qG|,49o|)򫓴C9&Q WhPM)ѹ;3查ABBWVcCi :jV15bxG[쟸5SqbohI99WӠ~Д $:H1': YlxO+Ip?Į`>#M#81rs]9 ­a_+q-ְ]'j@^|X> =&=$uP(ەs`+ʶRVV5yYb6I%''d|_wիj3Aݕ:Gˤ!m~hL Ѫzihu ucS?㜵q]}"R  [U^VH weMd:Mbz]; b8z̵uvg``oc |eb\ 7 z8qww۞Iy\`=flō>k?i/h;,xҗKKۖNvZ+ͺ\K(N[[&(RY̓]kQx{o}tUZVROW:Cp|\8\ƎBR B]0v qFn@$-8 Q ^D@T6Z79ֽ5Т52P[#5ꯘ.–hޒfi~wRLXF~&h~~ߴ-΀w?<;51` ,BP,9gw![;=Ȋ3HeêBӉHFatl Ly8/>yL3g")yLd"n0Ld4 E3O$xGf=HA#GR9&OWmQح1/+VWlX< qtVVB:lt1Os$NO+ԥ G(CPOP/BGZkUb-VcuȷǨm>fk5Ǚ^3<@p{YcL,R z_y:3zcƃ7UQݥ>w I}>=?7R[yL>,oʇtFi؋Iiv<=f[V_;磌{.Oi= yd= s߱,`sk*k?[-QsZ7VqZO_A1;W1եNV. @`[->c;'+wcxٱݲ4v=r{ґq)2vz7wpNXڸ!q{MƇq>89 cw>PXhV@ } }6l}6l}m>nӆ>>d,*db>8etJub Hx 9L:G*Kujȍx)0we n$t2t?SZP.JRTW*Jk}s___v\NA!yX~X'RtgpTԩͣP ܘjﴝ%8eRo#> f[Q#:umN:K(jŃY*+eIncHm$XYڢQqcB678mhx-FÍɁBAÓ Ć}yg&VvPv,ntlÑٸs\bwyd.<{>.-#bMg%mVG'Ջ ۢK SUF0nQ/SӋ؝Rw n[$b\ bwi,vޔΔMQEB4Fl9VunZt@V{(t'x mHZNZ#C7:F^+"K!vb\\q/su-TݾSG/kܗ*H{7,mLV}rwɁ!Z-Wj%@ XYj=Ʃq3Kt9/1Z]+u媘:bqڊӊͽZGa8m n,E.TAь1;$8ltuYtfvuW*jx܆k\ŕv.l],M`qsu-%}o=UMzc4[T~OHV*{d.S?!_˾-׋K8Wa͍q-9}$DvhBttng;-66b;ZݔӤgShSlF>&BPy ?Nx nCl-ɥIWE6Bnvk-6ߊ|[\4˓4vIͭfgNZ>mH@je41~ga|C_/8*MJqR%`QG%YiZ֖yؙ;b;mW̅`#eH٧zhyv#zl(]ms}QlXrv/KD)S~4.>>3 )n]5wn i=qMuk`U蠛Xio |$(5Q@CX_j`k#' Z=L:&. Nf L&J1/vAa%a֙>Կ." 7Ǧ;Ѥrmtt70C%nQFUhٛoTd A\wJ?'8 ,D⹱4rJnRrӐ4,Ӱ`NÂK_#B64E>hn@׃x?,4I(m@BQVUfmjM6vݕ~Y~C$FKBNe.w4?]$D:ex FIvdz%Hℼ7+H=۽ō[nqZ.B'rNlMZyl-J=+~/ zG8$m@0K6@c,`F'wY*VKYK&4֢cKzI2RF)%GuZ<1M망Il @llX=p_TbCCCCCcA6ǩD!zN &F6L_=*V_T$dGeNl?T' r`iշ^[O%dڏٵC[ I аzZbg\a7f9Sz>J7tF|'!`"fO}sԷV}'~b?f1W9_J6 G}3߿QjL9^J$rJ=pa^[['k4J_5>4q_p#ыo-32DH4w0IOS zV&ݙr>; oh7Ĭ:p!|e"J>LC0 Q 425*V S S Sil@+ƒ)ON>ҋ/& +*D@X7tc&I2:i}1L bp p >,ž t#T~ ]/`~'-FdL 2 tZsr 81r"<)x0&D^B#;PU!A|wB=a~c^oVCh7VOYi&}nTZuL=E?mӍP-~ m7Bsِ,@:HU*R9|b_*ڄnAJ1^AXDT QB큨BU@U*}q.*ʩOwjiz'c5c5EmZfř5U iie(ܘ-<}{3j#7b[1n~q'1b}"k/A,Njr:"?HT:r v frkѠ '\e~7}ֵ^N32D\z\#_7??PYD2o?[7qd{L#G|XY "D;ٸR_5W u>PNUr](Q>RZSY44qk`Mq=5lkc=ڽ40qOW'gl\b%p#Gȉ п0% !cdYB"5.R"0-hxdpC'PGO<*ѱ\ދީiͩKf ᄥ΢IΐsW$"tE"B{oKW3p.86it zAD{}. #}{7 Au2Dy"wDhNە!wSgPTGؕhCgR)A?G;>%ogg}0'`"gs냧\76nYGqM65]RUDeyTVuWu6666Ս-3ʯ$IN/͎(K 3l``k#fr4=Ҙ o5'[ӬFFٚfNDB4lllllZ,W 2,:R4lJzܝzF(@?Cr^ɐ@-8 F lz}/+8yƵ2`3,_!V).tXtHuCW!j jvmVcgt5~մFPkjhGg'kWOgό73Tuz[[FgG18p8L$ccEO|DB^HkbX+:9iƘ LČyO#} V}].ߍ eGI  tX~5J!YnpnaN - q-NCpwWcpMr5n ^^]X qpz5#DcICзOF> *BX q:cH,Pf>R.qB##"#(2J`.Dp"yEvF(QԵjzh4~+HWl9^~K^j:%̀9w3?*cb40~yހ.Hoxu8! hfWѪ3htZпAFEFFw+Ȩt.Fb;5XJ&atBm.ibd'Rq.rhw]@x". h' ' 0_oY +Z mũ%zλ9Z6_1z^Ies^2G\69jLd:L0az8zYAX^>xNiಪn%q q 0J%fc}_}%UWƉ(]b8%bi1.(FJ0V$B9ܔƺ/I%8Yt" r.80tBigk b '&1Tй=]=Egtr;pw7A*-RQꝊ~G,.ۥ7FBЂ[ -[8A9ݫ/אsAG [S(')ד/Ҝny뵏UZK? Q+b${LA^cM:ƻz=}vF{C)k ie!~~*ƃt-7Ue1;#m|D־Ӻ/2]y5cj7؂U]`A#X3x_t[x(pQ*V*j(i|߬@4_fo-PYk4CGXۧDz\k5ʾԎCϑ'͚Fѫ.NUVr^VC%|]dZFdDe[ &bkt[^\ @uD jGB<,|,&YjeT 7gcG{>4EMQxP;,mQqV QrwsAt!lprCۃ!-]b,];,v|FNgꆌ Od Aӆ*1G揢ke\pb?(8V]EwRƑ;>Y!zt4ӜS*G)oa$ɰuWjDHDa&쿉 >LQdGt &#MFD196>9ٞH?Å"39[((\ 3#`k2m%6JY: O >~mD69+K %MZW>mAcE8Voc'Dd\MBv/yՕ[wy&:lgQjҒ~F*ՌFAW+̲R43Xcb4 Ϡ ]k;9ZjYK~Z9hN#z^5 r{[,5ӊ&Gm)+!ct?.UtCͪF1VJF^d/*tCW; d `WΝrGG`)3z#Z1LmF#beA@13f f3JfC׏XNՁV"8 l=IH,+ieJ*'я=*;ZwD^L^]_¾".tc!A藺o_ʳٞ7ls U~FK[ݯ]wN#Ao! B(ưo9Db7]"Ren H^쓀|NkHE8!.)s:L$7#FěN3NqF . ط}+_ _^vzGzi=amN`GhLOgb|a 5oX5kXx kkuǬ`,< ϽET</ ,:eqѬBh)"P@T:NB$pϳ4DZ ;SQ0^D*l:wa͑71rP 2`Y`dv"F~o~h5_64y|7{bݣ_%*ʂ+I\9A9 ^A-j{ԠZx+cq6K{U7璷ubdVI{7zllv͗;hڍʶS#}n~&vG3;}=v;r DV7&v&!~W2!8P c2/L7xB;4vnb׍qN: "VitJ&!^+t(˝8{^Q;^Q5E^iƥ^Qгe_YF]Y⹈KDAxHGx]v`؁3vb<=f eV@,bV,VaX$0ց#?ہH ̄ 0 G(r_.؂QF ` h\%4[ aY%ȣP\X~kq`n,R(SPn,zZۯ=I[?w6lcqT~-^/o7cZ6GN>\>ѡwR;̡oܯ|5y[\( /j gGGM_fOײv'{>yz*3Ϫj|gX ^ċ`,7{k\!D:sʼn]lDmDm` ކgoó`coXwЛs$A!4 9u<4LR:0<_D/_nq>}>}>E4.|黗{"/Bᶻ0`P—;%1g,snTPs6:Nk,Dh\=~N]kM$toi4?ۗ é7B^}KdmFⳋ6Ec/䯙)?v͋#U5ëqa(jWV]!o?l>Y\<:? W dXwZYuu׈x:cمxT0L;J_cZeZoMq Yky(1̆7yf=ÚhrNLނV'U_#Fv_tu5K8֥ Z[—W8mͣZd~x6ann #B_sې]B|_!f!o oHۜqP-Iv$1FĶ#jbP𺪧ZTF6۱M  a=2l4ېFmLTΎkkt@P{uPGuP:mDZBh`| Tkl9ܝ3a;'=~=G u% ClI’+?,Jؐi b?}+gUF3q܋VU=BlEpRP7*dWvH5xhGZ4G ZK!4v c9^ćlɈqTh j 9?[f%+0F^̅Řh\؊s]LAǹd) ؈ `<a{!K8s)%qr:@\hJ:^E W* Ą.oYBݳKtijxVq \CWϵt޿ʳⳐG¾|Yx X$®UVVVMؑIDl^ǰH+h Ed4JFuSpXg >}oD`6>J)V"m%]$M8,lؚUiHXt Y6Z}T88+t=H#.7V}g ߞEV"aAÂt$vt#lG&iU [LXL92a32a;2ȄȄȌU@e =z?"I H"Hi ONC,uoŠ(FN_~aǰ#aؑ0,I0IX`}4 V?!FeBc'zo6Mshd $ [+1/LC83=2(.č 99b,kzL^QXf#~^AȃJNjen3|a"^d=JzP!#y$3XIseӃ2!.6ޑf屢跜J5\~Z%(e^KၨȃQ\/>Of4$L592q6rjD~)M|v+72^VGIwRg|kQ߫!iͮahcRU,8BAZrv*,hAgZpNѪ$_DZ1+v}mפ]^㻜c?M3|õ+6ڏVmU>^P~Uѫ?Ҳ:ϼc{ϏeuKhqpLjK͒>VHp[ uZ|[xωiÉ΁Ntc'A`-OBs;̝0X*M"XAr)f@6ih@?N"s4}q.M/RM5P"fͳYBAKɱN)hc.M,gpH(9O5tnQ|H5s&wCS9(M6hu$7~ : jsYd4.TPV)CJ35ߚj]EJč NeA)sؐkw6EU5X*Y =jyz{P>f U')!5Gi4޾Zn]m]BFrڛ r|:d=ekvW"IЭ "D4_)tdZT&Oq*8$q< 4N@N?#D$!u>ԇׇׇCB=h==x~Zvfu;(%R @XQ<艴rdcٟ ώ5|ȡLqȕ% axa,F8P&=p+b6C& H:&(dPiV"%1|O$'2臐xfN!-(gHG"j:B"!!tэ2A8"_w(iQ*aC%BB%0JJ֩|rr`ϱ56?˼0h9,4Lo>Ykhvr)j4c2+ctC^]T6C{oj̵Rsn6&yθ˘o0{@@r+XVs  I䀲~FZꗘA2~VRnZU-[=3t{9*xU|ލ,?kӍf--5u=?uxبLd ]cME҇(MC=05i#:Lj#a#nt Di"DiRB=4dvd~UbaՇ @ _Eb?1tCL ƶ|kۂxDKD:6\D^] xWV 2&vAM_w"@˸Y Aft.5htl̆Ho瑱HOtj:5]k2r#[tikqkgkokok!ſ4k!Mhu-FOt19?aW%b7VV60CN; ђɘEz "94rA"aDeR/U{>¸|~-Bb~q,M)P.d~ 2 <ݍN3N3:M`d%yhκq:e +Zf{\A'V˴? J"gW~%EY: 5Z(*7~q>Ǎs->xŌbN_Gb:^SRw1G_I-{?h g+ o7M^icJj߽Q+XR{cu~Py S3fOzfON'8xc+x. 3(HV@3tj[9 axE>9Q~<4y" ]`u ] PTR-O:͉%jp3_PQ@B UA|O'GS[V:`~R1^ԣ"22vE.^B".w#B|^EB ԣ#ɔ;R4ʕ݈Jոk-Ĉu@gܩN[4wcz?6LԀHVL`!dR^Ÿh7?V@o : $SH20bbV̫k!׹Z :7]/z=!nHֲdid n7s!ZZʈy@̶Ǎ۝A9NC^DL&OBJF +5G(9^1u1cQ<^2;07Q<'7QQvk?|_ 1J>%vâph=>N+#"}g"I{cA3mw ;.%s<y؅["qQ6Amw=ʫMFiix *?駺@Tj)e"khpQCjt!zbz^($;;d<9jfOЫlpϫÒ)g^Cu蹪i(LuLY!{AT&Q?++fAu:^yEeʍL[%ކK;cbuړVPU6%`8Q' ujJuj @)gOkxvc D uDoɱ f46 n`F@@Ȫkx9c99@N |;lnsz6_\v7}bMJ"Ρ#h@Ii&!n0zܚ! ^%F-}ΥIF&֤mގۼCk߄&m^at4a%]R\he2ͬa6̕$9{3\ZI_m-Js E `t^jm NގOBFQB;礬@Xpony 2uԚZ4rlW7텝etVOj5ȨּMX2#Gs<.7T+.x~Wf:}SkCWHsZ1dC}G<[٭rhޱp_vkNqK_-}(} w4r8Zt ͍2g-d9=ciN)]ڗut)kmml-׃Cl A[x/ +t<6tl$dv$AGIh$;`NFwW8?ժ&SѩTxNV\*:zJߑAW7]Kʭh+:>>qtu5gݎ'GA004&H9c8{c}sl+71F b0|!4rbH̿"b9D"8ΖM3F^fcM5a6lxȆ]~t삨B"ot#n!oA|v#;.D:Y[i3l\5xdtw'ytN0ۭp0yWrV Jӂۃ#yRTEu*C;:yh'{ؖ|GVri6_ܬ2Ө 'ez<:N ȳ/&P?+|l) S42#6F▾[Z*n@Q](,>suQ uʩ jXԥYS`Q]xgVoLf@f@f(k&{+sxN߱?yk\dsY eQi U'Hƨً֨ h P(KԣbU*='R9Tx'RW¯H_сFoar:4 ,,@HKdq.oҘ/"OqH:BA"# 12J|::-8:I6 +4|1Ѕ6Gm>rM͏!h_m臱Wx@l`Lr3IU6*-[{z)d9||6- m>?6\!ޝI^ m5MQ|%JB 5J cE;F/0ƢutDa.y"%m5Dwշmzqx\"Rߋ[n1BsTu}ݸ|' "6ډǝ?Z=`ɢD\hzB0brAb %1X ?P?Jt/Bd-JT4FnG˲WY~ >|/oq{V3br' Ϟ~|~x$ϕ8t>?0udT8S`x'shdrOKᒍ;H E!n KH|HHG0X Ib@ "Ɓ!`]r@p6> =gpB>rZaZimb"7ͨ/[̧̳56]_}۴ ;h3r#buc151|D-~Yu/3n81B9ݽß=}ϴ۴>z~)8C*1m_[튥ji,Z[+awG[E}fyHXKۯOwjƸP[gm<2{V쪻FqCf{GފbFA]g_`Wط4vv],hu7SeR0$EXrILŒҳ ވ}ʼn~u/]Cwf>H*0^;{Y dI*C(qf"tLo#2$@h=0#L^:+^fxEGAὈO{{a셠>`+C eH(M12l < ^62lrea+&XI&e(&ѥA#rAJ 0PnzT!-CDD@{'rؤ }sd%p ,DnuK❬x{ͭe4c]o~+d /)P8WN)8~eFFK?Fn6Yj~ƥXmzZwgU 5zeGO]Q|Vn#htƩ1^~#1AG|K0cvxZ@R[RʙtT1Odbȑ;NCOD!; ā8؟HAS&)P 3i}™瞤&g2rS\L\Le\uv~=(% F(+ìA Yј? 9MYʽok+YGK_hnsnlJ< u g= {s5$ 3p.%Q"# P@d=4ByE9Oʉ'0)k5t*bAޅt$),gz*<\e /ua 5/bFEB{9&pf0+ uzfZ.{LThm3^A& Q ll~~pmz]uB\NTu"ugkJ'rn`nLc:[aAZg3ͽ#˧P>@d0Y`,u4ff .?IEb*pXl@'39'6ۚ(q& n p`N KBX:Fgx̦420::Ki.Wv\Q.x&Z$JY ҭ,:OO׎;!*k?MPMj_'7wxvi$cUɄ-&uDӄ9hV 1 7mQPzz聽 = q|B N^rq*yń88rJSzD +q*Xvv7ym4:')(dtT2V#M4%ٝ!cB⩍z,α&5/.3I&Gc0+3XVC#Wqt<\dYoQ !Ei؞{l:F6g g<>Jݕ0+i] 3Jx+şBcԮW ?CPTAxEE0Gڵ]DMGSb:sNH+S!֪4I|%L:3Cov:|*{!ߙ~gu4.Tʄ> +ƻZ&\W{09(s9s:gMsK9/kk>m̲J|!e{` ZKhl]i\ vw;0{&l܇_%s`ܣF$?e_B='˥,JG[5-bمoCFPEMo bhQ B,A˒aLa8َ33Nqt>ֵΟ@Z?cSI? JI Fk 3--ƔZI\G ei]"KCd_Gc;^:~QwuovK71G]?;mtbbP!vE[:"<GҖrG" # =ƴx 6+(F&g#fͅ9O-/l4Oq6([? 4:":3g ]<{V帝r?/9n个8;/a_O=q+v?33y©[UN# ˛\F3]]h=B֋I;;GY֑VY C熨 [p~BEQ\5v3^|oމ[JÇS#A(FzӘ* sDΕ^?pq܄d  "Wܜ-Hl'+#)F@0OPhz}*m|(#r2mRƙ'qyѯǙc#gZYZ3 ?c l3H_whgxޫUL;Y눵뜏aoY+VZ{@{ojhAX}^JVLqYHߒ@|z ;ޭoy}ǭodk4٫mL?UTN߿0}ŧHs)7;NgqRB8~dP_Pd)YqvaY,Pb i'3>}0!4Ɵ,{]@{i[ kKi;{ 7'ŵStƀ(cc@'OpJ!IdYC*,T\\ͨR^Wq7:_'Ryb\ԯJym7^\~a TmZywD׌O|,Yc?K2{EӦF%L΀.IvqPH#!)]D&邸v#ӤXMag@ 0Q 09 V9Ui*)ځH*Fה2)@e2^wtd<<.-r(2sxQDeɥ(0't_<&5q9Ώ8y;I&w:`tSԧbԏbLO$xS7[v)Z}L/׳WǴ;˵:oЫݼM&:vvfvf+dW>[&-K>H&lAVw%yh!`]qdژ=F;NF9lƝ' '3O\"YYKW"ԲTRmқM& Au gX40@kuKoЧ=ZL;^gCK!{)ytTSY m6 u!) .:H ww'P.3 W!ezCarTC1&KG?K:QNNܫC= C3!+[d?@37nlo/bWE wϟigWEbjOZiS#ȩx|2_0d4;+HzO? aabbMp>n`h~5ƾ |h G\/E`ߖCoE _mGSc G2 7DOYkߦ]_Kl\Io'CO}+rU3`N2(EF%%+|58oIJ ")U#QRP$Hxt0ds&gU,]<,II99qS6s\x%]{ϫ h(6RtuXUSƠde!5T8íT` tU^E*bYŲe"A`s|W1L ‘,8Ⲁ䙅%@ʢQŞy*_ik54.QFex#VQوzHϳ_GkkRdtlQQ9وFtVkDe#j(Q?3}"~CMP%DI@{vv=I]Z"6Ԯ;[:o_[|Gg]S-L|zχ?1xgܦ\M7+)V < K\lU#ӵo.U{CT4ys55rbɥ2,\3G[]Ӻ^Sä ;@*kq=l_OGy؂s2$@LI%shcd57l9 sЙl4d%6Jxׇw7Jl +A.Ԃܖ(Vң^K% . 6Hlg\J/:4􍚥%f'hp/rcdIħf/~ՠwF9%wj,:Y6 ;k}=im]v,R? }D}Ŷ?{726|Bh!ɸ%Mim_ImZ}"Y~OwUfL7+y H^'`JqLtU@b٢+5Wh󽅡_DŽօOr$oki~{`Js[Wnl.)6/S쥑Eײٟҵ OZd t9_HzJ%w^d}oecpd4JIO*Nn\%2{Kh!33 f4wF<~7ޡ>c ml(wiihzdC錁LvӤSAՒ ZU2xVkweI ؄s*z 1Gd.Nd."}.`,i)sF?Y6*KNe)کȑF@J=ڪ (54rx:p5hFnJ(A)t zNcA=Gc"AE@҆TIlD%ۜ6&%m $ ܝjlDž\K l!~m׼Cm\f rʲ3tsxRHWہ'TDD9)i{fş=Uz4"Mޞ]e1OЗ@SEVp3)ο|Nye֙% P !H6ڴeBL ,6X>i ۚwniIOlrM~`s3PexR# =5J^C ҕf? 9M\vF'cKC%OjY W腢 My4:A$pU 'g \Qd1Ef{l(dPZB.|8YX/z^D^+{#EK/I/qt}+dslImydȪ h, ?Q\\ !t*|l9L5,&Uo@,YR7@klnMQh ~$g->k!k!k!k!ki&5dx˔Z)JJa0 AubdHۤHVxg=ctOAc=N+XMȷ;?D>RGIvZ v:Z,WI\F>W_ߢo׿Ɖڹtmq$jyt@nk#:5ʌF?Qj_E_e٤C~69ԻeIpK`psWw4e`5_ b+_X;' V80I^j *$F?"f$3:1[.-NtF$ReΝmSۍ#3+[pДjm2ߕآړ |}O_/oY|%)x[ >ilL Re1| [E\3L2k'6D4 mjMKmm1»#\P?Fpk8'W$JՒĎ9JlCW %5T]9#8d4yՅȫaȫVК9ZF <:P.VA"OG)klO=n f4:c\4"Jq*\t*#UA?>RXBG /"sI6O\K%&<@n/^MAv!2-ϤBJSbKuoNw8 5v !B&/lи#M`WtRz +7޼X)qllu*dҢЏi4rр H3in֒iWhǓ=QGW_M֋W=b776iI s=A5=qFךh([~M3 ~= |*EK.]_ e4[kD]=r%P*KFBnAndoC!<CidEOTt>dؚ )^q ynk?B"y$UYgitM+i5z1.71m}~ ؕѥs"LJ?ly02?|bhlwo'0^5k U)?r_gl<3Ȧ?}j߹90Hwwѷ}+;23h(7ԣEhѬasY["ccVyYdǬ\Рҕִ֏*?~̺C 8FtHR[5;%J:5wF@Do(~*t+ҭDʶ$8428F2/d"L 82ndȸ!qC @ 8Pߩ ,J@/_rn:%s] s 3pt,MR I4g{{ =pxdޠ`>d |㷯uUCPCPCBHSdYd٭]HB:f{"+H;U {d6OW:-#M:Y[_ezݣ0*76i#cbqinڤugb41wT&tw+ǡd7lų߫?܆/-%pޞ(\9[Jt8P<8]^OpneO`z'H's" /ܮ\$9΄+u և=?*yJ/y|'96ˣrGDQ2 t:4nMy$揄@mӂ4quhwI_ wm^L^.%]bwh[_b0L$@pYerr[lfK[!SP*ly_좙DIFX68%BDAQgZȡ A?e9s!h(i,BU#ٰaugi2tf֣;wrBA@qvy/ea7Z9iI<$a- f*D2NO?*4eRyCe7M 2ٰ: <"-,Kh5~Ӑ_NGF`^tӱSN^9taL9{t&,$Xh#(G7tta>Ȟ{@<ʞX b}&-!=?=\9<ʩҿzQʩMI};0ot2+t{Uk ݒMnK GICtcJMprPdE^FhYz4@()6]aZ-K&wMcC#Hίj<=}ZfGhυۛvTP}֮Yc:?6gwL:PC|XfHVVк3P~[vآ O{{7{ܰ"kCzǼ^{owg'H34vVΓ=_^zJs;QSj+pZ?_eѻ7+/=gS2C;S&TJYz1#34SM#3~iHLBb_ FKԙ= jN`f%&,I2h,$H)XZ"}II0Dҧ}jJ,&@i$I5hd-rZT5jhQq/k5}iXGGMg/mElsށlyW-I}Iu,[>q֔CLG*,z9յo OR>3p*}!I?A _I+ueD9F#UӁ{ =iT1n#+1藒.nL5vɖ~.vvI߅ A?L#tAWM {C'E*ßEΎ> OwoށFm6;OOըй7B#krlǾ~Sg;4MfumWO{%+l.& 3ЖΉm , 6g Z[s/[\W:,`AK˖6Ǵr7rlm$=y^Z)O%=}*^p՛6VmCMG ~>`9/ zwL t؁hdD:Ja+ozn) <,&v uM&`b vtZ6Ms൘OGQh4 է hqhzx;9~'˜ӫp^/ d/Zj{}}4?%)IwN*d&_:׫tĮ-N_ L"5cjU%zǃaKTHvȮ r)fi;1 ؽ2ElT?q*] 8rBP@(b *!bIw) Fώy&|Mp}O1!~'ow3#FbV]}2%T~7Y?2Kqes^ЖY7"< Yd Sg]|Αx2&nnڏ'&!q,pwRۻ?h5}с@ / XDRG"ѧ >L}c8ƜQAg,eJ/<y,2A˼(d2"zypCwjd{1W>ئ_igDQ6~!Ŏ$޾xс`Oݎ /n㶧8:uO4]']hіȚ74ў/,n 5Ȋg:w\jb^-/DWEi% M}&- tہDUjJ}~;#Zh{67 R(.86#pp"qqBx[?#J[oXM2r`=`N6ynVی|N5fW~]U|u(69r/}_McrO 2P1M2i̔LyH80@o1[.}{T]Dr8&'D4U݄`t +SU S53j" 3dgCHοp: }I$]\4_",}C@=߼;-BR' lS #zH0i׵ұ~H!'e"H#yFh@ Bӳ paH GVq%u2p%2W"p% E%JϯD4Lv:g Ssa *4kPYi֠Nu5ԬIU4xWyΦ*:B*Ϲtif!CN,]}:tէl S]XT[VI.m yGJͮgF߉D\.8Gs!\x ^r&W]__\5}p y9 sRe弬¼U:8[xÝeFE D;{q(#2 NoʁˈF8 (p陳8:_(ӰaI|, jx8-M:2]ED0=im6!!zB_(k V}PkA>[bSj(PʫSl4rlsvC1}>r #Op>PCݞ ZK5c!!BB 1b,L08F6 o909q90}6Q/KEޜ\ys*o.z t*A0A?Hw4L -O.rh,ݡ1΂@Ypqf( \Dڦ]!;/hC&&+~$šϼN]CSM4{I Qg0Vg |eL2u%H,CN5Y;H]dq˝a6voicgKO\tѺG^pugRU\&r,re=N ^pы>4֩=jZwx\nKm<f0.rs%0%8+A8k4} h%p)X` L ܁%8S WYIgOlW*p*aΤy4I⼙4 =z@|] =d!4zNj#,Xj0aW!XpU5pXsY}}Hf##A#-G J g9WC.\ʅk%]U]/MDd,(soҢ0hvƥC\6ԡQ͹9qseDbw~> vnި2MnƳګM]4;r vDc; %ȶWk~ D@ pX ,V?Xo ݪPoAS)69kc6)NSd}ORjHN@FnB}840SAMZg:å%bE#u@=Qj_a]޻U{0[TcWJ_>qk {ĭyL2nz<pqk\h^b<` m2YXm E[K >ƅ) ۠.^EYz;( m_{#-rwxƔHI~ViuwEވЎҿ=震\'ԏb/5q%-B̡T{/,af惊U]b(R0Io ! 4AZčˇ֓FFyHC˨ʁWn5\:1i ?n4rX~t6iĥ2[i4Y^ #PRmCtxg#<[Y9trfQQ.BuhUOe4.+  /_2Bɲ+kBz5Ahd2tۄ&:c"to&X{M`5kDj#lF{3mDi#LmD6Zq "qۮJ'%Y?W|Zj~;1g yy- v3v/j9?mhﲛk4ŋkn+%pj벦1V􋿸k8mhhe7SKbt{7Y\>Ɵ4o&E#,͎7~tsW,aWq]5Ra%3tgrݛDdɂ?2]dEA̧QDS KRDtEa5B6q>X~ J<wd |U==rePT/eQ1` i.D*D*)}1u2': !b=8㠦>FpVB]L8EgHzrLztl $dU 9>Fi R 4˴ \㭆Bt.,9 G:H%4֑iB BGߴ KC9 tKk,E#16v6ۣhd{6nid0\|Ȣ̥Fj'Νzhdc9h1H{_y $?U$?*hKS;MNQ__o/f({ZOBQT*|Rboס}&?kJġnlk3~z| Z΄*~;_Se/s~Nb%[(e&MqLT0HN+_c hjYpdK5~k`YSF[{{s1k\PgNVj>SE8vze'g(T[NoLoJ|zjS30d 6Ԅ-{Ħť,QB@_бhS* ̾qs ˾DIf*4"oM2hκ( yhѲ4H^-@AxK-[4[c{o3h@fy<4q&6d9@$NwL=L>b:O#+$(FIňIÂgtFǛ<`\j5.8sYb3~ C}*WAa;9X~*_K% $|9PeV^^9x$%I^LE/F9>.`N IR^ܜ8~T<@//uPH/R{(L`/d~#9r,LWӕUbGgSLِ-X K1D>K1*؈G=tQ([xy?rRa@"J H MK-1+N׋:-4F'Jorʰңԕ-gg fgJ^qr+0|~f^VB:&kh%ڮ݉Ϣ߇-!~;.ڭOw<^`|f}ݾ6c_n:vް=/^bg{m|kn*߫/Z4ucΎP\L6#Q&EmoY o :‹DxӘ{0}>[IPq dByBIgJcYB4 PԟOĠe}w8Vr靸W/X#>@w%yEg4C: RЇޓ[[8 ,mΰhI3$: shO4h,bzbx8!;l1:,F|9 Y S%@$/?ȫ)Ch.ӟڔ4xA˕}ar»BU[႖k> 3UcgiiM/kj6QDߠo׳G5k_qas[ҳc"GңÕprzP,mhY}A7tUs4N0?+QadMt1<ͼƼ~GƩZq9.zNl1T* FF߉nWC9 Fq$6#Z2};b͏-~^* 5>vao-z5ǚlcMqa`$3GsFcw/V<}~:bzo0}5پn$aCcW#:v}HW=֙\+z:iRˌYhA|#W\Sk ='-ղXup_𓖍 ckiiNdT%X$H,pD29"q()H^`f`0)۞ ȞdןA2t8L^G7v3OmSۼm﴾V6-[nj~W-#LmoEsD[ȥ< Kyr8Hr䖪m{ n{B0<~':kzvxl?1\;kӰeŋ*1%RpHpL8fJF7g/fǃKD6HOMIvA2 $0p6yi2 $l`LFDr|b^b:֡ض[u6kaa[hV\cs86g6xM/mE-: ~xة dr*Y%9.]!ɲ^nZ/kk>m̲JIogXӬCCv.#K}С!]D ZWPRK.w@ބ|lpSˉ=ϑ90բ^t ^;x5pvegj̓7pܪ[ U7VqW2S5lHU,X>@IGb2N9 5s1)dys>,!X 3ҋ$YnᔠڡݎS8Iw 47i]FD%[{<(N 5쵻S8mH$  RB Y;Y/Qk|_6e(Хf$@4,T ѭkl/%5vm07o(ho7iHХ^xJPWNJV\\+@WtYU|U1\#;#FL$w?l9R{3V;1,fkWkjkh=ے۾lgہ֎'h+M/Z׵к\x:o̗L5%oU_7l?m+>_'+ }j.bzōרw;b:SIm1u7ȩͤvd'gHK_"]thhynؐx%Pȇ5|(gCAOC@/o$Y.a$H$ȷ$ȹ$Y$T(i5P冩&/0Q*XTJ FE/@ן z90Ka'B$j -dʝ[TDl ( @IJ.u]+kłFЈeWV\dUuL! ?'OΝ;`#|+n%!|vN»H`qw )qp$5aqk ]j5]q,j{ӻ ?8L} |Y#=BuzC]{Vʤ}X.D" w"rꚝ&ÑشPnh." ۴귉/j6f?4c8ESV;L䈲8j9S:yr4rd>2F_nl8d :*gh~D;@Ȥ%%uH҄@]/N >RkcՁ z;=`3czN$J%¾DW&{LӊR3|\iVZjҭǭP^kiJ M YɡUVu +4_B+]-z*N%+x58~lt.Ksmgy9rJ>w9\k\g[{7+Y P}$c /@(Lc_1Riuz]7@oʴXv{MbxGHx\jcXV&FJyS9zc\Ү^պ3uK3yL455]9>8vWB\1jk9ٜg1gOijOjk}̕u}J[t;B #FMǍM$m}luGjy'3Luu~KLzۋ |Dz I8*w(idB':d;`℁NHcJZmy LeQIoeP^;TE̓q2,k19=w@XC ૞Rk\UBrHe኱MgArfA-ςT΂t΂ZpnGO/~(nj5ħ'fLzsǪb9dL>29hG<kXIYbAH hN":dD4I+\<=km1?דV5M;U\8T?lVҔEeSh5yAt;5g`wIMY&i&F+.=󭛖Bk9NDό:k4IMTOfex: +|3> ܆/m˼g[7s̵kvеG|{Gt{u䪵(S2a49~INnC8@$ A8ѨA4rs^'ܼ,% <ʥP67096$ \ik3r{tQo1\ Q=YZoj'?lrE{.ܹ犦hgYv9/>B *4,9]jTs ]y\gW>̻_ 97ztWwO >9DCnmZh]k-]P&uR.Zk9 qD}E:4ɜ&zQ-}$.ɞYr"N'bn02ú:*Q-A)b~ªKvqm6-l~]Gz$wsQeݼBk/^;[*ܛcvgGաV6 ε5j?W\, ѿߞ);؝( CukRN!㳉r6Lx=x Ժ~zӗϱj[WoJ75 0Kn)딨^N^xRil٥Lsi,6PQlX6Q`%k;.AĦA%95*Kvoa ;B]q")򈲡H" Aݐm&"聦sy @m=9Eln3s`e&b7E\nOp6N&ՎNT-[YܒEL] vbTBXOXUV7kkdꜟWО0 dO476!+į2'tjG; FC h$PiJo&6 y.u@9}FvqڦCn" 36#' 7@-H`,0d` SnѸ 4v$~ !K{3[OqXmChkAZB {xݟCm&_!ogB7OՃZvYWWkYj7BdQf3>q\dzs;oDNRn^X2guup9qK:#vLS}glLJVMCVNЍvXn"<A NB#uM8r'vg -cG2Ҁ҅~͸T]hl,Q:H‘2H@ ҟ,~"` L[j}omn%Cms^k^s9˜cEQ+?c=Ytu7ӯ6"[ K`w`h+L+ݧkV?u{ABZ#KeZZ[emwߦ] NùpnX_Ɖ%%/K>eP_DFXJ&zJ/ E\Q3Нv <Z]l+:\NӮҔs,Bl7q!q1ƊnLY#'  ' H_TSIwDYRKEh.ATRKEP.A)4:% '.'N9q 2T\.o=å.VXX\?՚`qe>Xrm KԓM4wsE+-5Ufibm*6ӝR! g˅='1m "Jdt.ovVsb=BlE4Qo3q$3< D;[&9ō'oտ}v U} N)!343T:`!s(#'Gz UkuuiT-B nC .uXr}x?/#j{!c$6PF"J8Q‘0G $ 0m\(m&4O5I)L3 3'6M 8$]dӘ $\!`*9 IxWX'eN ,T9 ѷ YOs9̃drfG9R:sفΟg+,_ x6x-/FQ9Y<vx}C[V0{^`v>!wؽ}mi2u'@j􇉛9dG#FYSRmV/'C\c L7]^c!boqĉb;ș$[$IF?Icfjiie#$iL^[FqpʼnZvеd.XÁ\>Cy-\s1fa7f+`M# 40 0Fn[%ĪDV{94 W$ *wooWҜwcO8 pOx)Se[(4"ztcz+uz;cq1sm7Gk X?FImt?֯оR7Mg6h2CqVۭpRm^W`ThZekQ3p˼i nә6yWڭxB  Dx5 #"YuvP?E'X΢ "NΔOj>q 9ƑpH˲ۄq,;O"e Ήq1-'IdaeNԚ6e%@c"Tshˊ̢s犰?!w{dz!\4׊r\ ;%E#{:N hF|6l6|WTn 2+bmKUX94Lcj8L#$ӐRI#K$$$AgIsg derCS_UCuǘ,wtTQ-%Q|kB0tUn@W]tUl0U0VuhU:Xo!$ɲ7C"˲[q}!]WrrϗʷE^̛ܬ/l&)޷Ya)MMeL壀إ t/Q6IOݨFz!5u=^8'LȆf<^y$S~W>~\̕ y$#""|DpI1藓6K"! W/{-7O+{ܛX4 ?(ovőąKڗ<}~Ș ś r$*\ür(h?9} "pLv= Ҧ,m؉Yr:c$$W`+wώ 0@Gd#;^2 #^-4-Lr!or!wr!mJbx:Ng9C8!{,tB8QcXAsҘNSiGJZHȞ )AR`{LEX'Ꝑ7N'IWUöqę*,NȟEsI"]DD:Q-H}{?R>z^v)~BidkkĤC>:ZDiid]A9&-18%h, ^18D )]TwLF 0e L֕>Fqv Y5[H{2e~W,sKDz-%n&c tMuvcx᧍Gk>nd<'?I'+Eq='ٚ\-K$?9MO{(K^^`7e* J"mIbG2J;$g a4UBS"dT$uIN`U3Z`L#υm8F$Bh*&ww*`'XHg9{!xelcSꪺ"Mzw=3Sc[}yuK;óݫ2OSSc4ϧ#Di?2o2f?So 3C?oDfF;?<`|f3A?[u+m. ({rBOSBLv(A͐RۃGQ;8;l #aRكH~&vݝ)v,rhd۠>y5B/A//b:x>_>B4X׶x霟y5_; ~Ե5Wu,W"m>orLpڕtޝ|+U˘5N.6Ms#Y_@7;[# R=H3(mkE}ҷ-{m<_^KӞ6fiϭ U;o7j7w9#5?SѴ74pP`pg?ݰ჆Fл G_O5vyk!7(}+>pİ@@sB;< p2`laL'ق Q{Ȝ K =6x )X)S`*OnKQ}_,9zs\Tc1*/h*h})v"*mhǼ 3LedL>dēO nE +rf|~jx`I^Gc%sic騒L/7J+Ꮿ\ O|%t_4?xZLj‡N>vO.}b:A#Ӭ# x =*3霂F ZL(h1ń ZL(h1ńB^]^?9 )لt>ɱuF_3`g.ogl42 ww]CZ]n#`<קj$X%i=Am0;_&R5WcAj({!e:[7بv 4*ݔl%_&I`?3&_m򩞕O::x_;6Cn٧kQdixzoS, L#(ɤP>Ѧѹ2U `& @6F??qk~eؿm$ $lvsḥec&#) rux#FЩސ )f7M`c~En9KFGaRfAVf-!=3p8-MIFYy y7#:IN4q›V`q.,{I?%Zow'{7sj;];ܴysg7sR.Q.T/W'{_],twr]+|:튷$}{tz\<;{b9׆kg5^_{KL}#s|]w~ķ73]lu{7\;Bu=Wx{xprrtyZvH۩v6Fkw@K_gi~'_A8 Y$'wzw?ܜ!ːLA=A$I-`W D5,,c@܍Fu-?6 79 ]Gw@* W;fi O@ؑ4\d ~8B;qx NQDo,qlѨ dS*g c˗Hr,,y"IrH/Nvf쨊fEPHc_TIc5>زq~tK0p9H˟AWUuZi}{ 2f]!;3h6id g|8}>m~c1ZNmxϵ}(/?Jys{|UYmYu\ K58/tVܾ^ICng묜xj0?I,R`sROgɒ'$˓c#ӱtG~u(o']  1&d04:;Zt=ȥ9Z쎚BPH*P; 0 X`3 ga5 sA Y|$O4HHd6@@@VH3!C%{<&s] .d)J \?9p?p<\JT*g_x-p}`[?[?}I'9}}ՓTi_W>G]~\ܣݦ.U]"[[Z  #,*ZoX-]e5Z\IW[ˬE=Ǫ 9A: "A:YR'E_"#΃R&5^f#gl:r:l0̎DϦ1]f6 GNlhLOt:Z@z =q]x\.Ǖs /7eسgu1>ǹ4/p,\2:Σqc99Χqc;..ׅǁEKp1$Y)M}'%]RDF6qFQ8aDZ] mT9 _h$¸?,Nܱ܅bMlOdU,Nu)ǺT$IؾS~{㋓@ViE?|˼zAtG@ ib͆(`ɻ+"q%}id^؅ɰt+ˇR bRּ\% VաU LUkԏW׽??jL4ԘXwM40?NEX0 |;J*XN*I2a?1ױgST]S:ܪkWQxN†s /G?k Us.!Φ:6 FH|}>JT6rn}lJv'srcWDႤ߰,N6Ek= JsE <)P0RƦ3R,ʾյA9OYH#9Dqx$NÀe[Ðtlk7zTkPu  lRc-ӷ)un8h|DhnỆ/9sXX wݚaM֍v#`OmΨa_+qld&x=Hk`Ɍa~XY>bve Gӑk3/-{A_/α^_J7+Eg td' *~*)DdTp=M9i*PO30P~*'TNzt/m޼0|J6 R )IBۜԄwO'"#n -Ԧf36S))r<)Boq Ʌm 7ra @p7 r!%zљcN.}hhj 'gMc0{9cxF{ey:66r6R+ˋ}MK9F,%_ۥ%c}s$׃#[|]Kzc+OoR,WvHFl.,˜%˹kљ/I_÷^-Y,WA[ٝ#Ǵ=x}93an4N푼}[{fOng'[ΗAGI'\&IQ3~yo-QK.b;X\iG=z<1Mw68|8|0Jh̗wܺh 2=sʀ\9ܞ >חlS/p!=?LV=|zֺ׺Zn-N{NƖ}@B?Jh\YWؑl{egj1xɉFv/}4EW勵}:q]g|%A*TM듎W-kTobq`r! 9<ufɨbѨ!R]8Jt4;6P3E#GP;v"Ή眨w"_Ή|9'-wr:N :b 0Λc3S[e_!~]2D.CMPjPT3h?x\T)K'<Vy:I%\;՞5F?tɐyg<_. (ܠLS&+3K) F9vhlW6Vd3S̅-^1n7x}g0ld{u&ڄ_>?,'ILjRD䁜cмGEZKůGJh&Z7wa4y`hEm#cMގ X%zY~ L/u|[L/0()^={|7rUhqO;_ڝƚng" _-}Ogn3%nT-J0?4DWkU9ͼT[ "2 ;d{swU ~ }yyYmN0{ԅ#D؇FȺiN:@5sL K*Tq<5z0mvP?XBRM9=@Y?wroD/Ѵd͜ěg>9u¼d޸]Of0o9´ϟmܮ;͜mh;[Ȍz"C~X{.*wcO{ qQ-ڿRqx*xz*9_z ,"&H-Awx[h l}o ȍmE=gH.4v&%ǵ=!Rɟ.,:A>tBBJ'¸J/F] +@VtY 4.] 3:uN 7:Ant ^N ?{hp"J@nm|:;J2qaaOaK`La݄;iZ$~VYK\=ƹB{Z;u% ęk%JSl%\Hv\7<uQ7<uQ7<ykCBc u9^OgRҕ8bd"ӭShLbdNFt$aS Db Q:tt.ƥ4/n}8t4rUq|K+h.u\@sBK+iEc"Tv]LEU4^Lkv 4qyR8ҼYXO:e96x9Wҹ+iqM4*7Ҽ+6ӫ;y;y:;yc [i^︁m4q=7Ҽֱ济h^븙济[h^븕济ӼqkӼ~w]%ߓw( QA4PNBz066ҳFWR{js7 Mձka6mk?G{֥Gj:>$ƚuEZ$MS#sÄk; 04wtQ~Vd5HAD⳶ֵxXG: XdѺO~I$Z?(ݻ܍ j9#07,42QGT\=~;(.D(JEp#S,W,?sqmRBy-.s*OF#o-̥%ffv6̟6f9Ό-'< Xw5xmvHHᰝ#B~%sAq [*s!IǸ6[Ii+IðjG $F]rvYk}ZN(,Na°!CY$@B~HԢ208    edȖej\nvi`1n'f!fN1rXR: 24WG\Sc`Mf 2 *Qr8; KBH0?rROѤlK'^(=莔˅Xta9-@ޥE#e7i8eä@$<<} ?Rtƣ@1, -@ФA(ixIl|Iْ% n4H4H4H4K )Hn]5'KMM mⓥPHPH_8liU{"&-`l|JѸܬ3 ZSmKěF! Fc!BNF Y .o9qk>."5o):mfh?ۚ=tpCY~ߡPҟ}֜ӟRp/W|M i t3L> ɒ H#H%1Y tJ-m)rz8;@ >-Z"CC :#"wt@pC!͛"E$.N?F3ivi4UDHq:Ϳ6 b4ў (ǫN T ²I16RPH!B!"2B )D(BB  )D(BB  )B q#A; 2ҒC!S PTB"2L;c*Sz}gE&6TMj``*Y : '9'_5C_qr2;taC;CZ<464,40ԟBLzNO-+d֊ _D>Vֶ,'$ohΖYy2k.##Rۖ܀}I+_vLһIZ{i tYZw$.H =V(Jk[V%m t5HQmˇ4H1c:N1c @[#SDjMu6`R,9|,1^k 퐴.e7I:Mz!IχjY& 䮇`tPifGswJk*J 8u@p4[(2Q(}2\h_B8OGb42pK> Q.r>p RWvKB?~7;kitӼ h\iv'/*x!Up k.gGE)I83Utt1XU*%4߰Ҹȱƅ4zkhlT9:Xng\誝LmIM3<.N>esZJ6+Bd3U .8bvL8>unp"2ĖerMG:-q sZA  yk #qF0ykϏ-Wu&ҳ{&ѮU8(7A)9!Tьhew{ȼՁZB%D*Gҵ <9Furh8h0B4q/-bhR늣e1d(Jh!F*䮄mX -rsF?i'[zM;c@ nwʼ;NxM ̻l-;ϸL.zMT$C rC1Tx nHD W2H敢B V`;~`ODeHlHEwF[m(π80ghASCNG\@D"FDJeӫ*y jI*\TKZH͝,uq$7uq?5RڧvfIjU0b<خV[qVc{Z@U*fF5V#t΢O=Aq@餆mjf[k9Ěg]fGa({b[^tvis/]ʗ>m=fXR~ힺZ+d 'wB %[l6*L[HC ɒEۏn,=g'DhNdx{u24%.vw;(δˉG4%1 t%x6ψhԖ1tM:qBQ,}Bt !8I4A͒' n$ޒzK- ' R( 3b9ӓsT;w( .uy@]{ƦWT!DRLHҔ'NT0at.: g^ʁ= 1ιZ$J"Qpcn9$5İh䰈 .9".\qc%_X!k,^TםR~gwdd}i T?RUn_Z)ap5I{'|3u񞐇Nm{xz~:iIxw(L}5h,߆kیw FhcmSG@\D WJ4MQi_ңyMdAQU9}>kHV`K,ɲ9E,Xѥ&9r#/5O1c@xi Hډ~-HC4GE<-R촫HP#ɕ6p;K5Yoc!IoT$[,NZ;4il=~h >Hn/_?^Z"hcr7NmyBd.;?i蹆^9M8+뽂Tx>}g{"6kpk bÂ..LJnƋ'C eK3]JpwK&Gߤt^G}ӕĈ8U {Zhi겠3xU`U@Kֆj߫CddVkQSS{wXH(40 H8ۼKdD8~>W\mjFԞCz<Șke䛗=B?YB{fm sg'*s.^ɯ+wʯ<ë$Z,,ݥ2ɯ{[Ic-4$ 57 9DT'd&xNe$? \Aǐ0\1^[^& $o],a@^)|sK?DVn%*YݯV#e\k؈g**/:聗pDJhhЫۗ}_66bCt-UvF 227byXX% kŀ  5s'o*E2@2@}2-Ǥ}2Їo=OJPp*)IE,٢4gnٶ0h@# JMGhf 39FwBGZ,u2Eխ܀{MܓiL7 ܗŭ=)ux鮶u)gW4f>syYk13N"#F':B^7?VHGӵijAq}:u:~:8M/2n1ow7Gx,2*>d9̜\ʏɥ̌>}L7K{XL$w&N@ԉBO&8 h<5<]`/}d'CXz{z@tDsWCvUƱ3FYT;v!`fX(GeiJ5^E/rdV"n2<ls6w{{7=~ls`rRvƿ#p]v Y,Է 3tVh]IWN706BHlκzKg'4?:xpprŸ]w2oG`>g ])Hվ>F3\]}bdyi3?l?s =YKSs otښfoTߪVډ}|2k̂WwZ/XYp lFҳỵ v/`' 6-hGq ._1ڄ9r~+|nsCׇ9bl7뉴._V&Yg%`ҭL+zNݏc~B3ޓm;G-C߫n{Vm_IտIԞN-Y}'|L;{{rϩ62uOn7\Ty6k %-=BP|YWchX%u?Z?[_|}e` 6"a!kc^[nGFpv;c 4Hf<@ $۠^ן*ٷѤh:4U8N|xqtw(,clOQPV]Rj锶'׏ZZuָàA~4|X"$]rje=h84s; /D74ҷ;҄g)y\-OC2yt29-sW8.@7%tk8.BZ4^dɋEj$KqR8ȵ+QS;6|9"/w\|N@4ny*7"c3PUPUס+7~ j9n7x|#=s+nC¿qͷ;.:w|rK]hƻh|i09vr>nT+Uv4_XCjߠZ:o-:ަkh|[4_O?sK?sGu t\HM4}:nqc зvlLJ4nu|D4~LǏ鸍m6'4N:t^@].C.chl RHWC+/hG RRG Ǩ]7tn?lVA#`32w] %ڬ35kԘ̀μd H6}n͇.pg+'9 z|o]gwoPog??+3+ LNQF燶'_|-|2$H:_\F-MTySU;0=p!yK =Q;GYenN.5损> X7\T}L9\h~lɉHJh5=SddGo5lUlҊWz+)&g5г敦i24h5Y+5dX@ uW㵯o4 OMg%D(YJ=ݗx%ne۲}j)*\iES/q^U.g!UbrTb䊃ؿت)4;,ggi%uGdAHo3cUA`Y 8fv=LjqPjH f%l@jJ6*uU}a@%H#D!J@+uӱYuB5d52:4Vpwisl ,(ꦙƩtnM )S7fZPi۲P{GP:PzAL+xW0J̹7֍82LCufg0qu琫M"Vaھ52sE4m]čauֳ[a6\Q&&̹r3{ȟ[t bHu=[ -Ӑ&1q,0)f#!xTy'ڢ\--x8Nk+^KH,Xmb1]5l@%h zp$ b%GIcE.F?ro،}2١!u+"&zxzy=/p}"eeR1{7FoeyMnsJT>b쐉`xO܍K9S˘dd-A -cZKPi2x1m &W+ ?ΊM:=+] Ldu!bٔ Ttg'YvL 4f g¼ɴL[Q_bȴצ-F?#~# a ͞]*`D9W>;Re 'ff(5v6_38q-i}ݟy6bƦ"ƙe1/2h jPteFo/2vN>UZ3 >,W2m}-<2m}'1)v-hr.fϋ@l*;jQr]*[E%D./3ş#sr:՟O#ۍw tcvȫNcڏ^A5k|Xm:9iEՅG#/Km m4_y|K<T19h:hlHa $Id!&}z7<|OWeRI d\T c^.BOXɴx_Gd:z %I_E|2r{S@ 7)AW0,9{mx&*T M&$V&LLS&LLPV&dS>Ra\2cV6)aR&bUEmP謫x Of 08ԕ&u y\?Z L[5 kLOD[g8mƊ.;\T*\*DivX3!.-Tաx _& sJ^e ͅ%$亄~иVo_huϫ4&gN[ѵǴZ8btJɟ;ɞ;)֙iTgBi;UvE*lTȬTPW*̗x*gsc2V ;)K J$יgBV2T<KٞV3)"VSTmmW2jikD-1[u*ao~c#3~/ MS xS{'Q=34S&tXLf ];M9&ܖLq:$g!j(+Z ksBl,H]0k:D/bF4朤O+3di ]uwX,C7u6P.jY*pVloH3=]G[hq<G!<al4[br:dq'u: HRe=qzE;;Fc{"=׿?7зû<05ֿחw.S*@Hc^,u>4x?1m;eԞhtv]jռՉUa_9Piصɡ$b0 ='*3) S̐9˼|\WM4̞FmGiVTaڊT*cpY;i^`ȗٽ@A'Aa ; v@8}g4y =sBlk($; D2b +]^*Jԁtz9?R` y*f m[]7T_eg񜷓&,`ٔB}ri{^"G<_9<$w  qdhq᮹ddlshL402ⱍwPXQ@>0Y :Z>TMsQd:c1@&baʜ6498#QGxEo}Ϫa&i#m6MFA= md>)o_հ˵%"M*9q]Cwe65ḞͫIbE53D&s: :uˈhP'lf8q< !6`"-SY7F;A; ZRZbZCQ~<97G؃=` U~~heXB3Mi ,~ vxi9hY?[աKVyL 2 k־RhA$ރh/nT7bɺ96ՏԹjX-R];'٫DVT657=V*q0'̝0͡O+/ qpM[$u`2x0&X+N51A^,Dy/#_IWZ%`]?`^ߵoWߴ f^.!ZYzͼa&48j}+s&p7|ڳEE^N3Cm7©$y ,ǖ=A|٨DipaqhdƀAV+ R@кlV𝚥H56W7eW$u~*Y͚BG}]$/E RkMƽO^k*z]KB_"zeVx).- Cn>Ia9YAjW#2϶lZa|HV|azCpā\;qyȊCEEodh$DE9uIuj_1rtH4~6aQT"\*ygy/smA M M;A&qciE\Pc.ed@QvG@/td8*woglz `&bT$ou9d:Zb]:Rb]`]u*@BKzOh|ʿmןЗ)/#9O_U,y1ݨ4Xsmf]k_Wk͓2w٧VkGH E3eb3~5U+i[3bsWy~fm7f0Fa`4jp֯?U )Of+ԩ'U+R_@xqW"įOqFZJJgW\FgW&裌,;~?eЄ;W*|a@ߋ[gWwJX^ՠkdVu )\XboGi"imEHnK\8:^۞Ҡhvk'vbUxlJnEq>Xb,KlXXe #3: Gxg1tĜXc]V#&;d鮽 b ܞ!t\$͞=@B8 a<`Üc;vZOoyh[̥PMİE8ͰGf5h=ӡa? R/@0x$[##aC<`H>8X>OU =@UP` 8 n R^/eM ыh aC4*HX\JB@oMex[$o1a59\c!p3?Le+4,J;kU};s_N̯|&W=# ߞˬуzs?vCF"9bcYjqQjswW }1x8h lx1ӼjM6 vxS,,BTGgSa=1SOp"fq"% B.cJXcK< !k̑hLbH?qRD&]H|0WB?$lK3h"^ȯ^(rd/9B`/dBS//w,abbOY Sb+1cI"ƻd6yںl'Mw{NU}Muv}Ӽ?4j(?n'pث \\=_SFi}nY+gX_VF)OPi7jZmVKkyo챂KۂBJ͡?]SXrCmz &L<-mol;|t;l)0sDEE&Cv[d(m7>I1g롷"#xiWd}ȑȡ#!WG[ޚa:>yZ~2,K !]rI`g]yH L%)I0I~6IL'7+Xp'wBwAYu 90qEfwDVWD7X/ i4Y14ﳅWe\<Η =U4xfȴshU5K=i,h,8ς΂΂΂΢ouXU?*b,x_* bO [CAf/+Q!v-UoQխʟ"pA 7ԽV[W=xt/~ h>80~;NܯSSR׆. UB[4?kQ>Q߬ԖkӆbmCF#k;qHDXVok4~#[Կ!M!;TWH;e+MgZCW_飕R*eRZ(uzF]K7)DuU=lV&nBV&qtҮmrW7;!)`]ѥ+|7++Se_&^3xϊW?sojvV&O'OeܴS t̉iS0fg!] ]节`(Jl(&zC*bP؉BD.fYThM˱ btf9tf9tf9LrQV+^DufCx(Vh_  kb Dg<ޮA Atσ <0@cwb "|*,~ČtdbA.]۩{I秐=fR"A/"!Edn`"mi O7;hϊ#Wj5[n&;WFOeq }9x(7b3j3lc_:׋%Kilk-'I4asL0s&yNԺ;8]OhE /٬n(PF?<5mz`  . ڵep1:W E X Á&8h#&8fq.lQn)( 0#FM2=f,?*`r(mQV^_Ba-ѯ'k5zKD;W&yUf ,urQ&(ͯQV+a|2t|G7i䓱qqq'ͯ׈֎n`8aIi\_w7 2|,Hx}hETY: <QTrԎՃz60KC*#Xk1֬3F=̱*L2ﯠ=`to,$@_wҿjjk;|}\zˁ}wЙ#?׉qS39>̭q7])9YV]6t8eʪ4Cd<,HGO3`E-Nࡍ]c&$єpƌX 9HAiP.4fj%5"jJx9Srd.Y o"HƜmX*vV}c{+ S?X\+wpl7z fS.K6>??@@AACBDCEDFEGFHGIHJIKJLKMLNMONPOQPRQSRTSUTVUWVXWYXZY[Z\[]\^]_^`_a`bacbdcedfegfhgihjikjlkmlnmonpoqprqsrtsutvuwvxwyxzy{z|{}|~}~f~01Y~ O\_   " & 0 3 : < > D  !!!!"!&!.!^!!"""""""")"+"H"a"e 12Y~Q^   & 0 2 9 < > D  !!!!"!&!.![!!"""""""")"+"H"`"dccsqcaD751߽m<*߫޼ޠuޅLP*,w   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`apcdhvnjtiqfukzbmll{>?dwox````0tT.TL6\ N.j > n B n ` 8 & L p $Z6NlL6h,bDp6 <6^$@x"T^jv(4@LX"v8DP\ht  " . : F R !&!r!~!!!!!!" "0"V"p"""# #8#v####$$>$|$$%*%t%%%&&<&|&'v'(*(<((() )&)^))****h********+++ +,+8+D+P+\+h+p++++++,,,,&,2,>,J,V,b,n,z,,,,,-<-H-T-`-l-x-------...(.b.n.z......./6/B/N/Z/f/r/~//000(040@0L0X011 11$101<1H1T1`1l1x1111111122\2h2t222222222223333(343@3L3X3d3p33404@4L4X4d4p4x4555X5566\677 7(7H7P7X7`7h7t7|77778 8888@8x88889*9~9::l:;;B;N;;<<\<<==T=\==>> >\>d>>>??2?^??@<@@@AAVAAABBBBBCC C~CCDDE4EFRFFFGGZGGHH$HvHHIIIZIbIjIvI~IJ JLJJJJKKKBKKKL:LFLLLLLLLLLLM:MBMJMMMN.NbNNNO*O6O>OOOOOPLPPPQ2Q>QJQzQQQQQQRR RPRRRS$S0S^SST*T6TTTTTTTU>UUUUUVV2VjVWWhWWXBXXYY Y(YlYYZHZZZZ[4[>[z[[[[[[[\\\P@!-1A#"&54632#"&5477654&#"#"&54632!!"&5463!2###ӕj{G##j|FddJ4&%55%&4p<######ӕjsFd##jsFdd%55%&44P8###8#P@@ %#"&546324632#"'&5@F22FF22F/!!/!!x2FF22FFF!//!  P@#"&554632#"&554632##/!!/##/!!/##$!//!##$!//!I@IM%#"&7#"'&5476633#"&7663366323663232##32###"&7#37!!'G!7!8!&8!F7!!'FF7!!'F!8!8!'7!G7!!'GT88P!//!!/@/!!/!//!p!//!p!//!!/p!//!@P`ENW%"'&'&'&54632&'&7676754632#"'&'&'&'#"&567676'&' ƀ/!+ U\k ~Rb/!!/[ /!!  ,:_qO\/!!/)#LA+<# e U.;!/%f l~kEY!//!Zk!/ 3&oƀCd!//!AbcL4Ue5P@ #/?#"&546324632#"&"32654&"32654&"&547632pꦦꦦꦦꦦpcccccc!/[%!/ꦦ:ꦦcccccccc/!!/![PP@ =7654&#"3277632#"''#"5477'&54632z|wcuSSuqttRib!!//! jniӕӒK}^O]SuuSSuVftRm/! !/ʶSojӕ~P@#"&554632##/!!/##$!//!P @67632#"'&'C !!/ /!!  /!6644!/P @#"&547&'4632 !!/ /!!  /!!/U@C'&'&'&54766'&546327676'&'&''#"'&&767i   < :/!!/: <  ġ %! HI ,    u !//! v    p B B P@4632!2#!#"&5!"&5463!/!!/@!//!/!!/!//!@!//!/!!/!//!@/!!/P@7&54632#"&5476s#F22FW##F##22FF2Ą #NP "&5463!2#!//!!//!/!!//!!/P@ %#"&54632@F22FF22Fx2FF22FFP`p@632#"&5476!!/ !!/)/! /!@ P@7632#"'&"3276'&PuuuucGGccGG uu uu`GppGGGP@%#"&5#"&547677632/!!/!/  !/P!//!1+/!! P/!P@$%2#!"&547654&#"#"&5432!//!!/^/!!/Ҡ/!!//!!^!//!ǍP@5"&54632654&#"#"&54632#"5463232654&0!//!ccc/!!/ꦦ.)/!!/ /!!/ccc!//!ꦰ(!//!P@"&54763232###"&5 !/+!/!//!/!!/0@/!!/!@/!!/!//!@P`@)2#!!2#"5463232654&#!"&5463!//!1/!!/ӕӕ!//!@/!!/p1!//!ӕ/!0!/P@#632#"547676324&#"326+.M !!/ [Ǔs. /!P@7#"&547!"&5463!2!!/g!//! !/ /! /!!//!h P@ 3"32654&"32654&%&'&54632#"54760cccc~uꦦu.)(ccccY uꦦu (Ǎ(P@##"5432#"&54732654&#"+.M !!/ [Ǔs /!煻P@a %#"&54632#"&54632@F22FF22FF22FF22Fx2FF22FF?2FF22FFP@a #"&54632&54632#"&5476@F22FF22F#F22FW#F2FF22FF#22FF2Ą #NP632#"'&54|!/)T)/!, /!+ff+!/ ,,P "&5463!2#2!&&5463!//!!//!!//!0!//!p/!!//!!//!!//!!/P#"&547&54632,!/)T)/!,," /!++!/ "P@!-#"&5432#"&5477654&#"#"&54632/!!/^/!!/^F22FF22F`!//!Ǎ^!//!Ǎ^2FF22FFP p@ >"32654&#"543232! !27632# ! !"`ꦦHHPmĦ!/ QaapꦦꦦHHpPmJ /!! ZaaQPP@!#"&54767632#"'&'' !!/,!!,/!! >0 /!j!/ CP@&32654&#!2654&#!2#!"&546cc@p@uJ?p!// cc ꦦu#>/!!/P@!2! ! #"'&# !276.!/+K/!!w :/!!KKշ!!/P@% !# !!"&5463 wK+!//!w  w++/!!/P@ !2#!!2#!!2#!"&546!//!!//!p!//!@!//@/!!//!!//!!//!!/P@!2#!!2#!#"&546!//!!//!/!!//@/!!//!!/!//!!/P@*%! ! #"'&# !27!"&5463!2~+K/!!w ϟ!//! !KKշ!!/rn/!!/!P@4632!4632#"&5!#"&5P/!!/ /!!//!!//!!/!//!!//!`!//!!//!@@ 4632#"&5/!!//!!/!//!`!//!P@463232654632#"P/!!//!!/!//!!//!P`@"4632632#"'#"&5P/!!/!!/: ,ִ/!!/!//!R/!!*"!//!P`@4632!2#!"&5P/!!/ !//!!/!//!/!!//!P@!%#"&54632632#"&5#"&/!!//!00!//!!/021l!//!!/**/!`!//!M'PP@7#"&546324632#"'/!!//!$/!!//!#,P!//!!/!//!`!/P@  ! ! ! pw  w++KKw  w+KK+P@32654&#%!2###"&546ӕ@1/!!//0ӕӠ !//!!/P@+%! ! #"''&5463265! !2j+KKմ/!!/!!w ഴKK+؞ !/!!/ wP`@'!2654&#%!2#"'#!#"&546@pAL\ /!+/!!//njA"!/)X!//!!/P@:7&54632676&'&&767632#"'&'&'&#"'&`/!+ U ~q /!&Abcbǁqכ!/%f ka!/LbcƀsP@"&5463!2#!#"&5!//!!//!H/!!//!!//!!/!//!PP@463232654632#"5P/!!/ꦦ/!!/!//!@!//!@HPP@%#"'&'&54632632 !!  /!55!/  !/../!oP0@163267632#"'&'#"'&'&546326!! DD!!/x!!!!w/!! DD)p/!v!/pPP@#632#"'#"&547&54632&!/ /!& &!/ /!&{"/!^b!//!!/"P@%#"&5&54632632/!!/- /!))!/ -P!//!!/!n!/!EPP@"&5463!2!2#!"&547!//!`!/!//!!//!!//!/!!//!P 0@!2##32#!"&546@!//!!//!!//@/!!/ /!!//!!/P`p@#"'&'&54632/!! /!! !/ @!/ P 0@#!"&54633#"&5463!20/!!//!!//!@!/!//!!//!!//Pp@#"&547632#"'(!/ D++D /!(_/!!!!/` "&5463!2#!//!!//!/!!//!!/P@4632#"''&P/!!/! !/!/P` "32654&#"5432#"&5ꦦHH/!!/ꦦꦦHH !//!PB %2654&#"67632#"54632ꦦH/!!/ꦦꦦH!//!P `!2#"5432#"'&#"3276!/Hқ/!pꦖo/!!HH%!/cꦦbPB 4&#"3264632#"5432ꦦꦦ/!!/H0ꦦh!//!>HHP`$&'&#"2#"5432#!3276 XuuX!/HH/!XulsXuuXs/!!HH!/sXu_P @#2# 32###"&5#"&546335!//!!//!/!!/P!//!P@/!!/RcFGcP@"DC@P@"DtP"DP"DP"DiP@"DgPp` D"32654&&'&#"#"&55#"543267632#!327632#"ꦦXuuX/!!/H1##1H/!Xul!/ꦦꦦsXuuXs(X!//!XHH1881!/sXu_/!!P  `"FxP@"HC@P@"HtP"HP"Hi@"CR@"tY")"<iOP@ 3"32654&'&5463276#"5432'&'&67ꦦ" /!.%A4CHOGhAꦦꦦ:!/%?O@PyHHQ@P`"QP@"RC@P@"RtP"RP"RP"RiP@p` %#"&54632"&5463!2##"&54632D;));;));\!//!!//!;));;)););;));;[/!!//!!/);;));;P`/&#"326547632#"'#"&5477&5432]a|Aa|@U!!/Yo运X!!/YoH~B|aA|EU/! YoX/! YHP`@"XC@P`@"Xt@P`"XP`"XiyP @"\t[P B $32654&#"5632#"'#"&54632ꦦꦦH/!!//!!/2ꦦ!//!!//!P "\iQ@` 4632#"&5/!!//!!/!//!@!//!P#"''#"&5477632(/!!/( (!/~~/!( P"''&546327632(/!!/( (!/~~/!( P "&5463!2#!//!!//!/!!//!!/P463232654632#"&P/!!/^BB_/!!/Y^!//!!//!!//!i@GP@ #"&54632@F22FF22FQ2FF22FFP@ #"&54632'"32654&vSTvvTSv*;;*);;wTvvTSvv;)*;;*);P 0M"76723277632#"&54762!l#/!E!/P=Gcf5$( IN&!/ 3/!(8*ctP,Gq#"'&54632327632#"'&#"Zz^/! /B8,Y{^/! /B9)P^ !/0#P^ !/0P@%"'&54767632"'&54767632'%[  '%[  $$  =$$  =QH1 #"''&5463232654&#"&54763Ec;7[#/!N!//!!/CJU8YYy6&!/ 0 /!p "&5463!2#!//! !//!/!!//!!/ "&5463!2#!//!!//!/!!//!!/xu@#"'&547632u;)>?#b_);:ps# xu@4632#"&5476'&x;)>?#b_);:ps# xu?74632#"&5476'&x;)>?#b_);:ps# PB'#"'&547632#"'&547632M;)>?#b_[;)>?#b_);:ps# );:ps# PB'4632#"&5476'&%4632#"&5476'&;)>?#b_;)>?#b_);:ps# );:ps# P@'%4632#"&5476'&%4632#"&5476'&;)>?#b_;)>?#b_);:ps# );:ps# P!@!"&5463!4632!2#!#"'&5!//!@/!!/@!//!!!/!!/!//!p/!!/  PP!@3%!"&5463!4632!2#!!2#!#"'&5!"&5463!//!@/!!/@!//!@!//!!!!//! /!!/!//!p/!!//!!/p  /!!/0 #"&54632cccc cccP #%#"&54632#"&54632#"&54632@F22FF22FF22FF22F F22FF22Fx2FF22FF22FF22FF22FF22FFP_67632#"'&'&54Z !!//!!  V /!CB!/ P_#"&547&54632  !!//!!  /- /!!/ (p@2#"&5476!/$!/@/!^/!P@-463!2#!!2#!32###"&55#"&5463@/!!//!!//!!//!/!!/!//!!//!!//!!//!!/!//!/!!/P@[&'3&54632#"'&'&#"!2#!!2#!!7632#!"&54767#"&54633&&'#"&5463ꦦu/!!Gcc"E!//!"!//! ></!/ M !!/Vk!//!lc!//!D4KKu !/$Fc--Nf/!!/2/!!/x(/! /!/!!/3/!!/P@CU32654&##! ###"&5463!254632!#"&'&#"!2765&'%&'&547#؆.[$GJp*** ̜/!!//!!( uhc.[$G>z0ӕ(/"%FccJ[ !//!!/k!//!p!/* uh(/"%FcZFP@72#!!2#!!27632! ! #"'&# !//!D!//!m.a !/+K/!!a./!!/'))'/!!/t`/!!KKշ!!/atP @'3A7#"&546324632#"'#"&54632%"32654&"&5463!2#/!!//!$/!!//!#, ꦦꦦpccc]!//!!//!P!//!!/!//!`!/VꦦJcccc/!!//!!/Px@c7,C0P@ +"32654&#"5432&'&#"#"&5476763 ꦦH_U!/ix*ꦦꦦpHH/!!!ZPP@3"&54767632#'!/ - !! - /!uEE/!  o!/sP P@!2#"&5!#"&546`!//!!/@/!!//@/!!//!0!//!!/P P@!2#!"&547&5463!2#!!//!./ /!`!//!JM/!!//!!//!!/P "&5463!2#!//! !//!/!!//!!/P 32###"'&'&54632676!//!n !!  /!!  /!!/  !/  P@` 3"32654&!"32654&#"&5463267632#"'&cccccc]uꦦuuꦦuccccccccuꦦuuꦦuR% &-"'&'&'&'&#"'&'4632676763! !!4 NCQrK+/!!! 5 OBQ{B+/"* c=5\6@*/* Ec>4W6@*/GqU#aaPQ#PP#!P$@ 54632#"&5 32###"&5#"&546335! #"&54p/!!//!!/!//!/!!/P!//!P|;));!//!@!//!P/!/! ` /!j!/ CPp@`w@0#"&54776327!2#!!2#!!2#!"&546R !/!!/!//!!//!p!//!@!///!/! p/!!//!!//!!//!!/@/#"&547763274632!4632#"&5!#"&5R !/!!/P/!!/ /!!//!!//!!//!/! !//!!//!`!//!!//!Y@#"&547763274632#"&5R !/!!/Q/!!//!!//!/! !//!`!//!@'#"&5477632 ! ! ! R !/!!/0w  w++KK/!/! 0w  w+KK+@)#"&5477632#"&5&54632632R !/!!//!!/- /!))!/ -/!/! !//!!/!n!/!E@E#"&54776322#!"&54633&'&! 32#!"&54632! R !/!!/@!//! !//!KKդ!//! !//!/!/! /!!//!!/")KK+)"/!!//!!/w  w @ )54632#"&5#"&5477632#"&54632#"&54632,/!!//!!/ !/!!/G;));;));;));;));!//!@!//!h/!/! );;));;));;));;PP@$P@%P@663!2#!#"&5P/!!//!/!!/!//!!/!//!PP@P@(PP@=P@+P@"2o@@@,P`@.PP@7#"&54767632#"'&' !!/,!!,/!! 1 /!j!/ P@0PP@1P@ +2#!"&54632#!"&54632#!&'&54767`!//!@!//!!//!@!//!p!//!  @/!!//!!/`/!!//!!//!!/!!P@2P@!2#"&5!#"&546!//!!//!!//@/!`!//!P!//!!/P@3P@!2#!!2#!"&547&5463`!//!3!//!@!/  /!@/!!//!!//!!/P@7P@<P@167654'&4632#"&55$'&76% ֞֠֟/!!//!!/vnjwFwǍv!//!SS!//!S  PP@;PP@/4632463267654632#"&5&'&P/!!/o/!!/p/!!//!!/֞!//!pnjpj!//!p!//!pl!//! P@5%2#!"&54633&'&! 32#!"&54632! !//! !//!KKդ!//! !//!/!!//!!/")KK+)"/!!//!!/w  wD %4632#"&5#"&54632#"&54632/!!//!!/<;));;));;));;));!//!`!//!);;));;));;));;P 1#"&54632#"&54632#"&5&54632632;));;));;));;));/!!/- /!))!/ -0);;));;));;));;!//!!/!n!/!EPP@3C7'&'&#"3276#"5432767632#"'&'#"&5477632 IuꦦuI'<H<&F!!//!! !/!!/ffnGuꦦuH6G<HH7/!!/6=!/'-'uuX!/sXuu'c&7k!//!6$ /!1'uuX /!7Xuu'P `#&54632632#"'#"&547 /!/LL/!/ { /!..!/ @!/%U%/!VV!/#W#/!P P`/4632#"&5&'&463246326765/!!//!!/֞/!!/o/!!/p!//!pl!//! !//!pnjpj!//!pPP`746323265&54632#"'#"&5676323265/!!/uSSu/!! ӕooӥ !!/uSSu !//!HSuuSa#!/ {ӆӕ? /!SuuS %4632#"&5#"&54632#"&54632/!!//!!/<;));;));;));;));!//!@!//!);;));;));;));;P`"iyP@ '#"5432%"32654&#"&5477632HHЦꦦO !/!!/0HHꦦꦦ/!/! P`@+!"5463232654632#"&5477632X/!!/ӕ/!!/ !/!!/1!//!ӕ!//!/!/! PP@7G46323265&54632#"'#"&5676323265#"&5477632/!!/uSSu/!! ӕooӥ !!/uSSuE !/!!/ !//!HSuuSa#!/ {ӆӕ? /!SuuSP/!/!  "&5463!2#!//!!//!/!!//!!/I"BBxu@#"'&547632m_b#?>); #sp:;)P @ #/AMY#"&546324632#"&"32654&"32654&"&547676324632#"&"32654&pꦦꦦꦦꦦpcccccc!/[!!/ꦦꦦcccꦦ:ꦦcccccccc/!/![ꦦccccG@@&'&54767632'(Z 2%# 0G@'&'&54767632&'&54767632'(Z 2'(Z 2%# 0%# 0P@"BP XP Q( P0@5AM2#"&54762#"&54632#"'&#"3276#"&54632%"32654&!/ B!!/ H"oꦖo"PkwwkO릦릦owww@/!d/!"`ꦦ`" GwwF 릦xwwwwP@%/4632327632#"&55#"&547654&#"cc/!!!/J`c .!/ 9/!!/Pcc8/!//!Gc%/!!!//!P@P`!327632#"5432#!%5&#"htl!/HH/!0ttr_/!!HH!/rrPA'3?[2#"&5476#"&5#"&547677632"32654&"32654&'&'&54632#"&5476!/ B+!/ M   ;UU;;UU;PppPPpp FddF TwwU@/!d)/!p0OT<;UU;.*1.2O.4O.D.F.G.H.I.ML.R.T.W.Y.ZK.\..O.O.O.O.O...................q.b.lV/&Z/*i/2Z/4q/7/8/9/:/</D/E/F/G/H/I/M#/R/T/W/Y/ZK/\o/s/Z/b/J/i/C////////////////////////}/f/lV0MC1MO2$}262729}2:2; 2< 2=2M2}2}2}2}2}2}2[2 2gl2il2o3$3-P373;3<3=3M 3=333-353333m_3o47u49}4:4< 4M]4 5-57595<5D5F5G5H5Mj5R5T55555555555555555555l6MM6\666lE7$7&B7*a7-7274Y767D7F7G7H7IB7J 7M7P47QJ7R7S 7T7U7Vw7W7X7Yh7Z7[w7\n7]7X7h7`7A7P7A777i7R7i7a7R7R7*77Q7m77777*77Q777Q7Q7`7Q77h7h77o7Q77U7^77f7h7l7m7n#7o7p7qC7r8ME9$9&9*9-*9294969D=9F 9G=9H=9I9J=9M9P9R=9S=9T=9U9V`9W9Z9[9\9]9999999999999999=9=9]9|9=919~9=9=9]9|9(9=9=9]9|9=999y9l#9m9nQ9ou9pQ9rQ:$i:&:*:-A:2:4:6:Dz:F\:Gz:Hz:I:Jz:M":P:Rz:Sz:Tz:U:V}:W:Z:[:\:]:a:a:I:a:x:B:Y::::::::z:z:z::z:z:N:\:z:z:z:z:d:z:z:z::z:z::::l[:m*:o*;&>;*t;2\;4\;F;I;M{;W;Y];Z8;\;;;;\;;;\;;;;;;lC<$<&`<*`<-?<2~<4~<6<DV<F^<G^<H^<Ic<JY<M7<PX<Q<R?<SX<TJ<Ub<V}<W<X<Y<ZZ<[`<\`<]`<?<^<^<^<^<^<^<`<<~<~<~<~<~<~<^<^<}<<}<<^<U<^<^<}<}<^<^<^<}<<}<^<<<<<`<<<f<h<l<m<n4<o<p<q<r=&?=*?=2]=4]=D=F=G=H=I=M=R=T=W=Y^=Z9=\?=?==]=]=]=]=]=================?==lCBBD7D9D:`D<DIDMDWDYD\DDDDDDleE$E7E9E:`E;E<E=EIEM9EWEYE[E\E]EEEEEEEEEEEEEleF7F9F&*v24IfM0W~YZ\6w4\lZ&*24FMHYZ[\lF&*24FMJYAZ[\lF&*24FMQYAZ[\lF&*24FMLYAZ[\lF,MlM9lM1l,Ml$7!9;B\lH7f9:`oYoZo\ool>p7p9dp<pMVppluqM>qqor7Tr@TFIKNsPsR2     !"#$'(+,-/13g579;=?AoCEIKMsOQSE*&EEJ= * C 7 C Co = *7 !*"#$%'&()+.,-. 024i6C8:$<>@A#BD$F0I8J K%L*NoPRvh)+,y@)BFINPRT{+,E+,#,8+#,g>R%o+,9>?EMOQRS#r+,;>?EMOQRS&+,W42?EMOQS6E  .&#*$!'(,+,5@F&IKNePeRe95tT   tx"t$%'T()T,&-4T6IJL+(,e>L!N!P!RQ2y+*,C12?@2AEQFM2NqO2PqQ2RqST2~+,H'&     w x!"#|$'(+,-/13A48579;=?AICEH(IJ&KMMOQSE*&EE|o  C i $ coCivci||c !C"=#$%R'&( )P,-.00204i68C:co@cBcD$FcI,JVKELoNPCRnnw+ 1?7@AOEFnIKM/NnO/PnQ/RnSTT|+,E?&@TEFIKNsPsRsG((o+,9@F(IKNgPgRg+ ,P+ ,b&+,b42?EE&&+(,V@F&IKNePeReQ2y+,C12?@2AEQFM2NqO2PqQ2RqST2***+,;1?*@EM*NO*PQ*RS*T)+,eB*LLlLl+,>-7l?lClSl+,e___ ~+,P- 4?AES5&% s||   | ||}s|| t!|"#x$'|(+,-/13485|7|9|;|=|?|@)AEBCEFIH'IJ%KMNOPQRTC6#CC   .   !"#*$!%'(,)+,-.024568:<>@BDFIJKLNPRz4954 T   tx"t$%'T()T+,&-4T6>BIJLRl-06-((+,>-7-?LC-E'J0SLqqq2qqy,C@qFqIqKqNqPqRq++ ,e,`51+ >R+%,b?EMOQS.*+,b>R7~+.,H?MOQSI,IIh8+#,Z7?ChSGGGg,97?CgS} + ,v>R+ ,E?S'+,E>'R'u6~+!,96?MOQSJJ Jjnj,<-7 >?ACjInRS        +$ > ? R S        +- ,E ? S       &  + ,> >& ? A R& S       %  + ,M ? S    + ,V ? S+*,V,9?AS&m+-,V1&?@AeEFIKM&NeO&PeQ&ReST&nn+-,@1n?@nAEnM/NnO/PnQ/RnSTn+$,P>?~RS~|+ ,E?S,+,V>?RS{+,E>?@RS*&3+8,H6 ?AS+&,>6?SVVVVVv+5,H-77>?vCVRSv+1,;?S,H>5?vAvR5Sv+1?MOQS+1,9?S,>>!?R!S+1>?AMOQRS++,\1?@EMOQST         +) ,E > ?s R Ss!!!!!!!!/!!!x!+!,B!1!>!?!@!B!E!Mp!Op!Qp!R!S!T"""""""",H">"?"R"S#|########+ #,@#?#S$$$$$$$#$+$,Y$>$?$R$S%%%%%%%4%,E%>%?%R%S&&u&&&+!&?&S''n'J''J''J'''/''j'+',<'-'>/'@/'I'R/(r(((({((((+(,M(>(?(A[(R(S)))))+),E)?)As)S*+*,N,,,,,>,R-------,U-1-?-@-E-Mc-Oc-Qc-S-T...........t.+.,>.1.>/.?.@.E.Ml.Ol.Ql.R/.S.T////+*/,T/?/S0+&0,911V11V11V11/11v1,H1-722222%2+22222222 2 2 2 2222222222222222222 2!2"2#2$2'2(2+2,2-2/2123`2527292;2=2?2Ah2C2E2H'2I2J%2K2Ml2O 2Q2Sv3E3t3333*33&3E3E33=3e3V3o3 3 3 03 V3 P33*3 373i33\3o3J33*33i3P3o333 3! 3"C3#03$93% 3'&3(3)*3+ 3,3-3.3032034i363873:7303@3B3DC3F73IE3JV3KE3Lc3N3PC3R44n4J4 4J44J444 444j4?44+4,4-457474A 4C4I55C55555'555#5C55C5(55#55C5C5 #5 #5 5 C5 C5C5'5f5C5#5C5#5#5C55C55C5C5C5C505 C5!C5"#5#C5$ 5%5'C5(5)C5+5,45-'5.C50C52C54C56585:C5C5@5B5D5FC5IC5J5KC5L#5N5P5R666H66H66 6H6666g66k66g666,96-67 6?6A6Cg6E%6I6S777777G7g7(7o7@7F(7I7K7Ng7Pg7Rg88888888?'8A8E 8S999999E9e9&9m9@9F&9I9K9Ne9Pe9Re:::/::::::+:?:A:E:S;;;;;;E;&;&;;+/;,V;@&;F&;I;K;Ne;Pe;Re<<<<<,9<?<A<S====> =R >>>>>>>>> > &>>>>>>#">$>'>(%>+>,>5>?>I>K>S???????? ??4???T?(???? ? ? ? ? ?????????????????? ?!?"4?#?$?%?'T?(?)?+2?,&?-?.?0?2?4?6?8?:?<?>?@?B?D?F?Is?J?K?L?N?P?R@@@@E@@E@@@E@@@e@E@@e@+@,V@-@7@?@A@Ce@SAAAAA4AAA'A ATAAA"TA,&A-sA8A@ADBBBBBBeB,VB?BABSCCqCCqCC2CqCqCyC@qCFqCIqCKqCNqCPqCRqDDDDD+D?vDAvDSvEEEE+2E,eF|FFFFFFFF+ F,9F>F?FRFSGhGGGGqGG GG|G+G,EG>G?GRGSHHHHH HH'H+H,VH?HB(HSIILIILIIIlIILIIlIII+$I,>I-I7lI>I?lIClIRISlJJJJJJJ)JJ+J,EJ?JB*JSKKLKKLKKKlKKLKKlKKK+$K,>K-K7lK>K?lKClKRKSlLLLLLLL+L,EL?LSMyMM*MM*M*M*M*MMM*M*M+M,;M-*M66MJNNnNNnNnNnNnNNNnNNNNNnNnN+N,@N-nN7nN?NCnNSOyOO*OO*O*O*O*OOO*O*O+O,;O-*O66OJPPnPPnPnPnPnPPPnPPPPPnPnP+P,@P-nP7nP?PCnPSQyQQ*QQ*Q*Q*Q*QQQ*Q*Q+Q,;Q-*Q66QJRRRnRRRnRnRnRnRRRRnRRRRR R &RRnRnRRRRR#"R$R'R(%R+R,R-nR5R7nR?RCnRIRKRSSSSSSSSSSS4SSSTSSSS S S S S SSSSSSSSSSSSSSSSSS S!S"4S#S$S%S'TS(S)S+&S,&S-S.S0S2S4S6S8S:S<S>S@SBSDSFSIsSJSKSLSNSPSRTTVTTVTTTVTTVTTVTTvT,HT-7T7T?vTCVTSv2\ \el \   L \ \    >  4 "N p p  4& Copyright (c) 2011, Johan Aakerlund (aajohan@gmail.com), with Reserved Font Name "Comfortaa"ComfortaaRegularJohanAakerlund: Comfortaa: 2008Version 2.001Comfortaa-RegularJohan AakerlundThis Font Software is licensed under the SIL Open Font License, Version 1.1.http://scripts.sil.org/OFLCopyright (c) 2011, Johan Aakerlund (aajohan@gmail.com), with Reserved Font Name "Comfortaa"ComfortaaRegularJohanAakerlund: Comfortaa: 2008Version 2.001Comfortaa-RegularJohan AakerlundThis Font Software is licensed under the SIL Open Font License, Version 1.1.http://scripts.sil.org/OFL'V  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_NULLuni00B2uni00B3uni00B9uni02C9 commaaccentlirapesetaEuro afii61352uniF001uniF002AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacutetonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii00208 underscoredbl quotereversedminutesecond exclamdbluni203Euni207F afii61248 afii61289 estimated oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbse orthogonal intersection equivalence afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098uni0492uni0493uni0496uni0497uni049Auni049Buni049Cuni049Duni04A2uni04A3uni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B8uni04B9uni04BAuni04BBuni04D8 afii10846uni04E8uni04E9WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveuni0259 ,latnkernB`fNTZd l  4BTZdj|*<FDjp    & , 2 < F P Z l r x ~  : L ^ p  ( . 4 : D J P b t  , f p p ~  J $>DDJlrx~>b`f8Nl2L|f|"8Nl 2$.h,2<NTbhz,$=BBDLN]$4Kjry~*,,.;=S7M9C:7fR92     !"#$'(+,-/13g579;=?AoCEIKMsOQ+.A#++8+#>R%+>R#+>R +(>L!N!P!R+>'&     w x!"#|$'(+,-/13A48579;=?AICEH(IJ&KMMOQ+ ?7+?&E++ &+42?E+(++++ +4?AES5>&% s||   | ||}s|| t!|"#x$'|(+,-/13485|7|9|;|=|?|AECEH'IJ%KMOQ6  .#*$!'(,+,5IK z44 +6>BR06((+E'J0+ 51+ >R+%.*+>R7+.,8+#} + >R+ '+>'R' u6~+!6>R&+>&R&%+++*+-|+ ,+>R{+>@R*&3+86 +&6+5>R>5R5+1+1>!R!+1>R+++)>R/+>R>R|+ #+>R4>Ru+!/+>/@/R/r{+>R++>R+>/R/+*+&/<%+     !"#$'(+,-/13`579;=?AhCEH'IJ%KMlO Qt+   ?+,577A CI(+6E%?'E /+?E+/> R  (+26+'++2|+ >Rhq +>R '+B()+B*+$>R+y+66  &#"$'(%+,5IK+&6vedo-2025.5.3/vedo/fonts/Glasgo.npz000066400000000000000000004532321474667405700167750ustar00rootroot00000000000000PK!HVefont.npyeV}xUB B =n-SNHDADPQX(EAP,YYTX =ߝDu}Ν;3w{rN0`bn ʘgIȒNɝnܩ{r9%%|3Dzh>oovs]'/JWoIM9{9%nڬ3KS9o)-+K녍^fȧ]#DZpGJ Gk1y`wc|zGam&M ?4@ u]څcpSt&Sq8_>՘5M8=nQuᖿ=Qn%VHć#N[<]5)+N[)da[^vuMx:{q͖e=Y ˶3lg$Ylv;/8ڬ?Z9|n]/4Kn~qWv)\~sѢ1`fBm}vd}m>ۖ[ t>Mwε5KuS(?k["%S ?\%T84ZTD}ϓ|6_sywϧ=o =w;Ew;FMZuuF} Ȉ3!B͠!8al:^,m-l H0ZA&B'A6Fv!F#d#lt GV7$;I5z@vLaN7za1B1A5C3@7B0A42 [^1:=3PQu1 heAL>F1a6Fc:GC4JK}8 wd w|dݦX1%v$'9dP,;6[7 P|TvMqgy?W%_X(k\lqs<`~+? Mfcvw3N[ ѹ=ST*^ix Qj:p-Q;xpq_'SC몯:^q+;nPC^TjUV{͍vkmW\>/V<oQppo`O_#=qkQ0Y Z誵ЊQ2C B= dClŶ40`(4F) fz4:kY @ VPH'n}Z x⡓j 1 :`hbt hEE{t=%2ݿ nhu.?@ t 3 9={&ZY΢㍄?Ξ–,lm pzi7R}p!_?@C`8̻Pih+_dkyu)zͺn`By݅sMEW1B|+т ^O)\?|),4+?_&ibdRy@tLs}RR';`ЭebyFl NYz< }c~ 2VNO);À x6BMJدz1No»i>qg"\$NJ֪^M.Gn#TUSOn0X[ŸR*ƨ [9ykPi adk5ۙ'ʮB*WRrLc5ES='΋oD)jY6Gz.kR!.':O>k,%`;Ad1%O)W:ANz9P~j?|;˝|xw#>>Nܩ7?;w7y$~Cn_Lj6=-p-ƻB<e;T[^UKVufVhסwtwZ/f{&|<-{ߟ |uBf`TI 4'Siث7ޥXb2V~$+p${ MU~>qj_xhdiU #]T4tc>c(> (c҄qLȩ433gAN7fC2@6nc!o6J ø3j=(9Ԙ r.ޕN.,3n3n5B.^ yK K;; AXyq7rcJ*mڃȕ@15V^cl'k@16A?hl16A>h< aȭ86QqZ;?!wB0vA13vCk K'pu`ȁ{OB69{7oGA| l3>9`>`>`< c> ,yqI58>iSE {< %!3^|UW'ps:7qxЧB6ހ>m }8}x Q6imJhǍ `\.EsAkZg _ĵ]3?Ƈ \9|z#CCW eĶB~ i ::Ӹi|i\4>4D/ gyDCxYM5Gkl/Dn&rA~[E'lXl}xqŸX[>Dh4г ևVf su]4sp>X,k/S Bp~^+c ]X ۱&9Y|>$ g-BYff:5g2˷;Csj'ÎbMARX5~T*[U`--r<'_b ~yI~$?Kغ  wWSb? dA}OfϛwZyk[dmm}̧E|Fˀh(v[$k5vEN[}$>/'QgSv*qZvاdޔbAzZpX_r9I-Nj7\O3?^޳[󭅸m1 0/:'恢E%btϖ8;Ŝd6oš{<_.P}իoAg eTm(.(,AA!E~1e_"!_dr<%+vUc5 ePEtq%yXdL:' H-P{jzT[5wnOв*P}dSϪ&Umf{Nv!y# {=T/9n;=F t}h|jڣX) &Q@ O M&juoIT P( D{:IiT6pHM=)f[RG{ɋmI&K6%_bwS;:xIv_1hD.5B:*@F(S]| RuJ'm]jzT-M@dQ>DuC&O}(3P\p\4uqZϫly5"*ETj 0r[ 5 P Ck2(RГAr!{C/}ANsCA@ J>FPƱBh@|zD* R*Ȋ ɠ}DB>]7 XFKAJhCTњ yd]hD*TM#Z5 Sρ:52 ]t* 5 B 5 ysA@U9-* S%mBA/"r(IZK o*CNHMZ$HVZq2PhXh»0s WC%UhZȺ \kҴk z~D@l3Q-xmzh׃D4 #hm|~=⑱**GvRS2MvCtj#hcxן$u `=Q"KGAQg1C"]!Bw A RS@N@>ODs @po_]I4l%ѱ [g _&2Z#,g: 9r}[^ O* OHpRME|!||4)TZ>7^*ZucEsބd_ ( m_q<'|?K%}DAP;U7U '.Oϑa v\ܯJT/J?Y6ox?T:0C_&?dKy"t8k|VΓEccY{0IIL;Gl!fY/':M̦o)}_>rNU>fةqyc 6.3ͧB -Ss9lko`Įmf" 6ugg5]l-0/Ciw[q^7ܺfORKg fK_(3-T'(|03p?Ο_ 25YuesB-fovĩ[Y ;NoNfM 6lM1) &98\H?M 4 Gd  G`8节.6*ѿ {3A #(2zW1r&# MHz@ }GJoX\lӦ_GBn~>dџB|l]H1eY F~)EZRe)EWhF)dCao5#[0К3Ixw?ÿRyDk{<3D6GHL3р L$`n2<r/ÐChD &j0 >HyWa3a ;fiTᾰШrVQh/xg n (*U5T.208 l/2Z%xVuS}U#grY2{rjgK*^i*#+wT4Ԛ /CCB1UvyYTo1"37,P]T/q-1i"C0? <xxX`ˎo1879 ?13ʵ޵C1ngvs5a6Mfgm&7: Od-5/U O%oxjr/jK| [⾍cW_ fWه*;dmPvy̶(ժqY2Kĝ1rE1;Ʃ-s) ,~1vGgn(X$MCWMᦻ}Ӳwm\w=RWyR <],\=ꪜ/G\+_WT^0w͊oe`SɡzA>PR>Oۧ-TY{}溽 c[rݚ_-3)jV:#k_|9V~L'9Yv[: ?G'L%~ w5!7M RLMWCGBtÏ>^un;۽X7m~ª4Vb=nuNi\s1ֵSEє&Ẕ21ˏ!;ֱ v,X2-h"_?Y k rh>+Ѕ^BYwuGJtuYd`g"=fz ̰NBj>-| nV!b? #mQL-m !QC䋻d]j O|Z3q8,c -ٔ蘍ٔ긙L0RV 3QJ)8K}> B aCBm@/Y#BpIBy7%! qڟ0{zr/SБ6ڿ}AJwG8cd»? ᳧!c:r>sN^i_< OY@OY^>h [igUS 7k$l)Fcl."{ro.ʗq??TvCa?fs焳^I6ŃG}\ @\KGQ*3霺=VpIij.W;6Y|7]#Eu jQ\j_: \ ϥ+47%NJ# 赂nIUH}% Ѷ[nJ 9 Zn?y/Xt9-+VYjpa7xQq2g10c°}ҍ ]//D|YYyCnYo蔭Ee4 0}p6b>sC1vzb5Ճ>} Ճz0^S= kzmau嵎iސq )֐bk iF` JU6$ Uut-1ckӰԉ$J%Q-S $I4 D@vhz'(MWU D ^Tǔe"a_ЉKZ")1H4IIKd[8QJ.{"d%R-"cD'}O$H=mmK\"%trsP]p}-WA.0 ]pl&ʼе`@VrYGދrvNfn`uBɶ2qtNlKa2WxdHdb/,e|,oɮW1cǪ3v sU5uW+k&U!`ϲ>3ϝN$;b6 [v;;Mqe/2}u!9yټ`+XWY);žŵuӲZ Zql-U tiU{FݧKQTRX 6ؚemGm Z\{~.ԫj=<+3{ᮼ"}yʲp%`FE7&뽼$RqT1/W+ˏ#Z.lCᇫhtNNC6 E5/nz< zĒz&БP~Y@э"h] #u_G w@~UNSBIŒ8rwۅh~!ER^.*\Nœr% n܃5r5уZ|kuh½U7X 2uNeFx{iAawV]zlc3 mFU0 NjVw Z}#TwU*еF6=n*`jzݸ[A5*g|Cp>pA6༯[`{9g>3˱E2k^OO"^M/p]b7vu)S f6{gTzJmUJ}'sx1%EY*[ /o!r&| 3 ,uV)#.&7D:\s^.+>~4D5XI_)@,il\x[SCՈCVc d#M<RVk"XmI چgU)4.v*˻{)NQ eAL fp轮/ V 2?{ú{>X=^tE=>T1oBgFo9'e`v`Y4;vɉػ=K1 \ ßA>_l#?/K2vl5{߼Ũw[n;މ{ `S_.u>.򉋳.~{a;+WL >L'mZP)o=O+GKOWg/< EzQ(ѾM %&DFmryѭXϻ% t.4OWrXV[H=~4H!6B#Dw]>t4d ?X{—K~軁1P?ď5rV Pd E;4[ gMgWoBhلh/Nh6f%lY MkCNZ[bL!&]}=8OO(ښbBekMٚHk :yۚfwyzn~q֍\ߑ;Cj#9tɾw(Nv4@#Ii^O^O3_~ u\oG.;V3f,쓼]i_{y&?z5fÀ>{O`+^G|{3[{x+ѼWM+Jz[ug ۭb#̙(b|Z^Wwxu>q} NFL{ӧb|GeQ)^拉88LVueMp*7Xr[8Ηag&Ags9(- |Vz+|[|]>ecR:e% +Q̟c޳ n jn Zj<粑_cu޳}#V\WT/ qorUe~k}蔹Zod߫Fe6&\_g9č\~>v *zY `ڂ^ngY3GjgX1M n(eKD6 w4*&,ABxB/!+ ;ѐofܸD&F@jEkHM1KЄ%!xn#-)H$Ob9hڔ-MkCCB2dddddddd8 ɰ ;(pFFF_ *d pWjbB:95J$f\\, W{P'79ɡD1 ɨ>rWt({䣭] 'DmPEL YW:[mA~S4HWH1!bC6ՃTb$Xb96My)dSmM~H}|]hB~O1?~SO?E}&C̸ROy]@s3t\'25݉DtROhb rx n[SS{ ɻ|8-jڪN-0jZWG괺Z哟%?nw9nCiuD+_ի˰?B`A%Qо6 ̕F'EQnZu 4D'TJ=·zt0?ȏƹzkG$!.h;8:+q9n!Z=²zesKk/v ԆzszI($Z?V{j1yOm:wI}_##VVyHN(ڜk~eְ;ayy,[ÿ˯b ?=diRjͣ U'Gt@溃q::g m4g_^<òD ǓҸ:^5ή,VPߕxtnĖK.^2l) תRA$w F7μ.K<>ww6HIrhU}zƺWc*h[)`.ď|,eYN{f+'55;:mòYhZuejbh#Py={c҃7XэŐ TIo4飿Ty-ɳl0mh8e4z`h荔yFUxⴤBnКrz+g7/?ݛ2qئiКbC^vxP"H8N2[]4@{A TD҃P!^Դ7Kөd8.焌HHq c诔c,H\X~cko\(XCT>MEɔL4c2rh@gCSٸzRɦT6fSij6ɦDT6)%M)) 9:4J#74#HҚ{}^߾[CZ+ѷq旡dkҐm Y-ͣPEkuvsIem쏱eÇgouBuB[ )H)[%b\\6/s·Z;Go-5㬊>sog->)KgO8z9CJ͇ug(6S,?c1Oߊn^u)?kLqO{q9"op!$p?_b5 '/ng7 Znpowg  rX)Vəb/rߩtclܝK+)k3Nj'ßZ+hp/a⠸ `v*^U;@z24sZF`2_^2lcU>f̄oLƂE1˪?dPLm1=Ǿ߈W$E4,W_]d0&% Z^JnVwilAf;}T+OĹ Ԣ {-3ۋ'mfe}buckK4h>^*)2J$uz{ퟵH&\t.|K#/G^4yi>FASEYy4NOYCBTw+oi `9Fьo(TbAB0VcTTNRE@1v$?P^6󡼫c >SSdUs:sYSiwşأLXX,}s虹=,;ҵk.)|_f+?e%֛3 fUi%:ł3lz艧*sFʜL_^ Xb-3eh^,W9k Fܖe>A 7}?L:k,qƿ%GMv0m.ׁvH:{}8.qUkPl1ˆ,|k nwK+ (ņ3$_%ӢLD;t.9:%tz]u^WYaVe)5*Ϛ^v-ZފreC7V&3[!E Kciz["֫!;[6HսN_E\eZE.R&uʷ4=)Rt0'M~r(} Gy\THol#FiMKQ㈭G:BNĕO@kd*W\TՍJ(C0*΃ΧQ7L:9k޴ή@ 58klQ9VA R A΃&T(x6riĉmL ͑͢97T K #n58OЮ!z:AtHNeT)z!B6B2 %i4,z JzTӽ҇FJ_oܡA0R7jZf9j(]Hy9!BY#f.~}>T:n8;X]y>Xc1s*& 1YN&fezތqZ8>ah\te'.d/ }$LBʮr#ˉb|T Lސ?c[[Ӌ/$\)bYb[K{;jl+n  ^Nfn侧֫HˣWx6_u4?vOqSO G2'LR;>+Ojj˒ԣ3O}n@[bגT4uc*_qߪ3 M:#,5TGT*䭢[:dЙ Ri -F@7@_ҏ?q}s,-éa՝3JonWNypaIJ(Z-:ZHlĒ#U:X0wq"- S`<x ux*Ҧ&זP"f\WXmoj k6-)O@O@On84|>18o>k1d>bbbbbյ:1SQDs_iC.u4/o w(f݈v#ۍo7YVo A3W_2`x؍0<GY4FxA #=qtsҩc'%N _xΰʯy䧬Guʙr\&X?v\,bi쒳wg¿JKk5&)@sg9V>:cශI/k'[ .̩genXdA<֖-I'r/[[%g0vℼ$?s  b~r ԿyG9ʅVx yuQ9Q$Gl_;nCj%E-QS:E=bF^S_:n/w:NP>ķCjcpH~IBz8d'0 @*^@ f @*Tbݩd R1Hhq*ES)ZJT6L*)T$DI"hCaA)M[lDQ"EL@'4hPJa[ o;); wBbL5(W2+!W= @ (-]Fk AEӲiŴ^bJe/Fȍ8b\ml| ^rȻ-!J%hp, (@fifi7'x$mxfI3l9~]'T5[YKB ||N>lqH0Q`Ӯľ$,d_]'=b:=k9tvКfjWfŲ ol -VWqK$"/8?G"=^FCMݡn{Ɲn^hB ߘ|C],zн<~|n+sr2W[%Ώ|rA68%ߊǂeEU:{_Ha5+.U⣧w#{nyw'h- ͨ#pmPͩ`fuL9 )jF"9?ӊot:+ۈ4nB˯5!~+l(kRBWjv@?M(ѕ+L"ߎuYj5ȦchvE{QYCloWJi(LY-։w 5B)h Bk(7 z0!ĭXI:FAz>ьzCz븦 2h$>;қ9c%FO] @Xq ^W^د }B/;n ͱHm``k)VXz&:C! e8a[m5|$jv 8\3:l9a񴬔/;Z͙f{36̏C>iWЬge5\Z9Z - _Up/wOknG6ampkx9(ql({h6l'vLOF4x1/J7XlNv7cjZΪBE|XCy|p.Vfhx\#YN-KnN'RU u7B z9ΐuicIK"D0DL4h1$$$U4"\~C;I򵀚r-ߞ;ķ7^斺%ף7[peTjNy3'd>_ d>c0\S\P1^7ƍrRG'O5_gMd0O)|? |E>B !BBL#w2飮&)r  +,,"(FDuYTu]@PvM2,{gzޣyOĩ8:op;~ڕk4YҐUuߨ!l$JC$6oem/l?Vi\aߋ. 2`X>iw&J~g8c,Y$TV)Sc0SKVP[068 ME5R2T|F : oIFf_7rqݸ/qu_Zxo{;RJ ˰K8{/fGdX8ɫXZ2 n6 :$,U Oyz͸K~d9Gչx #pf2G>&g>|-woٗY/}Gg?jgvI`&;D7%0x_a Xf5n x1P ="xTxw;oz8TŅ@{1cxh名D+Z$ȐD qLF9"QEXKAZ*N. dVkGN(:a/Fٸwp˂P  -w)WVjbo8B[K.7v8m@"0{i->qRmcϥԃ^zzвK2;ml"q0`)FG6N,'_`Qum֑FFa42,YcNNX5v]Żs`hE*`vJ*=<]F!uI$n 5JxUmӶ,r\'$/b)zdF;}PRSb8f^$`$0c}T;e*Ql'٧zmE$cWD$F^x. ?7xSyDx[Uu?[zjb`θ31f~ nEkU+vLMY"UqD>9ˤ{V| Gra$+m2w 3*5wov,[ 釈AD@H 3~JGb뀾,EYnϣZ9GWjQKĐ\̜HDKЋCo"?s"X7cJ2S /c`։Qm Bճށ Kک\o5ކ(Hy717yH<)a5~ջkyR5UcV&i${e"N%ρ@buEg?+F2,2MW}S2Z`3߲W٧l_`4#3>{=_8ㄵo^c_i8rپfWOs?y,E7!W^O p,Ke]t)7I1=`%ut99t\(H] ^*jPѦlQ+WlRf_!w7$vd>fW=q$21UT΃b%rHb"Hb8;I_ݾ?;n 9^RjNvtiK0+Z$Ԓ=)jTsl[&ު a` %7}t`đ&f'KR&wNt,.)Ph;DN6Aig*L4'T&M`"o= ]c-ȠZ9P LBm0 V&ƄlLći0zs|U=rmAX0a{/hbk!2̟-Yhג`|LR/}EIcjv2[}?kߑ8j~ ͂Of"Zb1_679нH`*vvdSx[|gv2y$>`$}zKn6]|+d&zJzm$T {0/o*O/ٛ]va'M`מkގ7Q, HBʨ4_03OP~"_4\|i5Y#vYL拇a IboGC"]AzfEYLY9lsde1p'I|$V ⦐bg8[ag)k.i$88H3''8No'ɁOp9MY\ w'z0UC7B6o*2췖^hתqMpP)*5hLpomJ%n%'B1"\&ILU]PZ#l'|&.e֕fv$1Gs{ZP嵒b-E6tŖt*L"C+xaD?Y.?^'WJ%Ql#^x<$Қ^KY Ny\fxC 6ZYNzC'.N3Z4[iDoJ&z+MVfb)87*ug@+Cd{0CC2a?S:`}G͚wqּfi 'z년1k#Mi,n/y/1\Ky< lMOCi1LPz!{r֮1/?Y+~PZ<~E^  stA'1뚵."k%GR׿~OӘeρE_!XP"&&E5ăfWkQc $5IzWP1W ԛxdhUvl+b>*3t6w@R>!0gV\ Cc&z[ ? `놯Qaø;kY{Ifڏd$<-MڞT^c$O=~eşn./?^lE Z(vpm"w ó5vZve'w ;w=<tf9o8'J'Yys3g]5Z+hځ Iw$Z|9Sb޻Af2YKd@#.v'Xb))7rS.3lp6q|gn`'ÉvBl= A./Y_p'OAwM'q Ԕ}ZIا|SO i?B<] 3J~@(9g3VOsZ%,NK]ھT<[\"{'VB[e-=]Qq<޳H#vX GXWAy׫3<׷F;17oĿ2Z8m Zt"S;And'=fӡKکMρ*&kNM9`OAUO]g"g3Ylp6RxURHď {) v>rGҹ`A6qv؀ rEz]6u$5CQMחoh[(k I|7HMj6QuKVou%)淎h7~+\ U-axZQon$IS2H {"_J&˜:$h T3Ю@\w60 1=Mj~-=2[Gڦho@Hϣ0]zpouOB< (n(]l !sahpxuSpUU&6NC}hPp I5Tc(g5rVc(g5jRWJ{0j%5`? Zi{ j@oR( L#25P734j}_jߵ0ưB*4ZZKzV/\VyŌ[+gd=$; 9sy54s'lYfYj~A/kXC%1Fֲ8]~y_3᳟D~?,veE?,Ĩ-|aM"DJ783ݎ9JOvt9(rP(@13!Gq(:#`5`t?z)CP4tEzk4I. ? ˠI.I 1 (BL 9 Kd Xh57P놢]7ȡh EwP`ipXXZz1?xY dBeyo2Zwк֬[ YXݏm7 C;CGo>Zx+0_ZqT9+m Wa=6@+MJJ{0|Ris{#ˆ{C`խV~n.7WP( ~b|ChP$u"AĉhJP|Nk< لvѯAWk]~dJ H)D{?}k8 oJRv5;n F# sDk} aH_=Inp"8w<7:a66;KhSbCʦHM҄V::QPIG"mt&(TѦHG&˸VJdm}@Cr:BJ#"RHFpDD;TY2^rM#uFT#[t VeQL5hYC[/ѾHG`:: INt(:Qttw\W` `!a` K9:o4lӚl.5Ym$hvZߤw0Wm ] IneY[Mh>kښaʳ`-ܔ P]4l巳HGtY ^A p_ff>{ vGgEIoE!eevwGpqMl&x‡ʒKj{F'FmG gY\1v ~0UVMDCFl^x[ψ"S`66QQ%!}~U$jߋz/2g3@ߟ+rA׏fyz0X 6M,> a>֚n!J9naXH6RC1Ȱ l qaR:H 1fmkk]NA(tHŢĊmkHm"2&.U<]EǯHG }ev#EDZF[_cg~22eZ-9oa[k߼pnslwCfԮG]W{W58-yԹߙ9;'N[Y06^'81N7'iԌj?"hWɶӞ+~ڋ0c~VxAZM}Kg0[ۧ'p5%rF; @_LVNQ>֗nbY lQ sP;M.6j^D6X`G)Ƨ:bԣn:V=*q188)B aZČ`;--Um[%<+{j}n$U%v*)E .jpnzuU$J':bK0%Vb;EjyRG Ij@jPϓ^e heo܃l#1 0 ZW{i˿V.TE.)'C\ =ͭpZjP+l- dV*KSB,gC`a&Oz}Q?4scpZ {zڱ)$xh%RE_ECq8lՁp݅(, / pY)VؾÊ IBЖV]08ԫYܷ̳qjr99SQMڝE fNdrpӷ5N$ӟ4%vjD8a QDGөl˥Zɿ5;X[G׬"3xX/j#>`Y >|RW[1*j_q!,9~/OKUGM|j2$'R]nрX 75h#DK1N,{qT$>gES P8٠HI'9NoI𙻹hsYH|*@5tټʌRo ' \c!@_HĿ*z6{=SIz6v wxL.+u }*|#m7;{;V>OyY8T{Ydo[/ ʘ2*Zo^SU6׍V\4J/Q6H^U gH3o$O.h)\J]-F`ah`9\Y-. 5$$4Acڭ"C@+tm;tmPk4n{a^/1" VhnךCk+`!hedjjyW^{aK_(E*4BB]YUhR4>)(NN X Կ 씕XvY CWFg!h|on,ДCxw΀A&駓r*OU = BoC+@4}q'}⡷Y\K?Sqg*.L Y{ کJ2' C,\pe ,sB}9:?trAJ')Ga([' P(JjL40.-iVGZ_mwA_PaT85A8A 3翰'kG֍37y.0J <\lӏrq'&?HW֎5ſ௩Q#;*u3D-^qѸ4^gO@o,AO#q 5_^=zϼ\ q8}e&`&_/Pb],'nρOs;}v0 >JnK*#*cx%$F%k50$o/W^JfhsFt OїJsQVJNm|- |L腉T6p4 j 3T RH)!oj( ~'(tKD!ńKH.731^&&*c-epSytŲP.ulIA!EQۖ+2N0{MdL H}1AId p jCĤ*B@i6MS p4(rkcA x%Ѫr*RWEX 9ZVa9.cτ+KnL]*@R(\%"wX MU,Y/z/'bW]F^!tLYqI.q(34bg̵ 5\$[ڲ+,f@al3.^VC}1>V;~~ٮGH;rV5tLюD}ynmG:_G2 `' 0Ez[u_͎,zOU,OomQܦlqłA+i32s<$$tbIpWyRw|nu*sqض:Uwz{މwvV;[ml5@nN\N[|'r!+w)iywV )bz%HK#(zs*,DʷӠD`PAl.C jɨ%ˌk}gjvHEˡ;!\OֺW2JjY ްrҳ)"tCp$\rŻ 7!]qrC]9u8ԙ(`Rr⍀CCB:Ps·}!.;G06^).lJeゎ\w9nBNFjY "-Bp,B_gBcBccEEqHVH%'x(((-+%'^m mizs!0f^-gl_A=Ml#[˖٬}I ]tb_PA#$f.g."?qVkcD+W:YukNf[VU $w^$^RXL_' gS$ezj$MI`Xs4WʈoMǣ{kNnNWe˶Wx{WvY ao/ AHȄGǧ.~D.4 &MFڔ%2``>15GLDu%`\CdR%tFS<@RU J L +SFaLY5*{]ʝ˪-[1jd\j~^ZFqu9M_CP 7ֳ=]5v8 ^JOqPi:qiq2I'i:VMS;XamjUVr_[}ȷ;x E(}w̗#RHQ^usjg5L Z#ۊP([y"?È^t3ijd[^׳DI7I^$y=H'sl:s>ކ-{6_E_''jj,2#9xubm}3̵95f: Ȃߖ)8~023q:T:"Y>LA2ה]5ZN{g;_ }>LUVZ0Ö9Wq^<.D5NXKæCy$N `EXLo/˜"GtM$#ȳq%z>:9yޞW1FٶD"҇ZRC|@;y:9#g|0LPd"Ij-.'I}*Ӑٶ1 ih|MCk&ʞ-t2N)uP:? sd#C$TPP+yU]^f4;ghr}z~=`[ZOۑ>17{t鮡+ct2dVZ2 ,s>,579`,qdۢBiIY^3в U#+{e7ݻiJbR2E]*CB$EB0ʻ#|^ !8cf´wYxWg[xf*Y[0H4KM" -RSdmaR; [4ţYM X8,iw@c#N2v i`o$}L_RtvzݠmT;Sѿ$DiwK9Y 摈t5Q;).[wW܌cԺ"ir ɰ^I7'˰wB0@(!ͯ{qB, \OszX&\3_*fmaxl oI*Hv5xϔLhS txUc[iWO-_>xgoQdQ %L#b$Ȇp^dӘ{zp- Zk^Kx@EZ nC[ tu#.H"m,I+,P(uV!*-GZ8d͖J-2+R߮."CSS0SdC8MѩiH5Wr0UN;ku tHoD!]CHu -aNj`I\3X*RbN2}1?z5$LURj!ՐPEߍ}"2g;h"CdtNtFZٟB9^Wj%*urD]ׯ|nj5Uu,:CJL$8hB;5Ы]d220{xrVu7<W , { s3C' XS`!HW `q-GƬ,z. ͠'R" d+`ȿ a}u0Qn-λռK:6<qhDȂ~ykF!pd4Y,j`.jWFw*1U{Pl3on"-a+sL>û=QsԸ^y2ʿE`5>/1Xțt$͇vky ը_PzepM~Nv@ozY4瀐u h^Fco^xHjsTdC,LJ#_ G.Z[-fWE[B_bVrr^ %KBj5aπY73D w#;Gs"-󼓈_ޢ?`}0nP|#>Q. Pۋ4SK !̺UaÕZi`AFUkmo` z$F ~wD`1¦ؓ'p;ޕL^>ۥq u`Tڡ)D X#^ibsf .63A8Hy:,cnF[4Fh67͍f+FQ q)i`a&7J/$}HPmiZ{%oT 78((`g"ZXd2Lw, LX)B\dGȶcjToQՋ%mS@&dޠ%hFZKOld5{X<@eTU1cgs|T0}}|ѾiW_#>CMYOlF{]cO5~7)B~[uMVM"7hx)bƊD0AvSi+NJb^R@wiG6Gc&{p Mpʈ+j!!WI!Sƈ+ʈZ>M姾RsqŌ2RzמD3+Cʶl+=,?BH;η_ERHs]>67(|pF GrW~קH'۹0bWcN ag^__'_X_(66ܚDWNoQm$;Ns`qH<%Iƈwn|ֳmd3@jV˿G֎`p|B 8F8[ܩaVoskOr b7[nҬao@3,XcdBU8&TuĄdL)V13HE Ujm @[k5]ڢ-zڢ!-Bg[&? ]ȄVhkj:[#tպhoˀVep5Zφ) SM Ȕb*_97@i%Hz гV:qU*@Ct=hMEGX\o(E, S(Edߪƒғ6ȱ:zJnUHhPj9Ƙӫ1ur W:0tcjjjc̛=vs/>jcER܍:.AC0L?^_雙l?h_z_M:mc 1l_Qg>MOӛXyfsz$={@o4Lnvm%Ep̫T1MY%4l[Ú~|1@v~KS8{û'[u.jZI8MK'yWD;<`ANOL2LdS\6v+yCeNp+eC4@"IlKy299gi k™5cxOXsqW$|޹a8'Hs@tb9/ s8 #GG~?o5 bܸ)nD߭:eg[( Ss68mѰo(8a _"2DUZᅮ%LTKf 4eLLPMB=4 $\oFu^ou &C  L@?`zPL@3t $A+UN4( Ie .< )Vn[ d"DP9Cf.P!}\q`#V tJ?IF L#5wYZk*c)0\ƂMT.{2h~RA~H?IP{Yfӽ4^t/ =Ż \ڃn"{lΞkɢM [K֟64^ &d]ve9ݲ+?muEM//J r.qprUi~eL29/}I?u0&&lA;ph/QxmYMHEK0G2Q𰞛bjA^*O,4A4,?EW!grR?x6 CWcxׅ WǦibD>,dC,~?t&oy"Z_^*)bQ͝\ʙa-βfy k<Ϗ")&yvoqѨr fKqO>y{6iN4&JǑ2ztN1g;wixCvz>oY;E |5Zvwwww"{ ?*kx_/c..lK^笋FyӃ?joNe5)Fr1+Ox/t7ٱ>X}TG4Ū7f#xcbhe2a.xS.+{7yq )N#S@uy?#$O0isԨbe0k0s9 C: 0t5H:u\a:bQU_ɸ, O P%#̧bJTa8XXXT\)y>>>>>> ݡMVz;:5'wG}Y.4E'4  4ppkұxXԠcq5:XX\ŵXԦcQg(xuښ<^]:}0usG0_  x/`DN P{v'cGy2Lǵ+ua?y|\$at0 pv ڲY>%Hi$ X z@}F¯p!B^x7cxeǃߌ]G8k ymW,6ZtCv"$s~w"[[R8/d ڧ=nhSXa/Y˲ozzC nv3_3C^V[azV;76LD5^6Ys.&+术e_Xz_o,|N5fIާKiib}kgX^՜`Ƃe&$+ڟ~,3>u51x'i[V$5v;pw'd0}ޠ] me;g l*֝ylKmV)=S\SnKS_ ʼn2yi%O ]0hg>®lWuItf5vNrdO1Mhv10|k %s6#;8I99 tdprih<ΑvO8X<>yx>Z O;7Ԍn|O 8ޯn k,MGREEOc rIMЩ\Ceq1@Q[s5{缴BR"MM>b`Enw*e3񄁘KVJ!ҷ7O{mBf)z,a jN 4K=Tx6c!JP6:1/1?<ؿ>-ʆ)P$W}bv hɸ.7f Z2nwTU9A ⡕"nA(E3 t (YyҠWdIÞn0;M8ipC˰ V! }0~R(8u m  &A;S&̗Jbq* E)Rbp ȸp L82 j91glLw.BqS S%39 ,sd΂ h8 {+?xN?DQp*X|iUs) (Q j}5z[-6x8}лOy1i~G.<#It)Vl_t#mOw22[Z_5225o|NJ`-^6^5OXE|{HkM+nN=v[ߥ Nz9F>@62+da;fu%NAv\f$6?{i`v2AZ736#;Í]ffg_Yhg1X'1h)X;x']<ϛb;v-`5pGxO{zvU+XxeD>A-{%FtؖpgpUL7޳X sH7dK!-} A8?ʢ=B' $9(_56V_=^>M7BM9ޚj}h-Ր+HC s.wDo^Q"pgo8b?W,O|XsJt8.J vX>c @f0ōwD*y:a Ft6:ch 5iUbecuq3"n/\}d/.f`L\5Y-P;H;0$6?*J<CFVB+\{k:@āR,çJ>2c]|p}-./Fb\R oͦȍv&q Au@i!9j"c" 9h%uVRZG99hpA!1Z6!"bJC0fF 9C@,VKCT}BAy]0 wA ZR]0 ZP]Вr킢M;_T$RvHAA"eU7bVØU 7՜8׉ ?P\;y9/‚JM_ +5KCi*@hGQu6ԗo>Qj՟EC6ZoyM^=!3I!Db&bOmJJatCkS .2"۳Y =fys~~Ux#p>$|goE3v@'03;*%;[QN%JS'&yb:F/6(o ݷ5& l7akƗ/u[ou$~ TY^j>dPZ^+0 .Jׁx;0]m3`C>Bzo3'"#c(^2``kj>Av@mh\w( ZSz:pnrV/<9Q#*o;597}| ? ,7gWUi ycŠ%X6x=2m ]K3>I.ηWs1v~&+¾h{iƋG.zfy^e+!fHL!b$h5ɼX^[8d]ٗ`8!b=eb}m?G&ifohYW د}FgS9Зq2eőuꋻA fTK *4xXRՑV-:8BS ][=ԗC[5-!DNFp8\MF xl @M lEš. \.ati(am\7]-Ap83dK1..5U]2^ sԙ:$Sgԟ:{7i2ku)78@&'yw07#7n9I$M\^,@c /@B*4jhKk$&y/h%h)|>磦W>壾W>jZ67Wisy  A7XQc5^  ( A9U+N&=Hĉ5%JLqBEh]̳KHc ^CwvspjYQ%pUU'@QPIqPy<=ao9cEj^ZMfe-ͲLͿZylP#".̴ɺ}zY~>^y]z%%$l# !ׯVml08{ܖQOˌ>pq"8l?"e]cu'п˚0p[sgь9e]I=Y|IiK3p8M;VfkF 5}_J~t}*}!jaӵY)BvH=Gk__q%| go+|m8նВOtiuNZ(]].,nU01`dh!8/ VZ2`Cz7m7wJᘍ\";gG16@4R1Cb4| AA8UOh­s8zӺlGkŸl|`,Xc]Sc%#N3*q5=Qfo˔,tSה$FgArll>ʌ6gA a+y9}>Ns,~^^U:+G㩛bjv-.BaY,]5o/(>guZkҮw+cdPPeʹRV7ppzZ]n7_@E˪5皗͏Jqp7d̿[wtתpKIGMՓS#ڋY~}ApIbyͽَ+'w*Գoy2/Uڎ9i L~4.}6 NW3 -N$Wiii ?bkp} &#*qc[zD( 1Ws,-ZY*) ñ .󧑡h}d%c!%vWr[S#0r$vJ g&Aج?F|a`@5WPTǶ5ccCsMA2tDƠC2FQ t;<;c>Rz J2q]F'ܑp\<Ⱦi@6 XLD, )ptCKx8ZM (݉piR E} gJQPhgnm 0 *Qq=k0f1ac>VW ,QQq |r7智q`hE<"b!yVad]_Xˠŵ|\6q`>.̇XU(%Cs1>4ZQ9%skp]?Q!8 A8A{~ ڣ՜8==ќ{9#q~ۚb&IfKyDyRZnu3 };+PMĠS=l7%IJg/(oȾM^xɣ}v[n+u`h7L齓+cH>uET3p'ANbꏀ,+ ڇʂT] yU"#<ǡXPXDLaܶCaY˩p I1Su!F"$ma;Yh&sNTQɨ ea@XbE.c[, mxSplj-]tHlRebɚ ߯N Z\Sd7=Eh eAπ𖡈Gr梀\Lʂ6@>Kf!pxi23l7 :G`9$̀UNζHJx <CmV.TJ˥JjJW;I=Ycœ=XEVMƫ$,3 _FzH"4"9XdKkщ;Az: u/+[nܘ ,Y2.6skڽ׸ȉY6Кk7K]T5> T!7]Ҏ.'|~q}Ma"w5փŧ,iJ7oz7pwAv`zh3F{7SG`RĠM)DFz`͖Ѳ3B_7%vGC+xd7 @gؖee:4|ox:#d?ZTԭ?`]7VRSG\K|yݖ6<̦N?bUXc=uVNpIz XX{]kB֗G_Z+j.>msy˩\OY]3 jԩ]5טO P?, .QX{_uݧLRY1E^l,9ȕߖpT魕l lqTߴ CmQ`BL"J#$ǸT8 {_0:E0 &H@I:H=kjzZ3:{k)$4oGOd)8tF"ø] C+G!<$WD=zcqBh15CH4< D8N$7YFϐ!G \JW :N)!)=RYJAΑ#9G F :H)$)()2-VG<8S\/Er,X*c)ILR{O^[ /\_WWa-ԷߍҖjWmwѦk_pĈ< F*}yGøL-"#V,Qԁt= IzQ7 fA+ ˢ/k[{yKj-K3v6OoqЌRNZ8 7+ny]d][ެ{\_f޺1g>Q{3`BuvXQC`ά{ڝ9ѧ[0e=1<T(\eMku-+|9Xxʽ'R$w%*/IHD輷2D xӢK0[ ZuG#7Fhn0\[bt)Sf I:+ ^0pt[+(F,G!r S6'H4\cXFk<{48Q(%"8+G+ AȀF/g|o>4gZ(w X4i͞YF9S]2wk]-f[9BPN/0 AC&Q3Po̷ ubu|>ЊV\Ya|h88H + V|0?7-]ު3Nu(κn8뺡/fU{ Auw޳E;ށtҁqnH!ojFb.:/jGyE+r"H#u[}A⽹MYJ/;{d+=r^.bl-KQM su$9nFr)nwGYM6qgX賻 ^lʺ3`+RSJޚagF}Vo7)ze;.Ĩ[aI?x3#?uLEorWE;DJ(񼇢//YTw 3Ҝ7Bq0bcd#3A\/'V7Vy*Aw!&r,׾.j]z_O蛍*қN XGRMeH k'X4ӗ׭~k%0Z5jkm5_25_6wg̓ P3 |j0/yk?&?{q[@[yCNckzǹ]I#-2޵4l/[h6\E` HݑHwG;ƽ±petYx8< H=O\}?z?£>+feF&7y;Nx2&j?|6 %WMwV7dq;YNod}S7 WjNmFhگ2P.]~7wdM"ܾ{dIm&Y|}H}>ؠu% zMBG:0vZڝeul!dqRGS_vNd'NW;>fy$V|8Y8X. Z&IfA:px^d&8{7Lƭ[sb1;_$vFYJGKV9AP,G 0,`ԣXDH){îu&xOA;aXZ1C | wU:`(   ͆C5^0,6b8sXK.7#0Cd6֐gvBCGH>!+LRƵ&@\qvϤ`~\VHiObTM=h6d;ٸK1.(J;z~ɱ EseXfډFN,ZDQ#޽B& A4 Yh&X7;40B8ʍ2(ڻpHb@cdB a!&.DՅREc! Izù D̆^hF٨1agɘC$Vi; a4Tј*Ӱ'$HiӰ~;[MB-#\a2JQ 'V9_x'~gkX6k\`=^~p~ٵg+FE.K| ϣE]\?)<Ϙ,Ăy ,*I`%z.c&\|dN]ǵ;]S:Z035cok2V'?Ê&}$u70`{]kt~'尫Kx(JY\_ZW<' 25eoyr(Ca $|oS׿ o wknwGx @WhE%yJZunD,&XFD ]OtP=`_TFE@=c`U;U69ppaXrHKp},d:@)sPTit"A0NGAoQ4thPOd`qշ?t1a?r0Y}LfqC2/NpN(↾H)G7n3Kt$hOG?b16bӑ#OǴ!Ц AXɮCP p A@GĊ!8U0M!za9Oߗ 8FNq38%ྵu7T֕ xLLexv[M}Gy Fy:O-VMFKD?pl8{Z~A_f$76bruv]增nc/.0 L&_zB)ďV-4ޠt;mg끗Oe{ T0}~Ro7$w5 >1 Փ7')~2N]~%sYNgqnus)o{nË//}sZF3MAhovNQxpsh t)|v[OY'J6>\ޭ6m[/3;p0n80oOorBk\wuEo5=2V P x氁[9oPp}2dIUtVJeGZ{"-r 2@f 20L-aL.Ygf݆%:br_*ޡ/VZqU%zABVlmTdldl88h D#F#F̽Dg $@E(%Q2c{sMBOEcd>>XxE W$ZUlm,h K@ Wrv E*@(8!u @T sW1|\J>r| 䣘P>W*͇v ʯ @[X_ Zd 2eLY-c rd9YA GVw/wxFҏ2m}6@ghUjcBW+D;_NkxНKc]?}൐ηh6C{Q $}MuB,wڤNֆ,ۨj_ [Ɠ@Rm$ 4}#5ohZ[~`/<ڙ`_ `(p ./HGљt{ 7,L1ow?} ;"^ےUvU&mHUj2W?63>Gq+yheJ?g v>u;wɏ 'W G4&l8u9ڕp%,Bѿ6D_/T2,^ L0Y/я ֓2 O֟Qr%)Ƃ~:Qç:a4?1ϛi޼`2?ˎ"P7v4xV$wi8\lid֙%VgX<3f=_9 _ɡrʡHE *9 KZeZ{`KRm$j[6΅ ȫv%yDGJ=v\?~0<!7 ˴Mq#8;Yv$7VmIĮޡX: e~XqtQn(.]^q LZK4)ǐ+-HeIOBhk SpK)rgYK,H:qϮ {I7K}(/fI!Ή:AuܩkAώ;ctNZQN.}Q tr ryR,X^%|<\C6lzy<Zg!zB,YrxVP|zT#ge)ʙ+TEt<Mȧ GL #ɣsp8V]8$U+ʯJk%Tgk/okIj]ېZwdxG^jzEB=ߦ^SZɘHvPzeoֹE~vQ t9vet1-@u#I60hDipꎏh'wcCݦr?RQGj\j~ЁQ_%k~5; &LYc}JWkW4n#?iǵmZ-PUk`$iۋya7gV0PNJC 0[ּ$sN&g44^k,n޸酦ڦn4|kөMc /,|rhĒ ^{1te$|KǺ|5eJ#g/yv^yաmj+;JSFI kKɲG]ɪkRkGn5j 5Nox!a٨_\wj4g^SbXhӬ8Ov}7k t񘞞x5Kf1`KI\fг Y2 A"%mbgww()\f]f7bd86LتAh1 ?uW -hz#ǥXaxG }| 䣑G#%LT̤'. ́(-t.svU8sf܄1E^@zwC@1J2x@ɨ94ɘKɘA4ɘIj&C+413i13i1رŨTj@A[ 1xx /*tЊ<{ "3p| +,1h0a9dJ0C7Bi#lUz=QGTDx^v+ΫJZh_+X` 7;6^@x u ǽwױ{xڽw=8GU߃Mh߇Qh߃39>Ch?#8~ :=Ǐ?cG58>qO= i8r)G O9>c- zоS+3R_) "&1v@Nw-v*]ަt /5mo?'/ 7>|֪{ԋ77tzJ|NC|%s WtzE= "]]eUoCnѫ5F<#u*W[GoEMyz9kt-FMPL6YKֆiGkUS`U[9bGNRgs2Z=hm޷6M(8|NW9\] 6+nʭw˓Bl y1kk"Ӳ:ERelҒU;yul5t9dͮXimo4὏'nRohh}sFl6j28֑]o!IG Vg6~bXb0~~=xm0UܴAGO_?1"Dц`fan;`}*mbۂQ =pM kYsp((,V[zA+zx3B·+b0XZabơC#;pť, PZ9MPu@A X/5Ms z P4F, Za6桸y2<3+r&F< gt\HǞ*P-,%hs[T07)zcrPDR*qPCa q0 >Yy4&uO/H(CyC2s<4b]&MX)@3= SacnY>dZ YG0tª?.4.xS?"z lr.ǹK$_HT%Mno6hnh#zo#i&$s <ְ!f'i6Fڃqo28RQ C9g%;Ӌp:'%_/P!g53G=H#~H%ǵ.ʓ"?U pw`k!Ƃ+fUda4̇{:\`Vx벙iY54MO'ʝ-H^`!2o]$ek-Ҷ-j䎪-W"u)|X,K(tWE°[tF3_g3:#uFÌx?( ~ЊY f?eL쏋#8Z>D1F_/3|p_Q(2r< 4Q3dEa}I2.EH^McbТ BX mMRyJG}BSG! 8paQ[*v暝D&d±Zc"aD/30b!:0ly!t092{ `sNtI M32BnЎ?wΩoGunz07wՙja t]g>^P 6U/6MrrTF}ދIoh,#qܾ@|h,'yuhݠiK @xN:}y= "}Ml |+,7ĪT?CUvl80AS@8.e᱆NoZc\c`WM&4t6}ٴӦ  lz)@4$ՍՍ4he\U۪Ź/kf]IcO묄e7dҥt iymF;~ 5k\cZϘ͕"s9jX-jf冾'GM7xC7>r%ȟ}10G ;k.R>#!a" ^̡zXX8"e2""@I7\X&Dtuf A {eWjl.!q9uBU4 a fx1Z kG#`dšSceQAX1 &"d >$AT){8?31̑u C}|hRk\j탡>Y}0rxec\}sC 59X\ 7)cbl?aa.͝r1y!UOKyXjk&b,Q]zx,>lo3ūx=Y>"enh w943bw (A<~WTM>9^~کvi##l?g]Qg|?o|1{dߪs ϋ`K^_A.W'2w:Cqp=~%sFh-Q^!?N"cqQ#8r5~Fjw$l6E3rp_ӊZ^Ӎ},kV2\X&Y[,J-q-7< woj ~q\L^ǜ~ZmZ :9)ѩl.WX&ShMJ`j^n^v(qa3 :֝mEˊ)CY;Kd '+B05ROfO8cC џopA8bbsq8<580Jάwba͟(#Pg\ 6E93PBgkzuBx^nOBQ&+杄ʼmA,6c,B5U8k GW,}I޸/@^OAv Eо"%[y O@xUr& ކ|Mm{qer,e Ak'e.2$<((vL/fë F'QK0-Q8CPLF,cy \Fbd| ^2͐X2ׄdEQn;tt{g 0YbG.We/ʅ As:Bi!:3杛v&y P-7`=`x+l@ y1 r^d ،9N_p6dpvg_wv{7n3'p9}|ړŤiK76xK,9&FQ.ic8Е /ec`qXVWuuu:o]Ϯ/)ׯ?:zn;sr#m~kU`2kuعEٯU"H5E|;sASQV/+(/̩Zo+ɟ8C@O7|Z hq4;ɪ}"4_t;}{tGdhEAA$?kfga@0 Ia7e<9}~`kv^PBxpr||||ʼnꋎ/:z9|[d O#Q}$p&b$+LEg3cln_"VK8[4Pj:jc3/uR陀,{ȫ?$y,UN`xeLs9ج4sA@Z,ԭcp Z|d5puEޓ'zwspqNf.:=c`m0wZ 81Sk\c4`@Cťi#%tr/ 9k`9l9 g$k 'OgΣ!%ލJ2\#ѫ4~<`vZ ]%SWK%-KZ~~-ٿrw"w<^  a a;[嶋WdR.[Í՚z!jF8wω=t:[T~vc0jn}n-{+ǴXL'&Q3==Q~Tp:p˲F`g!/@jSp+F n=yy #nmD P>%%?@&hj .8+ V,zdp:YBBBB,,TžQpHZgǍz&Gk+C$Hcob%._"c~X竱lm+ }+o%di2"z%ǽE-d"#/gQG['j,l'At+p3y*80olDm!i5Zc}> #Vk>KŵmޙU&E}rZ4n%ˌصueهo;eFɂM L;LQ^WܿZJHWl44.}pÝC+v{݀w_fbNf=_ dt4:Aǝ_WyKm\jr?/!fsJQڜҿnĹu/X{sN0c0(#$ aOG&P/u,u,#~e_ʉĔ8ֱlV^ D hE @>H‰DĥHĽa)%G艸]֑J#X̲ 4@@@@bD/higNV6XmKye%/4 WY0^=;D J+Fƚ5@1>YKKK&tQi& 4 h24Х![MbiKC>4 tiF5h w]`Ӽl3pTke 6Kx ^AMކGm+UWB_L(}P+PtuZ 7Avv7}>AP>s g@mJ?\MȄҘPƆi%xW7k=Ϸc;@1|WUV/]dgsↂcᑨ:J]zcRTu iIGu?>!U<ͮ"6.HUs?Lu8FvplzM!_tm4eGe|UʦS֟\0qk?c\cjʆY{ʙmP&]A,0*Vc~MZP-~2]># FcD1#Q%PQ> -0jb#PMl$ ;P%ZjƢLe*vDoaI(^#t-Ua;8q<:P#G@\u\Ŋ\hEPeA8fa|ymp.ƛ/5ڎ-2zc>繐繰't\ڗcn]yD坨=f+([?]dV *@+VzavR|7/G悛*Tpb}pξ9лZ090zЊMЊ p砮t;?9nka9Js0^h.WIW~ dq|@h[zO&: n!;r2`{pz@&dC _yvwN0K>z^zj "kJ>I'ڍ7('o#c\w zj%wXrGTFBԧ`v"!(W0)Cahzf4PQX[64P}{KT)͓-3р \΅rZ/\w0Ia}jTLQay4% 4 3ZRg֒O(#4 M'&Ze >NZsUP Dh-€Cۛtuq7"JD$h$$bB#"$w8ιP\sjHjzPbUTUTCIMU RUҪN:^${=s9{Z{2*tfTSzȧr?.x@^&ORGX㤱SDTʶR6\-tԐf8:d ar%:ÑbitWͿb]v6]^@Y|()Bj]]^[PEbԙJrSi'!dUR0[Ҍf&`YVPLc@E}omЬ+xgǻ<SJq8`ir 'Y< Mbege`y1 H'i{0F-`&s#͸yU]5aXYĵ.DamM}#FBF]mڕ|ŵ1Rp8{逴=av¼ +:bԮXUd or8.M#Q'8j 2d#E})SNA=LMA.5)(ijPYd# x>8k8ŋܧbYZ4SLbs{Gu;dYM~G.H^ț/抋ݤuR0Lr$MH`l_X!Lk=y\ʑcBG#ݱ+ [8^a忰cl0CP:), h:LmG*0}KdILݧ+w l吚HSɥiv<\0S' ݣR~?ˎڟ:`.-hi&~v> cY_e|qPfjy-mSm>Hj~I$Y$`#2lRۨImꀣbv&c V{c b%~|[WkǜjG3?KJ2VIWra5[a,C+LLl! [ۣ"V5 l"m@‰DS"|h#:B: 퀣pPk%NUXjk܅ZsfÙ9F !G`>d&dMP!r\!e.sU 2lY0GCtPd>[4}`U]u'mTy+v_Ŭ)l9VSv&uj?zyD~"?8)UԟkԩK}Q^3^jA3U>uV rz:k9vV;֎k;4-^ ԎlagX\7ÆU.^ Gj1n0ȳoUm5"DLVk[6n|uq{[o>ֿ(D{+ #B@X3تu ֨0Y`RZE\\F30w" F. aNF[,ՂVj!TKS*4@3ꋷC1Ĝ&EFq̅8ėƂٳaFŇ>X' eˆ>ЊX=O !%q(*d?\KAt)bkIH0MRPZe6Pvh2=b,Crp,rp,IЊ$,ٓfILh$vI\ gIp gI0R#Aڏxn !>'n-v֢ZjP4xm=&ٖ.KAxqf*2Xߑ&#,UkX9995ed+0TwZBki^;Xn"(m b7lt$0] iD˫(-dSy" L/@%uYoӊrb0.|~^eˮ ʬb%VFQڛ:Lnå)~)iyv0U!o]HcP0Hm  /k q;*zC.hL 'O S8NOO~YӪԜV8fj3I`>XO>#Ӗ흳> +EȞ}"k*%rr %rڽe뽜K٭um]h< zROWhQZJh¤qwv(n'q #`rM]LUd'Em]d_i+nvrS:i)G ny.ddxa<6:QƱG`&a"oKir{`%9lQ<ea, FXd&ߥ΀^ ,OXW6(-u}rd%XV K@?~6\xxƃ2륕&YO(i<1w663V6@| _d45MIroEsT5])ˣJ|"+k5jBo4Imf=^ԟdOi;.RΛ|.V)L"JNSA\4 . #!`FvqxuWGEQ\)\' Clhp>4*88&s4 Ce`XvhC0DC2iBa M*a ê/'#PF!V<%ģoYbˮso& 5s/I_ ΁ahVQDNr_D QeOlkTkXqTVNQ C#1FIzЫ=YO0' G*>u0wa9p]us]ssJl_xxolGc#~'[;ArR3{؞Gw:: GKke`-E3tj\;X=[R^RRA0/ k]䐚qy7^Pg?: hn%t*=EnT.LRYfst")e~t$K"݀X}MYIڠg{fe/ڿ a0n^ڸgďLj<(&[VY U8i (.E̗}MR'aV ɗR2.;H9rcA-a_Z$UD]Z:>#EIi!(TlHG/O˗Uu|"+w?ͧ\ULg 9UT*UMߚ`!VD4֝9k8AXje;:99D9z(^dB۫3G=R `Z/$!$T=Tgz" ˿˽1ù1[BBյp>D|h[_?w_Y~|k\j4pT& ]xc^T px =Avt")"u9ͶF3C>CW9o*Śt@A*C֛(zG@$l?5y3sLB\X1dF`KkG7sCFU6Fe'+Y6zѓI~0@!'uhw"(E/+>jALvfd_f5 l읥Yyzpl߰cMN~55oZ:zޑJy9/r[(ZAl]5~,B Xo3 _%*^S%UܦTLu/㙙/n /c!;`Mx G,eTC.#xw}}~K|HyWF8V>'~cԋp]rU=5{쥞A'V܇`'z4,Ҟ|RתK"8Nq`L.TO3.}߱T}]]P?TOnT|]:lF=BwdR~96zr}.yg\ZvW\L SORy4;«3j(rB'e4nZRozsһ5~@Gߡo#qxg}Z.*}1d}3~Hv~E/.]![ t%xy'<ҷ923mmNO9{4Gϒd~]ҋoڍ4-][Ulbё-l8N G*sJwZjF_:Osm}4yMG5JbCdkhFn~ʪ!d#C53ӕ^VA4&|0=#qcBʠ5M qVZ\% ~#vqBͫjSOQ;Bq:8 X9F鈖;IH.Kt &]{?^Wk <%h~Gߕ7)mpa}&RL*(Ɛ1$Vt-{"$5M`"8&bMѱ>u1A[q)1 ݨHn M66 ۈ( 84_Ēz$2~! M8/l)<5)Xڴ5i抙aDb,Èi!SALu`ꊄCx7̚ `3R׳AKg3#PK3?tƎ_&raOI치O8@2r51@͞ okd>Wb},QB2dm2։x`&7֏vwxpa;@ L!pJ7 { esZ$kXOuA]Gλ(sYXoou;n ua=bJyx4k5__o9@rH7Q[-{=G;TUE&*weUN% |@ @̞e@ڑ r]'K Z4&˶ҏR{%WSlJr_ yf[ώYM~x]3Nbv̟oX4#omu3H)'h)ȶ,O[=KboOF -=JO8ta/ )C %pȦ(3;ZLznup1鈷ykHlĪϤ[6퍸WjRQ \3=O D B+(J~hlG>]誏FW}8 >>].<~vl>ۻ HyEq4դ&$ P< :1ߢ&u0MSv0 0ɠwav[Fx9:TRKfB(Jdm%wNuxgBd9lWkj#FݣU[dKy#}]o{mue3︞|lurpT9%fÚp5r-A2S#2_ uȾ3Y kNy6{HtS&+/yO`^^xy[-ÝhטU0Jepz?oe :/R_sNl711|[fMMQA#j!.793!І#cv5\'-0h9mMVs+hЯusaBq6?#r2b1.tg3H@DOVhn.L1f'vb,>xcW2Υs)żf7o.1s4}Q&wth0Fc"AӴA=ij*%fG{7@|>~n-xA z"Ri:X +Q0꒙꛲蒏ZhHa~EҪƬy'e%O PW}hѠ-w.U9S,출Pހ3{3UqF1دFDI/G|ԙ0kC#/{Gq5`KNӻJ,yoE$Y"8xu%I#!_Sk"%]Q2wN٫hx4Vj NfZm0ͣ=Z*9G:NU3H9 X@)y&sR:iJVcx0J-tmyQer9תNy|H]fUaˠbi@Z^p|Q::i 9y)H0{j5lgﱓkif"XZ-G{Q[Zw%= Mxn!#s#ẖ&is}%M|xd]žo%MDc\8jQ>2/e]#syݝ!(a M_ jqLZ黭0۬"5Vj>pn] 2:UM ' sYq%#oz9ujppa[0'Dt5z%v-^fE/V,]#8GL$1I8bp$ІC+I""DXu.R$"JIDp"5ep 7Z#B" 0=4<36qVQWT8#XYT+bc$Lם#04hE%Qt8C @ C*{wp\tE gp·V̂Bd 3^b^^v1,A%0*VP/K`,{ 8/E7J|%^%WZބ~e=+tJ, ڕFX6A_b }e ^}>h߂~+ފ彷bX{e'[aW& ,7=֕z8][MdCd7 VxZ<0gO79r %p.ekZ6Pu)N:(tP!`}{!THA lS-B6C:[{y+TA@!1Zm)Gw@WbitXj,&!ՕKlcRP)ʐ !貋$ZhܿTOVnHӛPXGɟ>B :}?Ie4 ;/&"eH6\'UQXH66. ~4l]d.hC[j(O5j,r 5FVJwuͽ6vy$^߇_Xld/'eVK#4iIKفvK{}mj-@si:~fHߴ6ˤm]۠Goâ7IB&R+K۲3ZI ֓Z>S_g^4NNZ Mcooy(QZz=^[':{4PD6!I2蟬} Dm5VO|5^ ¿5?-X+旵bm< XC2c /Zǫ`YnC`퍁fAwV厨;%UdKX&+v6ܰAp6_pd 5 3us.#nVy8jHYZ مocT(2 ) .CҵQLp.b 4LSȇVhm' 81)NLApb uEgC? D쫨A+v&'WzZzO ׯ l]^)-öA MF}:dо+|2 =udݓQwOF=udדQ_OF}mɠۨ߆6BCo]/RnC 8ױɻоve{-Aп[ ߇=h߇X>~ Ϸ~#[C?rϷ~8-C?C!p:BwNS F7|o \k W^x=ZjKݯZߤE9֜kN@R\жV#PTTvRs9cb[. fV  -&i /ʶ`3(2YtM k2(zl#_ J {`m]umެUn.ZՇx+vY q2X(^5'{bluEr]ҏvWYvO{g)!ik.pc!?Է W4hF4gm/pObܛk񀪮e|IdzH}$ݖ7FNBLNQS"K.q+d/d 5@Uid6SU%)6o6lmt1E%u.Sr ᪶мBC [LՆiZ +J7~I|A=k/ %6/l2Pb7OGvW5G8k(>pq󋕏3̔Dw^A 4Q8=ިER72Յ6!V C4#X0kKcvs 77@P;`˃+kʸڼѕ5bbx$rGbVLSEV=, VϬS rHѧhba0Yz:`>t/h;LDk9'A/k_MN~ 5_?WR1Dk ddS!Ӹ#NHDw$s6! $\4;APښ +W.*f UA" mp/̡A?frVv@qE4@PDQZFA?KVQ&o"A:ʴЂx`:>myt4 zbEuL5LgA@ @0 ]'f/@:WvDa! [:{A*lj/Vu.~@+<BF]my[ \$t]mUhF} В_[\P0v}\.}cuXSXCa1`Rw$U$} aUV͒S7:u7I;zW5M@(3`rhJ:xȂy}~5QڨARg*vl{ۧdiHğwڊʗ@|D njQ>穡\EAW}QMVnAylIr_9M#?=hv+O.]B=ASAo#T eiFFe\Um0_OR8c̗Z7ث,s/sǝ)D8x ]O7˗ritQ)˅~Sh;qӚ~% /rF8cpͫlRt! va6L}>37@`pWfi^FrE: Օoהj-N:Q[M^ xPXD۬ok5^8r/Mw뮉(&/k/B//D   oP R@ !x٬CO:˛ЯGOz$}߈#X>UЮ}7h`e; Jw@ X/ ;~|Z/w7}x7`t-h!h?DGq>Q} 8пo9ih߇|G:r[| >9YCr}\~3Y.C9,W? >h meО*guhZʡnr h| Mh -_Ùv!g M-˿e -@{ro] ޱ܅[w޵܃;}hYh<ˏ>k]SQOsC]_vGM50LS DDP uZP|'{mr:A*{0^GwdbS"&w:fYB!l;]>b' J|==ֲ;=@jWZu;{3h?ӏk`zU`L+*k3]6s%᫦: _L5M}wĂ\m_ 1q$_YU(LOTbi]8=x"i(>t03)ܤS 3JGyjt'Wmu[-(FFhk^n&|?v/܅Xqd8 +lق. QrRYqăFV54kO<(hC6Nf,;ͦhՉl%I<2s֜s+rȏ>. 9ʶElaeHZ )§G" 2GžXe)q>peu=i4R WfT#J0ZVr_$ď# T_#~tZ]=Զ~qTԵAɹIxiQ |MgOlPvN9_L 6LֲRj-zC+moݣ.Rfs5egkvv`Ώֹ/%on|C^JKyT|}F:VhviHה|TT~H'Œ"SEhOO!WV_o_HZs-s̀ -~Ij{wȔb qJZiU+ 0Pu%rtD$m'I&DZ3hW| o7@vp-vdK̩:Nbsjl)=sa=iL2 22Ϩd+ "7يeڕ\AHl[kCm>,"ʚad0A*R-Z Ai,ZJA+mjlNkK6kc`Om V6pp-!0fY}<|F?F0?G!8]}1?t:%h_ , ?!l Y`ʅ[@t )yg8ބ#O^ @_Mn^-Њ0"0^, Xa:O~%W™ }=NEu0X[# ~ty :оX[%J\[&JAXs-CZhb;(1EJyL7L& v.5ϥO#+f_>mj5P=PoG=~PߧBz3wpջ;cjΛz>H_-=Je[1wkVֆj]4/_֙M+o3h fLF+R~bs!+˫`B#e j7?b+3 0`r~ˍb RYbr*<-aV/Ҍp_ U[h[c8hkA퐭Sl֘{Cжk5o&oM Fvlb-c*OXF٤"13DdQ"]VH%\pC`D0\AdR-CLK.fQD@}""_DRGd]|I(Kz?>ug!IJ`0[<%iMtm0;'1F' =fw|7z5_Ks[r] Qq#ľ-0VG:ՁЖ4FQxOkrG5(as=6;]RY'BO_;]'fcM].Amdu1P fy]uѭX}]~XhFIY Epl 4Gq-[Z"RKDbDFo+[]<p.u53;"ո#xᏺ=\=~lތx3N7x@O*7b-גEyإYOS^!L҆RVf.44@mЕegXKlNJ(Z*t,;m=mV[mMr$I뤏Hrf| y! |Cv0\--^ӊy`-A#d@L7鰟 a\~{jUE 'r?z~@^'VF(0n gnTA5.KՅy(<jS:8`.jW2s0?z Uc4a`]jZ6G :iXU:}H79<΀뿚t}-6f.ͥ]Ԇ[țiv>Z-v}vol{mbe6N]1YS᧦<[YK-q # `jBzK-ޕ-t6#112ifbAȄBϛyՏ3 |1z @9 b%eb3  (!p%Y1| Dih%1a9(bF 0yFFN&Mn, nЊj^ AgR#YL\H6s-4H<'ѰzcBs"q EaRaBoӈ@P YX.ة&yL# :=]0c]oh)0R ߫7 Cnf3f!Ǩ 390ra8# Z0~q4$Z&`F-ca>/cC>FcC>,e1ceYU0 sGR8/GaVkXc~hE,c:.eYqk7Xs 6@?]k,0`Fll¬A [0 a-跠r Fl(- "`ޅVD, 8gy{-w-}AI8hz# AD 0G`,G[XA+ܑ;`1ǡ=I?}N#h?ODlGp |wY@ П3է9vD/%St~): go"e.7KZ%T&v k]@߁P] (>4Cɻv- t6t G1;+pe_f Cwf( >O2<]Kġ b_ʅFľX!'PA)D' 1fYhb,`, lq^+{yӼ_㵸e^^DUAaPJ5mdQN<@R6[$-/9=:ɀo3,M^"+gX3u7=LcBT2.4O]~&qfJߢe6>j`ez~Hkj!Z@]zMS[2Bߣmq@Tֻut=O߬{7tFxX38Ee`.}4u/7}nG;Ex3\ b/z= idmcaOW]h :ZTETG~zAȽyZ})AA3 I6!Ӆ"Ahœ%&-",xϾpT7Y UjΕnn֦\ފBk:|{A"Q-3S5r]ZQ%p3 DIMgRwEY\w;\}N<0oxSzUԋ99'j[HnH3xzcëP@CbPCԐ^v[k9Wن""p" R"r0A1""**B9(*{|Lg?sfnkwwdfSg֖_d#VUZn nn!g XW&ӖVe~2ޏ,Sϻ=Z>^JYQ&]vmhAcWMoj,3B~}'yx-/5f[zO=Wtr5H!gZ#XAj/l)!;C6Jj=w2̓"o#?)#uN<# oD!rr$HшyeJ:¿3)! ;CuFWgxVF|cp<HRM/גT %pTCEث)T`?d˾P()[jEɖ[EYe'ɖJgk$ =ҍb/x$6 sE)?A+3Ĭi&/alIbfyNb9߼¬ԉ y-џOݼmbFҥ:i RHzGԱꠈ#F>G w->0"0ÿwth+ IIɍ>-'}sU;< ';ŞeY>ݶYLj20YC߭O0>60μd]b|_#E%>˼ϒd{&+j?ƾdlH?fd4OҸY벞ɼqWj˗ W_gV/{\ٌ秝|ÒJ$]ya57薒%QG^h҅.t,vn^Ѹ3OY􄇥'zD78zXB,!%_U%itS eL}}`H GK Bi C!Gl%o&s_'IހʿQHXƮe&Ʉ Kc_轌c ޕ6Jgit2.鲟N}v3^q{;= O yS^i7 u\D~kF`{*iGF{ۆt;hO}v3ߑ7Ï#U@.Ej$&ᴰefATy KE& AuPvueJ "d&)ձ6:UڴB㯺W”wEQQg[տ;RU]^2=htSS!_vY>b,ye)`gϐ)/K[ ^" ۼl "<]W0:Ђ@\ i1=9c:<П"ciWOUzѕ6ˢvJ| m rDfYlBkx3|9?F&Ï֪$~ʬgn^ϊ\gOq${4]-a#zXbh`fx\e.'jeY!c+nm_/ۏ՜vv]jtكQo6c{9՜td =F_Fz{]baqv}rwŝ1]1AM_*0=Q"&**EYyVugtnLp&HFifMAT:ʤ Mj4Je?!j vF 1!1ph`#vtD+2E<r6zʳ^*ɠ ^MBo@oeT˄2BFKЩ"Uh=Tn(tk9Fcc0 QPG( GQ0FK㨈D\8 '4SH]LS^Aѻ`SVngCB@;. m3@ҧھ@ICP@Roio?hZ>G4l.ݶ-gHcN*w^"_`gX ?$^cIC# *wVw3ۋ>«}ogky[1N-oyb/ GF%V=*#IL. Tz4Vt6ukM3蹒ZM5ӿ\Z2M'HA=W2iA! 88C Ìƥwody14end.ǿrURܧ$K}29M3ɜEZin3 ?kqQ'i[=-M 3 UYZc[,:6֪mu[kbX/8#y|1EQlEG Ӭ/zbqV&X@l3x O<<==Yͼ&>S^k?_ͦFvm1W|×EcEFO:]/|s;7IX4+`^?>E2}hR=[44rYẍ72ʉ2<$$Ǔ}4zQ㧹/|_8w}dBAtEP8{"\9Vrݴx,ݽR6aI̔_"WcDZԵBf+74:^:m'y; IpNv)KOd<D&d:?ILG \9Ҧq1((%yB_.\eAj}(?wz-Y2^kHWaU(OXK:lqC&jxsjmch6 e3 S U$Qv(KOvd'/wANp׭䵢t3[Kl+{s-]._,:Ѕ,FZ\o.I Ll hNj>Zj}#Iy;ЃlZfl54z1CZl>Eh-/;kvv7lc}CGMҙ>Nobg%ֿ3y?o:*{kv {UׯsĕĶoWGOJu M>f4 V$R/eXy#xdoүt.5LW(UZA"i{H7 IH'8K:b|D9"r l+Ֆz[jRH` r+nSu8QCqR t[ Ë\ߨ[:BSTWu16a VLoC j+)evCvnUKmpwEc7ݤs'BSw_{balY;v썆UJQG*_Hdct4g(PFz4&!I@4|$si 7 N4K/^XX>uV?,?F>F #uU-F hfy¹T& !` LR,hKܺ yUȷ 4NC,B` SOlzT3 \z!ޚO- ,şw?j-*o#ѣ %º(^maokf~_x5F("x|d6[aP6Yk7{RdlHw)f l{b+kB6{ݵxd(a$&Oז2LOv^'NBf%uC \ $Y~FĘ2r̬6dgyyzҟH95Q#ykDT)9"rK}sHר=8,p 01{o7ݑiQO%g$-H,.{Q32|!5UW?ɎN}f';xo;blmV~OW<W8>j/'>)% vĢQmSe؞=K2{h; dX=äzło}cOO3tF!;fFc:;:'SWlq6ѭ}:F]ɮbieUYgUV`{|u}KP ݂%ZYutә?u9w;GwEEU[mXo/5QSvv_֓5t^kVIfRv"bSvY-[8Jj7)Fq_ۍwUSN DFj7Iwmű27PI0  nD5CA]3D Im.k߱wb M'V5ƥ%V$] ?$p$Zc!} q4!a WZzA¼ eZL%h1OXj4IwޕoHt;"Wޏk^n4J _H7z x*(gƀ# $ч*inqtAÉոMÁOAq\ƣn&}2 r?,>zMy*Rҍ )mIw)nwt^AL Ms.=w"Xnw@yBqۈ.C#& rF6ñ &zC4>L^:JM:Hn @)ex8 h|#`>i|'=FM:FRmm%F6G%;xh>jS| ?Nlq*,gh,,(gE,lBC6DcID)y.#3hݿ >>(2#'|<_4|< #xė4Wi>o/xOhLg$#Z74~MzV@6CO@P~'QaHveIkJ4mhf^'dE'FF:>nl=ڲ>%/GFc;[g:dyVɍ*ɾ2:u$@6_ۡo m6ݦ%jqy_YG5}iCX' ڤQCqH5q =Ҏi|Ch\4ܪgǝpv\QKE}ϖ4bCL26l 󲚬g$z^L/Q􄇣' =EG+]94_:;h)&SnD=`"|NC{o=h%~""9@zVTN'9t<'32'"[dhnYH9m`Tfͥgzw-/__ac&VSڟ1vKk</ޤ3i%U27J,?YMɖlAXdo-ݟc=:/W3rb.ZlhP>'׈Sb(`x qHb̎6Uz}cQ #[cl's^+>ȎO!SMċDYYۑUy_Er'6;z/~z!+hDtJs8D<Æs 06.J9qu(F_:3n|JU32J2G&^ $& pdѨ mSNOɞ=f{˞_ҬTOzh(lJ-p@?_ʜ`屼`1׌t>}%F,/5. x=Vk_]`>뼵,"fvcϲ٫Kv 7b}c`H7Iem1s-y```N|0,dNwbN[8 0gq9ؠ4vDGud0<.%=K%une%/KYv ]ٿ `s7~M kxx?85S>V|ժ<"WiHj[)y `;e $]TYSJt;ijZXwUIYR]KG5Aua!6'6beJ_!olEnz1ӼR'+m"h\4? %hta5>k!t xy5Y(;Hu l\ +GЫ@CD6^rWk9oƚ:fU9qF|%EdW4a]xhC=daLd_󮢈 xю,llH-aT`Jmgr&j1'Yu9=zN]VsI zw~N6,qBo~+Vq\'ԥU; N|I *,\<>%莶 MіӼk Ĥ7>"C~P7krhnY,7xMt|>ߊi[&3ҘOs$a(7?T{/N)>Di%(BgWLDE[^?x6e -lUmf,ObMQw׉-B{$+?5'lN3 Z u3yvOw2I`rp4Đ`wyt '9;mnw g"_陴E)4tp,R9\RRyT*#sNjUTyLGа&|xPv#"URx]_7~YsV@sZUU@Ҫ+hK@G4K,( ^402 G[^ГzE!ꢪh-#(}mnoe#޿Ń)JxZ'LdFn!KRhPTѲȖaYHk~3GD@?_X!2E[gm^+ \@x4GxS^/i #&O',XO0v5Xc*:!oM^Jgۚ???JNm: cxCQW9Agvj:5ۜ>LFvdglv;9Ώpg3`YZvQ:9o9.gY欤qBc}ڗV'ڧj-Q_ _iٮggڮ #HP|1|ːu?OlJ΃6؝C<`w0<ؽ0{9h5j>p[u7gSANdqF9;PVi|ζUOuz4h|4uV&[A#ُKe~TBG-~A$*dWhP1VGiOQ$ͯ(3D'ѼIZE~yOEߓ:AɈx?~sBR]NbB̬2/yjѭf:BtF?: b3X 9F"wLNYUdEY0{̕Yl1 \_CZ@LmX>D+PO[덴lvL*<^<)ΈFv}} dt 14(>c5ɤcvEXy7~ڣ]fj5 vZ\%51">}laQNDA+CdT[__S1IԯqkEW$Yy3f7Hi ħ-k\X{{UݖvhZޑ^C6j o o m Dc~c$ B+gCr;|MԄ6P~ GW&Pa ttWM@0qy0uЃ}>8L Cߡ v\Њ+ ٷqj++@eʀ#ZV \A""-KVFk[YKj!e zQ9 >#Xz1FeCx4ߚZ&i=h%r/bnh. ɒRr{sGݐdLz"b0t2_eCO|[F),P^^\ LB{wT>O, 劭A.#4#X-&Bi)@L>BZ:'CVhu!u(b*w!LVMoIUO?i9ӛT%^TcŢ ~TV\J:WW"DRM%KtUE2ӳgj}^>!~o1=-*]O&kh֑xKoiG^};,-D<3[]k)lbl9jYìV9˚m=;(:z6d̪5+k~Ŕ@1;^`[X.Uϲz֟,r[﫽1=JF+%ۡgҳdbl+h Wabg[kfj[/]Vb ӱݬCf_'EW$Bأ!ɖ{fD[s.ok=/Xs,[lYUo~cylY'kdv-dxôK)E E ^:tW=3Ѹ'Rb3f{_(eԽzZYռc^W:"1-wȌ4O\ 7."bVg`Y<#=3<<2Jgbu tEDl ,U";oIWzwt>ix ?h4 7YG|Ճaղ/Ym;߾^o+`&: MLnjcvm/ᓸWlqti4*Bteod+1kHv-XĚbNYXO/t HpC]l@]O!tMY©OR[­&z6ڽC]N5B:4J"FN4*Q]s)#5oƥ X(ϑrQ$nU9]1J ;Ve8 g=wYDu CkK !l4,t~4JK]Z}ygpE EHZU#D3*]1H0AJH y5`p`pDqh ,N9< p1!>]"o ".0MƢrg,x,@cziZ/Sl) 43DR*x\߸B2#$T־CVFځwH=*?g*5< °ЭplnQ#JDa zhc% vً>cy\j^12f[Uߪn$jZW&V5:fhh#V:T&VskRQYҿ!Pc2b1T^bcu^5h6hmRm=[)LnWkbrM)ZK5@YΨQ q-ՎjUtL,(12"a;W2mBbo7g!P!к!P!к@c](&h!moyrf̢nl?0ŗ1lW n]_G>qxe)S.ǨqDy ?BwHq ͻ(;vh:թNM/tʽB]6YykmQnVE=@2_%Kߠ*t5af:4A:Nz]`sww|TXn I,Ug>{iK&1V\iΥQ>'DSBDe}"C"D D D D d{\F2& ɌrX} |55?|i|ΕOk2`&hL軄ƍ@di:/ѡq X7}9w9w9w9w9w9|;_]#XNh+ÖS=M 2zƇh^FM20jq2O(2"M.йB'V $W;}׉ul_6{ 1]iexn6V_0 }5|ߓSuM%ƫC}پf)T ey3\!LS L֒믘A%d CKf>ZXk5tJ͏پTzo7nS5ڵ@E@w&hWIZ5^YgQe5l{,"ۦ {GO^[goOYhlA^'x"O)+^8QHٜ~&͡7ٽ. Y"p5(& 6}ٳmr 6^O6ٕeɶy3Cc/YD4M8.zZzĪ쯬*YGvVn}O{òr8jxoV5#Q9Kc8uR]g\v]eLb]Wu*u(LR]\+m2I*7E>ün؞e RUZr(+BTfKl(h+/S37D70CW\=`ޜ,`mhu5 ֭l~ܳn*06 1pU_4*3XW PFL;x.uךƾѧt&o 0Fig)"d(Dd؍g֔Qbʉ4J&ք}cht1Ѓ QtOk¼V5[ 4hf K;3@G :6 fI/XI9 "l4`otx'Wy<|͕hi46[,qp bӁTkދx\x"|.lPq6LχEyi .k˙)mE?jb$?Hυy I@nK^= zz@/!{cCQrā8p`ϕ7Âe 6z.Jlićz%Sv){?5H^\ Fa|E$"Hd8";f;͊qFL@cэ^)M`nmlVwy7/2rm$u{ηZw?`Ǔ|^'dSf)fNJ$.&)i?e.g3J'=u z6{7 v][ݪzx>By{bd>] _%Z|-&<߬/S섇#YEzkX%w,qjzNs-n_2%9@uI1Ha#"Uq»D;tsGY](ZX\C4!$Y 2AEvD(C{B{B{Bؽz2HkNR}3vUӅdm:N=aHtH@r? AoTFl7z鍕ĂުNZQFJ2K6 m~/6 Àr4D3Y)l0%gyRH !4%i%g@D@DBTGi]I \8ס9HX:r}gBX pOBwො FB7nZCӔU5xFW$*I*cVp/a볼,!:hayh =Sz.gp @ȃ~f!긒Yd/-G=ʺ-4Mp4plu7H4C4z<-jK-kօ$ha[l|7-QܜUC GሉUi]癄"x'M.d'#&`%qbl t,dKte&kJItF TJU 3GU”K_Yxvb:2:ké4i~FimiA?|q~ye9Oy)+Q+4b *KQF&Jo0Cod_7޳," =. Iᘔ6y*6y$&+L}Ro;%J-E3FHv-p>>nYVJUx mK;Gk8|$"B6!| Y,]@呼nţb1IᢍWPf,Uk1_DBs)P5& A5Ɵ9%_WgTTGYHS:j ,==ͱ26WV#;q}#>w8EF>Z96ʙ3e*|d-7&|ᗉwnH{.[k@?œ07e-PޒZ{(y8֗פꖁg~MANf+lN|Ƌg,V SG٪g){?j~gvgEw;KhҍTHj$o:#ﳫ!-`j X B!TEdz}Ѯ-4"s]c;0{4W+W8W;:A"^UqqדXpLM2iFKlJP"Y?݇F@oU$dS3NbBH-Fv+_4H3kq.ae ̢{2$xQNCg7\`pJx+Ss!k0om@(oF,n1y&o+Y\Rx#8b&^&OINExAHQ]|}ުkbYwgV,wVM C oK}ܙ(^H6SɊ'|K9ot/rgsG.H*vn]'U;iw?~&^Ukܚ>>%?W՝ ΧVS{ޜw;uedDƓ%$&|/mo#{/:K&D*KTXZP(ֈ^kk[KZGk8&ڲWn,rWnڲwӸȝgm/|M]^Kf#*7^︊ő|=Ҫ86.'ʆdٕmoFk"lT5% ݈VeIckR EEK_IcI=w3Tn<.J[~wb+dœh)R2;kSH?Ok:VBg,]=;G\T^צi2:hK諸: }M*M"*˞ HCnĔMzGUa=Z,DNueϽG*k>v?W*rGakIO v3G㲛e'O0.)AtS5bX#Zg̚n,ٗ}nM@/ڊ P1qv;;g{`kYcQx4DPZY(FԏeQea"s6 O8&4s{8=sttZBԦ{ d0!=WaA: v&L`A;d~ϳ@A㉴ah]G6~N,yй R-(U4&<cQX3?< Xx4š'5\Wm}ivX"3zݺ۪cOn7eYYe֬ٙuc]YKVU`9SVy{1-Φ<4>@#v߈IB_!&lqE|O&>y+m=x0PgzYOmlz^;szZ:ÇtX]ӕL:^{K1h̛/LDw._媬+"1W_U]琈:r E@Dʮm nj\"N|-P3UEZ5;^okduZ [Ӯ+]n]Z[ҡ5;zZ^zr_k>EC?Td" ڇuu+מF_ǴVt(Օ*l!@Aib8Q3vU'gtʫ|Sy5qw*!3e;uqS,ĮȫVx:]*NFfat*tNUTM#t́#ADM! NaX/3ldY߲lGכ>ɖT+ue+Wnrl$9w:c䎪?C?6;~Mmٿ8,__r"Nl ?oyVN:{=/_dW^0f"؏ |;{7pyW Ttr +98]>x-2QyNB|w9h&̻7.|ZU˾] _鞖d%ܛƹrkyX| <x̸ _;ENuʕؕk _ү5ajrK,9 cdyXAWsLazH)Tut`{UTJWQ&&A4.ٔSjz†W t.aF +!t?j:&k]P '[q{i9fwڥcShSkoS裧h"FpjKhi_<5x0xdBぴ+AZU~)=*4hVh*KlVF*̒X^" TCmʣ5 2`*#9QǑ:9Rgv*̃RT`aNG^g5Y$ŧWM8 |~V 9vIԼ?B*pӪ* p*j.Bs**.<9+/<`u0;y<7zhͣU!$ $^LB$ $NnOnOB$z 150DZxN09({Y딗 "v S;qd'hmΜY>`4?.kntYN02r{c<vӳX-9Gﳿng4|{EpTPݫPR`Qps0}NQ˘c}^,s>#f:kƚ#[1hML7Xj&lEv,6;:_D3Ylsv99w:bi끹Ɂ= ]y|,,26Y͌m&WO3-&~~P9{0ke@gk%);>C\qV"_)t{I\_Nqqv;}?8bwu]άyn'7&T2[n@,xat#< *iNxuJm˲:byK.3-3N_3'|f7y"$;q.9l++D߃cV ifo6{uȾtS-6[e6}U]k V3-*V(D`jEY`f`}4֖Ӭ"tb]ut}CGOWn*эPw͔oiGE~{r {V=KkV\tCFD~jĵ>0ZU'XZS؛J5z]`04>#1^vT7i|X֮ هݝ@Uq ;An>=W=NG8PuWD] ՌhmD%_b U|*Vz"jZJ:ȕEnUU$.o]BuROLv!ݷ jk·&FK]6i8fZB0م` 4|v!B:KΧc9Q] kô QST2m4BN&@kCW2[?ڐ8Y'>ܬ"b V~M\ρSS[Y g bĭ_u>we3-:b蜫ζn2c3^uz:͈|%҉KWnAZOE'g"4g:hoc}b4=,%ٌF/j֛n3L#fLu뼕d`6څ|yl.QLeyBbwRDٿk2gdfYo#X9ݹ&K+xObW-lFgU^ߟol@Yn>^ƹ]Krrg+w%,s|>z\}A3!k:PF9> F,Vp˻< 7G&˚m{~-5l9ZWy?/Uz|µS9lt[[S!#Z,Vi7G&6DmRۯ cn1VBFk͍jD8;!+ԍ֡5VudZ-UlVsse[ ڵUp o ĉk N\\\\q5'A6vE O B\eoѪbe4=rdhE&*[Wy;s]] ~dW%L?Ed_J^UP%" ĔMXЩh4,6"ʃP; qeu*ifWQm1Ii8*ʜxs&i2b3g3g3Ǒ f"lq< umTؘe#mumL)쵵j &jFלtt^FufMt/xBEt9̿^0/BO\=q)0xVB Xg9(5PnV(U h@]0r!/ B¯Eܫ4i6 (&ivj:xX(4gvbnϳX݀J>]my>OMSh?/r_cѨjAqzDwnz^GA2KφNl ޓ@@/:WOKT: "pNz5E&yxn9+O] кP3N5%s5&z0Yzs*frkU|tʿ߄yx+ jLF6;UzAsj9f7cDK1TL nve6t4'k6'Zn44;[']eXv!;&*著  GG[%MJdx&* A4Z~INo5ZV+I#.Q*J]TEzCUZ5DMK)J:)nՑZU=toiwx[ d[SrmD}<'x(ɘ!p {ba$S[tҨ:^G@ګ @vBem'_'T)NB&3yHhͥct`6:&66(ѓv6"V (lOTD\OtW\ŞDܵ'J !DѪ&9on 2aǵ%dT]【hMQChl>yNAF>bh?*O )?kl={-0tyo40i` /(ӛ+HѪ g8b $/,. b&=KHY,D-R!⸅mE,w3 ]\m!ة(niGzFX|Ma`3`ic\L13LJ& H4Ήڎ+9gS9~^5I!) ~2 , 4 Ӎ49:lʚfaX[ú3]EȋknM=&* Q;%> e ;ouMUeXrCkB3 աשܫ?k;lȗ/EH[;5+ah#=(TH^ϳtuy'|K}齫O?,{ 7?q> /_9Jy3z"=w KUx/sVIAň FTX1`+]ʮVx8||#||ISb&VlNVdbx+jbVd\Wļ*׭׭|aWczb~C1G0wjv>GUh}[cޤUM=@bަU}6=ڽߠW>s(dqD{'jWȋ&E ;lm"kgb0yYl:c Y;JFϞh2ZX++lb?@Ͼ<ο$oNOp D *&xK4x[E`!LKD[v o+qk}5Sڐ|'9y>ϴ5'Y3")3Ƀӯi©! w\PPuFi5E5麷c\,;z}+Oɓr.Mrj`/#q(6eZMjl kf9Aߌo9Yz\}\LV1ƚȚ_ N27n3Әfz*GyXnX[֗\ yZޏ]  ^%}}KT^ߵW?T3˗2*nLC!~Jd~D""H.RVW[#heM.%x=L}:.ֺ:yt&~~]n(D{D#ڣ̫t&鮥$^zRk:ᩨIњgGda>RGxKz*OAt.Ek<بRU:A@ѝL:Gt}y)riЪv#=sQŕj\5䢊ˡ5VU Ѫt}uMpUpUpUpUpUpiU)rwAWT} ݹ 98ry ڐCU+C =A>H8~1'($U!E{tJZG,*?I??)x"QyUFׄ)c֪[+ĔRc=f*c%y+1 i%>ӺROBc @]dzbv/ѺbڽLBi )ݫUG~`1c/ 8'6/S&6vvv {F;_Uճlf{LrLj:b?)1| /Wl9;>VgX.G~,Y' kQht[9]NsMcolw>{ImL56)l#/iuޚFƊD6o&_g8ˏ=Gsu5v7심6+[4 SDyV~'zM2aE?E#T[C{ܨpïhi +D@HoǡkAs"JT j~#CW$R΍iUDU ͹Ef:p%+֞# Rh)t_&)V@VZ@]S ګx`VKPʷ!B~06`U:vFm]~3+J5^GPR99rWZ%UzQ&gVؐN, `҅9@4-wwȡEY TT_[*^Ke+*Qb(_U|Ee3*Ul)zuOgxyM$hTvO'}+o{duJ3)r;趃|ENؙG x%ҕv.~dY"I s%% h'xމwCf FzV8,fV3f&_f~pr`]?W@Mw ysA_Y,t>( o=KYJ{,-'$[!>￘m&u55ĜyjqT`}9Y2sg6EpYveybmݐp0hIߧ}+k-?|)(/oe u_!dYN~A&a5ٳ4106}YmcWűx;J7cS}O%>fx9&2ELx)qO}[qUǕ%K6}IS8A("ָlT, U. PVw(bqxDuz\Ytpր\uAfq5.&+NQ*,xUpUD>ls~Dq`>wA=O0+=8-%oK,f;1[FAVVٝaǻMtHӇ(Ee`]!"AMyA?FIoXޥjׂ;Vl~&iN⠙ks9ʟZ:ńTX(.gB?![66966 vl~EsNMP=engB!q?u*|VC6XQW w!Se, w'q9B!wl`.93dd]$0=][[َ1Ǻ`0?S_34lvGݒan G3^nz^cѧEa͑wrd}'$6}ڭ\u*j11^LY|pA~>7͟lw[8}/ZņӬ(~c@> V7G,!B5C]Cw}CECgB?:eͫA6 =t6T&y y5F|yջ+ڂ7__Ǖ[[7-M ?n=!z][cDOQ6/i2T3eLJžkuqr8dX燵u.Y1P~LWU`bOafxZ<%8GCt<` te3BgQُ~~n("|/{hF_xk/ʾ߯{ zxTmYse6ىl%&j S%ÊTV81@p֛}ji.c=l%iljM 7ÎTQ B YA~J8Q(}6B aͯ#L4Fz93]B5 pDa'jg7L1( L ]]apxh, Mѣ@L̵?_vuׯUvm/<"bmbutB'=)#&)~wzDYxkPvPuYvlI^RZcJ<ՓGfDOR tؑy؃kڻ\]}d6e߽lʺ"m; ݛf["Slmr ʶD C?l,A=LYxOCԯ{E~(}/ެɨL7P'SQe7v`xxħᵏu<<7BR!DBO !>B|*Ek(&b(lX lx03 grȸD†ަWi4YYff-4?![eβKXͬmƘр5fwNaB޵: ̪e{Kc7c<'_x^G}O{V`VvUqE|$ț#xyU/Ӫ+}-ۊFFhJїA/\e]aTQ(LW.ʪ\Zu u>EL7FV=M]aè0itySWB+2'j З60QA"S8B!@-E>Pcti5dJe*FAykV h2a"&.LBhbGҤRd2*RD*" B@5D!J3O|J ʌ,@fd YZRUӔ哥ZP uK_[Wyȓ,:RG6k)2#KY@RdGhZZPFd6$lGf#?2ȏF~10$0vU8?cӴq㒮45~KvG ,_c[ߩ%t7tMwVr h}lAgtzV+z^%\.9չn,_CQtz:qS q+.w=o;p8nڳ㢧s*իb7_τJ#ΗI,ou< |E`W&Ke&+zQ+f(hT*6zf]ȵ;-xAgʑ~g̪"zaPf*z-1uQs'Ձ;w*ߐFa7ԵQ oD6(ޔLk 'C1R!Q/]u )l7S1QV SS"]L^B}I Ԅ'^3]Wb QaVV]NaP#tB;/6Zg=H<@j]p ~RD]E'#"Fee]W}hЗJ/Wu5upQ[lt\c7Βm|xⷋb]d7c&;Ǟ6ߊThQ,kvĞN| ,vlUJ5X#wq(8yn=TsDɅ)b6[b_W, k(tC{)y_[_Y }-'[y:iB'E&Uήf7SKvM֑-dopCޙOs/'̹1TŜL[VoUsۡ>|֬Ͼ+o~78u`5׷/_909s((gN5a-cRF5Bk()@2oOp./+)_Us|&x:؆'D5[$:3ΆW~b{?X3)#Oʭs^ClL ]DKMstwIaw)=j<žhvO#E76VNvhC -x8le +lvH'M#g˻f5c\F"?ܻܶng+kK]r6\rb%%I%}֤t8x)oQhm,le~5oBtb.3Zg$RTХ A3?W_96|Wn8&p9(qKP(Sp S 5xӤx*:'աtT5o0zօB;J#pwjrf@Gܜ^[߂ޡ3Z wܭ'}U_ZOghNR:uwt;Gg0:YԢsAke:vJkuE]iMIK&I7Bn%BX:c%S*I%$$$;I`7I`9I`7ɴ&$k"p9:f;+P&*'j$< ʄV/_ނWU[YZΡu8 [Zn$ jiM0 kZ#uejq< wj3^T (S ĵ8]-0ZȩעZ2#KHE=to,"v`I`I"VW^cgG+%.(NY@TNOhͨh䱠v f*ԉf*입b XL'& *Э *Vn _eV_eVAcvy'e1-AzTcH?}t(A//qzf_uļL%].%1踄bˍքC=!ڜ 9{H'0L{oЫ]o%^ Iĉל$9#&Yd9sF y3fEEka2M<9bKFQ}eb~P|g2k̩VĹ)~=EYh7 Vgkή[È; :aVД|W'D {͏C1d>!@gs9&Js΅y?#. ]:qSc=aMX)1 byQkj^A󱬐&{~^/:'QOZҚf>?pCƙ/ $}=.+swJZabA従9dys|A޵y?9 &ˌ/,KsYex(Ew3g)}M1Q#WVlWhfdl$G߇Vo^^*X{g"ۖ[&Xb&Xb&za@/~/D\ἁX(tJ:%K]W! Ô b}>QE:ǔ+.c(ǀIg!@B8]9zg=B1*9\tftt'hU|1{:v:^5vi}0}20^E`#z5zhb,݁ :ҹ,Fj] `GH-mnElSUzo֚s6]C~ou;q`F:0-c8 n~4fᤨaQъ4=Uz5 l`w׀0뒝:Ko4¬\g=4э/ |@8/l¤t3t^[ye8$bZ_zBയuC_-8T4sϥ^R,ʒݞ:ȥcgL^n|:6pXGYJI>mJH+ _݆Z,{`ا+36E!!PH>TgE59'/&;"+F9sYL)be:13_O~>xgKm6ϴyE^ώfns=.+d̗{aMWt&du7m Mv?~un_w Hw;ٽmCd\G}Le0M_>QYU6CԶ<^*Ɗh)y =VV1H0=S*OpM0[8Uh[UUU{ WX&U~dq{j+.ixwJG/S [bU#̽}+mԽV;nnMU5hU*U8n,"`@Xn,"@xBۮꚍhL)xti,Oy2263cfteA!Z}&6eIyhY* 6&0؛OțIgyB9h.&HkDuj3={LZ)P=5*O(]3y Fg6:>-11A NՁpOqR|6O5OV5]dd.+{XOzV['9!*񺬄IQ1w6_ 9d~MS6-seo9B 8rέv=ӑ.`څVa~/ZSPڛVuTґOr? AB`2 FBwBN7P>z`4/^@^@^@^@^@^@ehU6iUHٶ^X{= X.>HdUEP]:F+L9“Uֵ &㛬'y} jN$:t \~ x0qAΦq: T\;:*b<=@_e} %Uu0gUL B?l~u?Rw!} 90_ׅ|^~Ʒ lķ2:~Z2(3m2(3m2)ݤWUJ{ϤTT5Rx(? "mȞ![ *?i&Go62LXk!Oh"utN90 fOYY愝ߊ"`#ꐨʞdk#,`Ogy<-dy{b߳ylh+E3v>bF#)7yN"{!]\'_ BUmƹˏlwW̗i2Y~&a{=nWn77N׊辚nO9Tv"m(^g |K~)"ysŸDK r}~hTfff:V0* ,DR|j},s~u=&n Ky C")x*#،Xf7#.yz>^{ɻxUԻh@ʪB&}2黐I߅L.R*.R*tE;s]1z {NӇwǼ -HH} o'SZ;cޣN=ZߦΘ:Oz֝ttٛ|GJB듲#=d ^XozN y:CtnY8kK:ju7j:^Ku}A_qYnҗڬ7)հ+]eP^Q2Ɣ/T lRGeO}Z!8 #Q2Aeb#RAbz~}:OE5_wbUCw!"k:iv}ڡFSlk" B=T+*' }ɺk8Vt5 ]KzѪx+wylzL3^D&K>N6O{rt P<5ML(;P@Bіvyq>D: 0z<<b+DW> @te8T" G|T+-LMATLך4ٚFGJU0W3ca01#<U:RQTIE,&TDcrɽpoCMdIKYFHm ʲtJkZʚq5y|U,o2zTn=W^vd w6ga?O]$!c)Tz h'<>vң*|t\v j;viU:;;OKyC;9Jk~1xRqhbݻCqڕЪv':N? 8?UAt[`,F5lkt ΊQSvU2ef~g9Y>J4ylFVg=nm}y ~-b{*ۑn߲6| Gqviv@BbfC>av]fUx>ogu77,{+ O-r'gMpC~"{ & X4wM~[c@'KG[75^u/߸B,jrhmr_wKz^y\}ދ.{rf*˛U,qUQL*LY<Zk> Fy5u(n1|b4iZLlYfIلIŷ8k2r>y 1 P+H0΄o7UdP|}̙r,S+l,W$"5VWU+lvzkyhfibaS7lO8S|mO :~ Od}~~*,| 'NyɖT1Fΐ \G|H,{f˥I}#rS)'^Py|X9@N?Xl]>`V5盅i Q݌SbbXʥ,R.Y'wʾcPT;.?doOR憬S>y#O>e7fF,boZ3|7?$yy߳"?a|lfl $#y.;<;ljBՂ 9;DEc\N`o3)YK(rlg3ϙwd`d03 e̙X@~GZc[Ge1o;/,"C,"2kByQN\Y N9J O$PC|<>G>hkR!ץHZQ+u}Eś;6VGX.N>u<=:~ {!2QX<)g>ih=A98<ҧ@`ԹeTnTte.+sukHusxO*b.sP}ZJ/`踒QPԬ/LV.ZR5/^i=&*/U7[J܄&lB&Tnu0}o0u*a^稈&ԾlB~zd?=KRY᭼Jˈ(_eTbLO9J;: OE)U-_Tfï4l x6o\&塼=5N?'/sp^@ylv<H'͹9!ƊݼNV5I^D3ր`_6W,Ke&sY9$'g9;3oyQa۟{yT_]MH7gէ=w\Ny{MgƜy߶|HV<;ĉsCr&y<:}Z|x!YuԖsƕwyޯ~xgYL˽%B~G=*|{}[9' nDU$| G؂qox?_͓x ;`l#Hh>[~׿}8.752uiKIM>.vPIuhTkmoWq-WQGEZ amJ44oKo M)M$ow+HuuoR:7XKS (i 4iD_ K~itmD驐~DxiR[Ѿ V"C@ш!'ZDP'AzJ$h:4T0u)$dOgC &)Rh .T:P'Ҝ OEjjAj~_w+ i>ɕXf0y kgHJxP:25F׵;!Nϧ=dLXQ 4/H/ ė=,_h_EC?")ѻ;<dVcIF\% O!dx HF%~d`y s]vJA%y%)+I֧SHҘ/s}$Kh/ %oD]M|e&x 04< 4|' (.DY%2hBRξ븗0XnL#y_X&DErdqޚM4@{]VÄEd}F?/~oOњi8/ic'^wTdX?Afރ7 QcX[_7u&~;a VOM0;GZt%DUfaQ1Kƌ=COD,0Ks~X.U'3ŚlqG UmB-G"w"㵅!$Js:E8_ *A|\ ߐ A2!w帴Gs2yu?,C|x=! {kjq]qquQEomi xGi"Fu27\nx\[7}MB5=.me|TQ8vvvշ]XVA2٣ jqpTg=y!GYsd>-&T+^:lf4[31Xk\4VfMeޘ.VքExDZ)7l8o/UqK@ծb9¶ʸ&1M♋eGMf$UK\&7/e#>ma׍PZD2֕~:xpodIT'$U<hEh"?ϣrEÀnҘԞe?hWp ْcq9h9Ü63~ ~Kpl.2"۾?6[ҞЭ <ѰbP}ЌFiՃUWV !w]0LZQ9tCvQb[k`[k`[5m=3"[o)^=7֜ęe֜D.tā4ʌ.`n`[`[`[`[`[`[mѺݯb&:rDSdQ@TBn8NJ"a\[{*FOזVimm -쨶"&|xtHċ *ns//#5nfQ\]s|.ßĶ*Cz,`l:NƤR)ȹJ]\<[DT8Yn؁m[WV9Ҽ ^)Yu V!NZ}EC$oyQ@O+ðe`7 A(U ۾Wv>.^vYAmxA*]F$/F ;BBIpchUz"ۼh&|0Ȋm 9<@S=2q֡ OSa?N]:(Zq!DB1dfCږ_d '&Q_]S- لϓmX(|3qeVTv&ͩbW8b;Wk%P_7ڛ,WѤov k:0_k#>&G~AZz4k別V_jXޤﴫҶ^_DH߭,c|2_̏Ox1V"n1'u;\T?+}]vHŚ{鲦7@qOXG;k l=`#@ٹCF]DvT6O{dt-[#[KbDǚ@ǚ@ǚ@ǚ@ǚjk# =it"OKbe{kϴ=ӧQ'dd h^ G"ޙ'lvl8ZJtz z.}Pdfjf`Q6='ʤQeIh&G:YYCھYWS tܙ@YYyn s s qO/( `1p 6 `Ms}*P}@nS*Po*\B4J.( 4EVy.*s@\9.:jZ-q*]ҕ"q2KFG '%c}V`J^i5&]:p߭ eihm+VhmEVToGTaڧa:7vlݎ,ڎ,ڎvD<^*w_ I ㈨0< QRUrGxܓtsٞ5u`#X.rk47cFcB*/'|z2xyu[W#l_/i\'[U/9{+usqo#Ynh@vƬ^)9kFUk k$P3dGʲ*wuUAW4VmӪtN"ެtwRߝV=`/G ']vr }#ҡ*IFH"B:9N}PE'TKƑ4BeP5{!,y6lFE]Y:yUtVޫwy]va;.y=Ne^BX/+%Λ4ꈃtSQq6Wڽ*̗}};UMk߭3]L=sQ;6RXE}QȾ],ܥd5ɬ&饝VAnVρv2s;C;(x-+w~7vjrQ2ճ4LQ]yd_/(sCsz,rE.ӳezL"Y(z^Q1DFAd4DFAd^D>Aԕ=Gs&:QW54kkPRh4$.XHH|lf1ij"=1H+ XSERkU<4o[~jNMvoJBki%X ߉d]ngn4kb{ :26mao苵Il1ڢF|ߋhNo=?}pk~h1g QBIUnY߷7E7 X̋{mVoENo,UYk8^ t墀rQ@( [Qhڷhbn@X\,P.( U)]ZhUtp%;e"dgtΕ(B{W\v\(aٶ~s<]s-]L أUQZ*Ȍ~ʺ̓׋]ݞBbDȊ#UL&2uGإ[W w""$Z" O- Z˧Vm pIVɧ-h#zocI''cΈ3omIK_-*f7V߳ 2xobڲYn1=:'H{̔E]MIGf-*߀?d8F=zqAŽE]ְnj5y_}Z}ƈh$~,%F ߿&Js7Ͻ*R)ٮ2YsTEeŖ1LٿfĎ {q+bKNlɍ= å.?{,yDIhU:Jrk6joȫrR^&!! **^ɫxȫxȫxȫxȫxȫx%jpJr,2Q~,0Y %a7Ou.̧٭Huz+dW ݎwRS ,UPlIේBO"M$x섋srK.n zc=Q$z/]#YHT<Bʩ6gdOjwFb;N|#i\eIwvTikNic)ˌgcmqQ\Y/-_|452;1 7tsy3cODt?\6ҙaO>}L=XDZz$_m{!".('F?*<SV{ яC*<씆W%LSH~*s])Eo3~I"Pp[].}p$e};]E !HD'RJIAG؃u!kRECECE+OyntT7EU{:'\]ȹsu!Iɸժ{u!PW!e={/ӳh{Ѷ'7xSpF"\CQv 9'#Ci<$J R^.ƒ.R/Y*d]*d^*tThiNUL7R KQfˊ$H$kIyIzIF$A%A%A%A%A[KKK6A>We#G;[!U(]|*ɦVk:ɥ††b$,rmmuṰᷰH7D0': \&d nA&Y#e`%SG4}~Ib5ojj+zscL-֎Q;Z,4|vt{3Xcd$6$&៱sl!ͧN F bLYDOWY:ӏf~Q6w'Ihl֟I&pxhlGH֚ɤ^f e6m֍KHD# h=Q 9 9 9 9DR^'MHHኤ1XcQT0d 3o3U}Hn~aUf7u `x; =TȦkXvOL[u  Y}U͇ K:䰬ő888888888888R99sY`ȂE@!4WӑD> D>EEa9`(DFT!|ȅ"{\/ilEգMj lܪ4%&̜1@`b 1@ZuQ{D 191@41`b V w֝VJzJF.G ⍬jde$+eP,#itt:=ܜ`b&"#"C̜9ӊX/MӱK2Z|V;î㝙BNMBdxeoFZ*rhb߭rPEst%aL&.瀉s*}_G(y7$>>:шމzE,f:!|TX=ˀ2ƺ1V Vb`\Ig}4EOmU]#~W2ZJDXKXḼlYf߭7!NmAwQGs>/QDyQT=Pȧڅ)+V0EH`Agh܇rqZk;_F`/`D!_=(٭2ۙA _Q^=6s;7s7|X#6s 7|' @? Ȯ*Ay@'>hi/=Wh 4~X_#9SBO\-fyvPmfiPӵMV1)낵Ͳihd)>aH8g#Ke:/߭+:. v:/'adKGҖQz#>D/w%go~m.fj\{t4}8&7ŏb!z1Ρ5lﬗwXӭ4+zZ@fqM)=8mls }]wjڗ{?3ꙥ]&{~tsLL#u?RyseQRRyNku=mRfd#7̮Vh$ZVG䖥,Kj1seNy1yɾD˜aMhAsR`u+٪bOg2+J#D+cebv8vI?`gM`ozWh}Ӊ]N]:n nga*"QY'x'***rφ7@O3Uu+m]EjM!zCK_W#zɌmMcK$տaMRw4FІƞ $fuR@{%hآ\8d `CQI;/+kk؝j4톩dV29TCDz;7$YH : tVcNBg5GH(D?X~+Ix.cM\@-_R/ӏ8U~Eڋصj/2L"oˋx:چچB)âEGsѾ Zm`M1}KbpR CEE%ݒ O,@X-.@X3ե/gz*t-jΧnuzTWy^'z qF䔺^ق {[-+lBsX,kٿmiQjIe^ 2EVUjZa'Rs؉g}ǒYh|FɈ(F6| ܗXᅲ,Xz ٽN`cF;\ߨ;鱄KZkxY/Ǽig}IZKxWEx1_lgizYeQYFohr3z427F.!6lq?ϻsYM3]d1e>V6X+̛4m^kd~+|~8[d h2$gc;~ho~b.dI'hNHz;}IiWğD 6S2jr [LlGgvlc&,Q|FGrYX@)J-2ՍcHx[ej}eȑFD4r$F"5-#+YDnjQk@o2B"Q"80~י83 3UGr6"Uղ8`-_XzO/W;+Q"9Wd?Qvܔp8Qn;q.T7C')>-NlWL{+ℸby$^ {{FkҶ_2ZI9#Y=qLlY(33u?p.dMxsQSeCQ6Uf_s!l]6U>8l]Hq)/ Ǘ경 2un\TT JP,p M*.9Ҫ}Fl5!s%jdF&jW2szFk賆Vh d H d z z zm6p@OBT/qy${RF>,~o B H\doa_{/{=Zoc:v?c{ve/wmяam|IYZћ>a< ɚ5t,U|y_gcO]dO~Jknl1%Y3 5CjCB'Y|Ql7^31ky|*'8QS ?L軔&=jO =+Aabq;Y%oEbI%vM~m}:e=EXXbE,0ڦ}:OwgOh/~O#1bˆ"*5}_\Q4=-kօ=w#\*-^u8@|]>gٹĊ6@6;l6"2/ z=ЎX0CĄ8z]MuD@@64v%Lh6@xuBrO*[` ǂlp܄cA^ r{m,&ea:zE-_\2gq?~P~.GW޽^m~LmA~#(2?1ڟo# ak*^[o*h夋f[ì:YhƳBkuҺd;v=,;hJMp#.R~i-mΘ# ~ܰp-[O &Zkoҵ ZY OjӾou+zA`U)?Drd \aCHo7Nzf4[.}X'I~C✱Y_Czfg9~odclxO-a k5ݚM5ҚgM'C5dꢫNbCj/$yNڢCRqA ){'L3Ma5||Uy;sf^𲴲RoВJΙN4jy3ͭz@oF3rs|yh[ǿWoVSv)PV1xu՞ђh}dlˌ oo7Yޙ- 6U^>-OKݾ@{=5/LvU#-{A mɗh/v} ".%u)¥>~/\k[q]EwHq5R׮ l ~f zAHؤRA;A66'I(zDl9$͕\'wgveE7t^tT)htnc-3Ԯg@FJ_W=Xn_gfAJEFWDp* V[U /a dfH* 3ɥkǫth_g0xSǏj?璽m.DhòNsH_V4r5,Mh0_F\lI!A 71sZI#3[K{͠U6gNcU'h?p %lxʆ+lУGgCVzjUt-ϾE / / zt42> :u4thE#G;h:ڀkbC+?/fxnwLjۛXQ=/C< CG~߫Jdx-<;aqWwu_$iŒmT:KKZU+XheXk!4hl-$ZYkOn 蠕$LB;/.k"dhKoEh} zUewb%74/AT=Ae(1BE8%mxU=b-j|I6E]f1LO4zzك祤eDU^ޚ09|fcsEyVq!<=>ъiR\Iʇ' @|DaJ"'&c323 QQ[V"_3T9Hr4yqFgnEw"N9*xe^Rչ.E܉يE&9 +)U=q'X0lmd86R7۸9O> (l<ט_gt䟍dh${͎dċY"_- ?c⢘EʿLxW3e;I+ ԒETugpg.BXŠŊŊX13T,FVPXQQK3%Xt62 ōbdM*zYiiݔ3V/ K _H䫸<0 y!xa8\P7Gi?V7cC0d-=KI^f!i9]ܧ/5U [ȊO,Wo2"v3G$|%cX)6olϬƘэbt1XskUž G=.bmbKH^A{K{L[y y|H h xSAG(uEaXmq7'[iEOD]-BxV[oF՛2~!}أ773>Ih5.~Hm񁸠2t{=&mn )ʶ^o?ndk̕N2ͫc%I$CFLsaZ"8gև;3qLY0&ByӚB$3Xf:`QV5+rΥ%ǧ+![a>d4ɼY?k5jɁo|Y75seeCg[X֒6%F~YۨheC=їfg}Varsw@u+oi%VeX".?c'rgQa=W?s5 27ھ2nWONvfMY.}?PEmK{tPڒ^qu5: #u ?[$p*x O[86,F{sS)sZyIjEcgAsgd`'*rnTe ]SmuAs CeAPpO˨C6Gwm;y\_K}:G2 ,U9 rU9A4/MD52(L7H%a,бZ!$>Qd}=#^lqks\ 짪|?Uwu`4Xucsr :Mr lx5*WT4Bƫ.4Y)vڸ3-VCDa!9˳_*;5"4)G\d:߸ '^'.=|{gJT.d1;+uwp "HKB|Kf2t93sw7n`ƻw&N@7ugFd[oB9Ѿ+hЯP2OkV OkV('M|?`D4V0n 1ni|F6W~:ghLN{?A\qX\( p7@ސ#jDMgփ}kn5;=XkAs9FOiܣ׏hZ@v`ɍ@@̀G#g@0Cha$D$#ڸI"h_KXVUW 3bhJ:7BηpgD*w{Kb(Doޓ 6sΉ(]ФiV)vڱd͵QMv;N*{s~3ylﱏٵם肘Iqz:?۝6N'uOhR?~A4(_snLqJ5V2݉)HsUjߵj0ȨV ג?a 2"kPzq5+]Kۯ*֩ߊ l|| 5 ͐$LgS0 +A $m2=E(P3LvQ)1pVͶ&dpdUW?KǞ~nG=w8b8Ѵr|+|ӐHCBYCtFh8Fj A`$VU;3tiLy hf44 <ܢjMZ]+Lܤ:kДb#Of`8;g6z=ݫݧohY3m>80L2O kf]ց1f։űڮ\/#wޏnyΗC ϓ>?]lyM\S߉ "Ҭ[ran[K\kՋ7}$VXDHN8iu]^m׶7Oqp&qιnN[˞jױ7M 4+yTu@b™:옂I$־1Q8>‘w9cpFψ)}o \t4T?[#lB*d[=w~;ɻVVtܨ p4F z#|*z=DSPgk蕍I<8Hqb%ɖ~G:NtFmI@ԧ%mKy3 (}3q4H\4P J*4²z^̔r 6+t!q1 #<f43q}1)蛓ۥɤ1( @I3>D\)|pHL0TƂ9e,: h 4ȇ2hl+:\Pl @P4 +)(Z*A.=vQ)Ĝ߰C__Xފnf1?l3Ϙ/M_:vJ/7^#Uy렵LH˪Ebx??$? m<'pogZV=|3_du`[?eL6qdJ9 gXIށEj h|=3=c=Vc#^SO=yP|lt?l=gZAUn`GXWKʯ6}V%l6Tjf5gnkwB=$ڶZo<~3(e}GF"曬'3l߸ui~ζ9۩Ӓ$N _UC6Y0V]R: G: RHӵfH5Ay3 ԵWIKjK&/%dɊTN-! ꤚ@bʠd9Qc%\HHBP.\h  ÏD"*Npb/4%L!!"G(9ZJj#i q#ɘb4qepqRBmć#|8%Cj<$Cu@Qfli$u*0oe R.Œ30c. ^)~ۇ m8N'uvzBGIE 6tq:h19G͵@O ܬ́9YK3^:?n[꽟nd^TGX {l vKl[e^2Y,Jӏ+I_Kβӫ{V#{ڣ=[r}qnY\a慲?ڢe~wxf_l3wO~oKV'|Tlm&aw˒G[]}=T_yR7i?5r+tj)B97΍HTud(40Tv4N}Fa,ڷ@R9xgՙ_&U>m8ǐ/K6"Һ*$~f1I|#6;cci2nv-5އ9?޺${v91!uyo7s;xz'e\!c .o=yLw)% 53izGZcA&K}qI/:^gr3_|(?;tb m77_o;-=]9i^t~?6M!L0_6^`DX7?MSN/ZPKw˿dwf3e;ϻ]ֳIgs%slLsrI'Vg~E-]?Y?*5'>S߫7gu$BIk࿙^~kbG8&,{>O_JzQh\9Üha7Í=fqXlfO"&ޕWhg^#vݩhg9v7 Ɏv~ٿ)"ݐ ǯrӠ"1̼)z=[V'`H} r;C HqQRU"|v둼r4 ( 5ՄV&j pB7h~%iʠ~ z3/jXo-Z(XOhB!LBq'yOݮM(¾3tuUsC_E>*hCxAJ(?RLEHP GHƀm,67-q*I[j|if@[HAcZMˆ^4b9BAQz^ D[hKtm->)D'=ox^)ޢ4$oyNxƷi>9M;4ϻ4]{4i|s=x>)χ4@}i'?>Շ43z>Cϧ4h=i>?{/>4M7'{վ1pVK۪f sg/cbkXcb#0?b-zR"^b}8 I;m00ms.: Ih1q>S_ #{m/";G~űWKy[_[gV6UT:JK_sVmjF.M='e8tv%bZ~ ltɜ/_Cd́ }۠Kn9ϫSgzX<>[U~կūSߦHS}jV"qV 7t]}&Y-mZݮ?Lץ{R_:>qN[d˾dA;;TBd0v8{͹8u}Ҝ7Ch^߼^i5o{ѬϚ.Q]S՟.ov? @TnkU?;}lɅ_~4sȎNsgvo_/z~ Ȳ<87Kd19\Z*~N!K^k]v܄+7r1z wCMnT~:&5{!;NeƳG] nr0@-*~5uD|#tF@+d]ݷ1UQk5(YC#| [5+t3!Ռ5FԉQGQe:x0#5;/Y݉3J*]odZ*8-e5jv(S|\EH9$ljۏp9Pi CDkT'8RKx^mtDh`ق6̪T:D-vQ'0 $1 bL'Ep+Ha!jĀ-BgA/Z줢=t`7TUȢ^Ļ0z}EOd9Ru?zާΧwa/K T0k0JOf @_*}b%G`a:( s "GٍQPf7@&;88{8N{ opNS"씨(QXP<qۋa q]PNhAlDE ,t$ kRStg(#BPq r3ɮѓ b xLᘏ'=ˈc2=xW!U؟|M٥icGM#a*3g_6"lO~PK!HVefont.npyPK6NVvedo-2025.5.3/vedo/fonts/Glasgo.ttf000066400000000000000000004317401474667405700167630ustar00rootroot00000000000000 PFFTM" 3GDEF'~3&OS/2XVcmaphhgasp3glyfY hhead '6hhea6$hmtx>Dloca{(|0maxp`8 namecL7postS-`2_< ս ϭhfhXf<13' WltE@!"dR ?fffp&^7O=iL\mn/q^`^^@baJVjjJSj2j1$d\F>1(64[Ld_]h\dWNZaZ^]xthZ@X?QjhNh94d~%>4B| bJjjjj.1$$$$$z$11114dJ`````` idddd2Z^^^^^>^ZZZZ?]?`__JiJiJiJiV.3jdjdjdjdjdJNJNJNJNSZ<ll"^>p2bbjjjjF1Z1Z0Z$1Z$^$^$@*]x]l]xFtFtFtFt=h>@=h1Z1Z1Z1Z.@1Y4?4[Q[Q[Qhtuuhh9$  ~~    " & 0 : !"     & 0 9 !"zj410/,#5   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aOpcdhQvnjWtiqfukzbm?l{RGHLMIJ8VTUPwKNS@FoBCDxEA&  V2rj 6  v  J8rR\\>d*tRx*L N!$!"H"#^#$8$$%%&'<'()J*X++,*,-@. ./(/01V1233|4D45v566788l9f:j;F<<=>>?x@@hArAABC"CCDE&EJEEFnGHI"JXKKLMNP PQRSTbU0VVWXdY^Z*[2\\]^_`^a\bbcde\efghijklmnopqpr|sstTu vwwxyfzV{F{|}b~$Ё~|X@؊V܏ΐDԖRޙܟ,4,nn`<ĩ櫐F^(P𶈷&&0ȻR2T*äĴŜj`Rʖ˚F(ѤҐr"՞^צ؜ٚZ$ݬސ߂4v(` DP2v><<@tBp4f3 70!00!00'0!00#0#033fpD&'454767032#"7&'&'&'&'&'&5&505676762#"'&    (  " " EE`3$%-  -%$3xrp3A&'&'&'&'05056767632#"%&'&'&5454763200#" 2       $21+ / -K)&Q+*   +12&@7&'&7476765&'&'&#"'&547676327674767654'&'&#"'&'&4767632676?676763236767676767632#"32#"#&'&'&7>76'&#"#"767656767654'&+"3276          0        $   84  48 8"     $   (0  / 0  /     %!   %!  $    ^&'&54'&'&'&'&76767654'&'&'&'&'&5476767676763276767654767632'&'&'&'&#"'"767654'&'&#"3267654'&'&'0#"32% '()  ("!      ')(  (!"     [    k *       KJ '        KK'      %P !%7$  b7g!&'&'&'&54767632#"7654'&'&#"3276%&'&5&76767676767076767632#0#"'&&'&'&5476767632#"7654'&#"3276 / &#  ,3""     %4(- 44F)' + #  ,3""   3# ) S""  9 %%0#&%$D4< EE\6'&2Q''7 # ) S"" 7/}7&'&'&'&'&'&547676767676'&'&'&'&5476767632327676767632'&'&'&#"767654'&'&'&'&#"3276676765054'&'"#"3270&()   &( 4         R(6  !  C      /    8  & ! %,&$4 )/      U'(6H8!  ,-  p3&'&'.'=6767632&    $d*  (833I&'&'&'&'&5&50505476767676320#"b 2&&  ((2   bLLY""*)S>[ML    )(:F*?>:)(   3I&'&76767676767676767054'&'&'&'&'&'&'&'&5476320#"'&     2('  '(2c  ():##*))*?:()    LM[!"*)*)>[ML O%&'&54'&'&#'&'&'&76767654'&'&'&547676763767654767630327676767672'"'&'&'&'&#"% 66   66    =!        >>!        >=){N%&'&5054'&'&#"'&'&567676327676=47676;2732+"#&%;CA; #BA"  A"  "AB;;B\i)&545676767654'&'&'&767630#""   "    !  .23 iP%&'&54767670363203#0#"'&|  12)*31  ./:<7AW    pf&'4547670320#"   # " L9&'&'0547676767676767676767632'"]& .*   *+5+*+   8K)>>Y512,S88  SSiSST=" %\ Ao7&'&'&'&'4'050565676767676763200000#"'&767676767454'&'&'&'&#"3036'&'&'&5056767676320#"(""" %& "!  d  &%  ! #[       .#:9;;#'  '#;,;:,;#& P"#* ! )((<*#""#*<(() ! /$# ,''1&&>%&'&'05&505054'4'&'.'&=67676767632"t (*  8@  TzMM    & )aa. mb7&'45476767676764'&'&'&#"'&'&547676767632303203#"#"'& c22$    !( G55 &+N A ('  @369-- N9983=$     AA] :HTH     n}7&'&'&54767632767676'4'&'&'&'&'&'&'47676767654'�#"'&'&'&5476767630303232"#"'&*((  ,! *   P4 .DD0  :, ,        )*7 )  $#    K": !!">/ /7s%&'&'054'4'&'&'�#"'&'&'&547676767676767632327676=476763232#"#"f W:    1= 6-,,   "#R  )!!0;44 1166(& ((1+.7 qq7&'&'&54767632767654'&'&'&'&#"'&'&'&545476767676303032#0#0#"32"#"'&()(   5 ((=* *<=*  7.*(23$ 22@     E05  - )!    18 0!)Q22^V%&'&'&'&50505054767>7676732'&'&'&#"76767632#"767676565454&5&'&'&'&+";2764&(  ((. &"  ,"$  $"(    (, n       , (*%?+8+,< !    ++D  %XX%V   "  <= `N7&'&547676767676767676'&'�#"'&'&'&54767676303030322"( [<*  3IL& 9    NN`2%&0   :A<-,!M"")!^U%&'&'&'&547676767676'&'&'&'&54767676767632#"76767654'&'&'&'�#"30327667676505054'&'&#"032764&'              (+ n         .'  , 00    &(    ('      00 %V "!   "#  k !' 0 '^Ag%&'&5&50505&'�#"#"'&'&'&'&'&5467676762#"'&6767654'&'&'&'&"276 !(    (h* ^ <    <  *=o)% 12% %HKjwb@  #$  %$ p/&'0547672320#"&'0547672320"#"       " " }" # \(@&=676767654'&'&'&76763"#"&'&54767632#"!   #        !  .23 " " vC%&'&'&'&'&'&'&'&54767676767676763032#"&'0#%%0$ ('6 C4'( %%0$''1$ ))6 B5)( @&)+W7&'&54767676763632032#0#0#"'&&'&547676767632323030#0#0#"'&S 89G;5&%  <&,.*+ 89G;5&%  32#"        4((   *"  " " ', (     #& % 22 $L.'&'&54767676;2#'&'&'&'&'&'&'&'4767676327676'&'&'&'&'&/&'&7676323276767674'4'&'&'&'&+32#"6545&'&'+;276.<.0"(&HDL$   0",   " ,"   . 06<" 6$ F    %4TTep^^4%&,,(//).B  +    !DG $#)Z78  } K>J,  $ Q[}7&'&'05&76767676767676767676320'&'&'&'&'&'&'&'&#"#"654'&'&'&'�#"3276&         238-$$   m!! LL  D%76MP98'   '89PG3WT $''$V bD((,-<`  aIw7&'&'&5&505&505476767630320#"'&7676767654'&'&'&'&'&'0#0#032766767654'&'&'&'&#"032727676wJP""$     **3 !*&  //  + '  & 1  `9QFL "!  22 & L  -Vb  ' +JJi7&'&'&'&'&'&'&5476767676767032'&'&'&'&'&'&#"32767676767676#" **334<&    -#""#-    ,H.('&%!%&H#8 /  $%?<(() ! ?$$   5VG7&'&'05&505050545054705676767032#0#"'&7670767676767654'&'&'&'&'&'�#00003276l ("  <0.244f. ""&&  $  `}a!&%2 '+3'/ 2O  /:NK!"  HKkjJHjw7&'&'4'&50505054767676703030303#0#0#0#32#"0303032#0#&'& 12GG21  *;5%$ LYYL $%5;)  A599.- _FK   IIVV je7&'&'&'4'050505476767676303032#0#0#""32#"000#" 0GG0  );5$ MXXM `FL   II ''8>, J7&'&'&'&'&'&547676767676767032'&'&'&'&'&'&#"3276767654'&#"'&'&56767632#"'&'&#"#" **334<&    -#"$%6! "   5   !% ''#G'%!% 8 /  $$?<)'(! C##" 0(     S7&'&'&'4'050545476767600003030303676767670505054767676320'&'&'&5050505&'&'&'&'0#0#0#0#000#"i  "$12$"     "$21$"   _ FL  '80""  ""07&   )@AI5>>W:  ,@9('  '(9?, g7&'&7676327676705050505&'&'&0#"'&'&54767676363#0#&00007632#"#"'& ! " $$- -*3 !   ! 4(* -%$ CNjkMD  DMkjNC jA7.'&=476323276767656=476767632+&$@ 8, - $"   4"%  (0 B=$Us<=  8:AHG& 25y7&'&'&5&5054'054547474767676322767676763032'&'&'&'&'&'&'"#"H 23EE55 #$/" ((43'& '!7))##  _9Pz :' .-=F('-.AA00 ##," 65ED34 2+J66  E% jK7&'&'&'4'05050547676763200030303203#0#"'&   $%5"**  -.:83A _FL  $5sRN  X7&'&'&5&54'050545474747676763032032707076767654767600'&'&'&505054'&'&#"'&'&'&'&'&000#"$ "!)HHK!  #3  4#  &9z :' +,8`''`d+  )A@I1/0-S:;  G,ko.;#"0GG0"#;M.AkKG 15}7&'&'&'4'05050505054767676763033276765056505056767600'&'&'0'&'&'&#&000#"G    !!-;,,  --a2'  _{a +#22BYAA6G*;lKG  ))=!&L]S:; A@K$:$$6Fck,G $B8q7.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676&P   P(**&(*  *(&X  0>   0". #J''!!%  .  %!!''J# U %@@% $ !")))>"d?c2&'&'&505050505054767632#"#6767654'&'&'&'&+"#"3276JND$    "8,  &  &  0 .`L  $#  ''8>-, I+'G[&'&'&'&#"'&'&'&'&'&'&54767676767676763232#"'67676'&'&'&76767632327676767454'&'&'&'&'&#"32  2 ")()   ()'**'()     $ $  ?>  "/<    "K''!!%    %+-J"$$ *  + !"))(>$$>)))!" / \ Z~7.'&=4'=4767676;2#"'&'&/&'&'&#"#"6767654'&'&'&'&+"#"3276rJN" &   ,,8 ."" $$<4 &  & 0 .'9FL $# (  #!<.- .-QD#  ''8>-, I+'F w7&'&'&'&54767676323276767654'&'&'&'&'&'&'&'&5476767632#"'&54'&#"#")&& 6.9 5'(BZ""  (E(,W3(  6/;;'(  [   )E)* #  3$ &  !%. >063$ $ $  . >(U%&'&'&5&505&505054'&'&'&#"'&'&5476767676723232#"000#"$ 8B  &9((I99 B7   Y4JtSO  O!1tY 15g7&'&'&'&'&'&'454705676763203276767676767056567676760000#"'&  89  ! < &'GH';8  ==tW$=  =>%2t==  8;BHG& (>I%&'&'4'&'&'0'&'0'&'&547632327676767676732#"6  &(4*$    0LG4WT RSlxHHxlSR TW4G/X'H/.V7&'&'4'&'&'&'&'&'&'&'&5476763676767676767676322767676767632'&'&'&'&'&'&#"#0#"'&                   -KJW/+,&F,,  EE]\BC:9NN;;;;NN9:CB\]EE --F&++..++%E,, 77HG5445GH7760k7&'&547676767654'&'&'&7676762327676767676'&'&'&'&'&#"#0#"'&J  )/)(I)  ''  )I'*/*   &'   00@H*)@>o> !)<*++*<)! >o>@*+I@10  (<*++*<#! 42[%&'&5&505054'&'&'0'&'&'&'&50547676762767676767632#"$ (    &&    (   .D9$#'>21 !);+**+;*! 12>#4%9D/[ e7&'&'&'476767676767676765&'&'&'&'&'&'&'476767;+&#&'&o %!e>./ 47NN74 " ' ! d=.. 21?.!")#11C)&&"=''  @)G;< #"#$ 3_&'&'&'05&505050505654767676763232#"000000320#"'& $#+1-1 RHHT #$,*'2h&<1I{0 #2ee2" L=&'&'&'&'&'&'&'&'&'&547676320#" .-6(  *)  9!YYi-.-)N89  88S,224Q:9)0! 3]&'&54767632767676747050505050505&5&'&'&'&#"'&'&76767632320000#0#0#"'&  RHGT ##+ *(1  .Mh "2ee2" 0|s\(' d7&'&5476767676767032#"'&'&'&'&#"#"'&w $""%"! /   !($$!(&& !  4` /&'&5&76767676767032320#0#0#0#0#&'& .Hg[GH  KP"OgJ97  a &'&'&54767632"'&'5 0      % _a7&'&'&'&5476767676763276767654'&'&'&'&'&'&'&'&76763200#"'&'&'&#"#"'&7676767654'&'&'"#""303676#  " G <$ @  )!!  '   E  !, &,      &3, !53  Z  !   ] b7&'&'&'4'050505450565676767630327676763200"'&'&'&#0#"'&767676767054'&'&'&'&'&#"#"3036s  $*)9'     '  02!eg **8Z "/( )" K 91    #hl%&'&'&'&'&5&5470567676767632'.'&'&'&'"#"3232767676767676#"#"'&   .& 22     "    "* M ) "      79      \ N &'&'&'&'.=476767>767627>765>76762'&'&'&#7676767=4'&'&'&'&+";676$ ,$8     ( ^ &    ,   $K/" .Z8** >=Y/415N+  ]  5*    19 dYy%&'&'&'&'&'&54767676767670323232767676767676#0#"'&6767654'&'&'0#"3276  &'209  !%%)<    !+T  %  MK  -          " Ws7&'&'&5050505&'&#"'&'&547676327654767676767632'&'&'&'&'&32#"000#"  ""!  2%! +   * 910'   4 MH5B!3    ""$    .*=  ,  C )    Z }7&'&'&'05&505050505656767676303276767632000#"'&'&'&5054'&'&'&'&'&'"0#"p  "   !*  1*<g!**7[ 9:' $.  );A+,   79L*+Kc%&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"&'054767632#"M      o    **;=)    *;>*)   K" " Xn&'&'&'&'&54547676762327>76767656=4'&'.#"'&'&5&7632#"&'45476732#"         ( 8 h        W{hIF     GKJw2$T7# " ay7&'&'&5&54'050547676763200076767676767672'&'&'&'&'&'&#"w  "3/0  L&'& $#"    )=JP  ?A^V$/ $!!  6"!-,#$ "*''+@K%&'&'&'&505050505&'&'&'&#"'&'&54763200032"#"N      MQpsRM   MQps0!M  H7.'=6767632367>323767>2'&'&'4'&'54'4'&'&'&#"#'&'&'&'&54'5.'&'&#"+'&2   ( (@    <>X+0?=   <234(( 10A<*   **#A01&'T#**    *767322767676767656=476747676'&'&5&#"+"2&(    <        - )76767>76#"'&V,  "<8"      7V$:  --6Btl?)&%  /'&84%&< P7&'&'&'&'&'&'&5456763232767676767654767630323276767654767632'&'&'&'&'&'&'&#"#"'&               CBX3%$3  549.$###-743  447-###$.945  3$%3XBC)(54&''&45()Xg7&'&767676767656'&'.'&'45476763232767>76;2#.'.'&'&#"#"'&n < 4$$4 <,  <0  " H 6#,,#6 H$8 F"8?'c&'&7676327676767676'&'&'&'&'&'&5056767676767676767632#"X    ! ,   $   #"/ ! I)CCY6%%.  &'(<21#$R4#$+ ,GFQ+*)%E// =QU7&'&767676764�#"'&'&'&547676763630303#"#"#"'"'&f 00AK)'8[=*  ##0A44 0/AA..$$L>-. 44B 0#" 67GS/.   67HH55 j3~.'&'&'&'&545&7>54'&'&'&'"'&'&5476767676767654&'&74547676767676;2#"32#" "  00  "   D$Dp   (0 "" 0(    6$+#    #,%6 HXq;&'&'05&50505050505470567676320000000#"$   7,!!+7 D5I6JV9;+7h3w&'&767632676764'&547676?654'&'&'&'&54764'&'&'&#"'&547676;2##"~  D$""  0  0(0    p 6%+#    #+%    (0  ""  0(  NE%&'&'.'"#"'&'&547676763223276547676#"l$   :$"   )*"#  %6*$   & p-A.'547676767>567632#"&'5476732#"        *76745&'&'&'&+"'&'&54767632767676'&'4'6767676767676;2'.'&'&'&'#"32#"32767>54767632+&'&'&+"#"J    0,$ &,"     *   6*($    V*"   \6$&$    K/ B!       .?  #B     . 9`-U{7&'&76767676'&'&547676'&'&'&'&5476767676327676767632'&'&'&'&#"'&'&#0#"'&%67654'&'&#"3276O     %  ! %% !   $  g    ! %    %   %     #! 42&'&54767676763&'.'&'&'&5&547676762?>7676323+3+'"'.'="'&'&'&547676767634=&'"'&Z8*4 ( " $&D(   ( "4L <>, :4L<>,  c#*83A_#*B ,>12 !8)<*++f*8! 21>,     2..0!  ,Xq'O&'&'05054547676763200#"&'&'05054547676763200#"$         68Q_,.  7"SQ"7  78Q_,.  7#RQ"7 d\&'&'&5476762327676505&'&'&'&'&'&'&'&'&'&'&'&'05476767654'&'&5476767670323'&'&'&'&'&'&'"#"00#"'&676767654'&'&'&'&'&'"#"3270   ) %      *)4 "  * $     !    $$)   !!  "  !? "     -)) #" !%7!  $  "?"     -)) $" !$&  #"! "#' | %&'&547632#"&7&'&547632#"&     T&J&'&'.5476767632"+"'&76767454'&'&'&'&#";6'&'&'&'&'&547676767632'&'&54'&'&7676547676+".&&0"&(JNP"0 &&4 :""2 *2<"$0F &    ::   ! :8SoWX5% %5XWoS@@8< LVVvUV w]II) [''$#&'!   8RS8 3@\&'&'&54547>76767>'&'&#"'&'&54767632'"'&#""#"767654'&'&'#"276 " $.(*4,  ,   T 2  4    &32PIR   ~5j&'&'&'&'&'&5476767632#7&'&'&'&'&'&5476767632#  ,"  "    ,"  "  # )*@3   8%+# )*@3   8 %+%A7%&'&54'&'&'&#�#0#0#&'&'&5476767276703032#" 6!OY=<  *?[#P?? ;4   SRX <[7&'&'&'&'.545676767676767676;2#"7676=&'&'&'&#"3276'"'&'&5474767676;&'.'&'&7;67676754'&'&+" &$$44F,lL&"&2" F42 &0T$|        &  $>-$&  &$G54U?8<%$$%  32G=7I[ KC        !&'&5476767636320#"'&  X &&$*   45&'&'&'&547676320#"7654'&#"32  . &$ ,4"" ! 3 #) S""   >))Ho%&'&=4'&'&#"'&'&47676;7>547676;232+""&'&54767676763232;+"'&%;BA"   8BA"   99H<6L  =&+0++A"  $:AB8  $:B$    }3[&'&7676767654'&'&#'&'&'&5&767676767632032"#"'& b   ' -  - &'%+ f/    +"#$$  3\&'&'&'&547676762767676'&'&'&'&767>54'#"&'&767>3232#"*  ,  2<$ <&&$,   ! "(  '  !" ))b !&'&54767676767632#"  8$ f    4z2{&54567676767474767676320327676767676=676567676'&'&'&#"#"'&'&'&'&'&#"'&D             ~ 33|>? &&Q"))    ));?// 9:H=5'&  $0 B$j%&'&'05054'4'&'&'&'&'&'&5476767676767232#"'&'&'5&=4'&'&#"#"$  ,((  ((d$    +-??/.+  !  [4$+ YtRO ORtX, ]p&'05476703200#"   c# # H7;&'&'&'&'&5476327654'&'&'&767632#0       &          &q19&'&'0505054'&'"#"#'&'&54767676763200#"W     2   v +-?E,  6"PP"6 3)M&'&'&'&5476767676762+&7676767=&'&'&'&#"32"   4  $$.  <      " ::    :: )M  01   "  "|1c&'&'&547676767656'&'&'&'&76767632#"7&'&'&547676767656'&'&'&'&76767632#"   "  ",,$    "  ",,$  *% 8  3@*) *)A5  *% 8  3@*) *)A5  iZW&'&54'&#"'&'&54767676767630327654763232#"#"%&5476767676767676767630#"&'&'054'0505&'"#"#'&'&5476767676320000#" E; ,   #     i&%*)((   +*2%  8     2   &1&&)P  &(      &$ )/OPWTQP5   $!ZYg,+,'I43  +-$E/,  69OQ96 h`[&'&7676767654'&'&#'&'&'&'4767676767632032#"#"'&%&50567676767676767676320#"&'&'0505054'&'"#"#'&'&54767676763200#"W b  ' -  - &($+ +*5'$$+( 4     2    e0    *$#$$  [\l...*M77'%MMZ.0/+P99  +-?E,  6"OQ!6 {dU{&'&54'&#"'&'&505676767676767632032765476322#"#"%&=4767676767676767632#"&'&'&'5476767632767654'&'&'&'&76767654'#"'&'&7676763232#" D<  "" $      **4( <:n>4 * * 4<,$&&<   (%1 &&) AF   &$[[k...*O76}^    "(  '   ! R b_w&'&'&'&547676767676547676303203276767676767672"#"#&&'4547676320#"4&&  *"           - 22 $)* (     #& " " Q[}7&'&'05476767676767676767676320'&'&'&'&'&'&'&'&#"#"654'&'&'&'�#"3276&'&'&54767632#"'&&        238-$$   m!  LL 5 1    D%76MP98'   '89PG3WT $''$V bD((,-<`     % Q[}7&'&'05476767676767676767676320'&'&'&'&'&'&'&'&#"#"654'&'&'&'�#"3276&'&54767676767632#"&        238-$$   m!  LL  7% D%76MP98'   '89PG3WT $''$V bD((,-<`      Q-"'&547676767676320+&'&'&/&'&'547676767676767676767632'&'&'&'&'&'&'&'&#"#"654'&'&'&'&+"3276               238-$$   m!  LL          D%76MP98'   '89PG3WT $''$V bD((,-<`  Q[}7&'&'05476767676767676767676320'&'&'&'&'&'&'&'&#"#"654'&'&'&'�#"3276&'&5476767676327676547676#"'&'&'&'&#&&        238-$$   m!  LL   "    "    D%76MP98'   '89PG3WT $''$V bD((,-<`  !         Q$I#"'&'&'&'&'&=676767632#"'&'&'&5&'&=676767632&'&'547676767676767676767632'&'&'&'&'&'&'&'&#"#"654'&'&'&'&+"3276     u        238-$$   m!  LL (        D%76MP98'   '89PG3WT $''$V bD((,-<`  Ro7&'&'&747676767676767676'&'&'&54767632'&'&'&'&'&'&'&'&#"#"4'&'&'&'&#"3327276654'&#"32&   ''7      $$-823   p     O L""  C#45J.**%D++ "!  +   +HHUE23"R $''$Y)+=3"""_c #"   N7&'&'054767676767676767676767672703632320#"032#"032#"#"'&'&'&50505&'&#"#"676705054'&#"33276*    -" =3 .10.  2< #" '0      B#54JTHI,  J* '-1V S+''$S %%5o$$.965J&&'&'&'&'&5476327654'&'&'&7654'&'&'&'&'&'&'&547676767676767232'&'&'&'&'&'&#"32767676767676#0    **234<&    -#""#-    $$'  &       ''"H'% $ 8 /  $$? !(((<?$$      &jm7&'&'05&50505050567676703030303+32#";2"#"'&&'&'&54767632#"'& 04FF42 *<4&$ LX(ZL $&4<* ..884@4 0   _K    II$VV J   % jp7&'&'05&5050505056767676303032+""32#";23#"#"'&&'&5476767>7632#" 0FF2 *<4$ LXZL $&4"** ..884@ ($8$!`L   II VV      j."'&54767676767632+.'&'&'&'&'5&=676767;+32#";2"#"'&        V 04FF42 *<4&$ LX(ZL $&4<* ..884@         _K    II$VV j C"'.'&5&'=476767632#"'.'&5&'=476767632&'&'5&=676767;+32#";2"#"'&          04FF42 *<4&$ LX(ZL $&4<* ..884@(       _K    II$VV i7&'&767632767650=05050=4'&'&0#"'&'&54767676363#0#&00007632#0#"'&&'&'&54767632#"'& !  ! $%- -*2 ! " 3(+.$$I6 1    C$*jk)$D  DMkjNC J   % i7&'&76763037676545474'=45474'4'&'&#"'&'&54767676;2+&0007032#0#"'&&'&54767676767632#" ! ! $%--*2 !" 3(+.$$K  8%  Cjj C  CNjkMD     ,"'&547676767676320+&'&'&/&'&7676327676545474'=45474'4'&'&#"'&'&54767676363+&7632+"'&      #? !  ! $%- -*2 ! " 3(+.$$      #  Cjk D  DMkjNC $I#"'&'&'&'&'&=676767632#"'&'&'&5&'&=676767632&'&7676327676545474'=45474'4'&'&#"'&'&54767676363+&7632+"'&     !  ! $%- -*2 ! " 3(+.$$(        Cjk D  DMkjNC .8O7.5&=4'&'&'&#"'&54767632767676=67676732+"'&767676767656=&'&'&'&'&'&'&#&#"32#"3276   ( " <\ 2hf.  (      . '82$"    &'7>-+ J6 0HF 1 2"N  ++hE20 R6%# !"2,(15}7&'&'&'4'05050505054767676763033276765056505056767600'&'&'0'&'&'&#&000#"&'&5476767676327676547676#"'&'&'&'&#&G    !!-;,,  --a2' 2   "    "    _{a +#22BYAA6G*;lKG  ))=!&L]S:; A@K$:$$6Fck,G !         $B8q7.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676&'&'&54767632#"'&&P   P(**&(*  *(&X  0>   0"6 0  . #J''!!%  .  %!!''J# U %@@% $ !")))>"   % $B8q7.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676&'&5476767>7632#"&P   P(**&(*  *(&X  0>   0" ($8$. #J''!!%  .  %!!''J# U %@@% $ !")))>"     $B,e"'&5467676767632+&'&'&/.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676     &P   P(**&(*  *(&X  0>   0"         . #J''!!%  .  %!!''J# U %@@% $ !")))>"$B8q7.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676&'&54567676763232767654676#"'&'&'&'&#&&P   P(**&(*  *(&X  0>   0"       "   . #J''!!%  .  %!!''J# U %@@% $ !")))>"!        $B Az#"'&'.5&'=47>7632#"'&'.5&'=47>762.'&'&'&'&'&547676767>7632"7676767676=4'&'&'&'&'&'&#";676     &P   P(**&(*  *(&X  0>   0"(       .  %!!''J# .  %!!''K" U %@@% $ "!)))>"zZ7&'&7676767654'&'&'&'&547672327676767632#"'&'&'&'&#"    6     5 $Be&'&'&747654'.'&'&'&54767676767676727676767632+&'&'&#"&%6767676754'&/&5";67667654'&'&'&+"3276z $ 4HH4  *(($4   ""*  d6&& " <   &&  B & !'(J"    "J)'! %     p%%M60&9  @AS$%%!>+),iLM++e60&9KK15g7&'&'&'&'&'&'054705676763203276767676767056567676760000#"'&&'&'&54767632#"'&  89  ! < 5 0   &'GH&;8  ==tW$>  >>%2t==  8;BHG& L   % 15g7&'&'&'&'&'&'054705676763203276767676767056567676760000#"'&&'&547676767676320#"#"  89  ! <.  8% &'GH&;8  ==tW$>  >>%2t==  8;BHG&     ! 15,"'&547676767676320+&'&'&/&'&'&'&'&'&'5475676763232767676767675656767676#"'&      #  89  ! <      # &'GH&;8  ==tW$>  >>%2t==  8;BHG& 15$I#"'&'&'&'&'&=676767632#"'&'&'&5&'&=676767632&'&'&'&'&'&'5475676763232767676767675656767676#"'&       89  ! <(       &'GH&;8  ==tW$>  >>%2t==  8;BHG& 42`%&'&'4'05054'&'&'0'&'&'&'&'054767676327676767676320000#"&'&547>7>7632#"$ (   &(   (  $( 8&  .D9$#'>21 !);+**+;*! 12>#%9D1/       dCk7&'&'4'&505050547676763232#"#"76767654'&'&'&'�#0#"3276y  ?8 !!    !! 8?  &  &  /`FL 3<  $#  ?3I 'JU7&'&5476763276765654767>76767632#"#"'&'&'&"'&%6767676765454&'&'.'&'&5476767676764'&'&'&#"356767632^ $$: *   * 4$"&   "  "( *       5HHHmL:"# 6"#$   -/##3 L  0$    !%(O!(  `Z7&'&'&'&547>767676276767654'.'&'&'&'&'&'&767632#"'&'&5&#"#"'&7676767654'&'&'#""323>&'&'&54767632"'&$ , H <&B ("  &   F  ".D4 0  &, ,      &3J 953  Z  !       % `Z7&'&'&'&5476767676703636767654'.'&'&'&'&'&'&767632'"'&'&5&#"#.7676767654'&'&+"323676&'&54767676767632#&$  H <&B ("  &(   F  ". l  6&%-       &3I953  Z  !       ! `00#"&54767676767632+&'&'&'&'#&'&'&'&547>767676276767654'.'&'&'&'&'&'&767632#"'&'&5&#"#"'&7676767654'&'&'#""323>       $ , H <&B ("  &   F  ".0        &, ,      &3J 953  Z  !   `Z7&'&'&'&5476767676703636767654'.'&'&'&'&'&'&767632'"'&'&5&#"#.7676767654'&'&+"323676&'&5476767676327676547676#"'&'&'&'&#$  H <&B ("  &(   F  ".   "  "  %-       &3I953  Z  !         !     ` ?+"'&'.=4767676;52+"'&'.=47>7632&'&'&'&547676767673636767654'.'&'&'&'&'&'&767632'"'&'&5&#"#.7676767654'&'&+"323676          $  H <&B ("  &(   F  ". 7       %-       &3I953  Z  !   `EZ7&'&'&'&547>767676276767654'.'&'&'&'&'&'&767632#"'&'&5&#"#"'&7676767654'&'&'#""323>&'&'&'454767632#"7654'&#"32$ , H <&B ("  &   F  ".N 0 &" *2"" &, ,      &3J 953  Z  !    2$+ S""     [}7&'&'&'&54767676767654'&'&'&'&5&76763236767632323276767676#"'&'&'&#&'&7676767654'&#"#"3276767654'&'�#3276%! - (/ 0#)$$%/ &#  J#  #     "!D '5 % 3 " ( & ,((          *       [  + '  ! i &'&'&'&'&5476327654'&'&'&7654'&#"'&'&'&'&'&5050567676767672'&'&'&'&'&'"02767676767676#0     !" !.( 11   !      %        M) )  "   79       &dUr%&'&'&'&'.547676767676763232767>767676#"#&#&6767654'&'&'#"27&'&'&54767632"'&  && 40: "$$*<    ,T  $  B6 2    $ML  -           (# S   % dUq%&'&'&'&'&'05056767676767632032767676767676+&#&676754'&'&'#"27&'&5476767>7632#&  && 40: "$$*$< ,   " *T  $0  ( 8&  __  -     "      # #     ! d00#"'&54767>7>32+&'&'&'&'#&'&'.'&'&54676767676732;2767676767676#"#"&6767654'&'&'#"327  (      0 ( &&40: "H*(<    , T  $  0  &        0MK&  -           (" d#D+"'&'&'&=4767676;72+"'&'&'&=476767632&'&'&'&'.547676767676763232767>767676#"#&#&6767654'&'&'#"27        && 40: "$$*<    ,T  $  7          $ML  -           (# Ki%&'&'&'&5&5050505&'&'&'&#"'&'&547632000032"#"&'&'&54767632"'&l      v5 0    *;=+)    **;>*)   Y   % Ko%&'&'&'&5&5050505&'&'&'&#"'&'&547632000032"#"&'&547676767676320#&M        8$  *;=+)    **;>*)   )    ! 3x0#"'&5&=4767>767632+&'&'&'&'#&'&'&'4'=4'4'&'&'&#"'&'&54763232"#"  (            0   &        **;=)    **;>*)   #B#"#"'&'.=4767676;5#"#"'&'.=46767632&'&'&'&5&=4'&'.#"'&'&54763232"#"            &    (  7        *;=+)     **;=+)   24 7&'&'&'&54767676767632327654'&'&'&#"'&547676767654'&'&'&'&'&'&767632327676763200#"7676767674545&'&'&'&'�#"3032763'&  )!$    ($   ,) &'  (+ g  '   , 77 %          /@C- %R     (   Z q7&'&'&505050505676763767670303000#"'&'&'&5054'&'&'&'&'&#"0#"&'&5476767676327676547676#"'&'&'&'&#"p   '%&&    *,      "    "   ;%X+0?=     );' #/  );A,+    )){C[%&'05476703200#"'&'&547676767672322"0#0#&'&7&'45476703200#"    99H*(9%   <&+/++   # #    " # ^ >6767654'."327>676767654'&'"323276&'&'&767654'&'&'&'&4676767676726767632#"'&'&##"'&(  : >v 6*    ()     )"$  ! >9 P ?*F5'%W     %    !J% Z i7&'&'&'&5&505050505>767322767676767656=476747676'&'&5&#"+"&'&'&54767632"'&2&(    <       4(0    - )767322767676767656=476747676'&'&5&#"+"&'&5476767>7632#&2&(    <        ( 8$  - )7676;25+"'&'&'&=>7632&'&'&'&'4'=4=47676;232767676767656=676567676'&'&5&#"+"      2&&          7       - )320+"'&'&'&54767#"#"'&  E  !, 2#  " G <$ $@  )B    %  ]  !   K&,     . &3, !5  $&"Je3&'&'&'&'&'&'&5476767676767632'.'&'&'&'&#"32767676767676#"&'&5476767>7632#"**224<&  ."$$".  *J.( ($8$&'$ %'H#7 . "  $$?<(((! ?%$    6%     ik%&'&'&'&'&'&5054767676767672'&'&'&'&'&'"2767676767676#0#"'"&'&547676767676320#&  !-( 12   "     "+  8%   M))  "   +9     )    ! Je3&'&'&'&'&'&'&5476767676767632'.'&'&'&'&#"32767676767676#"#"'&54767676767632+&'&'&/#**224<&  ."$$".  *J.(,       &'$ %'H#7 . "  $$?<(((! ?%$    6%      ik%&'&'&'&'&'&5054767676767672'&'&'&'&'&'"02767676767676#0#"'"0#"'&54767676767632+&'&'&'&'#  !-( 21    !    !+N          M))  "   49     )       Je~3&'&'&'&'&'&'&5476767676767632'.'&'&'&'&#"32767676767676#"&'454767632#"**224<&  ."$$".  *J.(    &'$ %'H#7 . "  $$?<(((! ?%$    6+" " ik%&'&'&'&'&'&5054767676767672'&'&'&'&'&'"02767676767676#0#"'"&'54767632#"  !-( 21    !    !+      M))  "   49     =" " Ji3&'&'&'&'&'&'&5476767676767632'&'&'&'&'&'&#"32767676767676#""'&'&'&'&'&=676;676767232 **334<&    -"##"-    ,H.(0       !&'$ %'H#7 .  $$?<(((! ?%$   6*       ! io%&'&'&'&'&'&5054767676767632'&'&'&'&'&'"#"03232767676767676#0#"'&"'&'&'&'&'&=6763237676732  !-( 21     !    !+      # ! M() "    49      '   #   ! VG7&'&'&'05&5050545056567676767032#0#"'&76767676767676505&'&'&'&'&'�#00003276"'&'&'&'&'&=6763237676732l ) ! =./ 253e- ""'%  %     #  ! /'9}a &%2 '+3'/ 2O  /:!NK!"  HKkjJH   #   ! `3O3&'&'.'.=6767676767627656567656767632'.'&#"767676=4'&'&'&'&+";676&'&'&'&'=6767632& ( $8   ( t  &   *      0$K/#" Z8**+E51cY=>  ]  6)   29 22*  (83.8X7&'&'050505054'&'&'&#"'&54767632767676505050505676763032+"'&767676767676=4'4'&'&'&'&'&'&'"+32#"3276   ( " <\ 2hf.(     .  '(82$#    &(6?,+ J5 0GG 1 2"O  *+hF0 S6%" !"2 )33}3&'&'&'&'&'&50547676767676763232767054'&#"'&'&567676327654767630332#"000'"'&'&'&#"76767676505&5&'&'&'&'�#"0323676  # %  &    ' s  &    +   K/"  ! -&&'   AE`k,G  ] 6   29 jhl7&'&'05&50505050567676703030303+32#";2+&'&&'&54767676;2+"'& 04FF42 *<4&$ LX(ZL $&4<* @68:..>  2Z  $("* _K    II$VV !   drTp%&'&'&'&'&'&50567676767670323232767676767676+"'&676754'&'&'#"27&'&54767676;2+"'&  &&40: "H*(< ,   " *T  $0  4X *"$$  M^  -   "       " (   jk7&'&'05&50505050547676703030303+32#";2#"'&&'&'&=4767632276767676#" 02HF40 (<4&&LX(XL&&4<* ..:84@"  (  4"& _K    II$VV  %    ;dUs%&'&'&'&'&'05056767676767632032767676767676+&#&676754'&'&'#"276&'&'&=47676323276767676#"   && 40: "$$*$>     " *T  $ "  2$& __  -           #  %  ;jl7&'&'05&50505050547676703030303+32#";2#"#&'&&'54767632#" 02HF40 (<4&&LX(XL&&4<* B4: :..     _K    II$VV  " " dWu%&'&'&'&'&'050567676767670323232767676767676+"'&676754'&'&'#"3276&'4'4767632#"   &&40: "H*>     " *T  $     `^  -          " *" " j37&'&'&'4'0=0547676767030;#0#0#0#32#"030303222;2+"'.'&547"#"#&'& 02GG30 );5%$ MXYM $%5<     &:  :.- _FK      $ * 6#!d<>7054'&'&'0#"27.'.'&'&=67676767673232327276767676767676"'.'&547(T:  $0 8A*&&40: "H*(< ,        %;  " ("  0M^  -   "    *( 6#jk7&'&'05&50505050547676703030303+32#";2#"'&"'&'&'&'.=476;7676732 02HF40 (<4&&LX(XL&&4<* ..:84@     $ " _K    II$VV   $  #   ! dTp%&'&'&'&'&'&50567676767670323232767676767676+"'&676754'&'&'#"27"'&'&'&'&'&=>;7676732  &&40: "H*(< ,   " *T  $0d      $ " M^  -   "       " &   #   ! J7&'&'&'&'&'&505676767676767232'.'&'&'&'&#"3276767654'&#"'&'&54767632#"'&'4#"#"#"'&54767>767632+&'&'&'&'#**224<&  ,$$&&4  "   6    & ,  (      ''#G'%@% 7 / "  $$?<(((! C##! /E6       &     N&'&'&'&5476763276767654'&'&#"'&'&'&'&76767676'&'0'&'&547676327676762767032#"6767654'&'&'&'"320#"'&54767676767632+&'&'&'&'#%""   ''2 %(  )<4<  !+S  :6'' I/3&  *!  o           "    #"/>$    -*=  ,  C )    R       J7&'&'&'&'&'&505676767676767232'.'&'&'&'&#"3276767654'&#"'&'&54767632#"'&'4#"#""'&'&'&'.=476;7676732**224<&  ,$$&&4  "   6    & 8     $ "''#G'%@% 7 / "  $$?<(((! C##! /E6    % $  #   ! N&'&'&'&5476763276767674'&'&#"'&'&'&'476767676'&'&'&'&547676327676762767032#"6767654'&'&'&'"32"'&'&'&'&'&=676;76767232&"!   '(1 $(   )<4=  +S  :6'' J/2'  *         # !   "    #"/>$    .*=  ,  C )    T   #   ! J7&'&'&'&'&'&547676767676767032'&'&'&'&'&'&#"3276767654'&#"'&'&747676320#"'&'&#"#"&'454767632#" **334<&    -"#%$6! "   5   !%     ''#G'%!% 7 /  $$?<(((! C##! /(6    &" " N&'&'&'&5476762767676'4'&'&#"'.'&'47>7676'4'&'&'&54767632767676276732#"6767654'&'&'&'"32&'454767632#"&"    P2 &(    (<4<    *R   : 6(( J.4&  *  (      " 4   #"/>$    -*=  ,  C )    ,c" " J7&'&'&'&'&'&505676767676767232'.'&'&'&'&#"3276767654'&#"'&'&54767632#"'&'4#"#"&545676767676'&'&'&767632#"**224<&  ,$$&&4  "   6    & $  $ ''#G'%@% 7 / "  $$?<(((! C##! /E6       !  .32 N&'&'&'&5476762767676'4'&'&#"'.'&'47>7676'4'&'&'&54767632767676276732#"6767654'&'&'&'"32.'&54767676767632#"&"    P2 &(    (<4<    *R   : 6(( J.4&  *         " 4   #"/>$    -*=  ,  C )    ,= '%    ! ! S7&'&'&5&505&5454767676000030303036767676505054705676763200'&'&'05&505054'&'&'�#0#0#0#"000#"0#"'&54767676767632+&'&'&/#i  #$11$#     #$11$#  j         _9P FK  &(70"  ""0 '&  9XAA/L%"=)(  ,-%9('  '9?.+ $     Z }7&'&'&'05&505050505656767676303276767632000#"'&'&'&5054'&'&'&'&'&'"0#"0#"'&54767676767632+&'&'&'&'#p  "   !* p         1*<g!**7[ 9:' $.  );A+,  79L*+        `&'&547676767476767663232320350547>76320'&'&'&=&'&'&'&+"#"'&'&'&5&5&=4505&#&0+&#;6767676 8 18($*  /  *  #$12$"   *"Pg "$21$"  +K &7  7&  )?   F|X:  ,@9('  '(9?+  &9 _!  <*&'&5476767676505476767632;2+76767632"'&'&'=4'4'.'.'""'&'&'&=4'=47&N $< H:8  >&,.m "  # *   %/ 2!*   + 9-:C $.  )+;A+, $7+ L*+ 1f**    **;=)   #!          hk7&'&76763037676705050505&'&'&0#"'&'&547676763032#0#&732+"'&&'&54767676;2#"#"'& !! $$--*3 !! 3(+.$$  4X &&$* CNjjNC  Cjk D !   rKm%&'&'&'&5&5050505&'&'&'&#"'&'&54763200032"#"&'&547676763032#"#"'&l        4X &&$* *;=+)    **;=)   2   g7&'&7676327676705050505&'&'&0#"'&'&54767676363#0#&00007632#"#"'&&'&'&505676763232767676760#" ! " $$- -*3 !   ! 4(* -%$h#    3#& CNjkMD  DMkjNC  %    ;K{%&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"&'&'&505476763232767676760#"]      ]#    3"& **;=)    *;=+)   + %  ;37&'&767630376767050=05&'&'&0#"'&'&47676763032#0#&0007032032323#"#"'.'&'47"#0#"&   ! $%--)3 !    %: .H CNjjNC    CNjkMD (* 6## 3&'0547676320#"#"#"'.'&'47670'&'&'&5&5050505.'&'&#"'&'&5476320032363232    %:    *   =" " * 6#&"  *;=+)    **;=)  l7&'&7676327676705050505&'&'&0#"'&'&54767676363#0#&7632+"'&&'54767320#" ! ! $$- -*3 ! ! 3(+.$$p    CNjkMD  Dkj C %# # K%&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"M       **;=)    *;=+)   "DAi%.'&=476323276767656=476767632+&%&'&'5&=4=676762#"8$@ 8, - $"      4"%  (0 B=$Us<=  8:AHG&  _ L  /aa. ^K7&'&'&5&50505054'4'&'&'&#"'&'&547632000032"#"&'&'&'&'&54547676760327>76767656=4'&'&'&#"&'&567632#"&'5476732#"%&'5476732#"      0          8 X        **;=)    **;=+)        W{hIF    GKJwVT67# " # " >(K{7&'&'&50547632232767676547054747676320000#"#&0#"'&54767676?632+.'&'&'#$  ,, $   z         "%  ( B=$Us<=  8:AHG&         p\&'&'&'&'&54'47676762327>76767474756=4'4'&'&'&#"'&'&747632#"#"'&54767676767632+"'&'&/#          8 &            W3Hh+F    GKJw2$T7w       25y7&'&'&5&50505&54547474767676322767676763032'&'&'&'&'&'&'&#"&5476767676'&'&'&7676320#"H 23EE55 #$/" ((43'& '!7))##    "  _F4 :' .-=F('-.AA00 $#," 65ED34 2+J66  E%   !  .32 bx7&'&'4'050505450547676320000767676767676720'&'&'&'.'&#"&545676767654'&'&'&767632#"x  "200  L&(( &D   Z"   "  1eP  >B]V>. #"! 5"!,,$# "*N*A   !  .32 bd7.'=47676327676767676732'&'&'&'.'&#"x   "200  L&(( &D   ;?X3 CK  #"! 5"!,,$# "*N*AjKm7&'&'&5&505&50547676763200032030303#0#"'&&'&54767676767632#"   $5;+)  @68:-.  8$ _8QFL  Xs0"N      Km!&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"&'&54767676767632#"$      ,  8$  NPqs0!M   N!/qsQM  #    jKt7&'&'&5&505&50547676763200032030303#0#"'&&=676767654'&'&'&767632"#"   $5;+)  @68:-.a!   #   _8QFL  Xs0"N     !  .32 Ks!&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"&5476767676'&'&'&7676320#"M      N   "  NPqs0!M   N!/qsQM    !  .32 j3Kq7&'&'&5&5&50505476767632000032030303#0#"'&&'&'&'&'050567676320#&   %4<+)  ..:74A    &9FL  XsRN  #22*   (833Kq!&'&'&'&505&505054'&'&'&#"'&'&54763200032"#"&'&'&'&'&54767676320#&      [     NP0AsQM   NPqs/"M  (22*    (83jKc7&'&'&5&5&50505476767632000032030303#"#"'&&'05476703200#"   %4<+)  @69 :-.    &9FL  XsRN  b# # F[!&'&'&'&5050505054'&'&'&#"'&'&5463232"#"&'&5476732#"     b    NPqsQM   N!/qsQM  g# # F `&'&547>767476767620632032030;#0#"'&'&'&'&5&5&=#"Y $    *%4<+) ..:74AH  =L  X"  kRN    &9r ]&'&5476767505.'&#"'&'&54763206763232"#"'.'&'&50=#"    *  6  "  H  KQM     NP   e/"M    NPA15&'&5476767>7632#"&'&'&'4'=4=47676767632327676547=67676'&'&/&'&'&'&'" ($8$    !!-;,,  --a2'       `z ` *$12CYA@5*fkKH   (AAI]S:: @AK$ :#$6Fck-G Z "&'&54767676767632#&&'&'=676762767676;#"'&'&'&=4'&'&'&'&'&#"#"  8%  '  %&&    *,   )    !  ;>Y+0?<     *;' .  );A+,    )!%MW: A@I==$ 5Gck,G   !  .32 Z q7&'&'05&50505476767627676763030000#"'&'&'05054'&'&'&'&'&#"0#"&545676767654'&'&'&767632"#"p  '  &&&   *,   r!   #   ;>%4+0%<     **"C $.  )+;A+,    )*#L*+   !  .32 06n7&'&'&505&5050505470547676763632>=47676'&'&/&'&'&5&#""'&'&'&'.=476;7676732F   ",<,*  .,`2(      $ " .'8{:'/ + #22BYAA 6GelKG  )(>!%MBAW: A@K$:$$$5GckJG & $  #   ! Z q7&'&'050505050567676276767630300#"'&'&'&5054'&'&'&'&'&#"0#""'&'&'&'&'&=6763237676732o '  %&&    *,        #  ! ;>Y+0?<     *;' .  );A+,    )   2   4X &&$*.  %!!'(J"   %!!''J# U %@@% $ !"))))>"   ^r)a%&'&'&'&547676767632#"7676767670505&'&'&'&'&#"#"0323276&'&547676763032#"#"'&3'&  (43(  (* g       3Y %'#* ,JJ% %JJ%R 2"   3     $B9q7.'&'&'&'&547476767676767632+"76767676747=&5&'&'&'&'&'&#";676&'&'&=67676323276767676#"&P  *(&**(P  P(,,  .>   0 |$     4"&. #J''!!%  .  %!!''J# .U %@@% $ !"))))>" %    ;^)a%&'&'&'&547676767632#"7676767670505&'&'&'&'�#"303276&'&'&505676763232767676760#"3'&  )43)  (+ g      b$    3#& ,JJ% %JJ%R 2"   3    %  ;$B=y7&'&'&'&'&'&'&5476767676767632#0#"7676767676505054'&'&'&'&'&'&#"0303676&'&54767676767632#"'&'&54767676767632#"&()   ))'**'()  )('+,  />  1!  8%   7%  %!!'(J"   %!!''J# U %@@% $ !"))))>"        @&)Z}7&'&'&'&547676767632#"7676765670505&'&'&'.#";276&'&54767676767632#&'&'&54767676767632#&4&&   (24*    (, f       8$  6& ,JJ% %JJ%R 2"   3"      !     ! *@j7&'&'&'&'&'&54547676767676767670327030303#"732#"32+"'&54'4'&'&#"376747 *,&D$0 $>2  00. 2>$ :266.,V" &'#H&& $&  II,$1V fn. J ""2<(((! /#"  J .Xe7&'&'&'&5474767676763272767632323276767676#"'&'&#"#"7676767654'&'&'&#"32767654'&'&'&#"3276+ &&3 &1 %!  I$  #   &( 2$): 4  +/  2  #     )   " P 'D 'D   ] e7&'&'&'4'05050547676763032#"'&'&'0'&'&'&#"000#"6767654'&'&'&'&#"00003276&'&547676767676320#"#"sJO!"$   ,+8 -"" $#=3  &  & //f  8$ `FL $# )  !!<.- .-QD#  ''8>, '++'w    ! xNo7.54'=47676763232767632#"'&'&'&'#"+"'&&'&5476767>7632#&   " 2   *   Z (8$<%X+0&=      (;>0/&     ! ] e7&'&'&'4'05050547676763032#"'&'&'0'&'&'&#"000#"6767654'&'&'&'�#"#"003276&5476767676'&'&'&7676320#"sJO!"$   ,+8 -"" $#=3  &  &  /c   " `FL $# )  !!<.- .-QD#  ''8>, I+',  !  .32 lPy7&'&'05050505054767622767633#"'&'&'&'+#"'&&545676767676'&'&'&767632#" " 2  *     $  ;?X+0?=     (*#?//   !  .32 ] e7&'&'&'4'05050547676763032#"'&'&'&'&'&'&#"000#"6767654'&'&'&'�#"#"003276"'&'&'&'&'&=676;76767232sJO!"$   ,+8 -"" $#=  &  &  /      # !`FL $# )  !!<.- .-Q(#  ''8>, I+'}   #   ! xNy7.=&=47676763232767632#"'&'&'&'#"+"'&"'&'&'&'.=476;7676732   " 2   *        $ "<>%3+0&=      (;>0/+ $  #   ! F w3&'&'&'&54767676323276767654'&'&'&'&'&'&'&'&7476767632#"'&54'&#"#"&'&547676767676320#"#"*&%   7/:6''BZ"" "(A"( W3'  7/9 $  [   )F(*   8$  #  3% &  !%5+2 >062%  ' $   / %    ! tn7&'&'&'&54763232767676'4'&'&'&'&'&'&54767676763#"'&'&'&'&#"#"&'&5476767>7632#&       0:   $"8   "  0:  &$ (8$ &       +        +*     ! F u3&'&'&'&547676763232767676'4'&'&'&'&'&'&'&'&5676767632#"'&54'&#"#"#"'&5476767676762+&'&'&'&'#*&&  6/: 6&(BX""  (D(, V4(  6/;:(( <\  (F(* 8          #  3% &  !%. >062% %   $  0/ &       tn7&'&'&'&54763232767676'4'&'&'&'&'&'&'&547676763#"'&'&'&'&#"#"#"'&54767676767632+.'&'&'#       0   :$"8   "  0  :&$4       &       +        ,-       F3 .'.'&5476327654'&'.767&'&'&'&'&54767676323276767654'&'&'&'&'.'&'&5476767032#"'&54'&#"#"  "   *%&   7/:6''BZ""6 #(A"(W3'  7.8 $  [    )F  %       # 3$ % !6%5+2 =15 3% ' $  / &t3&'&'&'&'&5476327654'&'&'4767&'&'&'&'&54763232767676'4'.'.'&'&'&547676763#"'&'&'&'&#"#           502   :$"8   "  502  :$! &        &      +       ,   &F *"'&'&'&'&'&=676;7>732&'&'&'&547676763232767676'4'&'&'&'&'&'&'&'&5676767632#"'&54'&#"#".     $   "D*&&  6.9 6&(BX""  (D(, V4(  6/;:(( <\   (F(*     #  .! #  3$ &  !%. >063$ $   $  . t*"'&'&'&=676736?676732#&'&'&'5476323276767654'&'&'&'&'&'&'&547676763#"'&'&'&'&#"#"@          S  "   0  9%"7    "  09  '%0       &      +        +=9(}&'&'.'&5476327654'&'&'&76767&'&5&5&5050=&'&'.#"'&'&7476767632303#"00# "     8B :9HU8&  $B7  &       $5~tSO   ORtY     'h3{.'.'&5476327654'&'.767"'.'&'&5054'054'&5&'.#"'&'.7>326547676;232"#"j  !  $B&&..&L & $  &       8% -":  .%'.  /%4''      &>(U%&'&'&5&50505&5054'&'&'&#"'&'&547676767272323#"000#""'&'&'&'&'&=676;76767232$ 8B &&6I99 B7        # ! X~D0SO  OR0DX $   #   ! @&3f!&'&'.'&5054'05&'4'&'&#"'&'&5476763276547676232#"000#"#".'&'&'&54767676320#&T$"  &&.  .&&&  & & h    &,."'.&'./46&   ( 22*   (83=)t&'&547676767634'&'&'&#"&'&47676767232#"220#0+000#"'&'&'&5&54'050="'&P 98F 8B$ 99H+*8& $B7 6&&  =?,  h%+ 6     6  %tX  $4~t&h{w&'&54767676;05.'.#"'&'.7>3276547676;232"2+"#"'.'&'&=4'"'&|  2$&.   .&L V & & $ ( %C%$*&     .%'.  /  6''   8% -"-15g3&'&'&'&'&'&50505476767632327676767676765474767676000#"'&&'&5476767676327676547676#"'&'&'&'&#&   99  ";[   "    "  &'GHC#8  ==t2%$>  >$%2t==  8#BHG& !         Z q%&'&'&'&'4'05054505676763032032767676767650505676567676'&'&'&"+"&'&5476767676327676547676#"'&'&'&'&#"#&2(&          "     - )>  >$Wt==  8#BHG& $   Z rq%&'&'&'&'4'05054505676763032032767676767650505676567676'&'&'&"+"&'&54767676;2+"'&2(&       L  4X &&$* - )>  >$Wt==  8#BHG&  %    ;Z k7&'&'&'&'&505050505>767322767676767656=674747676'&'&5&"+"&'&'&=47676323276767676#"2&&   <      $ 2$& - )  >$%2t==  8;BHG&  3 # ( S""  Z ;m7&'&'&'&'&50505050567676703232767676767656=674767676'&'&5&#"+"&'&'&5&76767632#"7654'&#"22&&            , $ *6""   - )>  >$Wt==  8#BHG&         @&s7&'&'&'&'&54'054505676763032032767676767676547676767676'&'&'&#"#0#"&'&54767676767632#"'&'&54767676767632#"2''          [  8$  8$ - )#B"- &&Q")(    ("?/0  &8)*H9:  =          1(5{3.'&'&'&'&5050547>763227676767>76547467>00"0#+"'.'&547070#&2   ,r  2"   %:  &'GHC#8 ==t2%$>&   &>$%2tz 8#BHG&6 (( 6$$!Y(7.'&'&'4'05&5454747676;2327676767>765656767676760#"#"'.'&54767#"#"2N          %:   <- )<&- LQ"(    ("?/0  &8SH9 (( 6$&" V7&'&'4'&'&'&'&'&'&'&'&5476763676767676767676322767676767632'&'&'&'&'&'&#"#0#"'&0#"'&54767676767632+&'&'&/#                           -KJW/+,&F,,  EE]\BC:9NN;;;;NN9:CB\]EE --F&++.UII, 77HG5445GH77      P7&'&'&'0'&'&'&54567632327676767676547676303232767676547676320'&'&'&'&'&'&'&#"#"'&#"'&54767676767632+&'&'&'&'#1          1              C3%$3  549.$###-743  %$.822#$.945  3$%3C)(54&''&45()(       42^%&'&5&50505&5&'&'&'&'&'&'&'05476767632767676767632#"#"'&54767>767632+&'&'&'&'#$   (   (&   (  b  (       .D9$#>21 !);+**+;*! 12>#4%9D/   &     ?'c&'&7676327676767676'&'&'&'&'&'&5056767676767676767632#"0#"'&54767676767632+&'&'&'&'#X    ! ,   $   #"/j          !I)CCY6%%.   &'(=12#$R4#$+  ,GFQ+*)%E// =x       42!E"'&'&'&5&'=47676762"'.'&5&5475476767632&'&5&=4'&'&/&'&'&'&=47676762767676767632#"       (    &&    (  (        .D9$#'>21 !);+**+;*! 12>#4%9D/[ f7&'&'&'6767676767676767654'&'&'&'&'&'&'476767;"+&#&'&&'&54767676767632#"o $!e>./ 56NN74 # ' ! d=..12? .!"  7%)#11C)&&"='%  @)G;< #"#$     QVz7&'&767676764'�#"'&'&'&547676767636303#"#"#"'"'&&'&547676767676320#&f 10AK)'[=+   "3$$A44 00@A..$$L=.. 54A 0##  8$  67GS/.   67HH55 $    ! [ f}7&'&'&'6767676767676767654'&'&'&'&'&'&'476767;"+&#&'&&'54767632#"o $!e>./ 56NN74 # ' ! d=..12? .!"   )#11C)&&"='%  @)G;< #"#$ " " QVn7&'&767676764'�#"'&'&'&547676767636303#"#"#"'"'&&'454767632#"f 10AK)'[=*   "3$$A44 00@A..$$L=.. 54A 0##    67GS/.   67HH55 8" " [ f7&'&'&'6767676767676767654'&'&'&'&'&'&'476767;"+&#&'&"'&'&'&'&'&54567632376763232o $!e>./ 56NN74 # ' ! d=..12? .!"     # !)#11C)&&"='%  @)G;< #"#$    #   ! QV7&'&767676764'�#"'&'&'&747676767636303#"#0#"'"'&"'&'&'&'&'&=676;76767232f 00AL(([=*   "3$$B34 /0AA..$$M=.. 44A 1"#      # ! 67GS/.   67HH55 $   #   ! H&'&'&'&'&5454767676767676767650565054'&'&##"'&'&5476763265465676767632'&'&'&'&'&32#"#"     " 2& ,   * :0 0&    >"/o2%?8  &"3     "!=. Z7Fpg)* h 1&'&547676767672323'&'&'"#"'&    o    i /&'&'&'&'&505476763227>#"&    m    a/&'&'&505676763232767676760#" #    3#&f %    ;p &'0547672320"#"   # # 5&'&'&'&54767632#"7654'&#"32  0 &$ *6"" 3 #+ S""   (=/%63032#0#"'&'&'&5476L  & :   $$!3m A&5054767676327654767632#"'&'&'&#"'"       "$ s "           hH%&'&5&7676703030303#"#"'&{  03GH31  /.: <7AO    H^/&'&547676767632323030#0#0#0#0#&'& GFZKC//  KN#NfJ8N  -&'&'&54767676767632#"  !     '%    ! ! '&5476767676'&'&'&767632#"   "   !  .22 Zg)&545676767654'&'&'&767630#""   "    !  .23 t-X&'&'&54767676767632#"7&'&'&54767676767632#"   "         '%    ! !    '$$   ! ! u(P&=676767654'&'&'&767632#"7&5476767676'&'&'&767632#"!   #     "    !  .22   !  .22 uZg(P&=676767654'&'&'&76763"#"7&5476767676'&'&'&767630#"!   #     "    !  .23   !  .23 h ]&'&'&'&'&'&54'&#"'&'&547676327676'&'&56767632032#"#"$ /).( $.)/ " ,+5PPO )  )5>>D&"#7h &'&54765&'&'&#"'&'&'0547676327676767676767654'&'&'&'&'&'&'&#"'&'&567676327656'&'&567676320320#"32#"#"'& $,**,)  $-))-(  @'  ' )  )5'  ' ) .'&'&54767632#" (  4"$ 4$"  ! 7    8Xf/G&'4547670320#"7&'4547670320#"7&'4547670320#"0        # " # " # " h31Qi&'&'&5476767632#"7654'&#"3276&'&'&'454767632#"7654'&'�#3276%&'&5476767>7632#"'&&'&'&5476767632#"7654'&#"276 * $ *4""$ 0 &$ ,4""     , 66J\\ ,,6(  : , $ ,6""   d'&7$+ S"" %I 2$ ) S""  ED[sn 77F5%& j''7 #) T"" 3&'&'&'&'&'&5476767632#b  ,"    "    # )*@3   8%6+/&'&'&547676767656'&'&'.76767632"  " ",,$  *% 8  3@*) *)A5 9/%&'&'&'&#"'&'&547676327654'&#"'&'&547676327676767632'&'&'&'&"32#"32#"276767676#"N8-,      43@ )    ! ??I I@?!  $. 66H   $$   P77     $%-))-$%      X33.'&=&54'.#"'&54767632#"00"7&'&545476767632327676767632'"'&'&54'&'&#"'&'&54'&0#"|  LJ             4O  _#  UR,-    ,-UUN=   PNA $ Ma { Q* $6      5 Y e  "2| 45Copyright (c) 2017 Walter E Stewart, SIL Open Font License (OFL).Copyright (c) 2017 Walter E Stewart, SIL Open Font License (OFL).Class CoderClass CoderRegularRegularClass-Coder-v0p1Class-Coder-v0p1Class CoderClass Coder0.10.1ClassCoderClassCoderClass Coder is a monospace sans-serif typeface designed for software engineering.Class Coder is a monospace sans-serif typeface designed for software engineering.Copyright (c) 2017, Walter E Stewart, with Reserved Font Name Class Coder. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Copyright (c) 2017, Walter E Stewart, with Reserved Font Name Class Coder. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL3X  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmuni0100uni0101uni0102uni0103uni0104uni0105uni0108uni0109uni010auni010buni010euni010funi0110uni0112uni0113uni0114uni0115uni0116uni0117uni0118uni0119uni011auni011buni011cuni011duni0120uni0121uni0122uni0123uni0124uni0125uni0126uni0127uni0128uni0129uni012auni012buni012cuni012duni012euni012funi0132uni0133uni0134uni0135uni0136uni0137uni0138uni0139uni013auni013buni013cuni013duni013euni013funi0140uni0143uni0144uni0145uni0146uni0147uni0148uni0149uni014auni014buni014cuni014duni014euni014funi0150uni0151uni0154uni0155uni0156uni0157uni0158uni0159uni015auni015buni015cuni015duni0162uni0163uni0164uni0165uni0166uni0167uni0168uni0169uni016auni016buni016cuni016duni016euni016funi0170uni0171uni0172uni0173uni0174uni0175uni0176uni0177uni0179uni017auni017buni017cuni20ac WW?ս ϭvedo-2025.5.3/vedo/fonts/Kanopus.npz000066400000000000000000006005671474667405700172060ustar00rootroot00000000000000PK!a'wfont.npywܽwxT7:ݘ=NƄL3MG]gZ§Ϛ6sn13͚8|tn34f(Tt4v7xh,z F:P4ΝiFyÕ`67bZoT%FWWW m͖kޘ6xHo+hwJ&[ ě4o~J7iW_m˖ /6W%-L}Upor{ܫ cKE?/譵Z?ǽ}5pw8=3ғg'kGm6V=]mƍu~D_[4l3̋V_O\z;=SVO{ 3l4o4o։8q>q )+a<ˮ6b{x&TV [lMU{,x#7gxXsfm_͔;ptoվJٲ};zs}'e;Cemm!P €F@mEm e-h[(#F1m -o%M%M e-$[*4C-kK2X[PQ큦ѩpf,4[-˖i4hv e'AɖeNB[ B],h7(ÑݠVba'@K7RP# le>@ˡ h(t  :hpnow7ۉ8sy7e dv.,S41uЂHE,]iomvWk7R+5oFoזR,֭]^ =&, h VСlޒFoO!;zK5o-/ۧW^@>d|ȍMgY:9{U q6Foѹ!whKGM4;B6);:zpuzzh2IgԷkv{e2US6q/䫊ۈ9rfhZg-βǍ4E> `KCiZlUFݣR:e)=HYTIK6zmIY4~D2.kY/}:z:BXX,|trIJm>Kl+㔾J vex$1SExAw|+>R SS{I~g@9FgcPq(XaV7zY;^ִKuz9>IpKp |bY ~ZL˸M%Q$O?iQ@\ ;*S7_8.9rNV"k]xY?s2#Ub{if3̛t3le fXj2_PX^(68ZNly>}E*@75^-n>O}/m746.%ΚX/s9{Bnf6};>Tyꨈ4",5 ">Gs̹a6mS MdYKd=X:nx}_r;=Ci:7S+]x~STc{zћN7\:>L~!]m*CUCOJIg//6]j_OOiX^a\u4z-``AGoW4PTf+3: h ZC)em lqgb,ٝp%MF5MJZ[i[^LGJGrY([Zk{Kk:kGUsR{MF` &h>PYfP_1@r%hO@=z>+!7T\exer0jJJ*^C6Ap@+: (((j r$(K %ځJj T P7* S j:P 5Ƀe01&@U@5ḧ́gckjD @'A9}m mSltv"PN̈́}^Ozm^tP6@y-F\ڮ:v=l^t> z3.@gڼjW5ϫk^\Ze_VKp\,ᏲFO 5sT Q#,GP ÙP t4jcQ;v Bȕ RG4tH$6* d(X``Lӡfp @}^8@PVPJ@W,wn@8^s י E@Cm7]d 荶@o tm ЛP.Ķ Rrl+.tm%[lj@tɍ){ji-?]rZLɕa3fQeF^_~ngΪΖgH~#! tymεn_N^ry"k E: o>NwI_&QW`2PeT{+ØJ"kCG:hEs282\ ?{: ƛ?cw'xq9tdϏ}1U:ܻ< =A Z^F7z' _fo7 9F@< G2Ҳ،gRJf^hCh"IpPa&mR2NER"^;Kl T|2 fV ו]]juUg2ͻVֻVaW8^x.ZεKI`udz~?;ZqJ]K$||w'xȎO0~WVc/H׃d>PFZ+Zm-]u{@W,lB-?4@DovbZw҃ɻ<^}Bޥ'%2k6)[#PeBgJ*ka/ާۭ}Z>x|yk|2U?r׻s?9Tزa~s uU>҈/ɧY}Y>}lWd#C6hUv6?NIhm,,fNIh%[R"]?d' xF8o1 4/ˁz*ڒg1Z}Ց]4|]67,ȷdGv:NW?  ۍwZ]y{=PِˆL B{!A%ߔަFփ{?Լ{[#yk}|Ez:lhh3aˆ!!9ؓqV]smc#ιJ#~Gf.)7*3\e[O=}9Gݨ\9[5V Y3gȣx7z4AԇjS8"_~6|iQȤWԜ@?x Db(4a![2 ѢdZNr(p,hiݼ5-vBgޓN\vZܩB<)?S-vFEKyVldTg_[7=yϷ<ߵދ*yo & 5\̊E1"ڋ?A&yg~/9G\Ϻ; "͡oDN-Fwwɏd]BwѾ0JYqmr=n>aܮF$]D;_<_5rni@^#Igqѧmqz jI$Hvm0طEl.St!+|qdBq_yB9[3lhS q鏩}=moФRl珎$gZ~ CGCB?$Zf B E E E/1FGnkZC-upDp-!j)kmQ]O1MG!xǣ>7Q0 B`dC PbQ ꌮ_ J'؟c&C1a0o:6hm(PPtUSxnbKﯚR &{Z-Os)k]8e;NQ]g( FR{Q-t =.iHe%b1_˄6Ҿ~8zƾvIyx*^Oh HYR>WOy8AY ,}!+b;BPV" T';2ml$ l9P+ *f׬-t`p&!@T±4XM*VYТYwB/ޫ_+(4_l&((jӾh`ck(`@Nwl*'l;Dqqfiiu)! w=x!]Rk]S§l&!6HWvD? :ג7!!ZEҙtmK=Rm u6ɝ^g f_1TW`&qb/X:Rm/ţ0 3Dw1\OH_-VS.[E%ز1eՌ،qV3VȑiCdR<1 y( 4a>wZģ"_pMxDxDRmcM'-Ɩ ZY[yha+yxC{(-1o uZ uW8'j)PGnȗ KJ2V*q%yP-CwaT,10n<i FO_Fr kX}}fbPUcskOXPK6O,MDj׳}]Q8mr25̽6^PP=}l=yF"hm K\s!P]<ֳct Y0/f$˼̋~O0礜H_sF@EYz~CMg dqGݔq?s /]ϖ'Xұ=l!#;egx"@,~gJZE*"R,DFx%Qb3; ͭsz Gw; :|eojF+2z^72ScA=n_?x^)=KmȞVWǮ̴I̲sL3ʽ ˳xťjjL<ɞm,Oq0 =Q_Eߣ?vSL| vF g_-ղlQw? "TN:-P j--AE:.dCեVeOTPzZ9}V~/#%0bC0D-c&E@-h ($2QQCh+aj8(!JL5@Y g` mbNuP@eܤ#( TB g3=KiUIXJT04 daMTlne0pdJ}92A&pdY#|? ]Z#C8Zx苣},V[C^Շ?@ꁾoxy.rC%)![Zc~6US:Uf7\2r\r$@J,Wߝx~i%-QJhbT $t3SJC 3 ? eih; ? 14-~ԗ-) ў~l. p|JE},Gd5YBƊc>fU###c<>q D6@`XWcR> *]R.8t-^)L(Q(G P%@9d\ލQ|?Wo B@(l cC1 `\zYopqjI@9[q;RQk9eҙa^֕}FP;X?jӸ2%"S /X,A ~a +좋%s|UR y"FŽr~ղT!Q7fڰX6}0^OƵF _i5}XR{ϕ:O]q+i̵LXWʦ My{0e9opR]ܚH&+lN,*wEQ|&*zC'WbC"`~6;.Gh7]/b9\`^of8 e7lv~OQ.Kzdu[^%Ia/VVbVt)H 6`?;?7!Pqhwf) Ȱxpj I'"TF;/ -dґ5z, _IIIIIIia-W"ampGBhXd(LJ Ip#`2ñ&n,t)ZwPGgzwsrw9JCJV)JLRri2 g2q4cg OxLZ @EBFT`M&gW`rv- W:`_-bN-*p՘S 5̅jX 5X 5TTC̈́W|pxB}|cP5bo B5B9z@uA$9*rҩ, 3WJ;vx_cA9Ш`˧?翙]v %>xW^Ys9sKrZ}tBI#]~pbg $ %DNT$Ul`Ar$E(+C| Jw;<ݡZkkNaX2Y(#0:Fӣ~2,3I-0S;?rոt_Np +\{?W'kݺIP72=GO;KR-{Gz$N> 4;g78zY`GJK`]lBRh ,坼Ǯ=ē:n"L"qAA|G MLE=anƮ6Xдqc7s얺 aOrNv9g}]]f|t%D(.C՟x'۽u>y^0$ju!9zH *{ 7z.!ҜoLo.YPY9Zěl*Nt;9NWE3GC.+F<}^|"ΉVYͱ36-yq(;|<, q;2}ҡltH tdVL:fdaN̓$tPH3gg"(7Qkhkq9tEC!fPtp(seTR1G/*-RUK4 [b %6R~c0a1N"]]0BJ笂̚BI"]cA1q莨ZW}FE'8pz?CehʜxI0b~<üxJ:LCi[ vt7ء΁b0Pz(1k1;S;1S;GpPOkekam5Χ8=W~;L}T1C,V!&ƂJ#w繏bM2 dd A"S{4eZ?6!"V ӷBw2A? we=YYN[2Jȍ$EXmʌr*kTev1ڷ]Ox}Cw>ylOkJR!3 $3D/6#B;EA",>([6ΩM4yЦLF}醏}d8Yi$iƓz~fhY^zGO^IYng#ϛ4dB}[_a>},3s_!ƾmxǮ@O֭[o콧{osRvhs vzvd=7K>p33xg_9_|{/ϷҕWۉr૽bUk֭'WeOzcl0BU9x}Z=m׆k+th\2R6΋Thszq83%RJ'0=H'8ym`3Y2[EM26?/= 調fRXFJmM3:lAELY!GNE&oh+ĿE, %.'`s,T0ŝcn1j7wy&sYhP\fS'\&"H1TYZώt$d5e5 Vbk`X+\ڿuP߯4MA ]=pdauؽoYkʑ%`4O J(&4#ߴƟ⟋pux `m[<1+%YkIi$1ޥD 18s'}I%=I;% ?Պ@H?R.-]B)g򛉂F >@{hDkYBX9raTjmP{kZ[;9PH3uxD`EF1N"# 54L qŅz$9piUfVJr}K:؃c L2 W_iӀ8 &@MTN+P4Bў@(zM8V?z EZPD`gH)D8qRFӻGa yǞd+`hjZqY%qƱטM׉XijE߼Lm(2 4< u2K1C'ңѫa\܆u eHH~KyLjf\ĉmEK$jmO^b'O z*RMV#l3mzXD2kT7=]+ޡJE&?E'Hq1d4syY}YNcQ5ux;joߊ{{jECN`Ћ4(?*NӜi6^0`xQxA dgh} yP/`|cfᬽ8Z? я'-C`tkCS6 kjB0$^>FFQSnY+c[Yz,h`JS,i0XLc dWO%DJZ }'0;0sPC 8]E~!T@#7аm6fX}WwSU  NzaF/QIMG@mvPJB ]h"ePTP+#e2B5Kʕqej\WFƕھڶ Jjlkv+еۀ vۡպAm6 ڿmI;T1;|Bs8P(r1K9n){ m3|۔Wo c.=- i0QYgcͼ|q)c]8ڭZ -JJۇUl*ۛ32_?CWڬvr9W֎(׫y[>ÞZU1ʣKc!OiNgV;vNY(7j 럒Ꟃ>xT s(KL$pG"%#G!´LL,.,wN*WQe7Jb* V#ReLciHkQ0W]-_:>#ҞqV46+q _Ư^8 ShL~P,i";l%b_lv#&NNѺ4^f" UQƽ~;}>IPlƹ,@9h,2B2im֠M׶j`π=Y[VŖ&Fi <ݞ ԿR(:7mn]F+׺b:iA L~V " 3L<%7p9HK%  %lAw&39 r5źy"a 2ܟ1.8 Z"-K[S,R0i(L\R0Y(%?S)Տ2[̲"DٝR; gvupILf(֔Humi]8)(B/j O%lՒ yV<-R5J1PQ0RQjd ZY>֥}Q|t䣥Ν|yJ9F|aWK`|A,$rZ_XHkg09c y Ysk*e֘ggt|+&(>=YK|5ۙNT{ba;J2mE o'I ~VĒ@i&aJ2]82]82]tqMP _hǬ(Qqa0J({0J(:! "2`5*pT$Zbd$匽FMY>$~K[. Ű`Ȯ ~mKKzDTnbUw{Fr;dOl<{$J|Kbq:?w=a~Y֖m-d) `)rQvWDE8j`R+3)):l%dP%2QedD&Df*PE{Lm, P): JYjR))3 6Wq!V!--*Y=>@%GFk=2Z6_;+l5*3~~ܜblc\3ah.x5MOC^eϱ\qb!v_ G Ur'JڅvMam=:VY UayRIH0lpFw8#K| X%r,ott℡"⸑ 'h+P֋qnXr )rP>2ɞVĚg]Lei^ dW芫JU%jQI=p(jbJTs0yt\vn,$"d.LbnVώLb9:%ژOv;XEŜ-Wx3 J+FuGяYJ;bFZ΢6Xe&eCl7 Mt_De]B6Dߪ ͣq!~Rw`d:0@YI<ݪX{FtP"?Oj)vr3;(_نoւ]5UYs^4(_3bu"H[#I>~cxp _l@i5s)6s b@@ tӄ"DXa PSB1+W/` qY)I~ R sq C2ĞXƢTEe/$ˠyJ([jV@,lllvV&2Q&*y)0@2S8S8V(r)eSʦddt$JA߁+AHJA;+RJA;+zN({ժ|ej偬q ƀ"YmjrrYDa[.'C}r5!mηV DKȆ:3 W f-Gԉ^ "ST RNf>DOuf<'@\ nȳ ԿrLm(9iQpDFTd1~fo2 OQTWҕ4v ([KדM<̓Vkq8֞hw29ۢ#~5OOlR#IQb ω˟>M~XW/v>68x4u|wznr rӃ{޺?7&R"]4jg}YmtNjLQ$$k.\ 4p%Z!%h(mDD45fH1UK7 iuǐ h|]c}ǘc vv16:TKc<nPJ"f1Ρ4cNrwG%sf_mr{j/^=?éE_K"(EwJl4盡fx@t'$A{|Pd8% '?~!b>Qh \/}Y1_L%H%΄yriG>STj wBY OY=[igMįԣR?#{m oW`ϋ kՈk5Km ]^NxvZ4HFIB!Z@zN9meEET"bWD+U"QD$!"*" w&~߳ K9o/ׅ] UʖH__)ėGːFqCk_*Ͽß6E-jSG&mfkMsQ?i%U ݻ='9'E>f*j_/Q Y 2K1U}φUwUs$W%m> Bix9Zu+q[cG"sc:>FFq*Mvjٓ%$(lҮ]*^@<dC*M1Wt 6b9\>oϨ#ΗZV,;f~Yv|lye՝fyFe=]o]bԿʗQ}=Bthe;f"6d{ȼp̯EL,+m,r=,~ZugZ8cZ4ך,oV E\%pjeF[ʚMP7l)t􌲩eMoYﲗJ ={k)f?ujr :VkyeeZ& qlN% u7*m(+-MJn,h0}|~Vӯ s<$tCBw`௏Q0|tjl310$`@\9zv2u@CLcL:З}YSay~.w0&B5Gׄy&tj",yV~ sy.?NwǹDD~ rAˮvK>|W$>A܀ w ]\{\nenDПe ;H$fJ֘7p!Yy7Nݭhߓ4Aoyh\ >I6q}Js'퟾\7)OGT ZyI&OjRv U54Id#"]IQc.ʄzCHK[a8o'ui]%'uy>L7#Mzݪb5wlמgKƠʒ߹e˹Un.P?46"I;zB1]<[_r_ y|7ec=T`Xٓ ds}e;Ym2Bei߲؏'vf;ٓl&k)4v.?[c(> EcFK4DNn I2g# iA/&.dy" U52am~-m$+P"z!t VɃ(~ؒ] R…u00`uL+ͬj(sdN1(Ed`  RL_@Y'j1ñY B'? okq>rZ  -G+ E?OȌg u~x<&A<z@+}? Q:peF4';OT?P > Cz?=,WR (n'Iaαރ]f{?U)[lÇ p_4Mps74*nmM;ѫB|D#NҘTx+ꃎoW)f_Z3Ao+v;uBi6f}߱9\v1_l5}+$[#3j4sP墳0gCƑWҖL;pkz;g!;V@#ImaQX)+`ZE_18Oi}Ec< =~ @VB PRRW@i_?NJ% %V3%H҅{^r3"Tfh2 ]r7)M❚x 3:u8:p_pl;Ukg;B:$L:C¤ $L !aR`S+#POv YYX_ʻjIL?l^d^`iZ"s'#Ck.33 Ew{ۛag99 Q]ڛކ^]t{ܡ=@~={η "kϸϸlC [;މMeǻ5n3aelK`s&+L7"j%',<6W+&_AㅑγZ7}9*ܯ+t{)t ȿ)_bjf+}Oz?Q#}W=LBfܩy?W&+2I ;Bh63Eg#J 25T& ` 2^v$0lz ޮb08q ʅC.tB3# -~nyBuGLROty(zZEԴ+?ʙM -RPI𣈵 6` %ZB4NbBС+X]!b]! @bͅh.sA (P.( 1.˥zvvvlg+~8]p 觇`0KԾKodOO>f _EUO. 1뉢#\FIÊ?{6)NR_+sen3GsuqMfS;fi:a4C!c8oXYLP8͡W41QP(P(-йwXfK &LDP-I0|?wf$'HLo=(X:J Jmf#M`GqJ(Xoa7R|=h:'`)_T|F1JN4\"Nv|l>P=M+.8=DC؜h>:rɞioqK)W)HSW!/ ՘>{5ZHWOW̷2}S6|YZyqYaY6ee',6n mƊ+'xneM5{;Kbٵ R"dIV.Yfr imeN[>Rwqb3bUg5E}gt)O%or2`w/aB_a,縯Ƿdٛ>zG'k?U̐s'rNKLԭ9@PB'¶'m;gkNك8WTHC9㄀?G'{M4+) X)KCZ6br| (gl V(@PPfYL(֜8[dgD[ 0EAooU+E+˫8~QA\K+eOB9Ų~>nIqWAGa{7濡4p\̎=`+A2"~+ lʊ;*rA*1 _啡B BN#:_[gw@d)'JR Sc+_7QMMg!!a'("q=? z@[3I@a@.ޚK&܃fFn[&ï)=So$S6Bי:sggzqX;XKzΠi^?q3l}j+m:wQF^QoN=0akF?pZE6ݞ ~i%+l =&> 1'Xpl+r hHZ pW|WJ Q?l![T(Ϲ[zvYTy-`'[nIlIK%N!zZIc`u]٥s33ѪlC"pH< ǪK+*Jj$Hصk;ē!j!yՌ<(%j ©NG9$>usMMo{ȉ1)~PKg۵& h`Sˇ.9yW c6\̴r@ƏEP00zB́ 5 z6GAy\Z37;m%T4D0vdlC:eb .n88*.m~1fQU~x*K'+zl"kQ $=Aw}GUZC*tE\0m3d%1OrAS[z5> $Z>E;~aE3%f570+eG!sJG[l9+gEl!݈dI{ &V9Znb@{Xv(,ggSvLB50DpsO)PcAN2*X6X 9. ٲa ̒-AW8GZYuϓT0S: %c>`=8ܶ.PSxU0mS_hǏ"݉GQ??[0݊+Bv a3ֳ/P.)@K/n^Sj|h֣pm cm5C}x1fѬHn ICe:*~jc*:m=o;\ipݗmiTs5_o1c tWQjz?ȿ˷?b  N}}/3_]@IuQM 6Yhkkp'X = VԨK$(IDhjy,(ej(r`G_ L<@jk KAM  \~՜7kV\O. vr"q(,0ۼI.yyZ&»\wLBsGҪ3,,0r}?>TmhM]Va96Dfun20glqpkV* __@ܚ[ZjWӔmj;U܏ x+xŭVR]Z|^?2_A+}7Xp7)L0e?>?2ȽU/eb_ҪӪ&|eOϟhߍIW{68}7`?{ߚ vn_}#|Mĭ䭵JU2/ϐw3h!: xt}g47M-gϐPLy[v" KeQj 0pCs74W~<ԑbkH qaUgg`|m9w ?~-  qWC-{ $6kypu6wM\7Il [ ̋l6Uf`|rϿO~ H  ~]t]eq0К|>lGx~cg`qK+Q=]Lb6L{KjGtYo"oW{飷CɭG÷vė622jB(}R9ANjW^ R ,63tx Zj֧h3)F=֞Ѱ~XD Q7m\W˖Tl,ӇUE}mq O/J{kbMtłW{H&Қ]Tܾհ}OmU:4-`eɹդBJ$"}yD"D4N5F2aܹXr iM"h-cX+YoUr ht-1l~UQX`kh[ 1,wAs 6g,9υZCS8U(#dP~Q+" N`w [`U hQ^$Z !%E8 B1;- >B[c_l0/?XUT@h@h@QԂ67PTXLH! R$M>4|x1סI?N㹅.d#Ofu`Ud wD#h4ꉷ|%Yr:7̎oc,m\!5Jq'xWWۢ}Ὕ"x . *2ҽ5̊x NC~G31#ܸA;wzÜw9Wܞo罷ڨ%+f7Q /;juҌjtm06:ΦWbrYbid)'s iN>Ý;/ z`97-'gMW|)a-=Blo,7au[k< X GKea7w5IY N*t~DLٵnGT,+!4-@0ԍ?Q<~!tmB4YË`x!Ď:B \NhGΌy^pqp8)AG gwp9K"~mmSڀ+C`3lC[u^Vׯ^&`ץqf2IF*MÃpW}Lнd ϡhW7*ܿ;z~q\eyjs%\BM1/M(Q)U ZvV fk_itů|{#/]H'i$ J"?'WٱqY烸;DLM}#1)y,<ҳSqxN+i CH X7|MvXZ|C"*~ 9nX7f5i v# 19'4QGpD4p]=fj6YI2J z[g je3~4 6O6<ٶ ߶||PV;@vTwGAi)MB@* /U \B\.\ہ9o6 ߓ>a9Zs.oX C80~9WNJӧ56jՃΟG\/zx,ͥ܋񧸺ƲP[[n~ӟf>Kg,6ADk #pH̤[z2.!zISG֐x(F$܌@K#wQ>UoPe/ߚ 򘹞?n560:7icr*L`-qcw0{i7l{SIPsp?왯-vêﱳ^[b%_Ӝ* kp[)=Q`/c<؇ \i)rN:6A(Ju2QCYA&X"l~[550TkiB|2 JځmxP'"(   Js  J# 9"P5`3qj p`h bhX$ y0 ҡO< jGKr#lzf33'>J8Ąd D%^}~zh|i?O O&)9}ToX<kW!xF1QOhsZ)yF_Md;+1ßp6><M{_3?s|vR&:%{$;U?I;~֡PwLmHn#H6 ߉Gס˾nqLcW2[=?;]h '}RTO"szohCҟ\JX#uda0Baud((ΌӁ]U jR`W$J"/ aJUR W$H=3# -`L {D= "9am Vam \`h(fD=DU]Al:˩PTi Z*5k0h ep>0,ӶܶfKW' WCElrU=;jt\{-vD.[_tgrW\U7H!+v*}7h7Xܹ8<2FձZ¿¿շWӿXnPXk$Y54PڋnŞb;b; ;vs? _73;Ns9u533䂧DT ٩\SWyϽ|_ykV'aelv_qb"`(Oc$BP@4G$Z$Lud4!h7T,$!RC>18Xg- pFHo|#Ob\&i%RM tnRK5Z]?_Vyzs:ͧXXM"5U+$_X}U/iyos/=Pw;U]_ӻiBT"gFMq;؂dҘ@8_J[ҞNk{8;duShAj,'8ߢ~O1mLF=`_3$\kxT.j7+4ԟ*"ʏ;vj:H4Y߷ 'OwJQ=d@];~>;.}V~_kjꧾ%y5/״=NWWS۫J*\7&]ogkǛ&׎?R[yMgPڨ}7!tYݯ`UqUAG Tx."~$wH:"7)"D鿇4@ڱqcVF-%*\hX,Q86Qui$AoիįɀŃLn䀐G%@ͮ oɺluf i"#DJc)R [!rt;tw jt,{GtylilTV01&es,aAhPS}8`1("!9JC5`Sws)TYuUr8t{}PW燺?Er((+ѡ>̕F0Fكr/]MsSy*_Ϗbz4r#?nr7IГ'׉YѢ^Ỏ6/tʏc?w:yc.?^_1}:}Й9t׾tLӡ3}:tOY8E,O鳠?}%oWsgv^)L\pѮz 8O{ -,ϞeQwc2Zr"z|EyMz7͠vڕ%9-bE}A<(2 !Cs:EW4n21b O؊p2YnTQ /4Ki&]$R?#x \"Q>WW٤tuxgy6x'Iya%pcs`f7 \L 34\,gXx(<ߋxTS'b\D ߢ)dcbdM.>2jWgAm|;&CX2[\| ߥ5L@fh VծY5~0t{Y'fHTYUVA~}aq.[6{d.ZrA&? &to~-_ 0%oFt(}U "\lf:vh.%2.QraGqvinK$s:XOvٿȘiQWꗵxo8u~AORջ];[;4i2M`/g};!Oy>zDÔuq㏉1?b,Xb ]&6?ׂa -'Y{-]I)J@r>5~|Q#]]8c 6HSqr ,2mV QlXhn2JNHB]*ENfP/@d!mB~:u0[90sU9OKg  tMQ{A6iQ2oFDZesO9Y<{˜BGkU @lWb=L $$ۙ E`*`Zx3AdѺ:SQ-9ZyQ-G'#?ӧGk#V7F|wh᝕^ᾠ|2ugmswNV>vTjw E+qe7o7tUxx{E 8g\&WQS)@U_Hznu-S˰sͷ5W87ǻrO>ޯ&qUV5t~_UݥBUT>s%q?! v$@r?J0Pdu ",lj?u~ O6:נI-cyvL:|ʛÙ0ZVֲܴۭI6 &ߐd';x眲ջ[O{{r' #Yk&Q| B7~}7sx#ɧ^܌%=e R'L(B jk1d E%GJ:4YNf#sqCYj~K,6ѻXnxR򼋵߱J.rI6@[X|;Ynu9{o5"'@+ gʠnZ!&/YnԻH7-&O 0VS0V|L* F6F]^[!9*^-ȟ RyAÎEj.`Oi0!'?\  Frk@unuPݮbbɄY/a3;ճ˔@g`.vv)Ho`n jOi`.x匷;s>=B vӅZT2ygGXiViwRf)NfS `c7uN=o-hq4"ZX "Η)#A\ cρ[CMHlpu`0tn(k}o@ؘ(onvbcK9TقSe~j=%)XHeN7O8O8?pƟguʲ4cC5CͧYO.`'M-P6v3tFٌΚgAyo7$:}̱R|t?/ϔ7Ϲܘesx(JsE{W_3QxN!0հps9jZGWē&wdz /*E/jXM,7{I5` F۝$O\ĻIw=wuׄ\ědڤ0%6O4=B O9&H4kQ ]5VB$J @M3 vћw302OɁx_sB_;˺-$D[[]J)\w4dg?ȢXww{? ٙ3 "}iKC 2ɥh.cqPYCkYD Ymc 7b}e~]P(Et?C}bJ1HGQ4R-PZ'įH|;?Zn G1Eİ9ȏJ9 YG;&\;^T]j]T4<hx\m:x)t OB8%ƅϵ'(z_?(Aqr.N8pɥtRz+\(Rvq/5W̳%A$AWRCȲ[hhoޛI0@3Z&ŤHLjV嵂qya\ըY3rmD;Gv4ͭBip,bl?[ 2ڂDF[mJ MQZ)`^-EP]/lInIT;hrguY#6I&pZ6_;fkŽљ3Q9ݫubgԛFy\n@c0@u~sINm> Wx!Z~hy G 1Fi*_B5@c>ACJ G߫QG;7Lq鞩.pE'sQî*/]{rD؂J(Uqy'Xs}T|ţä)^:{#K*H35`Xybg *2uL2лT2)ݬ!61o`PG8h:J:YT58Z:Dњɲd%ʰ΂߱9  Ղ׃@2T:9nD,aTW\oNtWDx3ḓDzֵY [E^. \"Arh"z#P?n Ldgɒ=Llwd;|>WkmmcQ{c2Zzu>ȸEE>'+jE?B&ҒTh FqFx{⏃d'^c4m7۽m(TZw]Ya#rGPG<k0n dvJQjQZH6RFVWS,f#׹8I!PO̅՟ggȥKn9;&yϿ"Gu62І[Bݚ6y$"D2T`ףP%+' WEUK LˁQrɆlٮ mJ@0*ZaJT:\5Bߦ+Q '2~ [`ֆ@hW n@J4PDOsD3 `:@Pf}{N\v  ΀wJ g2XaalvXAfi6u-EoH`S=G^&בxr}U1;=E(I}w>dwIG]MYF8UCF۱tMvdyēNR}v$mt=ɕfNgA7!I%Y7<]<ֽܵ^;,cYxasr%= ؁CaD+Hh{r`,{PNPZɲ[!bMīpۂe iz] aViK(*}ZCHpO,ȑ㕬4VCj_tij0Y@#9?#ʛUSr]x.ȩa7LW*q g|/*Ֆx ރnɸj7L,@ff Vߛj7D/{Vzga 2pwS68ho0Cb|ۢ>mOtF 4ch5zTTh}øK]&NjqCr;{# L{}۸sh1.ʍԛ%c9tG+2qGKK\z{yT4$ZĴ3d'T  OzZC 3.! <;8,vl_BZVݴi5ԵaB/U X S9'Y5Adٵi!}6AUM,~́x rHDR`~|H)T0_ܭM1)S4"GQм.;ji1gBJ! ,"B5p/b}U>W"+,|PA ȗ@BA[))1lXCa2Gl$O毮giI=J߳R),A{TezZb3}'"eVuGZU~韢;gnh5⫉(칟=3s=6Jپb2 4O;]Ҿ}WÜc'S}('v~ANjp/tN&**ɭH aX6's{L(HкhIS ˣG](n PB! H<l ސQkHyl;MWFM,eX-rY:}Ent2~g]* vp>M70὞0H}T{Wr?>Cw&^eR ֡aX|cn$\0VO7-ܦHnݭ>I琹$D[<0~İFwtj,%Ridxw4 ^: RxS&׈pCCeZ2liGCVtyo ~+EVpCq3 Xj[E(ƍK8 ,` 1-ts" վ:= ,YC5prC `Cmiz-vz)mXw zzWqY6[Ckv}xH_VWNae:$$|Gim׵[K>挦C@گq_n"(+' r E$H-\3ۓI=4󁼯]p_} #Wl@.D*Y-hcSdUƁa#aC/:*x 0r@;2Ad>gӮ+cAWƂΌ快#z2dPa'r8֝v@ڡ\Cd7 TW+ L cֲekļL"|yFLf#|0?y M:Dx);:\5>c]^ȓbR؏[BuNr(o& N<餘"j .$3'h$^M'f2|xmi4%O`>AVZ u}~-j%$@H;hr'BT.GPH'm& m4Y'vRRrRRd)H?)u#H͌: @V=vUy"*)*٩YPh@_f!?w E7V Ьj ɯ@O:(逨!tTv>& :VV^_˻N/,-ST4p B["uEn 7i50?V$SF5I<W-wyڌ~#W=7oÃX0y*}4xsͺ"\zn C_N2]Sܨ5HsiD?!׃ݙYeX2sxrܷ(}%GJzoe+pVN_<erʵلlUY%>i i*(9s&0DHV9#AƟAqRLJ'BҭZB_Uk!#23e*-0K>DAILTGk:i~ C[Ko^u64ifCh6B60C!.XĖ,FQhUeu6s1 Pď9:_fgYo]N[~n:8^_uFn(O6cWi3 E]6YQiɲؤUJ3~ӭ{Y\\o bJ瓛5zsf?b\{XZCB5Vݯ1}( R━TjQڹEv8~5בd #钚q?uy;չ-kj>%뎧'dGMm& 0~7QZhSzHU>r᪏?f)VU~K,ᶪkՁ5F8-¼$/Ul!bU /5X0Ucb!+cegs6ZY,&C&o' DF6 \h y0hlR6 Ӵ]<%L'Icϕe;b7Hu\!! = MDcblL$R?:ԯ`v>iځuQ=\= LI˝vBK™䢴^y>N[џJ{o)it ]A~ g+0:<< 6J&;Z#qNF{\j!Zcuw^/ހCI#$Z:$Dz -kȩSvs"pDņ`EDDT Bׂ5;ax]=ss^띵^]s)6'rp]/g򒽧G}e-HA :~Ƀ@kk?'k>' ӯDS/kWuͤ0Wt5I_*  .>"pRS.sº{>q-LG鮏qP-hIx> $, cid^"P#TYh8`py*Gάp);U#a VBrlB{|M4wG|x1lgfh dbcd{B{B󘝍~b#ة/x6wc'Z;]HY/ү~ʱ1yc-GX/[clVmBzҗLg$}QV{]1Z"Z*Z]t(u(gu.-܇u]Uȏ jNzwҧ ;]-!V -]YŠ^d3_!X$D>XtI$(ק ҎYjan}5X&)٤rs=U+fzlT )u3`Ir\fo? ,egUHtzeU&2Z^2WezM " Ҩ. F6 zbMii4ƴuyڻ 85PFNITC\ 8)A+]֜ 4ov@n;xfG0'GzxxZ[d*JG Ү(p:*{3O4h~b<,4w>JoBEv__"˘QM3C͡gm덍h-ŗGk)_y$WCOҖjs9'C˂|yA-k5ȔcM@P[rHEAJT<"}λh3G>i2~˚rzX?#FE#m?>lom8, 6x9G0Gk6.R&eS}hWY b{/TQz9U79i} >M✬ 4ºSѽοf]2I:l5161YWhg;s ٤Xat3R3`yVO1./t 5!5I Kj\u;ϔrQ!n'DGҝʊ;F3C>QpQ_ގEI[Le{.ֱ8ENDv,w&vGf`TW^wg{(嵼z_829]Խ[#{ĕZƵz'z}VK/Bj/_X=-vw@KK )|me=(JP\ۨ ryzx0.gZyϳ'-]_k=D{Q}H;Y}5ޢߓ䛅Rh!K~N%Ol"kC%y% x5.vd}q7HIs*1ilc`h^lT5ȫhw7kwYC2xTLJXbf=Fx(޳aN?#xq"nG` VZv,ԹRg$VFGWxKCQ=NQPP]'E9YE^˛x;NDPPqmc<_Nb0gVb=q|KuD8RV]Г{+!9FMsٓt8<Ϛ"7WdzNoP9mIK,c}6S' ]z[Z3VJ M۬)31JoMƑ#2梫h& /W})RL=ST (L*<1S<[lO"`_*V7%{z#~C÷_7?oF k5ךmY )[zD\=p(p&rOUthG#51H@lk|4 ?]'Yd/3bxG| gi5ݩr!'*\RjN;:+.zap(4ښ6c1ok3a6y%zmLÜjƚ*FnfemA?#BPZʵ#,rLЧ F sٟbX%ހm6H|'L?WNj<uC4A!Pd\UTܶ1c9yAAةf!H"E5]P)7j&j2]Y}IW/X9d*휉`23M*P _+LFJFJFs8d4bphMgĤ1: X  $q)nHUٴH̪R *˥+|Piy>Af>K݌R7# (%V`x& N b b#N"6ɁÈ1ETiJn1]!DU6eYvPA(-4kKr/eoǙb0F,HG3Z-=K;,w}g}{[}3^{ߋkIc*YNuLc݈0MIc_gmヒs~4ɛ{wc1gr};IcYqlI#͡_i4ɴdڂE1127'QqJ|M"x^VeMVX]zzzYzoEY ZK\,I=<ĮSf&t*}nsjz[gK[!Skȧ 7WGׇl.[|옷*5K|8FŃWr{qk-r#wÏt:2î[n|e pfXJ }Hs 띨5S,5GVd/z<6J,ZP*Z5<&/+#LPEcVѣ?LY@jǖU1JL㆚ ]Z&)dXFؗTɪdV2ϵX^S5ѣYJ&Djvͼ%5p9.od` ı g3 W g@Og/80"+]v0E m_Hn!3 G51J⚴`Yx/ Ļa&`cx-L$VNzvTHYKa;Im!x$6W0}]{x5 pMpMpMpMk\tطlYH|;5\s`; >5"΅~Aa t CLщR݄J@)U &g>Mi?r v-" кA B[B (m}v6Pk쿬[-C;9Y]mkhu3ڣփVAm4ƉC vhBnX'"USwW?No ǩxǐ/۽؉WKԭ]vYDYprW+!͕w:D~-s xieMRk>.oW,-T0ƙa_ħ9[`a7[+pHW:4ͨA85h8k0/tҠ9#IWQ1 _g"5^ymz'G%6L!'GF%RGhH䥡$E`+$ [;A/GNrQ1h?xHl'BX;`/dDS`;hL~2X2ӐDYhBb~6l$V\ػ]a{Z[Ik Z [M7߄{.?'oPJx/*FSX?Xj4LO!$VڧX?b`{ԟ=[u{xSmm{bc|, aDfB[o|?Q@7VMs:NFzu8-e4jYm6НFhMœy4^8Q3_g@'u~x#bX!{=?m εAk /3odZm ^l21-q0/q0/q0}]Fq!30j.8 Z$>ByءA}ԩ['ya_ 3?: bo.bYg\ {CY"{ɾankI(K{<3W_H|Q _#Z׀_k;0v>)}Mv|~D*Szr/u/8$ߒuw{X.ԦM֑g/d4N&2?B9xg_=&sQL,Xſȃ"ϱ6t'Յ!A_(E+o󄏢XsI('ojrR=uw_V(lRHZVK':QML':Wz{mU( 1^>Ww)|5{I>x=so7UZwwLym)fu2xȃfl'ی˼h} Iq|Ʊ$#_xU#9FD:?ROO:D91jc(|_9_ '!GLWq<:0Zg#y>>)c\>ƫNYFRKdيb,Pܜ]y;w?ͽ6󑑣}af;̦c׮!GO4fYsf{bx]T֋w` ЏnQ‰xoj9/I݇xV_]{[zTEUAHIF\2Jzm2;'Ġ<6oY4F_H"㺷1]^956 yZ34[`b9G㧆{uԺEm%qّR+"ij. cQ!!Fs8X2/_eI0Y&#Tٟv*6/<,"d%ǘ%C :hgbQdqweJj[#gKŵTॢ/S]k:T1P5U RZ(ooH Nj$#1$Y V̺$fZCA@YpKVNj~ NHǭ]d3i1ͱ&͟p.f{ wN<:yE:X#,Z9{P+vW0.ډ0+/ihElnԛOSQ*2 ˓1ɫbD"&5Ę,,Pb%a5~v $Ul-FRx?&x3umMkk ・dHuLJ}<{Rkhs|\{ϻП"07aOX/nVk:a初0k0AF{j\=㎝Kcq%*F񰙤jSFKaOgԶ&3ΨY=5pDjF(_#ֈӑo,B&5,S͜\qx#|: $ HGj+Ze">kf{n0{'|>ˁM.JOIy7M8u6 Z ,% N&tuON*k8 #635$IOK9MvF&֐7 yC6}~z YWi{N4Fߠ_wkSG>؛. GjgbX7茣G3EʊJZȏzu}x`_1?w; ojQVkAx]oY 6v|wYeCt۫U}#ɰZ?Ùu^E;#agg#O^tS].zL#{b.\죢,%N7Rȼe(3YJ vּ^ZsSkTC{jhu5(oњZz Q_|/+w~l "U,ӧc)z6){bK+Q:||c"/I&}X+7(6HۘԼ~edB1}22z F vs ab a7 a0o0LUa5`A;bzX8`h\(D[8rā8Qt0r<yNmb Uy$h2"^z1[E#/QzGkK|&BdkşkTߊbKWC |Kv(,XՈ?jOaP ڏCP̰MaQćK2j,STI w7zD1K 4̜(쨥k,q$3FC*BF8h"8x"[ '+"N'b=g^+9XAr!nBOk*Ydӯhd QҍN2%kG^cg{7[Nf7t'mJdy޸h0 f`6J z} f2<)34w;,h%f 'a$ެ.Zd,Vx47ˇK>cq%cJ&IK;׍W=6{*Ne2ŕ$\IHS[TsU,YqJ\߳8i(Q6̦ٔj&~''laWnd࿭OmWnQe%9Rɨ6;O2 l\5pNygxv+:]Uwc J{N_ 8 w24im %?%|95);DCb_nuG/Ecy>`', wE]*Lp)q@?Sj?!<YV co?7=Y,W|S i?7Gg=,3%"NZ<, >SϫA")_+#\+z)b9Eq_NN:bښi| K!֑ 'mD8m?%]ӃPg`qpQNhyChp`^C(%T%S7pi?NHNz pSN)PDH%i G(ZB.P8S(,?:yA'KN}Y e_͖ܝ6h{EHS7 O;S }Ļt#Gd,4&ߑ(s& C- wimDAhOA2§W7;:l < O {BˁV Z`$thmm'vo?[à >XS9*QRTF٢2CbMD5+5tTKW9tCC@zb ,z#1j\F:[] -rYxr G2Xv)BA$WS\B$%<>' z+v*)u#Lm`aXN^RLLgD;1u:&Nw͂觻‘ QQWta8:J"iLI)ECH$tI!LzucCvg 坹ܖҚl<=Îze|҇d&Rz=}5G3ގ$Сa8 X;ɡQ0EnaJ-VjpraQKzp9mw|rVzpJQ.؟ߩ)8^q(ÛDj(kP&% ]-t޿_Dj"*nʱMZVr ue!M#Sa]zC@끈l}.K\R`w\]{Ľs"IG$Ym(71У rݭU؃D==|>zpqI((\q)1btD8+Y:v5Eg~>!yRЩP/~ - ;PעWrsv >|?=ٚaJK,M<* \<|?'wط9YBCZ+`V-ko5:: R Vhe'y^Ǘ enaOGh)z]yf Ō2vWE}Q56ٺJ [d-t?.mG4dkP=-VjH1% ~ I1b-1 HS@\k}o8\,F {=]lbWd////ʒJ;8ziI .-tētDt¶?Ej'z" Ő3Jrc^Xh[墍x#ÀrT>o-0.}2C5iZ-mзvf9jq8Ѫr(_8QIԕ"_U#Q,,aM率ɓ\Qki,}t_tOɤ-"BE[hSۍӚAӯ9~'M+}n4uWi5:C}Mh{sbKkF-k,U:`,s|t?zrYMfKd 8\Qɓ|N6{3`=|$vK$ք=b%KPpbB`PPЏA w!<58]4]~KB[NPJhD9MhT$M=$W)H*;dX`= Y\"èsZh@/cQa/ =M)' %F32K ˫[g& ұ}ˊ gnL-+< ȩnu=xS/}/AJcRc~C#5Hݩ ł(X-5*SϨ_,6YoXmQ7<OB; ڱ0|:pv@; M_4Ќafn\0IwжC[ Bkχ pHr'* %~_0FRHRRJNT}g˓ G1XjAY) yRȎy0~.N$ihw[m]Akd{goO35=ds@'ONA@lN$BeIf~6&$fn,<3jY ܚS\:yJ&njiZt2_]SSG-]|۴<;x(CwDO Vd2ޓ)Ꞵ 5UT۫5qU(k䵗(|I G$2Z%7TMD^N\}$ k#{*~bO*.ЦbO*.u4k ,gʥEarVҴdmʵl7{C(WgP^ʙjfv [L)T>H %I#\O78r'7=ʛ煲b15ٯ2E,}Vz f/tE(BD ReQeܿ ˕P]@" hwśڝNڀ"bw;enl!cə@A jD-O iR@ZH pbeQ01Hf(fU v u U fW=Y߂׿J]K)& -tN1E9D+l yCn E[-ozu'KCMݝHϐS;.q4ݟz;hwFc Y;{ Z@+ ԂmdRZV4'] 2hT3B{Z D%㨏4]@{ڽЦAmnB mS>[فQi aെ<YdxQ@bkJz_u<f)XUJjXuLhmsIk%9dRkEh덽F"pܟoS\c6'g:fusK"[q:J%q5gZ@P/j'ǂf  0U%{KkdowN gVxմݤehw 8'Z1`\LxG,Z/a1.> O_.ow"`:fwN`fGo7CmCkBBuh<l>A-8%VpU0;t1x,88QY5>KxA`߇ǫP֢TtJ$IF'tV.w_Υ36 qn\b+vLjǣKB#9A ǔAR]E@׫~7j|KVҒHC " -Kdۦ-L`+S1 4U^%3Zy֗Ԯ6GŭW9[7Kj۲T>ʐ&W:4}Q=PY#pYwei5MZV-TXiexEkY hieR iHkC$Z=q_Da|Ɂ;k/#rn%|-J̢ EVo)Eqp' Olg~i.$9c/b(=mukXmX+)XqO+Y_vF 3zb'OUb["/1g}-Y>CKh?BҕfV%Lħ{*?ͥ`\8XxԷ'Lv9;ZM <[֓w1K¯)ҢXZ8qx fͲZYs!q@ou0j<7g;OVlł_ vUwA=~ 'j^5T~%o),I\.͎mX6BQcT+L&^ejby"V̉ X\.'g,hcK,IX" 'Q' -I8oIyKMVHJe$$!$aglu$- Avg:-v8Q*!TBDR 2pՑ b#ë/IK®aЖȃ^2J"q%%-<(ТMbLbM.\a_WNWlI~L\ `h>pkx?;NT8D]NTxfo'IsҜ";dLVQ]}DCj>ġ*vP0Б TY;mT!FL XqQDcNT(UvEDT 1I *'f:[KfDcoNP}DjX>a$,o ~/!rQ#]OQp8t|],gN\ (L0M: t[}onCA>0g>ғto&C?7v5?dž=t]E}q{ȟ (XqĒo5?%eiAF6 ǼhIR%5@2z:*L+JF+% WHtLT vk<= 1I!Cd\-ߛ Bn 8wщs?(A'%%]R8G*qn.[ihǡIbvx)'抙8Xr ,$:YO}.9I*H;|*iTc!1ۘ J}Mf?;jH~Fq_h 艢VbphgT 70ضsīRz5Da}b ۦٰȇ]b ^?W*F-WǩP Fm41WJ& C?5x~; {e8ʻsἋ0Xڡ2WJ !2W]лxchjخr*׭յε`{vخVWrT*W0F'LD mqTTh5&&e8omHBHBH%@If̜IJ"tX$QQQQQ, f3k{5O&bɞ&pdO/#ٓŎZt4ѬB)a79g`~Ja.ToJ|Tq[n8U蕊 +W5 c[B-+A{P`U.Ѯ@0KTS/_u/}:]U1WwYWfut:ٜj[Fu}vL1W1P}pX| -3b[?P8Nο'-'"Z2"@TtpԻ3UJHI"]"1!uQ$p,Yp:ɉbh}*cleeXb*C }XOmU,SF#FOuǮh`mJ]UEO3'*GEQI]̐ Yj?!T)SemMB6PAK8Ŗp6h * 71 A?Ɉ2TpC)Ȍ.|y0X _AƗz.|d_oXJ_MֹAsv}{]bmDZ}5Ewg oXA}|x=wYg_wr:f˰wY>@|o-.Yti 8T,F۳Z.^{`,@ދD_+_ìE —gl*',O[!zɸ ћ2ZA@? Ix"1UJ .-0bB%zZ \]Z`2m Qy@eZm:"M:cZ:z6q1n"'mp,Mds"5}=MG,_ mJ7؅KY7b|/Gh!whN|Žw vTW=eW-VVqNiK7vR;ýZQ);LD'U`62Z;v, GƎ:!usLt =f⯃I4Y*Z^OuuRєn݊+nusDw5U=pz$NR8Qo?+1T> oH0Y)ׅ˃ OW_d~VH$诐`lċ0.>5ѣpr!NaOL1jgAz&(td5L:p< pfafpˆH߂, } bɐpy! ѧ я$EsC@!q).rK΁rx8 SCbKj|n=W@J 22#Ek_%fU*/ $4qs*ٿf7L(HG|g%N]HĐLG ?}v ;y#vX B/DZ1˷Z-zw/[Y-ͧc٣?/쉅a~PHCcsefqzIXv\,;ھ,>bx@;uZ@KXN)f-b(-tR@"U_ XN*?u.6&NUn?+q+\=OyId,-^wãw1,wūk+H1 XAr;hy8`.RM5C%vkcq)ue$dI,č=)_m+ř#6FDmyč117VMs߰cibʢ#PqP齽 s:*msg!,q/lYrwq8c?5@SBv`f[6+140%2=E?% ~MGPѹu`޽D^%#id=d+e-ֈXM~k$9 Ѣ/_BD/!OVoY"cN+ʚ$h'bI~#&l8;XmxJ"Y$U$$@֑r Kӎl.[Ɵcl+2NKmuP{h^-3ڸͺ++r+48e7F*qb[$nVթ̕2N&aW2R# ez6qqĠS+ TW5 TÖ3iˑ(P VH:rt=P3YRz u)XĄ3]вB* > *(jciv-4ɿ )yG&1;jtW[%b @e 'h[$n8iYuBC3#Ѳ4*;ZYUwvweho+kh\ =ꁱ2:1#qecell8Piec]6`X #>${VMƢ]6m  2 wDBhy[Q$ƇM _r!@н9 l=.c {2[^ azi/ߓX2g6[,P9*P_nX#I=BԆ ,#lffN"L,EawG;x;n{"N$5$NV8*` gEH(iXQ SZS1-LS2i iiy%aS$KwɨD*Nz*~@Fd6: e#=L,s)mtYh݄W`)<3cI;) [J!2Ys@ĆgR1V|V6=MSYeUtOj J8 a*ZELE{(cR9P&W}5gsh55gs8t \9O5L|+Sq@eCGܙkюGGP"M]4\aqJp]{i!RGWdHm|u4ܰ+,)i{ "~Mst3r(ğq2ͣd6y0 -,XV?\Ka$oYxO8m5- h&f:a%=[]c,Xy-Ӱu>@< Az|-dϴ*ER$J7lxT;&*Eyawb]dQþ,4ybU"vC;M&kqޣ! W,4Ez!eQ/QOK<+'Fz;{$IV Q/[F6Ze nu-Vv 6YXt8<^שjAX :=rm <`~̫rG$C&1GF#$E1" >ɍț8mAqڪiD'"O#Z4Uǻ^d>`!uF_ԟ2j/iS` &N>?wO k/VM,QlY㩬}wDe_?Ho|/4'iЪM6HZtYl4Ǚ%$qV?767؏0^xmaqUXa=h:̄Ƈ0*zvwVWɷFzSë/1ςQss`__}|d-EG ku0Øc X}[21S,c&_]GW{&F%]>,[[<{vޏHm7R-yGs źr5?1'Ό+~r7`,1*#w[?6*uZ3:G:ѠZ=92A^+! Sr;RғT58׺d1>D yY|xxݨn h*߰ګE& bX #º:*hxP|+Ջb߰g~\{|Y%zY+~{誽JWUlHbUŇc,W7EeE9uu UZٌDm5ecq#7#PW@5W9#PW@5-V }*<%1"5\8JV`dTVwacix6 4KjY@et[ӱt]Q{M@e=p Kg<܇:c[g miRgCHyErz`ϳ53Y2Zm7{߈#P,G 9`?v,?L6cyz-VCsiDGS`2Exa5n5Z`TXkP>ШI;l$U+E4D&|E>}}5$݀W"hˬ7 st%9%jۏ|[-| +/Ɗu~bX,4f3k᤹*KVzy` Z>wx;yd1Yu_&]z\_/&į5ү@?hLms>W6P4uYc!5rڐfrYyԂףYk H='{ DޗOLg+fM96/d3yAYNޚ&҆rac٣8Va[t<)6z-F3$V؟rCvđQz +ް:}bݠx8qeWj`H$WeY$`W RCDbi$FȫJ QO@R'aO;Tx3Y%HFx&5 0_jAS%VeՎ^a#Ck#:Ps$I@ѧp쁱g@;{Z 4DO=QWxo7:9ِׯ䖏_v 'V"(ZU|Fᓣ  hT~_D}"J_\Dшq"&ÕǢHqEA rBq2+FzDžGucQ%ljAmǰyvX[GtF_>z1|?s`w7&A4[͝Gfhg{h풯?P>:n2jY ]$,*A%)d9רk4n7BG3>_i?δomNٽ[ud!)3S&g. `,}[~Ἇvښ%ZZsK MbQ Lɰ>l [ֱz({ѱ5 Ѝs[1a럄]vVڽˉ-j8nV)nx^;QX*R 1.ѯ:ڬ@e{eo+Y 2r2֝ O&yKpVZiFFջ-41c/8Miili_yw_?],Ocfea|"Q* ک30։Uf#jze«]YCdW5IXQ& * 1+ #e0b>IE'eų$u'Z ǖ\c,h$<"nO |(%bϑ-N+ȗ< jZٷAxIqcAd _j*O_IH'tBZ-VYkf0&m[|?TƺDRA$s?jwb>x\l} aNn~m᪓h }$e6Z'axVL&gzoR Be6R>dq"y|IZfl>^bF6by:LVLI5_?o&׽_ir%?9֟32E{Q^,+DM+1`a+tQ5N7aiG gtuy%j<8pՊUEIKףÆX * #,a2 jHVvv@FGFF-HJpJrJmfDU!ɹJwi4ag heʼ^5 (0ʷ#-hy/^i^'d890mq+Fk[< .uu+ @xtVH[d\!=n=Gdn%7yM}-?|KX>}H"x>Kh-JKw{Irқē=fCk/S|l[>ρ<>Aj'ȿTP[wl2zB 7/ڙKnYרk1Q|c{n.ڊybHOv{=ҾS[v/i[v[v{(N#P:u/!\vƠ\p wldr[>ܑ6v\( $=^a QW+i0uG,JZ_KNsa֙`$@TX2Jb$VUllbX%>^wDf >'n:ce9ìB:n ]JGVq#|뤙k5_1 #Ii_pMdYҗHS)\_Y,iBjXo44Xл6 aehAt} X_wyFeսk2}b%`, , 'Ja{aVqaL1F?v-hk,ombc60᯵sxWZjȊqn4..Aݽu-7uF=?s+Ҟ3X֣]^[wm VO{lv8Yrup{=a zaLxqMEU)ҧ4QU)5ʧ7i rq!&r8X|.K ǹfc^5P\z`Mn=2ȆRv@;A}xL{;WƳ9ȷvmd= 4'E$x3s; dhom.tshYތHјqΎ LQFmW>yy.(l*JHyX߉v7{i/i}ߗ.8Nިn$vh ԕqPbi!LeGc刺*cީ@jPǫq x oi&}2"O(dx;uR0ݩ?-}uq7PMU{<9t`7.~l~5懛Jnr7ɷ>| kXwzJD#N~K-]o-羛WN;쉳=9-gZ,K,T#$$}> ]z,Oz>t@ljfMyL' ^GR^8= c#i00j¸wY;kmҼ$X(lc4q@?OX'y3g~Fa{O~v+i'#9{OE _,#sk߻QF1p8tZ*:zGԔuR#G̱+gGb|W$ZpA{;y!WW^MUISNv""{ǖޮ,8RҊn6t{hvcAv0iEK/}{ǂrjF wcoe-iy\7|^K}M8Jm>TZӲ Bw`JW<ȈZf/U}[}V9@v?'tIf[x9+k}E;k-t1V%G,sD1R)i@7XU^WelWIYډnAf |U"Q?W/;3O%oD1ڒ fmǑc;}FY1+,֟jf53Ҍ6'&+dch%zFGf#xY*3u^Wex\&4۞mW/gϰS>ExD5g66e%LI/t`f (dh1e5:GGoyN(E+?h1|;o%3v ?O f[6^>'T_Q㢤EڻvXßb;سl ˚ ]:!ݭu%(]a*'1R뚾et-+ TdѺr_U'KD]+ul Q-;)ŚYv VJ V nFJJ?{@ ,'cmDRR0(Q((QM0HJ3pvJQU)0=PEqIqEqUÈ8\;kKGxG܉(o@>"\srYZKs8Y;D~B!C,dHb5`eΊpp_;%U߃~={\2)wrq Qu;GG '2IIFa(r_.k/ N[)SxgQa  CKP3M oO,*,R`~k#ۿ~MƊ z, 9,eg}[V977 k %3~gyG}7bۚL6{Kt"Ee؊௰b)+r:tb=*_H濲;1oP!}eH5co4j [xmޭZ O6>RjKZyl?+<xۆ9<)`m=ܸkٷQX\I8d52 rO4>vY5\.qծXTF^f<9P k&#ūYs.PsvV,VUd,|;*&H6Fk]FbS\Y]p1|^V52@+e͕h}bXŌEǸxɌGK_+]1?ė[)[tө'Ŕ֘הx'-<^菨'm2v9$Zѓph$yp7s `֜$*/fvy0f҂(τωHdQ.y2x3bh7SA+1fQ7 jL**xSA&o1֚Q?l="7Vw2 >>,Vie<=Wp6_5 V*lIEڕ_f6WFVRF>X&eŠ0 ~}3Vu҃0i#Sͯ ?'o(,f+- &9L _@᱂=Vx7wac=ErޤM˓Ҳl#Ė%i"y2OX|mL}l J>8 $/ڈP1_<(Efٳ-8UbpZnWR(Idb9Dpb *ӍY91]ʡ7ZFB/^,f@R$c$v2FmK$R:"IuDh=UG+:BUGIVoOT ~@HCz#D|ik,nm"M_9đ&*2\5حUv[.퓗H~lɵ%$~d g'ݰhw*q%GK\õĵ\KZJ%|=!yHc+kk!vN@ƙ񧂓P'e|b;e|KSƓ"U/redD|~`%wY{vEvAsU!$@**M4ӌ#\~HaK?1aU.n5?zyp>d2mE[uj5lhhT7 d3jnO>zXo~ +$@/I{:>Lߣ,E6F.O[ &=Z >^TH6gY![W y'ܙpdf5ssi#օK6FEc76۱f)Ed ,O>A;8֐OcO)b)2%Yt=F m]FvD%f)%_>/vj5ndxHM8kTB eFd(y*!O?9Υmh'r/?F5i #w> 4pP{68U^d@eYVy)P̡qӆ >l΅Zۃ6QkbǐW|DM VgF8{SʞJZ􏯤ҟ~<~&_55[0FF"}&ۍNv=|Rn^'s`t5қa{b1>6-|2c>?Ɩ^:|+gG9=Yz'+ah성k~eV5[㭫-!samaDxzi}kɞX4?ֲn|>l$۱D"߁+1,gDO8JL3f})08b1z{f(Vˆӯ6K߶ ix-ߍEus$6quhYUɉh笈.+:9('*sܫ8D8ND[zdcdPl4W+E*y8uY3/c:-wp+!v^ONtHk(x>N8կ$n{UMk8wߑnJ3%:],"3xd%@GV7"-XVwr9qFfecA$]A;O_9WbE>$iIC$Ҏ/_ècUL_+@7a"͒ õc|{ J͝0U6R0w쑆4a[TQC?Fԙ%_x-2%AuJyC"SV M418N۲(2eQhʢ7WLi!k\N[M,}$~ℽ6R ݸUᘈXh"A4f5hh4Q(PRhRPd[\(h6$c)&L8/u:ND+),-PhZ@iŵ@a  yB>f$tDMR;*>34 XIW' B<4yYS޲f^#}?vduiV6kbKWZFkIpzFf.2tA4퍲m!0SlG_',Ԙ;%,rAvA Zv}?}Lqj~e40(޷܌G=:Qk*F}MP#a#/Iet4E`hj 8q*x%!S&`lAXGGF 6ҒCUDU2vgHVbUU V2q1_-ZY ~-Z@k;BdG+z ttXmᙴdG8 qdO{BM̧81'.2孟"BKֿyo;s7V G_gʭ0odl4c*$x'k~{ͼߪ'{51$B7(#ҽ4ٓ64B{ s-d6i{}#a\$Y>0m_o90)WVV xɃ r_˲XUvHsx~t3yu?~$5oF'w5 ^|Ŋ;"+fK_[/ˇ[dg=y cُ)z+9o[}461Hqc+ fg\;Gbs~Yj`$`47W/$<}V6`,1P}`AXIo¨l'ۗ)>&:ە<.}v\7:W_kȿDHV)r[lQAh)#|y=R]uBN䶨BJ;YD1Ck.zws;+;wa?m醻~}8QR`GM8^/Sd'dwJeJ? q sg`VWsu8:V~(F_㾟g0d+XxpA0"BbaF*B*v;tBګ{v{VԵ)lzAjA+$>  x=;gY~ 3fh`l) Vc 'Mպl.C*_jw$io$Gs {M#Yd#]eε6<ӟꖸZjkT)%EMeŴ,X DjDP},qq@q%d+aA K,cEY E'[J,ZӢSpg-4)e*6ʍd:l-7@b:i#,>W.غ(euQRMricgtlTn3 @V(TRJN+m%TgQvr,4KW, tDz,8K/,"]nmQ Euհs%Uq&SD,".@\puj=h E@{tµDp&KDKמP'Sj^5Ae@P9t(gu`:Y}75P,,Pxcfr}z'L6f=32Dm޲Z+s?O l =ϛ:`QWp ͎"@WK mR!±9B<"jv5zͽ3SP*37j:p̐`3y]̳(yZohuC%USwSVNhz'u k*M`6ܓ^]^kdur&[+NEYXԳ'g0yzcC3o]\nq+n_]} zo+]/3oICp?p࿱6,4gUl?6O^שMSI5QF |hg_OnM`&VdM 'R`_tq:d=CbXb5&Yσ|߱}}GXcÀNH4 dX#ê ;DQxS^9m?یERFoj/<=탷7O^r*ix]s֩Dh#UF܅JCIs, d*V]J&ʩTpZ'G$,%+ hƢZc0WʁNF#7%!J\VeYc,\k zL膘 JO 3\:>mІNe/y׫ؗ൓ +*xxD ֧wL<)o7Lp|-о!}|ZEeGೕD!vxbjj<Ň( /Or:5b'6CbV"V`mф5ѱtA$/<+SxUJYgDExgu@)ΪJis,FQ6\Z[ZnY!Qskʎ#E3DsmT.n½ƛ0׻ Pi+Y͢)`wPMqB2&+(.2+VۑN7@@NG2BGC*4##py-{崂M@01 03\P˽N5/EQG}bQR7+EJh%G72NPb0`ҕ @n~|6-Cg^INcW9c1$1^u6_˂LbMʲR->ϪhSW3mlrV*2Z3ўN*%&JxMUur67_SQSQSъN88»5%Kw#Yދwp~%s O<<ұQRhXij}Rh2|6Wk?l!]L>ӈw0lf}|Ϭ @ND< !Az0ͤnWSWE~~oGٵ_D !` i+71.cF.RVdu`E;츳0K< q=;#iC+A0Kټ9;>9 ʈy}H}kKO8mK᠘Oֈ O*y?.ѧ۠AϊP;8m)ZSʂ>Ϫi$ pj(VEETJm&] 虯ɨSn GaR3 ÚuQ %auzCN:*HĺX-uQ΍[ga@^ -׉i0&*-$塗'1k5j6#uUVGBM+ 5W"hz@JDrȊpTh9¸JīA;<;`p+G-hr.@=hB8vABm]PuAB־"d.X\pP Rʲ ? '9mGQ%_l'qfWymAԦ vZGǫs${o-KmGso Ts5_ UQ*]kWĨ]^Fө5]p^-8Jڣp% Cj(Q%Bk0 @tv+{E:ZQKNJu ǠŨdd=/Qu}\%!^b{-8x|Q9i$c-3`π( ۶['-lxα߷;'~ԨIБn[/ZUT趢aEC|Dуj@!4BHHB !Bz $=j;TGADDE " "| v T`lxzJs?g̤̬{6kuOjJ0//3"i/.aځZ6 D)@? yh[d'J} ̵2׋C1<(K:Oe2. :v(%^gEuq:V*_xxW/Ѭq+11Kl]R ~Dz-ٶ9W85CIж:9Ӂ~xÙ7j!oZGj) g>xg9ys=md|~?tV וvK^3O:J^[D؎v۞K7 x*WDS}C`H竘ٓ }M%/K~k=NBG ItCm94Dx#›_7$lySMoIM"rT5*tXxQf[5ިx }$kc嬆u_F{j-lսae; kE&e2ç4}hDiǍI4? Uo2veyhǡ *Ҽ*沃X s%EV6%1V(wC.=ڱsKv;^N/>g2Ew .۰͛|Ͱ[䖖>|W@{¯q (|TxEVk-5E|\$4O1Hۄ.i>HK}BwړS@kw` @4>Kk _c-HL@IvT-)./qjg3isiO7sumNu}1,5`F+{Y8'|(#8揝~'?ia+{KԶ7(m6nRp=oO ! OsM㹓Kz=,Xӛd@?J&jړ>K:ўF1F1O?iO皟.e2L%e$Q%8Tq uWX|PlOhuPz4Zh !CL1d-0 lto66]:~{JMXu^75` ăY"ޗѾ|;EXC:.;gW2rZV 6v~Kx]6z-vwH7@NzP\U RJl7`X%P\XB wqps^%h?g?AFz '[%l|?/rȽH㈃Ssrj$@.'$tzRF..tsws/V7 VZZyz*ť5A/Y-PӔ_ 댾Z;|k̆J =a}kڭc3k53Y&J@6Z:ٚlMZA(UagRR#U`k\KUe^gwJhkΈ߳a~4u󟂽;d3r}:+`%[iE]\ q #!# JF$gP|(YLV0*wd[QXA0r09H0^ӠD,F~&'BL Gb_UK~Vp>e(GCQOYekUzT^h%͢AK2]w*|dP}aPz=Dxh1h>JFꇢ!nŅ%J| / t}FG(Ӭ߸{2,5kQuP9YYckM >[>a)Gq!?mFxD>D9ݼF,g33l a)͆x `Ax”hr2;b%@< <@AuP&g$_'I˔!Ȧ ͿShXY@ -LmI) SH;!&1ͱ\w`&r lj`q}S#.E!rh[-ERX훪ϓF+)n!G8rp TnvwbsX5rr 99%?{5}{}e3Gx0d>^Bc3;@r!SjEl ~eQ|Pt-I͜ԝ,8y.5xpN8T50uSMC!'썏獹OF Q "9pi^Փ> h; <$-Jnc(6@mnUTϼ &f[Yi 53efpOSķGb] _E6B?:s/t g~ݻBFE[U:W+d~PS9 E\YW^)^Ur,eϑG7{qKTb܅̏i^[D6Uk`WQS3?g(/#5DTFXgv?[u؋, t=O LNY@mR$l 0dvR limMh׺ξk9v! =~ \āڀfu]P]!fWS!~ ,NNv͐fP}#v2=Cr~dn 1ڂs(ٲCD.F2bdCVHvr!&A-v]N"M#LlW@ &rОB:$tH e.Gdq\خQ}] uz]8]*N78%T~!,&1c05l< l_36nnETX+CԐJRf^^1 GMjgFs㫍Wц( \ ȹ:C5*?*I+IWQn@Ԩ;?\ Zt2;\jF#ՍZK}݇4=fĽ$CkδYu|ܭngf=~bg-VO)=zh}q,W*;jd v(Lkk׭u`іkgv;ˆ*v/r)ROrP)wk@,]]l2M]n[Y!Sg|*Gk#-9Cw7ݵP Hf C C`"UV@NX5~Q2ߜ ;&nwǃj K胴!E>9,i ͝Qj+W9`oZhcgq'~kE8UbtGdu [e{Yb@ %OWQ'[Y\ڄɺ.5ZNӚ˙Vn}\@'@| 7 BB03B2 wٽ[Q bIF~}%g4 @h*-ŋJRUy/P|r24\j%xĎYO9>+vi7Vcęcfro,˶uYvNU/5uYylCqcml-^Q߂ij,sV[#?揁}>Iq)S<:H7Yx>8%e -%vxŶ}p.Zs6%j6}MwLn:[V h17,0=hP>}d]CbB  mwL5 nQګmmY[8;EN& RiUezC0n#p"`k\?%@$@% Ld$˃Z>L9!MAL'uuK=>AfH3d_K x6IB&<lͳoYYDb #SAX@d#=HנtrzHlbgB6=̹9<9qtrF$F1L; .foH) $— x_m^1Y;>Iaߓ+[Oe}k5ͪ+P(9kY+H>eӭS"=I .槚djۼۼ#~ݧnvEDL}a7;b%곾cD'VCz {H˝ҪB -#UT .oAB˂L8R e=xMeN-Y%@%ܲ!.Xo϶oåPSmҡ>ˡ ҥec5 r,iPEH !! D*wCObs"@>EL$_#Lz' :tDayX[{ڂ잶Pb/mi }ZWQѓ,$Xx^9 r!Y.T2 ϫ1k9$]E*j|r*'zr/,zr+˅\r r? :CQrD!G 9bJ9`'hC=KȇZ TR+Gn)G&ȣqC|ƈ؉PG%zXYc-C1I-R% GDxrDAub#EjTaF YN*`ݜ zͮqV E#dFYr %uoJ Ec[. )،-\򡋬vZܴ(* ڱMsQZ5|>|%H AZEC#r9̦vI2@YwLtpIᓝ~$)@FSjH8-9Xr7CFBHj1p[]kΎgu3tr,yq,Ysj4Qfڛfz#UM6W iH-N[Q[#7L3ֈ0&Foth9G٠=HIAxpvưh 4C$hH% z?SdsIRCn >mI^P<؛'?I'=,rTA w=$1-;&NJ)Wѿ/z!^/S.܋ +\i>^K6Fikkz[3m1h$-&$EG{Ovx>֡zݣO6jR%j_*:CH}XQe{iţ ^ګX/.q2}'$~G՞J͎h:Wk!#2#z~N{_[et&KvP*G$>U=mhDwۢ6ʹWj8?PKs^oP*'g/;aZS*QA4\ɺ oJL'߭SVʭ2XcaRM]C> W̤'i_v[¬!8ku~VU wSvGuGe);fנ:V [vlP_>U^G@+dGȔPOba͛Ty4.c Xw!@S}2 FU1FxY cbNJ,V,e,8m@ ,YOǯ"NV{wNx~UhE @.4?ٛ˟ n jÀㅌ(pk`T%'GpÕOXK. =AFnJO tS 87-o1~![bLDg *Sљ"AtHδ +@kgU85IL_d%$i._>r#ݭB5W0~?;4?p7hj飌{Qo?gL\ ^EG:Fv8{ 5bfӱgiZ`JICcKp|@>80kogd7z >Nt,REov #2Y-0`:؟ c R7=*jà jbìV r$IThVib(TT߰[*T fo:xI[~/MRL՛" <wyeϽ [j~2tMDl}6OZk_YsZoov2 cJ;oN>؇qw)4]6]Z"m~W0g3ѣd6 Ҕz*^yg?G ն⤽]jau4$:!`¡+XG|GwO<;Bz%&P ^;) ^$:AC h8Ptސ Z@+cKTcW|翭 襶UDoV7Hv5Hh 4 t3_E[W4A 4>dkW{zAn*@4x4Wz@h {DI?~U !d̴slC 2fW++Q?1BOڅ*U*U$!!6w)!vKdWP!!I %9w%p{tyf*^\n$|ԍ>yc~Wgz%i^ ߟ9>! 吏jqOtVi(s95O]\s_/U?=afqzl~'&sa3ÿK"2K׽?\wuՒ)Op1uq Vzi]}Oqo:-׆*ܑ {/4C;&QF>L'F|qt^Uj>p}+Gksh>3+_Ǎ4}vC_.c>߈EVXbkZMֱYy|u7-ZeeYoakފ;l|Zdݯ}ZXJnh-sRU=yrbu$nU:zϘŖz.16tUozKo9tl#{Sk`;9ΓvuZrȨNúvigDw)g#Bt=tftP4 Ѩ:XΊXd,\ _οTsB0U;7HeuI;YgY5datt_u;iPl#cd@:zΒrAwi1vKp]~Uwh _o% ZY g0r[/_;y'Hҟ9XēX6ÈAl1Z&Ϩ+'\#=ZJWLZA_0曗8y{Q&|Ƙ7_x!FhN1h%gM9'ៗ#˅1ߜ/J/ J2lSQ:y-Lф KG@ j4S$ts 0@W Pj %O?;Hm/@:I=F,`o ߷sP. 4dwҖ=P=cqc}kN$ Nl5cvݱi>)9KoߩOxu]Rp8O_[_&o ?Ha`]R`¿6 7$RjcbDDC0ld,^e < (ABϷkY)rМ W(\'ƕIuP\!AKGp7rAu0 eyͻA0ZSmo;;r Tp1_EU%J9AV/q4}0  _UK ?KN&׸v?(\pmpۤS?ۤ\pmH`ڄjvC)_(Gm sw`VG@4`k$þ!|p77 o|ɂ#@ Gr;h839>s̽35^_RO{A.cء3VӴ#t9-\F~D)此7h8sx).mpo_6O'Gȯf I ֱ%3h. >Cyz$$Q*ZDҀ i(=ɕy7hKgTb)$?r?71V=Jch9ڸoJx@o)x Q ^c'$=k {$f6zS#޿Em,Ƃi$ Dz>= ltۄY  `09h) i-bV{+t^3mk80Bs ́B':xDD`OY/̀ .ޚe_;x` 'm 0Ayow]N?6ЃWiʯd8o7Ou|Mv˖l0k4MBHщ7Ed40&z;ew'O;_1 683 m2D3Ӿ5}e1KPք[ÿ:X'rEsQhxt$]B&yPfMyyn۸RDO:E5j>L'vSUB~V] ֣_Ƚvm߿oֈ!U|6MaDۋc/e9ro7Ǜ^ŻNB./|yZ B'mC7&kmy}xZk!U_F)b`(Vm"*軾4HA%3R.tM@](^5n MF)QD 'F7 8p惜g>Xأᵽ̇IY:!\'9v<gqaOq_4iAï zSf"h|la{6Fbvo;㒮iR$}d6Q}2QR<Q}keyMckCG)*t7R{whC+(՟Jd-QisZ~u}͚Vjʎ|42;+"hU`OX=%&ċh,; #_GZ&CGWPڡUJmdZ{2?RF"z{QMm}"+OXL(K=BH82yl r)s뒵Ρ72Of7؍duA$($cmɐy}H`sP#EQ7`0\;չ`m8?;4a ;N{0/SZ .0;Fq_H׍+Mm=Kd`p2ҭvkhŀg0$_Cu0]{~dQa}$ }B(wߝο_ 0CϊQ W2=d)3I|^ >_x- , Rik$X<΢Yjm cț{Q'{P==G4?]h"'u$5MۙlQV,}O-7g=8Pt14 s]z=H/7K#aZ2s'We*F?~_7TY:Zq@3Θ>:YGo",!447މE\Ax̡<2#;nBf,d58rm9wO Z],醐fE " eH! .Rq2uQ"ě芁]1 bb!s$dN (E@&D'vXn@u@ ;.$F2D =:H k3XrEubvr.FnP E7H7unP2, %0IȌ)}V 3M,QFȍ@ ƕfpJI"DF;ڤƄ_kjư$6ЛMf} T:FŲop/$3pF-/{|vj<lu;'Feh ǂQΠ^D/#yUij/o,m{}8~g媱ޭCw{GsU(1jT1 p(BRi'۟B"#8?9"MO&zSSxsյ6K5srxV*XpmiV+0)6epϏO>4EL?Tk,/mK1 |(ЮQ`FMx8.OS6L G65X z7\{tB&hLжooaV4U_9'Gh" Nj 85[C57֓=`{O(<S;7H>PVQ Eς*?v;N^\2YrI8??zzNwn1CI7&/-f;*oYHiJC(pMZ*Q*Zhek{=*+C`m@fyȘԆj++湼 Jo~An()Ci6 ;,wIUx*' |4Cͫ;yFѲ}EyJ{eu͙5U[r|_h߁Ochd2YHRFы z(5Ccq<ُWT|rOf:A' 73mS{Wqnt%WD p*犻ݞ6S)[_S>:s\vj֣B =iG[U4 jffzfinRhfzд_]p,Od$^I£{ډgSUіd6j/t>E_կ h H i|8۽mW$҇[wHI$98_2ms?w? !'̖[0lpG6:m6{j i$0p!0'L(GC^c^<FADD}GI,y}BBj^>&3J}1vFXz y\HJXoisO~.#qw?(]1s\`&k8ѾE&=A"GZ ϙ3Q>#\@f"nEH'Ҋ{U2ΤQ'h&"tei4o;++J}zi_qUq^ow.k=;g2Ͽ)'<-u!l"gΜ ^"Z\ 5CeV[>M,Rհ#G >M } 5^67<"&7أj, CxC-س_4s F }$l$iIY tL09@A\.M贠u77u@} 꽤wI(Xt!DB !RBE1?=_ Ƀ~<\Oh۹{ލ$6#d' _7-A;DqK߇^dWDwPoإWBKd!Fi܂| D+a%+$&Q4opE0!UY3ʭjgjŭޱ1#[(W$] _ᵣ9&]}}԰8MAסl7DvyćBElݔXȏ's]b{;;IZN6P s$='H)ن;e(kW(R{we'ӳ݋70ҏ5 }/fvz[)p9}y\q}|\fWcQr8FBq +#‷lDฦj;5*3ij6897q:qȊ@VlwʊvIȊOJ<ϊٻgzbHe]@Z(+FAO l:Q$@qG}qdY@s@B}h$m,5C+$o=#Iv9=c=O'*r?\{رՍžQ՟.7?^ğ♛a8q܋}Ur/:F/M kY`0\ @%BA"FAb]EȒd6  Bk(W"Fu6V+pZQV2$VP:6OxQNtd%pL/ ^d=9  6s1bI| pHKa*޻rl6&s- ^H~TWnxƓHwK!t%HBh3m{>-`_p%eenĊY'FZLP~x47VIac[zE B-(^62Ǫ2V91;y2UQcڒreukZM㳫Al֛/j zc]?ͷݽt82yNO$jA;u)d.Kz_ѳj7ܫh1ʼa/gCZ8ي>>[՞([i }=|)^PpDGpT18yK~=NA6 x$n'fS^HC0j–lxD@!c")#[5EW;F3m03.]l + w4PSS3d9'#v`\ N vy<z˾OYgRM@ 55 EZ7\:%k5MQ2 TRPI;(n8L"MڏР r7& &6jI}{8_OtSϧ|FW@@gk{\8?-y fm$|[YH۳+;^NF ku/ۇ_d9MƓz81>v;=K^6ju]A;=r`=k7ˬbduaoX[C/BDt'nal04ms7}gZ]FqtӮ7|+.y2}w(YZc+R|J)Rz^7p,:y;yNAh9NymGQЌ ]dEK-[L4Wr [,$%c$$S`~_:eA- F[3ӎ!vk-@ek퀯saWLӕ ]K8orMBv@X7 _["KEilCwiog]Q 4R@ S-D h4eCPV_؟$ KcdZo[=So'VUUq[v}N">s2>A"2L]tT)*_e;9@svzEeZMj#`LD]o6#jWXgu7&Ϡthࡁ+p_'Sr=ryzS{>p#7zv%ZE@[D]?㌓94˲۳sF !Qv}gCP|kn-Ρ u@=? 5ll/`,_i*a"_EP@E>Z"(w@1&Au ˯ ?ar@;ɑo=_9+G8ՋAP'OqRsᾓzy~gpqW 'Ȫ&"ojS-]Md Ba1m7.(znK''8 ?ew?7#6b,n MڛVrSn'=F{EúJr}/{Q L{U / =$$B ! i@ZB 5ݳ̙  ( QlXPT]XAEDADDۍ\sٰ?RnoR[]WHu4N[s$螌Rt1ڸT8h9m\?%XDP).J%H\\7 ɵk? ~CI&r(% ]U^RFHSTCRJn,$$tیKcfRmFriָ5敵I! Mgn:CPY?5Pv򉋿 M⥔GIyZR%5YJy3%岃 }rGH}7NtIRsʋ.p$(:N:NG X%JY`nA[[,xUOfy6 /J^͛;QXaKf h&AS֙_/-~F[<Ͱ 8Ϲ]>N1Qt1&%8 7^8ˏ}+gG49~\yOO{_{_7Mbٴ%[ݞee~vG O\t]Lob +2xGXowӜob%KA". <hɴkfpvh@ RB(q*ow&{yP8yN _ g1:d'~orbmo? ѷ~Zj;Fsf+Ź瘿]Z|1 1yLc"CK c4C  [+?j+,kd b![ axת\wZU,:)^1m.Q1-\==?mկo&֋c#cXlzXD-6&_ vk׾4-/GxcE3-|jmYCm-leᴃGȷa5Nmiu}eOx^j?T`rvb<4x˻Fnv[X{{aߚu2.zQږTQv?28Alǧ)WlVW UHIHt6&*ۡ%j D1&]Īpv lALDu:!Ӂ!/L^ݑîPWA24-q*TBŸ7bT^q)M9-M9xC!tw0'}RmR~PPMnB=pꁛPxaȐ7. %c=QzEXo"((]mϯQ@ 03-Z^&[m[`-}f~Ϳ4:.Md i.TϾful1{>P_~ Azo9G>͏[>?B}¿,lg4M].s`\4jFD@L֟,ox~3N]!OG{w{O_j,IOk}mm:}2u{70Izr:^F'rV6U$婞r4FNdH&XL}RnS@kd~m?H?t$3$ W:T K&D+^J,Q9 ɽctBJW;4 ۡiMC-'z;\<\uBrթӮr9p&Wa{?'_aOKܥ(RPPPP$ s$5r!r5TM|N05\ Wr^X$^,V|3x[,N؉PR cz#ȯʞSY3F^{=VoU"u`Ug9;zB_kk׼BAhL ڳ֐:!X? 4 2^ D 53tPh~(, ~L=qgb?uyS0m׃ヤ`rhQ0%8(* b)֨_[Iq~n;1/UӴlHh[f0ZV_Az$@di%> ȿy-#nbkvnSx/sv/> u6'>6->pܳt]޻\:A{,s>Ϲti|(؟|W|'"_Oa~8c&Xj=ֶi|YvSv Gs^a1>w~>\#R-QGe|į1 ތonH#IlI)Uz}|0Ji_);cc'*#qIHUmD: ҕH%yyiCW]bu ׇrTh^J#r4B nxzP0j_wg[3R<;2SpPFiNfY A'q2]S` *| !vOoZ⚎ xtW~ S\|:_t͆:5#]s85#]h8h.1 00ʳEJ~i%0^Z U0.u] U0p\ 8 e0^Ǚk8ӵ+`x=WncF7Xƛ\`\[`\[\ae]rW k\xk-nqkqk=w6] 8[b7qN8qfl.׻.0.jo-<轭ZAE}፿@}]wh`|sUnF{鷑S-Tr69D ST/6:"fk@ʝo(1p]B)Uިy:DT/UNHJL,PFw5) J#yMd aHH4~ R c[G`HeJ[L,(eJ):K1HY8V8UygKM\v;ptý?TRјTR#{ߤb7 ͊ŒaA1gjy%f:4da,ih.U6iZg>>[VZLI$3<y|T9<>pxͣ|#O׈+ׁ!|$wj8'룸^DR34Bd}8D6HfTԈϝ\y%z__8SƄ5-pZ&G &)L8e]*RXsBm0HNGK2Su'Yc@9IvLxVGLYq[LPBJ: Yh?t넺_.䠏%sBQBУwL,DHz'Z%"ZtUKs4,JbGTH 4 aPr0CWD' (c>I+=hJ}?Q'쏺ae8ė𚁘I#C{^9jQ>%اč9#]ɸpD(Ӣe|ZL3p1bNL%y1d\ОԠv/ ynS$卹/"o$C~cy?E֑$!&yu3״&5d9@F?h:o]|1gaɹ/96X* }?;C BCCBClWpXhKpspyP k`^ /Dbm  ^8 ¥wY4fVl.j]#1k¬j_?|註蠭@[ vW\֬֘~ q"ڧ0J%0HΝ#q*7pfm p6 0΄,'59 ,Zi΁q6Zslر`\`.un a9`.q ƫ89`JkzW:ή/g[W3gQ.u }+P+ I|R(. *\*>w[E| ܔ8>Zg`]Ŀx -6r՞!nl/;ri@bYz埱;{}>sEI_5z`|get'vEe0o1ڣIчxsx$z //x'🼀OO׋n.^WiuV!f7_ Ėɡ h6H1 )MSNC/UHU -illơcn:0FH52b6 7[QdbMO춓u=zR0)tt*F_]=13Zbh*`gDT@v!1b$飺[Ejuڡci7f^HdrL* >} V`7l -8m0:Yϥ0G$Һ*8s@Ee-fb;75Ta9lf;xR%KG\Џ8W0Vя'~Y?⭴10GaAEcJXzC|`Ѝ afjZZv-{̾F׈ ?F{J^0Să3l=M;1njuw#^eԘwgzJ$r=5񒿡/y==LgLOk6Ls s`+yz~[o򠽂?a> vՓ+r؃y|f, L۴+xv7-4܅pqR 7+)<0@>ζl9G+EB 닚aVXcSjyKR+GwDY7]E>X%vN"1 B QwCj7L.OD+ ы+q8}^/R CBs娚$'/Rmz~t=Tƍ$"e#}Ҧ #] -x(V :DpL"O%G!Yhs>wrZY<&Ȍ{p%-E̓jhRvRKz᫸aaqi+ˍ=% ez*Mj$U?q(7uu3y.$ x q!9d_¯+/*SGbޖmI#r: bXoWZ,1r礃aBD*%n-;91ĩ,7q叹wxN (õ`~:d&Խ_Kj;wx>/'xH_GqG8^FaGqj*yJԶeb5k%eaw[=m|'QڷGKSjI=K;ˆUo52<!3*c MVſoH*!Uîk&җ@ǰ]`yw|+򉼣lQz65pnZjdQs9,=G[>q1ɡ[ɭƍ\О=,-/ѯjf~_ai{Omw1&7>o }l2ͷVh?{Y#~90/XAT;_G8C\.9`O~sޟgyq~hi~^ֿX{A_k%qt#z>GC׫eAo2Ay'#MiuVAFWm4qŌ==E^iaϺ`#C  HG^Je# 7\X! 8zb)~^:?/ɝ,m$vݼ"S^]cC`|_~];v q̗%YƸ/x%JR Z\ތpHSRϺT.C 5b CdEI,:1ͯyrx%PW B,IZB^#:Cj@n8_ 2lL!zy< G!PGc?o(]uD(=މnWXViާ>Hz[e -BlL%bxK'!ģ&31ʚ*H z˒v^ljH@jgi ݡQ=:25 Sh%ٌ&hPQ.YJ>owV?;+v"(t':Jh c :(Kީ#+jIo %n~OM8U#j .q4#IdydVK \"_FHDHd=;Iy? p|{}`dkL|j&F_OZ{kRxK+ NVctپeiZ]-a20Vfuq>м'0j| PlѪ߼~o~q"N&U8m/>0nFjgw9toB.I v;=O?n>xMѧiwhk唇m*Z [5.oET6@y^1$KFCU宑*/-N9]4Y {J9D2?a2R/ _eT2`OZX X藀E Y LrJ@NyN贺"O#, dqA{*2bUH-ga0% Y(YBBB,4PP?4'p'Q¾*>RM}|57EA Z3Zj#YtX)< ,,{!:-nX{_IخG[GW팧7<GӰ݇-s=H"P^G@aXN|BjIpnilu"}`5KpVqojU29b;K3+1Hɨ>`Ŷl7UXy;*6Bɕ FBD(SN3LlE#bda<>[RUmY=`` .xeFy.]Υ}a,C|6EU;LT23Qjp} $p)9$8&jgJɉOp$g/֒cZF#opu10OZmf\ֈ'VgϯX6*g/ֿ V,\Y1;o1S ?ww]/)4 qINIO7MLnh. }f--"6:s³5`f^3C+f4Na@[j/`;>fW" |L^OՂb|9%Fk}^+s~vwhO&XPU4]G9*P[ЛT;/,/8MiNMI{jJ%>uTtQѧ/0ġ!4$H p\4uh3p6MSQIW:h!DxcZ"ReXj9$ T]H%RN\Dp!9w(~ҜfaSڶ2/HLjao;.'uIyGg ,d5@q8J+T"Qz`un ct ɨatɜ*tU(F[d%3P;GKvZFYouI|cq@;fnG|gn 8Rĉ;+27ӃQJ&5`.Gڐ.Y)z]2k 7 |2XoB$ 䱟Ǧ!&A;yr?L}0 k ð/ĉN۠VT7eNq4|Wc0^5‹|kkL_jY|ubɢ+D>]pRm"e]P6`3"٘^{eʮ ˰d̐'[ F+wE+J\Wѻ~ue]1֞]imhlr,½A0JYY0FFa~wݘs#k*1ǽk*Qc+\K<005WyBTN쐄 9`02v;Y&ͤ1dX#bEeMeMl(xyƳ^{ӺfۃkBk755/y"]mx3i)«φ~yuO^<= o 5 }f@|7 ՃGeG`(:pb9ο?ϧFd=H<;RGxj5yϕTDK05 qF$DĎL9RB1ʹBrjJiF:IȶW 3:< 2=w讈+NTƅdF'.q$:jqaB.PL%1}q(%vk.:t~؃Cvpbx̏T Qgn؏0U:C?B#88FYk(\a?.@ <h0py(@.dƯeOa{"%X/xX< LqH&_c(fC> {c/qp۱be,}Y;xrՖ$+)H{!ʊӶ x;V$0 G^Jk<^k04sm2?C.x$߽;mF3)| )Rک!Y ҙNu+ 2&7~_k֫&w{6|O u)Ҁeцl$5?]|إ{0鲣%85h]"v婯&衏{r'*ڦ,* Q;HDHD <%?%29tN*@^:.Hl$IFةo L[Psn9뮒:2+>WUb:Sw 1I{y# {ۋ;M0yߩCTPL`Z[K D9F(=b|!"E!J`*%^!F>"ϼy5&DIC(%Z^SpyMUkiJgRA+t+Z` ~.gD{}N̻"2=75Nik5U/9++#˛{o|wSw4'GOl/])U%m}} U4#l@lIb#SBSBCDψq*X)^|(6Gyϋ{ţp|'zSx^<|93/x,X Gx_moƆ^zO?-g7EQkIhb:^9M?]&yte(W[Fw'9C{"~#I`M-_0^xOtH¿'/%2^N%4#j2K-%]˘4D$PYGU&b%BN?/*睾+I3DfFT&L" m'Nqb)HeCȘ 0()Te|V; N'k0YwUP!<+Z6`LpUn'=~L̙}jc? 6AIeUW2 Iv!#P_DC8"GBl9Qpx.h|r Q} &\k?_' axNјXM8Kj0k¬bI Qһ5 hV-tVKNItX5 ZU/?a=˯x1_he<1ݸ,z<4kh!/RD+Y|Y<ȷxwC:Y5|@6FA|?;f_}E'qh˳|;n<"7TjF |o6o*k\I}Z_7җ;2kI NM^+qT݈Su*򛕔lbibP8 t.5GN3-` 1 )|RjIH`yS,JQ%RM)zA1D6&bl1sn1摈1DLD)QqJhJ"O8k4woJIl~(úòZ4Rj%|"@)d G6GaH=sF{<[@BPNR5<Z@< Hki.[`Zd"[F+< ֥7d3Lshye%tgҎynU[d0+ϒG mv{α4b==.Қ~2#׫%FdI\S僬a, ^zbU&wQژѥe8]WZ`,m)2)iQ:Ɯ1C*20wɸȄ 1D5Ɯ Yh ɪ? J1RSmZ[Tw,,g]GP#R `V@̙.w+Gߐ#*Gsx̜#j3n#Qoj3#$CG~1#p `@ /a2@jQg@l6F`s)Y" zV,6Fr3m)Le23Si`;4 .2녖Y/z!d/䃜 9Fep.~o0 ' #l0 0J>9 ti0 #tdL]Wq:|s2rut]] x=+ a\kFX]7w}rRou+\]a]k0NkS8ƵFٯ6<oB+jwz4|7Nw{ߋ~Irw_N+hk)Zءfd]I@rw]o@{{پ=0 գ_؇WZXv1]<]eFoW}I@ZF:@r'i@Z[KM4>dշ[7C}Fws]h20'-tͥin„3Ϟ{q|/::>эLLkHWCvf~ h zFMgk09ACbm;dt}P}LUhyܽJXՎMV1ߦ"]Lv,냜c[GxtYE1`a.pvɷWQ./Cq7_s:jL!S 2dfG+;6>KGJG#|!0c=G$jYF푫=(kdQ0Vb(0HfXh2=VGۺ=zx)S&HFy#B晎g:jyc| +?.Xq)_DLy)S^V\&D1pp\bXYY* H亭а=b7VGr^}Hҩt˾M1s!z3G,6xFmdlҋ̭hDgH1# ?h7bws.!Z&r4$1dyXZcf{4@L'U){?W>P!NG W Wc,CTHafUcYɫj5&4&+Mp$bGXb_bQB,K,ER*iqŢAYSG:"J: ұJ6C#N"~8HHp#tÌj'FX)]; ҮhaU[!!ArD e!brBo56@1(S5e@a <2RZ#jϧS,j ksVjm9y8̻g38 xi4T 3\pԂ˓x{N=]l2?Z?.geֶb$igINv3I '֞@ri, *N,(-C짟wl )ff<'k{9l4{.ڶ;<}o֟eTdX0~/K=Gsy?_@:T}]-oX%*>0s#x4Gwz,57 |~s>w,I[^liIML0kuw;ϤK%I8 O/L 'h(.Dh;,$x`tOvIwt ASe@8TKѸ2 Urtp7Sm 5IRNW. .]Rgu!Z5"f,,ZZ0L<5xvYƨ&aQQ .*ue \MLOF],J`xJGlSѾQE',q)B"RQ6Ҿشj:C6f#=FP,rBHHo}/lxRRz`] rIe 1Hl o  (Qf( YB Bb 5ipn_.Ӊr)2Q?+R}t%Ao$76ŠzCXC-(a?h%]cօ,q+of_a!Cl a+Ǟ_zcWO?a_+}FC>>}{ڷ+/ $D&(Q&(;Rͣl1+77rSl:+._FP9FSg[1ڝmw?m׳տX;@o֚P3.Kt N<}qNP+Nf_{[ڇ H(qQUwoMoȞ@/E0]1P_j,[b$,d&Ro, mЄdF,j³v @a#b êlE[06 9jQ[iJstK7G? d r!;бKc4צb&Ka2";fH ÅށɧB$Gg\]X(0Ub~tLMVl^7fyy2Cf,^05sp=KW<=8ol%9ugh"ƾ('hͰzZ8&V#ox|G|`6fr?~y.N+Q\Fyr(hLOIc~/ C*d!{D]$4/&`;"dZ,H(4 mtQCu0`x X Ebk'(i8=QR@+Ǡ3FLυqh4hB˙GAYߜ B;ӡH8q_ ~ $%=MGzG"|]$D ly\҆_O͋l?Җl#=3.f?,fItֲt56^3'-*eKzME"=>ޤUi [Vv]id6a vۼFͦRF0aلiS5I i)Xҷ e $Eݴ: iQmld,*Şa1dH,{"`&8XL Ͱ^6nH#U S:Ovn\;"h[Z kFڢ-zD5.SKfc R$l:]624M_mmV2V"DZӾl ܽ0XȤՅtG۩rÑ GO/c 37ܹ(m"\ݽ1*3؁!R'Ƈ4 p [!g t0h6|0_ԟO*iKY{/-O`:F}=zxw̏󑀪h/lyz+d9h>nl>FWVtoNqv2| >[ |;V2hd}_[+ȱ7bXIEkORN?Gv Lc_ˌGI/zv %z?O9_׻s;Tu+,WX!_a[qx-#'S?&Nb1.bZ$]lWy$ZXb{ܺ蓬hMh;U bﳫ lcpzGb{Heն~b/QЧ=ſ:bΎ8mvhg ZaG7L톩"%K^sX{`߲:LHAD tbZbuOO~+q;Fi ]<݊1o j=owQeTi^ckA]5Fc_炖2$U|+֣|y|֤RB=4Ό1OɬVk'܏1Mz?D] M8iƑ-=:R24ls 609gٳ]shܳmfnt ʜzW), 9}ٞ{:֚~f/jl I{dVEHǩ1"r(Nu4c;0=ńtene?2ud(,0)K߉d4X1~&%طB~-sQAp8 j )j`# E`[`^1E+Q&K膾 tL:"%.#(SQ|o7y)g5+< 3fPv ~Խc0l{+~KX%Hǽoz}xAe@,7@-(}?#eL/!_Xx6k^uT|q8]x f"NͤXGɱAp5^D j}mEDL,iriV.6]f7]]Զ.:ac(H)'Q0"6ET,t H0G96HD 龜THuu @TD4'ڧ%5LJگhj.V< qL?ֆ陁,iƤȌ0l[FMRFH\vaX+6QjrUyWh,ȿ=7뙓paJ~8򋡀:OI ݈$ :(mD#ť{ǻ+vѪ?GXόj}Po6;HK=BE$dQngꠛGlj }gX,ny@v~Ub, Wkynk({0T@Z(;FWF`phoD`^ ];!&5`H?@H%U1&6p=JGIHI{NBΞ:iR$I{v$XՀ}zk`*"8N2\8CM,$НA[/f.sBYWytG+[?le'wtȹcGwݑgwG|wGuvB[ZhN| -@-tn\7X,DwϜ/?_n@>XG` rϗ6m*xJm{@Ƙqv}/|?|cu9|_TNbx=؊`³xg֐mapV]9=d؞?Vrd}~gޝJg_wRBl8TB2?^óZj({ ^rPVJEp#g2;ƋSIM$ B6Ρl1D'L6ͪIq7 V2߲5kl7s4C7BcM<^[*h6. } v@_H@3 L4[TߚZKVR]#6cƺ7z|<:3ޑ7nSS`H&FXt>iG>0~ř`Uk3ifn#"3B~#ϒ>T;@sYf>iKxٛ~8i:MΌ?C`45v z`bO ]l직3C0ZAs1uH3( >h:TB&6V &V k~jʩN>pzi驧ltg_U+{W0d]mJ=Rd}OV>CwD:9=w@ݱW15&PjȾ`vGFĒ,G# 0# jcݫ0 '阡+}e`7fX++dS9#B|LD$"VѼ(M'66#hhH΃DDH""!DD4tն Eݱz.b%;\ Q$p"(X$s5Ic\u.wJ'N4vb/3Btᔢh+s8;ATPQXGa1r-˱ICNj5E`<\P8hнHsҀrmEv\d} x@2{}z%845G#=6ͣn W:zle!(&-(P]{*1I[xKI2اWM-ZGXUCMoV>uQ[*eTM֕f2 ݱUc;FiPg*}Lϲ,xSʦ dbnT\6O{7nj$Hߢ,߃N@nj+&'tȔ@Ab|(딺DLh\Q:lYݚ5,l-14~ŗH/CgAгcjm`,OB#h45FH>Eߧ~d.NW:d |3~BlyLfY[fo(7b_h7=΅|O{x2ѫ}\^0e!IVOFu1& PjO¾k' yͥ^30, %tt5hpA kxYn;-ɡ#֞Ý;`sLDڇ)\z~|Fg 7%{/r*BlV__5>oy,4Cקݨ޺3j}VKr#g#}*z/{4k>ߍ&s3UtmhCqJ򅧶]N'MVaq$#ar걓lH@C͕F~yd3-9s=ri:srn`)lC'ZwX֝h'(_*U{`$WAn푸Z6D9M@˺_^! a) lV5NBJts\-`D6|/ aFcEP{De¾ aΉ=q^6g5~vEBCr-#4Nh.-e( uE++@90~BAxJB9( @WeW(Y:(yՉԾS[%f7*A#5?&x{pF Ox{UNʚ'y5Jz[K,Ӛaamv&t=}4P,ϟ2Q2.'ɫhRN8^S%臵a?w7UaHl9ez}ͻ?)Y]dY Ji}u5jdY&}~D53k|,{uo 8㍹8'f>UZC ߻hL4~-CtmH֐5~}qQۤVV)\wrR/DwȣϽÕx9~~ ~ʿ ~쿭?V3i;֐g~}+~J=O/9Yr֏j=dVR+ vz}`iNkg^>RMЛ3rl!^f;؃l\!Гޣo\8y~{d©Sa K-\foeRPw$^D#e\ Zʵ&i6$Z-kq^ȮqHgDZJ8uFw9!gl^-]V,s92$Vj/k>pRա ;R AOrPʑU{&+3a\iGjE.zzOတz2ȭbzc1n6~2#c}>51bTz+whElr?!CC09!%"p_J03|i,<$6dqz6 aq̳=iJ}w6OSnwN+>u<|XҺ5dbЩO12F!O$HĔ؇:(N-e_\~+L$g}& D )%LIDwGTwE%͎B(YKuڣlX9i]&:Q'm.G!7E쓉 >dOLi>m9 ]Op2?ueq3Y'^ ' 9^?<[,:(o5f&eY| Y!FcX{w&6|KKTd{TUZ9 dɻZLef[F \_ '!}:g}3|aB(#Lkޡ;&VA>D{G2X湧wE z(ƻ<<#pIq'v0ddpBilUwћyJ+|_;A|g;;/Y/$(kEVs_f ְ?=whܷD3 U6mm]*+8m7QhTlݞhjo\klK >jCfPMtB!2v 9s}{Ȇ xhK6B6jQkcKA8BXKB?ɹS_T WD% j)d QtOplY?6j(TM |g #ߒiMڏb?zn'\)'<7G J7o~Li,uXُff4Y'J7Ma30d$+sjuI3}'V 5#Egsxֆ]f3y8kpݯ?76v_~"MSvy~S(JBp~swWp-OEagzڭd[F!:3qy~,vXJWCt5ETt74dqN8Kǹ1%Q,TQn-qvvj*AME"VRu"FR+,RQ0njO,&c %P,nu2"eXG|N%]ˆ2%R.90( 9l8\p \t qi @b8{YԌ"2.H VD/ދo7Y$rEY;wϗ{Yp}Slӽ̀3v:nqC=_o^J#pt-_@6@}_TBD9PX[:9"J]Q_lTES$OK<-6\ueU=%%bh:֬hN1<#Qh b0UP9nrUSF^VkW]_"n)c7)ҽ!yU> m"hD^ / |ʥD[)۝c6J+_#ylVC#YZk\]{zv^/Ǖ/TT ?$$ +!4}kFPɛ +u-hN௖25BNC,DrzqeLzB^f2Yty^uGO 腒mW$M6{> : X@- DۉZ/N"ND C7z8ZhX-[*R;;gzg߻Z)DL?Fg͌'6qPf'Ylޡk6ED Do׍xr1hqU#ulg3YFjљt3-?$!72tBmyyw,=$Lj 1M|j)z_'6[qGReey88k6i  `3Fhj}5B]#lDlh0}30 - =^ihgOoxYUZaLguN1i@ :"舶`Aw:A"Ӻ5C kg((Uo8-t1a}lSܹF N1)A\j\)V *tRlW2|)6mt.ZXW* 䃎} <`չVixgUoUp!m*nS4ヾnmu>'SؗT58CRz>ԳU?h`/&l4yiuѾt% w2z?^ 㤷ɩS7NN.xIo OI=iKvz~ZC@o7|Nul6J69#)HiS06MRN5HLvPeɿfa%I(FE;"RM`wXB ~dX񢩬xv@ndMD۠R}5W-iv{yg)}*mמ&Y-j`}؏i20ߛx73i Cv;lOÖ6'L'( x+Bb^*_u2 ]ʚwѺh"7v2!Y3K/IdTjј2u8!qv""R-JYwL/=mxOd޹0Ě |QmjG+DhRnu"dEb v(oT=N"j'nu@Mg *]%ڜ@Xom*(qoa_ B}E~hyZ>NߠO WSiII48a[ȓx JW@Toư!k <.:8!{"!^|eXVK+Z`[/a{`eu8fFz/yg7Z6'nz-;Pk E u8w91vj߃o}a(LZ#q/tm;8~20(d"EEtE] HH-|2Nrc7›Y{?fYpt}G Qcт?koz7I" ndo[l:b}>5yw&_kp{`V;uo%ǭVoKp@p`O.kŜ9|x_gHE*so1S7s&lxh#&',N8GQ]T&DĵPXXλI"ad pbB-P9m{Y|{5enT{ xo +NeaN<5T!b+!aIVYYXM-S$RhVG{O/QDcapl t5d` P\mVoWkIFVA03HѲ\W8Pb8 [J(T^/ *0+GEm -ۜ Xi rA{Y}a6qu,>8 6Rz ~c+X;s&+0M1ך-X gg泰5=k;t3w4Z]oU?YZ{_GޥR/Sa>״״Yڟ7÷L[?Y6з/[V66+0pF88\}+z 3|.;wyyNQN±KNc8ջT# "zH ",Ѳn\3lG l$(u:wqe]=y3& zS%Ci^*x5,w&;4'?:ϻ#Go^ڽ.{_6;`eIz (}(@v ģbMVJetP Z*#Gȴt ! *4x1܋-F в5 ~}0/BdIu° o0: Oa4`09'< #0B|IvDI5٧}^1Ljv?bQZ0@_ 6Z9r~J;wʗ*'WՎ7N |'xwptmpn0H3 Ucև֧֯VBcw 4s-0nvmq ~|s!~k;췹V6N.8z ]0>nz{a^S0s= S0> 30N9oq+tՋ!d/9˒4찤a_0ATLUVlV~S:F%'/-P'<tl#ÖоQ%㌗5MT?mU|kz(*~pѵI٣aӖ\9˷m͍~n҅d\gl՟R~7M X41ɻd}7 * xRޜmVş#(߽JW=Uo_1#{G/s}r#ooeZeV'aͶ[_o=_0YGk$B{|7'-|?m3QF<:1z):5NVS% 7G⮝ihkWW}u'ܣd)1 &Tg&u3L`%I.rBڙ՝1׊] g {aXTvaOkbĒ#j QS:BG:""j (R\(:0 D>2|d*CKa(~G) u2x> ,G#aM9G,726t-2d@>d?~5{: -1X:6w]U\eт|`iZG-ؔZ':йrs~'!-a[\8a__ImW%^9C[;9[NJ9*.3l|ѝ&IK5qJwD9}+2fS>a2-V[F+Iޞ*R՞du>_mm>>vZhNyX;}܁g|i| |+OabC/J#%8jEon| +__Z봠ţxg> |7 ?[eMi+)VΙ _eG|]jdjdDjcs &ݔWIapK.K$ZM"/]R,@a$ ](EZ"&hWͥUUڡ1. ,SÑ1!רiҴM (41A>t¾BuiɂP7Iw'Lr͓sKLzJ,i]Ss_қ')9s]hZ.P>Jkh-he?VA a- h Y뭭׾њMI_'=KivQa,60ƒ$Is9l]k׷2҉c^6Fa|ht"edy4t } gb1|4U'?c%EG:Ϻ͋m^ r"ke+8S^hΦk*6JÙߢIlS<,C͇&ᯂ+||0ji_**U+~7#:2{Rq6 gxz5M]2֐P/|'4{׷z$4j\Yf$B3V+pj`]ҿ NĞv3d-ڴ0:eȾLRaWfVuߩV0KBf0 ݛIYHB &`]:#;% #)2D-Q2L@h&35hJFP&!ᙌއd4P%#@@GQ~AMizX!PG}-fqudPK45TQuO'Z]y8@ Ga8"v8*g+"oybJwh*{$P.N04@'Q)r"* R,ōNy, 6)FYo7&͘Zvkp^\CuJ:Ce6XäA ZBh)Hx߲GF̮7ѳf@&|+Ȑ< B$Z-GKeuymx9=BaVc!N}v> !G`v_G!C6Tei9,|)&74{3f߬y y/>ks#_|ߥ|{䣷 r{7ޘ?T-נo=@PIP(C}? ,WJ^UCw#ا:BrJrzNJ57FLpq@^mQh:;Nm`EL rk"i_&2_,cдr_kL=m툶ݴP`{<noئaGYi4Wu\~y }QN'\! e(%1 ȉM}MБJ ӎ>+p% Tщ*ً`[%)oč>h+%qAH>.GT>2|d6l#G6l&L><_fX0̣(#eh pl`$,gD(!D.Y:ChΣaGF:\ckqhN5A艸']Gɒz|?h>-q7;\wħu?huB!'ZsOsO>7eй_!Sa*(4عQRtfծw>ޒ,|7[ǻ1xqʣ!~<-9BXk&V{-R| ܋w-ƫ-q>R|e[.of:[)P>H<[XԐܠCUYXZ5Ǎ5z}_mn S+}{S̙s2"xG[i9{I3~?[ rG>l( 2ܚ293g-',Z8jB;%.+ FUQd;+vD,+Cp%'11b :DD)H>sI@)Ґ$`YŴ tN pZ(D³zLԹN*{ܚTˑ^#*ʞT6&}]'?(mxERU YBh)_[6Ǣ @UU=&h@{x\P;AF3r{{Y AuR"%u<'s3%}akc*43߹D$ҨJ`68̴QTܔOY<>R'*X˝X!k%>*X*VKThDF]2ԕ8oLLLRF,/Tm^iku=Ewk ԶrSJ4)uq#o>-L&ƇQ I24SG}ZԳɣy}huɢ ` 8k(|Q>K/g)PV2x&Usl%t%㚠),_`^A&8'WjH;ձBXfb,BX [)hu8x3ڀԳI=݄#S]l 1E kz6 j>TixZƣ]:6^wA>C;r+*Kua+.#"P9ߴ؂򚓚^Ͼ xu"MOO厓H 7 ;!JDJļQ BtVBj*&RPM#M怏9ЌO@C>(=V"sU,T&PM@5QD-TQMAEQ#l빬m8o9 k;R'-GNu+.vMQ %BЍ@-rX1 zǢ6ߜo j7P&j8"ŇTP`OdFn|=N+.yS]w;u.bҎDS"?9S]D:ݬ.axҮ*Er%uӬ8QqP>ևX⣐Hr7!iA?&d&i3sh<&lkofFcq-E2#m"Vd Yچ#CIFKV.W P$5Y{:[EqX;Kӱ4#4嚯/|DuOQNuq 3'L#|rDO∞#. I=宂B<;43g}} -EǗΰ.arvxo[~+;] w ~}(8o>f= R6M"{'5pL 1Ϫͧ|'=oy?YR[i # 1 <' `Z?i6EH8)BZ(;05.t/tǚ(3;|k/tuQ7PI񇙢m_h03]9ĭp8pU8Nע~qs- ڃb}hY//FMUĜB0f*sPI1C,+^ɨ`dxOE2T0SGU8g`>Q,+T"ReU]Vv^,\#Ik$ eDzP 6] VcU(vdcx, rإW 07c ,֞~Du韝4 կN-D)L/KkWW8>s_zNzԀ$$wQ9Ƿμ`1ϐI @"RlG0^1"RGIW' OJ5M sapLBar]}s|ܭO~9[O<x=ο1{<8x8ih ),FSMҴ=2i,tĿ!M [kʕ:Hu1[[t-iZD6wA#MG/i>tcZ8hzUSO[ޔOgtv0W'5x1Jz#IΒ?%o-Wj=y->?6PNe*G. ~#)HdwCEݢG}?z2ect)% |jmp֢j%о1 aҮ>pLPkVM%qB/G3!Ô$f'jIB2 F$$Q TjѸh\D®L-k:V Dճ8DuT(@u%EX KF!*$8;Q/ A`hv5.aY)xTgb9;&$$CHyӞ{{6zInQBKQC{0;HweS!~o iMZmϴ5ijh5z1֚4Ϫ|!wV&v25djbjĈ-z҅A*+UVOTC+= ThL$,`ۙVc]@ε@wdF1@?r Sܯ*F0~es>[it`4?bs@}}S H 9 iPb &hn|yVk|6i+`{'wq#cqlUܕ>{ʁ ?wuuqw&ca:; ;Gz?Pt}JV+D:H^z&d_@WtxvU+A\d>O(_hI)[}9J__Q7[- k -VҺMHxØ mt}n4&7z c+AUK7d6Dg-#Ѹ=7']+& x9-gVƲ֍f;`Xof 6& fJjKCpbosWJ!ϗ;}Mș]b1|TX9:2h/AD+a1,A 86CX~,]Aa@ILYUn UhѢ0@1媆X '_Րz;Z+C礳Vl=Xw!f~8±l%^Gۮ.וwyW{湓ܫ=)ҝ@'T%t(4pCd~pi7_ݩDk(>=N&^|K>GUA7Iu3%ܩR+eeP\| 3!bq[gA2B'X,gIEAW PD5`O[#G:d9^"̓RKSRj3 uel; 60~rh&AZ)7 l W';YWϞ4 -o=j#3p:p(T_hm4 ||g9|񬔘]LbHY={*Koӥpv2vQYĎvL_Vw4Fht/5!]L,zYb`D$E8ND9'Yu1?ee3,^T<UN,YKw)˔ Jzo-QoYOrvWϩHzE/*#4CMQFgOh6(v'.HF!@hpV)yYp}"}^L'5-QwT[+wPwvĤzvq F.h *W;KpIW UOv[ gqzi"vi'wۻs0I@|W9$bHb/9E"ek"bHw$(E WI}`lPW9`冁/͉l[E-"nus0 A0D_; m~I^PQ(| zkxzΠ8Au=f{ 6̚@^`qCP=かyMWZ ފ[fdVd(F>SSVY" ¡MC@x&A.B%n+wg?狉 &~''~2DfmYeY94 t8 3!?qZ 79Eʫ[$j )cns9VQ!xibk>8-NѸ|)YTE4x( I*CBU:HD͞O x7) =N-,WeɅ$Un@и@ToIb$¦$-h ?˩Sjk+_!T$I:I,E-.7/% R["1F$H8 R"A(%"zc2^o̪$ČK_&%9BAThPO؉nwpM vPށ>sA_בl:R So:6Io!-ow:wwLI6?yB dGqNy]xN9Njuڋ{>{N?r}g?u >f'IZkiC~;;q 7#xO^eN1#wvNgS?L˘ȅ~`9)y/~>Sӡ Ensvzu;}G$W[nhs09[r5mcubQ;(adzH}{*wcQx2IW5xxf¯y:1Dhc}|"7Ҷo1 x7> xy. |o~]%o,-[.k8yYѿ"Zv;B^,>w`A`bt*+hcq-tbPJĺmDEA(m|٧ Ν;V;ʓ 6yw^o1ZۧXv8y|Jh{b]hxFoϚxvDzfϊ85}>Č7ts='NZ'c^0?6יs>]ߥS0FErS@G(eg/r|g{t8-%4eXG6fCE2G|F#ؑ%x_$iuz#0nAhGC/'5zı,ǤsL< ǔ]zЯx&Ɂ` Jc.+Y*)_QWqggU%"^2K6-Xݼ1gE}88MF( Ԝj5e昻ݥ|cm7|_7%fh&_÷g[d`upNpwuo )p&8"xi~`hy)x9Y@`|<0>B@h0lW+X!$x%o4(X+N^y]yՂk'OK Ҽ```nE~C_ւ~XiN!Y:ZdBeI,JJp>è&R{PsJ|1Tt8p3L,hgEY9p>,\ w-t=z,_Yb\K0swxa.k9_pk%UWbg3wݿ_|\k1zhE MUxgk3@~=mrpk+]o`f7l۠o/'\ۡG\;]zUw] 6\ns߄jv˵׻|@q$[mYEϨRJ+TXZ*kkv!5m5b .6&P=o 0T1Ԯ,3LfW 놪-(֨Bb2 f" * LGc(po(8nn̷w!G+Jk:BT_/FUQ+Ֆ)\mA`>6Hpy}2w$}Tz•F77 T_#JZ\{[\S$püLS%x]$& lWhG[s o7Jl O} ״p{kl _#-} sd9TSG> ӷ>W| 15@Պ尚[980* \jEPB (Ya znCq;+ PYmh~]0Y0P|a(T0TPyݱa+YE-7e%Ti8Ob7JFUa Y͞N4l6JY.ܞOv͆ ΁s&?g< 3>g8}ol ta%0U^(+%uh~+fv1o7c6RZRwg\s8gav+j ׊jmbУ7`^o\i:r,w:r w:hw>Ŋ{o^:Юq}vkvChAn0B+\C xwVh>v+`p+s} >̧C{ >g9@g'PwvV.hX4r-7 UwiYwiQ,=UV}^kJPϞń|#1綀iyy )7ai ^ywR!s'ŠjZ´:/X 5ʺ<LA{EO;\w/g~)͟+|b 6kh5C+w2^VI^3?+X5chPvLGK5/ϚϘ RO-u v 6 f 1CN7|$6nPaѯ’+(.Y|jbl&w0hmFY9\|(8$8?;ppi Ssq s.J|~TO(%r;[Rk.W, %ۧ+xcz%e?l uڂ8EB6_&2Dž',?a?ri޻ewMX}w;O{zٞwr[`LVz~!;.ʐm50Uw;s̭,kF(V͌ŖBCi0P> S0-w_Y8"ƶ'w$cؕYs9K-مD|𙆡"gCܕc&h6Ől,C) 2`քZ1mq9,Bp`͆"`˜~hF6фUdpq%}Gfl4`; `쇞>3*ؕSGUmF_+Cϊ֠0yk̳" ً, > ߃b%Q@>4bY`.%# FR4CWb UX>x5gw68hx p<0Rه>(ø.Au f'p.8z mpv # (<[p Ǡ=g')'~i Á<: 8gp~^s} 9%hϹ׮ˮo~෮+s](^xk ppsgϮ\nڟ\?\a s*hXaE XJf,hZ̑s NE &ϐoeĽ4fLbCeHHcހ[wH̐TP7wt汳6;+s%w)6Ԃf™H&Z6K%GwŅnhнpbfXi~[sEQOxMZ,eS[m nVJqKGY'4:H btutKc-:r&^/@xJ!Na(L H*C*J*%):lOĝ %ߒʚ5irS7oh>G ?B  1]0d{JceҸϩ4K\{SiGi%4Dil׶k5 i-A$1N1GiTAr*xT;ɵk e Ta7Cb'H:t0A?GfuWplc.iwݧ'yg~ƆeӼ}}]JZEA&Ot>V{,yqp̄#Gk~P4:ueF#cX /yqGGuมPco򈷏R[ߓ֏qr+w_you[HkH6C Pd(-ChZ^ۨЏ<Ҝt!HkbMB?̓%GO(B0OSvYCYK.Q(K27%\"oMY aY(#7KWمSP<`_.tDwLvD\3?\Mu.zt#\ e Yjcm(ҚHn!>0,QĹLՆn j-$"'7.GJz/[EIfEu7ȃۉ|2͓H$6s׫`` Xl4"/dn!ꋮaEWLB/@@EoXQpNg!Ύ Q-:L;>z賤PS d+ZNiy҃T=uѣp7m+yTIH&U5j?/"lg;KGV+!wꕄBfF oyЗX=}֧pKrVC&!d6ed>ԉe˱+\BJ/"2ed:PC#j#R+ R+"+!R+#R͉$D1$f\OE&byk>j'2Y/ 28p0^G s4P֦3) vPS#Uox;5OI^lvv0+m.Ö#e$}֨$/+'e| .#?*hy7nw)ҍV!]$[aL61z卟AvVBi W*i|J25hqQ5'{yST9m̞0GZh(֗vWi4D/Dޡi#QoO9S7*;RBl7Gh .ނܭ+mK+EiJ>wdMdfCwWb7$ S{^ =͕Cm9bWW!+!9`&v*jHip}EL/wfB.70 %J*pM[ :ecPK$(["l,Ӏ7m\ zm-(hw^cYC\Z/ u.Lh qN%Wǔbq[L)W9j]:lJ*펨;a]~"f^m0$n΂^v 9 ;0ocmYXv871E(]֫H,Y5'˾.e+uoJ{:e:%wo(W:ɿxYF ~J.6k PZ-c',?{e*ɦ3UU|C{1,֎i=kV߭IkD$r[ҋTK( YczN*}=|o_Y^OjoKEFQդ [CZ[[orA_ _e -'?mm9>قޑ!}. ;kQ9Vq[N}]94VPCqop/U~8LW^BwWƺHęec_9J(x"PIDs8WWҥA9DžA\ܘp*:R{:é) U"pN:ڕ{q}=ܹ/ Tz"3,2]}|w~J r?yc"(%}sURSJ Ւ܃C=CV)㽳|.]r?*eyxgf3cJ[ucA=COyecYMaLJ:यe?tbNx\L@;"4C9uG`|qԉOClHow5r 7h_2f="4OZmbIkݣo`׎;#j֘Ƽ+I# H$ Yd$J<`@,NcP9y\s d̓)x~v咲jwiE6A4 b.FDiDm Z,QW# AfL"{ ES_88:ds%{F8><%huRJ7;R ,?wV[oΖ `I6f/te{ KI=n-N*}2=BFdy|@ca8g*TR>S@|DY<@|"{10BQ_Bm ݉K׽-YJ =.x=R=_xkG9r2Fc+ q6~P_ x w2θ;YrsLg"S%'L*#$8%Q^^rcnYEkt=mN"zGeޝFo A4r|ADX'*6eHE҉^c'*w:+oY'^5#ȖD;cю@n<6,{rcаRpRUUO549>MqվcVK5=QHKX;砂aͲX#5;0{N*`U+Y"Vg,9B8詂*Xê?*fh Wfu%VC|9k7lOO [5j0G:̱z}jZx5NRPɷF4k N}Drl Zqi%ͮfϳXcCLǷZˡlCVe[Ao?uDtur/?Kzi(j@\PUE zo,#"vC/X\ ˶JF5>qY6./7zBʍ0)[cKn#:8Yq#F''k%Eⳅ`,t]H3/1'}Mžg"&Z\N#2q42\ׇikP;Aveil4ګUXrEZ4A48ALohyVVf:Y6YCO #d^K6tU+49Z{CTV\W'wcǨƂ{Jo}S ȍDaP-%q`S}IY n 6a8< r/em-VlkKAם1XYR̫1Hv 'N+$fm!Vq*jT5N ͻ egu=ƠlfJZ]V/NbA~nARg"qJ}uOr<`[E?11 <ѯ+* Vfqkh90U56Ѣ {x̂*;.a 'fm*-OۑϑZW=\!D`60}Oz6mKdN˃uOXח@$7 K;ju1[7UU \1SpU*kI#6WgPC1j9 5dž!(ڛ0o"jL57Su:cGLeiRJS-D$ 3xV2%+7{L06{O%lĪlo >іn2C㴒>f$6eZf{֪ŔXuwҳ;o>eZO+cнB/-rvL$('R i:\+/#h4ED'C@<9Y7(Q:Q:P$Ym>BvpQbܹ7'Fm8W`=wc 7Vu7\n sc_OĨ8.ܘ?\q# ,d $p# q'(bqaEz#G/vx7xq>ug%6<74^7gO>XgG fxS95|c1ݰ pyGr:W|w5چbtR4(S媢ñ: t8VGd&혅c Gf&DNIk4ӃNbfAb$qr/ %|W9>w1:7}eVLR٥42٣4FNN )fow^z\tzz++}c$f)SZjO_-XeԸ ߨe,bWt!N;Pٯk=K>$Q̬ 8xDGq&9Y+fDD1\(!B + ;ނc+ + mw:dR`!\1% }D!!_MnObR]ʨ):pB0 mBŝB1!˨FdޢZ5Q񸓎[S: i?]ϐvU &N~fT꧗H+BX߮< ji5}YMVmMYIp-5Ľ{@tIjsM[4:C=TwjCA,EeR{zvGng*Y; 0ރsk&,'ϖC$dcjr+@-NIMXRBe҂Ñm]jJ)^%$J(t+!'vF-# @Tw KӔ,Ǖ!s=&K ZŤ]v箳tHFr-`Y$0Mi `KBN+)j[G˦9nrhbWnm"NҚ(}B3B ,35 =+UV7P[GSD"|N:^"9|e:^*턳N;!whԷHRpZHr>P߮=go"і7rf?GF88y^p\7aT7uVέq0^rsg P~~.T<ʸ[R+(Oyn"k>UêOA [}2zkuQՅ3kF'Ͳ^A$W@nƁ" פRFS"]oNaz?L:O#]O‘wx).յpuD|i-Qhn&yWu¯TU___} +L#k;TWDǷ>p [~#Ut;G2xO:uȷtWtO'`guV'M!Q&bDE7AoI%7쿶Cθ1ITEglYIYT)$|LI~i7KD6g9nϙMX]/60&Rm7FgI<vS܁B&Uu~(؉Lzۣ]l[Y;}ɛvOt'njn>?/&t m7I`Eg[o#dѝ.v!]vI̗P;mR;d~SFInOr?ɝm8اSG)}h8d_bXwvgӃVw:NudW8c2!v W$?a&~#F iFϭ>{Uwo}Sp}[ =Q{<GKEp^Z=EITd_<Ζiethr_D}jyQkg^5?C2Sw,## a}q,͐U5ip_غPf;t7Cvk,YT0`vk,>N}:,EIⰓE?Y0na6fћHѭ$Xi^O~l6,̔73m?`@?^76mP$3#O,zTSD1'~?Ģ坼AӱЉs*eJƥۻ7ug&zʣE2uIs'αN t)I_ ]v6o֤.q]Zﺏ@uNa ,8pԀc-=@gQBhkB"pk>K2Ncc픚-S۩Jje JrJ]W8?"~9YDDE'~/3g &E#fn0`;h7 \f.WNk]FɢH;'^ ZQR"h8+ß~{w'M|ɧD~Wy^p2pĘWy<G}8:+/wvw_eR {$Wp#KRe=i֜f r }9p fFjCy/y} 57jjgUj]QSUeoo?E"~w5?:Y?e"Ȥf~.j;E\K'HngűS 홓?{mm8BMH N@BJk6UEEEDĆ"(zX"v(z8*񮹓Eɳǜee9(|iv1_T"$ziGl#.#z_/~mK#7.<#RHi"xJZVr=@kz\-wyISnK;R㲍: @w+u+95sxNܛ$%2WFi?TE`On_{|u[מ{:o3FtFc_3M/!N1VI8O]uj%c66n a.$ܒ+[-Il% 쿕a{8uʛ%/v&gV*GaoNMNZ'85҂1@~a' )&g΅?W f%;ZZZXKX u# Ǯfbgqz@Ccw@[2Z l,@eg}t-c` sos,}vN\9nE>*}-IieOgǭ>^v} %)U˧TX*Oď#^p]VUmUd:3tiJޛ;ؙ70SSzu̓zidMgqg/.&MpK;/ҎZ 5ۃO'˷2+36-\2ƻ$#%|6 g[~S3KnPi(vNvBh[zuni-ʹːe]->תnxg>0>}T}UDp'j1zRK%{KVHjs[6guM.h1obpJŖb'ًmƋ7.~VX^?RϺeh dd~C)*_ﯰ߈.֔GGd&6 Q\  .u0 .k/ {I [O$NpMY""8/,kSFʗWp3')|Bh\k‘ &UyUW_>'Y88͜fA7 mɏ*N1(u קל~3|KUА G sw[}PoGO!ȵG|FM"I]e%f!6#F~h-6ʏb ,_"{]"KzmEGKbxL}TgWEE=2Ջ:^Sv@zyFu+Tw.>)ru殠?N$d$$G $;zL6)G'"""WD?jsuzQ0_doc5 22?RTgr=YO!Z,s)ofiu\njE7nN6 ͥf]$]i47 SbvzY}*],zC饛mRLߚMdId^Kf˼RYez#uޣ\+hK]W#/G֑+#DuX9#2D΅Qc@G`=[N:F?:=~Vbp D9\i@?m(aCUfs.шζWG\UDVąe".,blKl~}>XF>Q`i>#JtdkNdai{Ty至PgS@Nk w;?8kCj#J-'XbN?1X:,~" NDMrD n9bKHDė"y ᖠ n ᖠ%IqsEoqnxm8?.J)C~*,ĝFz㧠)qgXw&g8Yc=_| ѳh\Xl\|!/DC޽Ķ\ /qP| r\jW.hq%s+rǫ<)e8̌|6L\yn ׏.n\}.0\Kl+tv^xTxfO8!G{q+?iE#Z<>ړWop@s9w' šYI!hDgU[s 714pQ)XS).9r DۘfҒE{#1SG@4) h!=!DV(AA$ i}Kpd i,\:B$$'ea9Bs<̭!@k<"!2g=fܰd"ڕ=Y8BM(HRclUew4н hG5~4Dihݓؒ!>@Aarma@T7t~es|bv=_ ԿAtz;#3f@M`1"}V$uկsTeOtؤ>I0/9娃rA-rDcA!0w9ü3@6j|F}cEP3mBGMBb]|"&/t#Ӎ s'9Pw[8Wn@g#aO hI'/44돔"t@AD`2:::#,%DZZZBo %%% %H">ZZZZZƃL ʡ k ߨ ?WM*Gդê&cTQYu$> 8 ޣIi6EWAb=Bt:l:]K1|y,<9tKՐG*|2jp*['Q1rsYf2s zSgWD'9yP/hԏgpp=S,{3~C(e݋r;TdM J^/W^2J+OFa_V [nEZ)>0Qr5:>UJ5XNJ@#cԳ1R{nZ&\5%16&MGk̮Յ3æ HP9+=1d!C3C ,GrQXYhM@nO%e#3n*@7 3k*6p MfM%ʠ̀ܘ1rc\ @p6 T*a1eqx@nq54ȦY>4s:ِ!!CfC̆ =HM` 5lQl;ng?0͐<<<` Dّ?O4ZYvs&?D-&z.%4.;N{v/|=>a}D5\HWqZ$zh4^w1 n]E4kBAjzJ_F5[CiD]N#;pxB>uR,e[n K]x %ƻڻ}=T% w:Cߨ )ry|V,7H>|Xϕ&G+;ltgFcE{Im2 mHxk)eE52<T >M՝\GnSݸGn&%qlu>qVk^gN:^N2 j(Fя+Ɖ/8h{H w}nn;C=7(qzƁB}<ɌT#*}V)Ĭ?'Mpܠkd{6G|KfYQu21N/j t=T ڋ➪NU'O7$[L7Tl9ٜmΡ|m=` IiT} 4l^A X'l6vg J-92d榨RʥConS֩ߕYmbۓg"*rx&L@&X@͑샪ʨ~3lWpL˅ ],='лFNLΉV9j&(]8ă-gZ ElzM{nC#idk6Mt r":>g ͢:-pLh5G?f=`4=(<3AL;4+B WCDbUX"t;,I~&8@M= |BS*ŞSS-(H)'Ȯ|Wq\~0O}K{9yzT# 韣Xj5'wKF>N-0$Yta> ź29&$۽E!Q0Z?fv_UUz\G\/,urImC$`MRSrGdOEOKΕ栒X߫)M MίxM]Vy^oWhFPrz dzګdٲ:EϿudpT[Llw璞 Gr$"d Y!Vt?vK}!ޠ}g3|jx\xT8yr[Ҫª)UVMu7MQzg%FZ\[m zz_#(& Kվ )Dl,)V @e\]T}Zzm:*FXmHߵ!9׆-7crSKRc9(^U$jt[by=m2Xy^⺡Y0d95GC}KY0~d3b0(gb3!g3Q4:>h&h>P?؁2CjC#E()4Ɏٰcˆ{RЖ"ءv)Br,oB.]Hl2aCTB20~h0VNCi-,O%D}G0}el*QLg o? n{*QfoA ̰'#N@'{.d l3 vu@2@1 6Oyyz2]~)OdCDݨ'Iu:ލn t]\Q{Cl]wIn09$e T3v5Gϊɱ^֒unW@̦RlUqzILiiC}PT;A5U,~44 J9L5,2tF=:t[=I 7{XY( d2 /SnS~vQsSD̩ۅ :4<[UʇcWtݽHmDH4/o:{pr*/\\_WDu=╊pzEIO,A^j.!dL4{K`խz{v;#o kmj[j6V6/M?k(kb!m'X=vv c@J^'u"NeOqdQ#s ^0T5ͷ퇢{0clٶ?BQ#j,E iTWe׏]_!Վq -v"۱ɶbf13h3k$XvH"A^ Q'R'\,˽ pr4Q D1L4!8fYk+%ie8-ƊB+ a(ƊBg!s B SS`?q")DO1ƋD#$|3F"!&BbMĚ5k"$D2aHA#v71aH wR1ƱYG Ǟl¾2 ϝ׈+199db@3rl+ṷSxxilƚb3 7kS0j5 `o(^~,7#=bxWDwKf<&4*c'mN>B<~f &͌ [uK˽g<]m5\:O:K1`H P}U' 8. ,'bAZNJ _J_;V!|Bmf6Bhn;8d'5. iQ m6tMQ;q !k6嗍 ?v' 0JG@cGD4B|~#c#@d#@d#@d#ȝ?@5hV`j}-Łl #ʕW!2f"@L"#p"F#` '&xD'S˝h}[I\t(6HN>C#$Mz%Rb2I3IF ;bb3(6R 3kO:K4}CwZq ė>oQ/H7[?ovforjm3]ϴ6mMXVVI4}UV\.r=)w8׆W \N{H|-#=n0h#,tMxk*Z$c Cuzmw$Nbuǁ: CdK QQ>>] :YkŹ)vPc;CΤGP[Cm ek(ҭH5=N?b7؆6̦pi5"^SH}MeMal @jgCh [5[>u rmS]uD@ @K [G#w%e-9cl!)VY.JB@.YDZ*t TB%DY."]f!BȂ ,8 26_]}~i,t6Ngll#o6\Tᬚ gl]vDπrX;g!l䖞EpZ-$niu~] !խRED/[I(;5f^wqk^wEڸˑ6Jzf ͖l=4.:GvL< 3.bs<؞㋘L,&]SoENB,ݕ5bZ_MQNRk6CI2EtY"ٵ4 }$s3nS12pbՑ̪Z+?,g.UB>A˄9Wĩ %f98ѝHG'"UvɈ#[41Xdv ψr|z}SuF2Ho ^򪘝t81.&ϴ0{EfJ&'\q*8-MMn*QKt"]cEޯnLaɐ흢0KSjʓH+SՕ-.ji8p\H:e:-s./13MmR3z~_ݠe.}wbX'kxOl~!Z}Wd-6zjYŰc̚Q%L k4 m-6e̯,臖16R;ʊ&ь> Ʀul _9&=/v4oӊz bªzb:ӧpj.leec@0 P3@0d- f, ʉfec@90Pc@90Ue#e Q 1 l>xEpʃpxp_*{C8a{oew,@{/b:ilN~{y5>l7ܹ;Gts> _$ n!/D7!# }q>3Fy)3͛zQg|ʌx`_Ǹm2G1 /d32N\]?x;Ǜu+BV!)"֧)Ԏ^3i53fy2t];܋ވKpF!>=ZCfDx3t[Q~Dz8/·  iSg6E4|U{+n sqns]xKSH?Z^}Cre;9~ޤ~nw;EFWQ aV[،l:7\-׷&`4k\mdI5 RFV}TW$@,KCtD03kH4X3i&T `ynR `nV`D0ha\鍈ް:7Ͻa\aF`VCVs< Y7ȋDDDXajIKKkK J6|oƣj󘋫%:]l3Yp2SӬ4+F]-`2l(d`h`3Ѭ h(1aD  3P pfsi׽9K셫s h,#Q```ZZQT (d8**DNDTTTTTTTp [!g%QW.Fp%T.*P.šj!zi)EWYz9W•sBUDE]kQ':'>nQõrnH#8hvQ r6B&]I#WDc*"x4A8L,s5ζno!b|W5}ͻ6e*Qe}*TUw?VM :ÜC*k{u5#6EZC\sb{60?|+r쬲tc5U_y}ho"'=]&W{j]c8q{[ 2X"z&ѳ.l̋":ӅgW'67q\%G;Z]b+= 1[|d~4=?Vͬ19CZ=03H{GLn99i*B9 Λ^M_<0G>~=obutţ銟U=0'.N{.n<{g3oyJ|v%cp4 iys| %:4hNptbq-G{ݕP2ab;o~s b >2l_|Q~MǠ^ m$6Ru96G G^r"[䢦"j7-8V2! ¦C_Ɋ:N]x`~]YGM ?CO@i`7`(NӏFyO ؒӂv ϰ;R3- }wJ)ZztDAD $4X"x$j:S L}e:ݗ$Ȁ }y&8Ngf:st|f9LgLgaL,E`y]3p8ST0e̹.\vLgkYAdY`;\Tu.W\f9klep0EuD\Jq׬W]N,C^ %u4~Ƴ6eJ?^ Jmn$:"z!uq7n&&K`f%6ŶkFP.ݖݖicHmPEa ;!+!wfV;n{]+/@86! -MH% `}uhík-HF!!m%A-DgAk kD=T:YK=Z5t8t ݂{{ɜL ˞qﱧy3{-71fnjnoit~_}*CuUM8Gx*Msrt(*?J7TN_)Kzŧ3IG ӇJ~Ul(?M؟RB?Pzo<3H}M7d~P tfÜ<3[1j5ulnRS`NK}RH6:BV}ퟮ&2Y/"AF8&Uډ*Qs6:?9^;ONyr2K9&̯>浣' !#|qK0pv21يc`1!eznMZuW0S_  t\v tfHYfD[@M ٖG)L/X[{~pl'eX2gtyYcLctY4G5t˹LR "qJ4c75ӵdeGmͳ_u#3AL|0`~í#7 /,c65lj-B0"uLc""wu`#3|QYOe4XG,E4;lo9Xb}ͳU:O0s;X|*0qtWÜu5Zu-\!n8^zt}F`кJtnB4BMX=؄;hƻˋt݅]wh~V}Ƈn%0>DtӸKaӶ c_ƾ#(1X3?nMS˽^=4ⷿX~ oOғ>ә!=cҬ#am=ڶ`CwwHAxODD!,:xEDu[b=wٶǺ}uXw=0%: ZX6"gAτځ 3j&4lѝؤiE9߃ݹ/`hw L/ŒjAmь4#fd;>Rrt>/o*,QeVu/WSX_A-/[dwt'Fz3ۜu3'==⥋UC?Ta KkHs6&ni1I;MkoCf[]h v&`ak Fv訇z]鷞(]znZU\yXv*h-\L]O 4 3-6@cpfos3*6@BmXƻEʝX0w} >[i|̃l m4n=nNQ#iLj>A4>I?OiO}ƝD&,$NQr: A= -. \cqq;Xc ϫ\,_㥖)Wb(G@h#7D|Nﵤޛ . bxFE,we}[jOP:Mx=JM$>a:ǔ&lcUQߒp1\K .Rs>ќ&A֢(uеL}z[QMeQj̑!CdC96=!5P4 +w99CBdZBi8t7Ltz==qWWhܡީ/!:s^PtxpD>>"$:|dEpc%f2_5Qy,Q'6&( e3 ͠[0`M1X)6hmєh+_kʲGCm?;UβAj0, &`׃$2ד̺.BG,=:&w:BߚCt(]H`2؃QFyS`=־Y^y.9 84JKJ9K͔e-r8 áEG@SN@qMz%w*#:i䊫#YQdQd1ÆY^/.̅^Ά08{Hֻe`(_ .,p6E$0%0rVApXR8W#62kptbH). .̃06{яK{'` O-V}g6fLεbiyxC6Cz-72mmgR|b7SՉڡgf7 3\iyĜB{ļhDߡoMHou_Y4㸫Î4ҙ&5:Tׄ  _ϝ_U}+1oɻͲ˽E'ݧ8yzܩJ/wԫ_*X %~oaVe_9Vk}O)3WNgMZ4]bQ)l{v1ZlM?FpMۂn =(7b1Q6;Ec0`I Co6X@8Xk!?Ć r >+3;9L~(PhCSPxb&^l-*^mٮN|l]b}|.| } Clhp9`!Ȣ9Dφ>xͥ6mذ }k7AxQ[0E9ȑˌ1X+^cevFûvЍŽZ^&o\wQvx|Wqinw`^ԙPxБ<ӞL{3L 1N#D}293K5T#|N]!jh?~js'aBCV$eG, dgա"ŢɵDX>l6fp誙j6F_͠ӤZ9hC }K ͂x4CévxitBK/}y VRV֙\lm_"͏47[ n o`j(?v!m,}T#Fzׁ<"_q~ QZR;vݫ=wz|/M7n1ڑ:S&o@΃zm5^p^ "FJKjJN~W!'dUXMwd1t~N9.i.>[wL/,DDqy@]tSCĿX}(Wt*&u>CJ}u8g$ZuǍ[{qT'qHp>A|q5L1\B)!L :Y`Xqts=No$z~Z37-`bH*H-B`fcUm췟:<_(j-nz\8#7e kM!`jq\PARG/ 1~=6Ənk:wD~h5PGʮNA|Uz0}r0j} oՃϝC VedP@9_+{$٣j1 mm h:zX)t2mWj5*4P4m,,Ch1_eИC#ׯMCXQr`́NlFsɦA7ltih: H/MiϦAO ±hK6A8mkJ; g8`4}TX95n *t{qnP.bp'%6eGJ\~t>[*TǔHH;gzpJCsd4GdU{y6C)3}7Vpb* ?ZFXώAd3..]L 3֊?P#P"X˥xDV6Եum5İOTffhS|mF}:V6p1;򘝉244JGs64pDP{P{~8~0X9O pv[S a}hf".ݰ{{JEemz;ޢԎEKj:rL!n8N>.+9\GH@)c4nnuQ!>P6xyW[Jx*[DzzT同Iפ5$ѷo~ y o,/DT^AG% Z:o2']jUsrpz?%mggNrJCrQH~4㏡#N.IT?tX?duvhnk@#mc(`+^FW6ژ+,&M 4Ef8'@hD𶀢J *|@%Uqa#ڰ]]~suՒ`y7 퉈^T"f}rc"| l$$&0j qLA6<ǏUA6<&qh}[ݲi :c$=8烥F!qջÝɂI%F* y7mzPq"*>,&biv?ut;x+bh9qқMC\KR8HYn`0*5M zT$ y%&Q%*A%HLLMV}{jҪ\}-Q4)flb4_-D7@k%m|KN !%8W629/Ne..U] xU$А( Aa 0$rNE LTZTD6MEQ oF |舎>}2sNp}|9Ut{vgO+ g,ܿ Αc_9:7(n~͐Dp [%c|e^VˡZ(3$p C!TCMsF; ]d8\ D"3ᢄ L]D̜\`<`6lD hLi$n!z93 gWw! I""^J8DR,)B!K2'"dIYR, C"dE=dT<!{ȼx(BP!Ӓp%-Nxx;*>]W*n?w2 tX~gekWzv= J:Պ2 C̃<3yU4=LPϿVqu#;w{:#RN}W'RDR̉HlK^J%')ܓhptvDqiDO3wK9h1!E N,QaT k~ePIˑTC()pC)}IeT2)iIy(, gC[hA?Fq1&EQ@ yL`N#<44Nf(. ]@I Abt*Tyg8&P:R8vc!̀7*%[)=ADG9> QNrBޣ(' ~9a< $|=N%:|/)JtZ%Z%UJ`L[}c,}DsݺݺNlWnk g8~عg,g<Wo았dMAV#dh{Znoe/̢uGh:\c ++\\9岭~2mv?xodH냷nOD ?j'9kZC]k5"t5!va t-^ +4zx=shO:QSR::$c է6ۧdd!g h}u?CqV=Yzf෴ Tǒ⍧hOSQp=9{qpJvV;K՛8*7cG`62(_d" r"o2ދSE%#>#[͗=_j4FV1cY>f{*ᬈ-d~>El8sɦЖkMZ%dϜ`l'ڋM4"OaSs 0;1%.>_0jv/3Ho :T߼ј7jK '@vXv"a o׊>!k,f.` {l&/gY<+7bY>ܘe1sV^}gc8g6;㬚Mfi@wЌwk)ŧ=_MjDT_d|w7cP3Osx O啼f,<,3r!ܻdMLxK__+ _Uʰ}ʿ f/jc4ceahʖl's٭w0o2wֆu21vap5;M~]"FEi _Mow4R75R@?-0ޟW|*yIJ.Xww缍& ;?{;j!Le쏬/$xF 8ĺZkmXeb8(7{~/H)rlM$uiY}8,F; ˣ19Or+'Id&kN_M4U^WSe̓nnZ:. ΂~=]d"{~Q+ڟh%HFHdD?ڏg?)slQO?EG:oNu? $ .cm d=@&*loca)JTU7$maxpo$ nameI Dgpostl*r &Aprepň+S6FL_< {{Y?646  0qr<B4B4}dHL 4` FXO[CzqkN*0&'&&5MPjh/*\UrzmP?cFwD}X=XXX=XL]~{XlX?X{=KX=XF5_9!! A;XdBdddd\fi$OOdO&ThXqaXXvPPODOF{1PPgvTcPjd|djddddrd@'~d+ddb.dFdDdZddjddddVdd4dpd dFddxddd=XXXXL]L]ZXzX{={={={={=d=_9_9_9_9;XJnLnLiLghlOAf$OdOZ?r?zGdq) qTO??GGjdOPPdd/hg {f=?=G=$O=?XIOOXzGXzGXjOXzOXr?=c=c=h=cXXz!ip gN]tL]~P']q!~{XXQlXXlXdfXXlXX&kXPXPXLR)XR{=G{=G{=G =3OXPXSXTFFqF~hFq53P5P5P_9q_9d_9d_9P_9d_9P!v;;XcPXcPXgTTiPXi}XB=OP MUXORl~5J=! XazXJk!]aP{==IO=xOP4XlfiZPIKZQ D9EPw`al!X]PlHKICdzo&?|ddjdd sX zd OX[dX XdjP]gZX ){=G_9d_9Q_9q_9d_9qtfh]gAf3={=c{XX=O=GMb }X zd O=cXcSXPlOAf=OlOgXr?XzG;g{=G{=GXTXq_9Q_9qF{53PSXXIdOl?lXrPBLXdO{=M{=M{=O{=G;fi PrPpfkO;O=$O}X7{CP_55X[XdOq)=pOBz-2Og8OI=P"OOoOOflfeeOMKdKOW#XLL,)*Qr/iRX|dfPWPP:QOOOXOX|0=QY 7Q={5hf b1-ePFiPETpPPSIOjXd423NqQ5PO^QQOBAbOOOEPP@PT&X^XL O ddddd#dddd)dsdd0dddd:d:d7d7d%d$dZdZd:d<;E:d<EddddllXdYddddzddJdddddGdddddddddd$dddZdZddddd$ddQdddddddddUR@E|9^:GudSEF4"0R4lbpzh^6O(u&e|_ |-4,''#&/'\-'<e@PP)d)de@dJ_2UJ_wfydH]M  I H^Fceccc{ELh{c'cGe{EdKcrS3S Q Ab ^P@(T nVU_eVnV<=-VVZ52Q<g<(P7<VUFVLV^_{RZQRVF)KO)QtTQTz(V VVrQVQgVTVRddFPPhdVZLVZdAeFxP$Pd^d/P^P0V[cQVUU'KQ##|(ZQZeeRdHZViX(FdRhee3 eeeeB,e p<a\ddgd,,eHdReHR3 d>e =d =dRddH ivV8d$ZTddbU dedd@d@aPdSAUAK$UgdY@Ad-A-A2A"AJ_e@ddUdU-(Td$U{e~cdd!Wad@F dP'Fid  Ji AbF( iF{((2 <{HUK K H9U_U H (FUdPn6Ndd@d;dKeJdd<T(bdd d da\eddd d[dg<(|2FeSAe}AdPH'UH$URd;  ;  >@RR d ddW<<<<Lj p< ddsd,Pd+aeSA,dc\V\VAVedU]t\ p< da\erSLdd@dd@{HUUQUHJ_3 3 3  deTddAT>@ >@}UUUUF_XFp_dd ;d}A`HFRpRXd=P2222eJ3F,2HU v gdaL22d%AdAdWj < ><odP,P|<2KF}F<-dFdK-FMP<M<FF7K(Y<FKFFDMF<dF_F6(ZaF3ZMQ d{HPddd<KdZq_]ZZ_]H_^F']Z&_Z^kZW2"P<Z2P_%2ZFZZVZXPdQ$ZX|<U:FZded!d!ddeDdd$d<ddJdFd<dd,ddF<FdddZd>dWdZdPHZP ddFDPP|dZddd]]]EZ]dZdd2]]22]5_5db]^]Zq]dddRZ_Zi]`Vnn?d"](P(:ndeZd BFhP]FZn]g]ddZPUPPPPPP|P}PPPPPPPPPPtP<PPPPPPPPPPTP|PHP|PPP|PPpPPPPfPDPPPP|PPPPwPFPPePPPPPxPPwP>PP-PPPTP:PDP=PPPPPPPPPPPPPPPPzPPQPDPPFPUjOYQPIQIQP|OPg)}PdPe/.$jatt^fXiXiXi=$OX?XOXOXOXOXydXzGXtOXzUXMX&T=cXXXXXXXXXXn{XX{XX{XXlXdlXlXlX ?vP?vP?vPXPXPXPXP{=G{=G{=G{=GKXFKXFXPXSXtX#SFiF{FiFqF5)Q53P5i:5$:_9P_9P_9P_9q_9Q!z!g!v!v!s!v!v AT A:;XgTXcPXcPXO>v\fT &&:.M\fBLLgJggJggghgXdOXjOXqX?XX~GX\GX\GL]qL]t{=O{=O{=?{={=?{=G{=?=9?=IO=IO=AG=IO_9P_9P9EP9EP9EP9Yd9EP;;};;X)abIU''AddZd dd>~>d>d>d~ddddd*ddddddd d)dudd7ddd:dddd ddBdBdd}d$d`dddddd0ddZZ&&>dBd&&xdjdBdddddd]+d)d]]3ddddddddeddddd ddpdddddddddeddddddddddd dd0d ddGd5dRddDddgdd d\dldddIdd 5dkddddddUdd-dd/d=d7dZdEd|d|dCd1dd|d|dFddddddhdddd}ddddd @ddd,dWdddd)d"dddddd%dddd >{Xd<dd^ddd ddOdHdiddUddpdNdAddsdddXdXdd dddddoddhdTdH"sd`d`dd`d`dzdzdzddddcddd`d`ddd`dKMK K jK`F +F hFF -KF 4F qFlLVL mFFFFFF F xF.FFF Fk$ZZvb dd dB=PQddd d`d*HJ:+dd+dd+dddddd+d+d+d+d+dd+dd+d+d+dd+ddd+d+d+d+d+d+djdddddd+dddd+dkdkd+d+dEdEd+d+dEdEd+dd+d+dd+d~d+d+d+dd+d+d#d+d#dd#d>d>d>d>d+d+d+d+ddd+d6d+d6d+d+d+d"d+d"d"d"d"d"d"d"d+d+d+d"d+dd+d+d+d+d+d+d+d+d+d+d8ddmdHdHdd^d^dddOdddOdtdddd2dzdjd`d`dd*dddddddddd|d*dd*ddddd dd xd dd xd d d dddd5d2d]ddddddzd ddddcdddddddddddd2d2f2d2ddd2djddjdjdjdwdfd2djd2d2d2djdjdjdjdjd2d2dMdMdndddYdYdjdjdYdYd]fYdYdYdYdYdddddddddddddddUdYddddddddDdEddddddddddddddddddqdqd}d d2d[dXd~dd2d[d~dddddddMdMd0dddddddlddddddBdgddddddddddddddIddd{dAdAdrdrdqdqdddddDdEdDdEdydydddddddddededNddOddfOdddddOddOd9d#dd%dddddFdXdXdXdXddddd ddMdd:ddOddvdD2Md=dRdRdRdRdd(dddd^dddBdddddddddddddd^ddddddddd.dxdddddddrddddddddrddddddxddddddqdqdd4d4d4ddddmddQdd@djdEdEddd%d%dEddMdMdd'd'd'd'dqd'dMdGddTTTTTTTX'd'd'd'd'd'd'd'd'd'dwdwd'd'dwdwd'd'd'd'dwdwd'd'dwdwd'd'd'd'dwdwd'd'dwdwd'd'd'd'd'dddMd\dMddMdMdMdMdMdMdMdddd'd'd'dddddMdMd'd'd'd'dd'd'd'd'd'd'd'd'dd'd'd'd'dMdMdMdMd'd'd'd^d^ddd'd'ddddZdddddMddddd td d'd'd'dddvd'd'd'd'ddddoddodbd'dddd/dtddd'd:d'dd)dMdMd'd'd'd'd'd'd'd'ddMddMd'dPdPddddzdddddd ddddwddRdd'ddGd-dddd<ddPdddd<d dPdddddddddddZddd^ddd/ddMd d dd ddddddMdMdMdd'd'd'd'd'd'dMdMdMdMd'd'd'd'd'd'd1d1dddddMdVdad'dMddddfdfdOd\dddd@dAd`dd*d.d.ddd$d dPd]dd8dduddddKdududdMdMd'dudududud ddddd'd'd'd'ddcddddMddMddMdMddd'dwdd'd'd 5dd'dddldldldldNdd]d'dd'd'd'ddddddd'd>ddddddtd'dddddddd'd'd'd3dAdd(d,ddtd#dld<d?d^ddd!dd'd'd'd'dd8dgd'd]d'd'd'd'd'd'ddnd'dndndndndndddd'd'd'dod'd'd'd'ddddddd'd'ddddd'd'dd'd'ddd&dedjdjdjddd,d'd,dCddd'd'dXdXd'dXdTd(d(d'd'dd'dvdvdsdsdddddsdsdddsdsdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdd&d&d&dd'dd'd8d'd'd'dkdEdbdbd'd'd'dd;d d d'd'd'd'd dd dd'dCddJdd'dd'd#d'd'd'd\dd>d>ddddjdjddddd.ddddIdIddddod2d<dddddd0d0dd8dd'd'dd+ddd ddKdLd\dOdz\Quda\fNPXXX2P`=?9K!,O O{ONLddFZXPV-PUf@PY(_U'<V_Z,,V# #XVJV;R<\VVZ^VZ<P KHV(ZZ.Z_VQdYZFc\ddd8dYdddddddddddddYdYdddddgddd|Fddjddd dXX5PQFf f Sff*f=fB=PizQ{XXz/6^+Q+z)bxM=O =OKXDGu+l$=O=JOa5mdFe!g!}Ez-N%z8 S?3SF @2U`dOX sPPPQtPh`?/`"D}atmMqShSDO9zfZddjdJoF}5/dXP.HO,X5dW5~:`SZ4 =OTdd d8QNdZddLd xd*dRdGddd%ddddd4d9dad W WZZZ{WEd'IqNrU  S=d*dNdd Pd dddd ddFTqTTTTTL{d &d >dd dd, \, x~XY?Nw/V_?  "5ky ' _ q !""#5#####%%% %%%%%$%,%4%<%l%%%%%'''))))))))))))*+,f,v,-%-'--...../.@0L)We H  YZBPz1Ya?   5ky  0 p t !!""#{####%%% %%%%%$%,%4%<%P%%%%%%''))))))))))))*+,`,g,w--'--.. ....>0L&0WeG 0/ ih65/,+"JE߿feeeeeeb6b)-z-TXN?T ' +,  ~boXIYYZ?BNPw z39@AUN/1VY_a 35??89_`a     "55kkyy   '" 0 _: p qj t l  !!!"?""?"#5#{# ## ## ## ## %% ,%% -% % .%% /%% 0%% 1%% 2%$%$ 3%,%, 4%4%4 5%<%< 6%P%l 7%% T%% U%% V%% W%% X%' \'' '' )) )) ))h)) )) )) )) )) )) )) )) )) ** ++ ,`,f ,g,gT,h,h,i,p ,q,q',r,t ,u,v+,w, --% -'-' ---- .. . . .. .. ../ .>.@ 00 LL &) 0  x }  WW ee  GH      ""    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a2qdei4wokuj r  gvrl{cnQm|8b%&./*+ 8fCD 3,0:py, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcEEX!%YR[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #BEX CEc C`Ec*! C +0%&QX`PaRYX#Y!Y @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`++"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-),# bfc`KTX# .]!!Y-*,# bfc`KTX# .q!!Y-+,# bfc&`KTX# .r!!Y-, +ETX#B E #B #`B `aBB`++"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*!-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,#B%%G#G#a C+e.# <8-9,#B%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:,#B & .G#G#a#<8-;,#B #B F#G+#a8-<,#B%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=,#B C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FCXPRYX +-o,:+?+-p,:+@+-q,:+>+-r,:+?+-s,:+@+-t,;+..+-u,;+>+-v,;+?+-w,;+@+-x,;+>+-y,;+?+-z,;+@+-{,<+..+-|,<+>+-},<+?+-~,<+@+-,<+>+-,<+?+-,<+@+-,=+..+-,=+>+-,=+?+-,=+@+-,=+>+-,=+?+-,=+@+-, EX!#!YB+e$PxEX0Y-KRXYcpBr^J:&*B@yeQA-*B@o[I7$* B  *B@@@@@@ *D$QX@XdD&QX@cTXDYYYY@{gSC/ *DdDDaa 44aaA4A4ff4'4aa44EE.VF+ 4$VF! 4YYzyj4imj4Ld4d 8|8 (  , |4pT<lT(4\| D !"P$%&l''\''( (\())**+\,(-.../0X123 345h667789:;8;< <=(=(=>@ @AA@BHBxCDDDFG<GGHI8IdItJ@J`JK$KKL$LPL|MXM|MMMN NDP0PHPlPPPQQ4QXQQQQR RDRhRRSSSTTTTxU@VV(VLVpVVVWXX$XHXlXXXY Y8Y\YYYYZZDZpZZZ[[4[X\\@\d\\\\]]<]`]]]^^$^H^l^^^^_ _D_p___``,`P`t```aa8adaabcc$cHclccccddHddde$eHelefgg8g\ggggh h8h\hhhhii(iHjpk8kdkkkkl nTo4oXo|ooop p0pTpxppppqq8qPqtqqqrr(rLrprrrss$s<s`ssssttLtptttuu,uv w`xtyxzzz{|}~LT8l8@H8 ,(tLDTl4Lx8\4|T(l< 8d<`8Ph<`@l 0T Lp4`4X|<8t0\ XXH 8dĈİx\,X|ɨlX˄˨ HhdtL8Ѽ$xd$D$4ٰpڈڨHT$@Ld 0T84Hh$D(8(@X,D44L@lT X  d    P    4 D T t    ( ` `| \H X8<,p ,$P|p |\p(P(<Xt<\<  p !$!!""D"d"""##h##$$<$\$|$$$%%@%|%%%&&''@''((,(\()))**+l,(,,,--$-D-d----..//<//00 0|012(23@34`5567889:h;P<`<<=>??@@@@l@@@@AA$AHAlAAABBDBTBdCChCxCCCCCD`DpDEEEEFFGLHTHdIJlJJJKK<K`KLxM\MNOPxQ RRhS4STUUVLWTWXlYYZT[[\`]],]X]|]]^_`|aabbcdedf@gLghij$kl<m,n n@oPoq4rxrrt8uvwxy yzz{{${|P}}}}x$ DhxPph< 0@(8H ,PhDhtpL\|hp$4DTd|tH@dt8PtTl( L($P Dh€tŨ<ȼxʐ,ˌ̸άLpӔԌDp՜d4X|,xtݘݼ޴( 4(P$H8\LL$T<l 0T,4Dh<`0h<pHlLp  |     4 X | \H@ xL "\#$&()))))*(*L,<-x/80112235545`6809,9D9:8:;8;<0<<=>>>?@@@ABBCCCDDEhEF`FFG|GGHI,I<IIJJJJK K@KKL`LM@MdMN,NxNOOPhPQ4QR R0RS(STHTU0UUV,VW\WWXDXY8YHYtZZZ[|[\\4]_`8`\`alabccdLde`efgdhhi4ijkklDmmnno op$pqr rsttttuvvwxxpxyzDz{,{|h|}0~~@l8\|ltL0@P Tt44@l|X \ \4(xPp<phXPd\ X@8<<@<dH$XXh\lDh4 <4pư\ʨTD̨@TT`4XԄԨH`xդ<h֌֤ \א8\؀ؘHt٘ټPtژڼ(p۴ Dpܜ \݈ݴ Dpޔ޸,PtߠH|<x 0\T8\<xDh,XH|4Lp$\ Lp$Hl$X|(0@d8l<p @tDx 0TxP T(LpDxH|,Pt(Lp0Tl,Pt(l$X<X,XP8 p , < T t    ( X H`Xx<DtpHHh`@0|x  X !p!!!!""0"P"p""""##0#P$0$%4&H' '()X**+l,,|.t/0|0002244<4566(6\:t<8===>>?AHAB(CETEFGHI|JJ4K KLLLLM|NOHPPPQRLS0STU@UdVHWWXYZ[\^_`labpbcccddddefggphXiTitj4jkDkll`lmo0opdpq|r rtrrrsthuuvvwyzz{{{|,|X|||}}4}`}}}~~<~T~d~|~~~~~$<Ld8\l 0@d4(80Pp0l8hX<|4l`ht@tL$dl0X@ h@|$Tt\0| D pPHT`XTH0 \\(l8\,X@dd $<h040$Lx4t88P|,X8X˜È,|(ň<hƔȴ$`ʔ$dˤ4Lp̸̔@p͜ Lxψ$PtИ8\р8ӌӰ$HtԠHtPܘ\ݸhDpߜLHt8X$dD|$p @H Dt$($Tl(Ll@d@lX | 8p$dP8`8h0H48p(TdtlXL| 8(XTx$   l ! !X!x"\#X$ $%%|%%&<&'''((0(h())<)**T*+P+|++,,D,,-0@257 77,7<7L7778@889 949\999::0:\:::;$;X;;;<4,>d>>?(?`??@ @l@@AA(ALApAAD|HlJ$JDJxJKKKM`N NQQQRRDRdRRRSSDShSSSTT8TXTTTUU4UTUUUUV$VLVVWxWX0Z[\H\\]`]^,^__0_`_`,``a$a\aabb\b|bbbc,c\cccd4dddedeefDfggh4hhiiDitiiijk klDutxxyTyzz{|l|}@@ LX4LD@<84(pH  T$h8`dPDtȬ˘0XҌXTh`0hِژ8ۄ<܀h0(HXxT$XxPP ht``T  $`t\L`<`,84p "`"$&(,*8+,/p8T:$:p:;P;?@$B$BxC CDDEHEF\FG@GHHHIJK$KLLLM\MNN`NOP\Q<QtRST$U,UVPWlWXXYPYZD[[\\\^_`bc0deef gi jl m(nnopXppq<qqrprs4ssttxuutv$vwx|yz4z{| ||}t~~(t8 8X0<(8 ,hL$(Àà@ĈD|,DɈ,Xʈʸ@l̰`$ϜDєH@ԨՌ4؄لlL۴Lp$TX<@hL8$t4`@\X8H40H`(tp$H@(d0,XPhH| @@xx p     $ T,`(XLh| DTLl \ (  !\!"""##4#T&','\(L(())4)**d*++T+,X,p,,,,-T.T.d.t//00\101@22<3,4456789;p7.'@⪒&2*@ 2 (Zh!OO!"NN"^V"J0&ЀZpX(B&xzbN"!OO!"N!5@ JGK/PX@ [L@ tY(! +#"&54654632.'>B*0& *ZB0RXRX2<2LTN>*4*4((l #)/8@5/*%$#  J_\L +3.'#7.547.5467>54~\Bp8ƪĪ`"\°ʦnP`PZ^F,@NFvBnV0>F|> rtN|^Bx>q$,W@THGg  g _[K_TL&%*(%,&, $$  +'2#"&546"3252#"&546"325ppVqv}qv}0V.«çWD«çWDk8>@3/&;7) JK PX@'~|_[K`TLK PX@'~|_SK`TL@'~|_[K`TLYY@ #"(#$ +674&#.'36#"&'%&'4632674&#'327367"^Ex/tSfy dtŶ>OK^J6ssrseh~eF&q[dZj[ %raMaF~mf6>8 7iNr0+7 t^4^@ 0+>"3T0h@ 0+'7h>>V&:G)V' a@ JGK$PX@~c^L@~|W_OY(#'! +6327#"'#"'&547%632%&l<*2B>4\8|`RL^H|F.ZH@BTV&p&m7@4JH GU]M +573#'5#'7&5m"+w$h"0h$&r&> 0+%'654&'>7;Y% &jQOuKo{l:'WW,5Z@JU]M +!'7!"$b*h&rMF0+.'> 'YY' &[[&FY' &[[& 'YP} @UL + #* rH @g_\L$$$" +4#"3>%#"32/a[eE]_fDż9[Yj&@# J HTL' +35>74&#'6$7&#"c(6^6>ULQ( J[UL !2@/ J~g]TL%#$& +)'54&##"'4672!267]JNG4>몰n7?2@/Zp!#K[ mQUK"&D@AJ~ggW_O#%"#" +%#&'7$!'$5&##"'>32( 1շ\i cI bp]& hg.@+ JHG_TL# +)'27!5673&+(GYsn0.%KEQi&Ei ,=&@ " JHK PX@'pggW`P@(~ggW`PY@ $#%$#" + 463264&#"'327"'6726Q@Eky&?d&n(  9[;dP+A$ (< $7@4  Jg_[K_\L%$$"$$ +32654&#"'632#"!2&#fuoc~hwl:!񚇔!QLA]$ \$@! JU]M +!'654'!ڔzN! /(>|a]  T-o  '%@"J_[K_\L((($ +32654'#"$54%$54$32654&#"MtiLD7 }c[~luiا}vر6kVolM$z ":@7 JggW_O%$$"$" +&#"32#"&5432!"&54736pevrgv^j|.W␅ NB[%r r#%~%~3+3+m#EG 3+?{ 0+'7 SS[V%w%{cT"..3+3+wz 0+7'7-wS#R$V%w%zDf+Y@J($ GKPX@~_[L@~W_OY#$%& +#"'45&##&54632.'>f2$V#0&̒b 'YY' &[[&o@:%2BXY' &[[& 'Y :@: 9 /JKPX@*  gggc_UL@0 g  gggW_OY@86#$$#$$%$! +&#"327>5! !2%! ! #"&5#"&54327l"z%2|}wB1x4oQрjKWO6 =#BzyBUZv_X M |wjg =T+@(J_[K_\L$%$' +.#"3 # !2]ɭ)~SXe=P)+(aD?X#C@@#J H~p]SK^TL" R +35265432$3 !"$#"732!"X11qaW2qQttuHZoZ {p=X2N@K$#JHppe^SK]TLE",!60 +3 7.#"3>754'&+3267$'"52674&#kNF>T5Fp_PR81U_ѩ6Z>!lȑ-t Zg#WiX.=<@9* JG ] SK_TL;:91aQ" + 3&#"4'3&#"526543267"65432767""waXfsQ<|d2i{59mk.,vp<(D#C4'Z OlPUZ ZթTZZQ&Z ZX _@ JHK/PX@p]SK^TL@~]SK^TLY@ E31 +327"3 67$! 527674&#oxuh?>."Y>!|:e ZprEk Z14wn?=p@ 2#J6HKPX@ ] SKTK]TL@#~ ] SK]TLY@:754AAC + 5327"3&#"567654#&'3&#"52674327@e@lFn%iPi:N6qS+fG ^8i~e@OH;R Z;Qe>=Z Z0 tEENgCZ ZMSN9Z #lX{3[JK$PX@]SK]TL@]SK]TKTLY@ AA@ +327&'.#5327"#&'3&#"5267654&#ZB=R  <`DSN9b :`F9[? ?y LhS.,Z Z$#0taaQ+tN.$Z Z&&`]M= (@%_[K_\L   + ! #"32#DViYY0; M(X )9@6) Jp|]SK]TLaA& +7>54&#"3&#"5265.#532632&']uq@[2y_1B\a[xY[$+_\Z Zl}cQ;W  = 5H@E!/J~g_[K_\K_XL!!&!%$" +#"32$'&! 2367#"#&'47>76%:ɶ,UX֦'-R`Me_6F9[%+N*D/FL8-H*FwKXMb4< !&X0J@G%#Jp~~^SK]TK\L"qa# +65!"3.#"5265432633"!'-+G$QYLIJ/lFLUN Z(4#e81$Z Z5i=5M!FOqK PX@LA?) J9IKPX@LA?)J9IKPX@LA?) J9IKPX@LA?)J9I@LA?) J9IYYYYK PX@   p ] SKTLKPX@ ] SKTLKPX@   p ] SKTLKPX@ ] SKTLK)PX@   p ] SKTL@   p ] SLYYYYY@HGGOHOFE84Aa@ +32763227"54&'5327"#4&&'#4&.#536767&'.#"654sU+%-]HzZN:NVGHL?NAXBp3Io#32/ W=9B%JC2 * ZD81(Z ZH0 #(1Z  Z$4#e秡eM#e!,DA=A@>9) JH _SK ] TL=<6540A"0 +327"7654#5327"3&#"5654'3&#"5267 .#w-vmWWcXQMM^01KBarz:կY%IDHW]?U;ZEZ.у4.Z Z2B<1Z Z,)W@8 Z ZDRYKm/7@4+ JH_SK]TLA"@ +327">54#5327"3&#"5267.#pR|#ש<#pHKWBFJ5t#;)bJ Z7;@z-qK =Z ZHkzWxMZ ZMt9)NgXB(@% J]SK]TL$E$@ +!27! 67&! '67!"'6f)BhQ'1+\F/Jf#\5 T9`b \;Dd@ (@%JeU]M +!!!!(,& t$vd@0+'7X.<2 :d@ 2@/JeU]M  +'7!!'7!,&.($vZ&trd60+''7~&v"B|FvFfX~ dD@U]M +D!5!|d.0+&'?BscU'T3 f\ )%#"'#"&54$54&#"#"'4672323276&h pj54&#"'672!"'4#567;>muvfΊ [ ѤeP5P(fwiO&@# J_^K_\L$%$" +%#"54! .#3283T&ny| r`.\H^ѐO7 #@@= "JH#G_VK_\L$##! +&#27#"54324#567=LIas*^xfN]1/$.=P[m_e9FQ=O(@%J_^K_\L&$## +327!"543 %654&#"\yEK*iYjAZӣ6 .$C!^[XTv!d JKPX@"_UK]VK]TL@ g]VK]TLY@ A# +7354$32&#7'3&#"5265@d`~ vz.*h\Lm+6TFf4 jRZ ZVdh% >@,6!JKPX@3  g_^K_VK _\K_ XLK$PX@1  g  g_^K_VK_ XLK/PX@/g  g  g_^K_ XL@,g  g  g c_^LYYY@ ;:53/.+)'% > >  +2654&#""&54732654!"&547&54632367##"'nKlQ_Tg ?VTwۺq}#V %:N2 Hmg{v|`hYqZ+;;IGqLJcpŚFC]y 5+XB'C@@$J" H G_^K_TL&"#" +3&#"527&#"3&#"527ȷ632Ot_^w\nu_^vhҗ|K;SZ ZS;SZ ZS)P(iqR#Y! 3+a#C3+3+X81p@.*&# J HGK+PX@_VK_TL@g_TLY@ """ + 3&#"54'&3&#"5254#5677654327"`uwJW :Lo[YqcǐF;oonovgZ :$+T9JOZ ZO1P'c}\P[ Z{X/A%@" HG_TL! +!&#"5254#5673/]\tfĔr ZR/P(f_KRP?KPX@:6'J8H/+ G@:6' J8H/+ GYKPX@ _ ^K _ TL@&  ~_ ^K _ TLY@=;5410.,*)#"#"! +6323&#"527&#"3&#"527&#"3&#"527ȷ632ht_^w_u t_^w\nu_^vhҗhJ@;SZ ZS@>R;SZ ZS;SZ ZSP(i@HP'KPX@$ J"H G@$ J"H GYKPX@_^K_TL@!~_^K_TLY@ &"#" +3&#"527&#"3&#"527ȷ6323t_^w\nu_^vhҗhK;SZ ZS;SZ ZSP(i@O: @_^K_\L$$$" +#"54324&#"326: R[Pi~׽?Dn+S@P!  JHG~_^K_\K_XL$%$(" +%3&#"5274#567>32#"&32654&#R\oeQomp4%K,E/?XZ ZCNP#P@0-::!*4Or"F@C J HG_^K_\K_XL$$"$! +%#"&5432573&#"525&#"32g\H~:^Bbv.C:XZ ZX!%ϲҹF(i@JHGK"PX@~_^K_TL@~g_TLY@ $'" +3&#"5254#56732&#lXWna<-sFbNZZN(P&az[|#*u{.=@:J~_^K_\L%'! +'4'732654$54632&#"#k W<7U ȕk%JFغ`Z Z 1?Z ZK-NNZZ )x0&ZZIr)3@0$ JH]VK_XL%&21 +327"54#5327"#.'673267\0ftjHV,nJ=IudRa\Ke|,)]Z Z<.@6Z ZTb5O=2&A^P!4@1 JHG]VK]TL&E51 +3!2763>7&#!'67#"'6]{hU"@|XR. wwvv$?|[ET( V+Cd4 Z$ CTd OJK$PX@c_UL@gW_OY@  +"&=4&'5>=46nRffRnllBf "℞f@Ƽ|P~Ɣdl0+'7..> : d  G JK$PX@c_UL@gW_OY  +32+5>=467.=4&'d nn pRddRpƺ~P|Ɣ@f""₞fdxj8dD@-JHGWg_O!#!! +D#"$#"'32327jRTqVjXTxN5[XJDr:@ (!JK-PX@8~~   ~e_[K _  \ L@<~~   ~e_[K TK _ \ LY@421/.,!%$3$ +7&54$32#"'654&#"%'63227#"$#"#"&54$54j+ Ί w dE`{:  O>VGU;rT_Vr=]uts`\t\W( I2UL:Ef[)NGd2'B@? JH GgW_O$-,! +6327'#"''7&547'74&#"326ll^PP^pl\PP\xxzzfRR\jj\RR\jj\vxx'w"<  3+3+3+dV  0+'7'7./+1< < >$ >$d'1p@-JKPX@!~|c_UL@'~|gW_OY@ !+!$ +#"$56732654547&54632&#"654$e޺_uiJXZׯw&DO8M=Kw-ifiecH!z^|oIXR=8Tf.3\wdW#3+3+bPy:]dD@R/.#"J gggW_O:842-+'%  +D2#"'&547>"3254&.#"327#"&54632ZVcϕoJq9=WI]eu_y96&l\ƔkysGpΗҴXcF 8S EBumwzN@-d )/@)!-JKPX@$~gb_L@*~ggU^NY@ &$#"'"" +#"'#"&54$54&#"#"'467232'327!'7! z@[iDC\K*2J @{bW#&5A #!9GD@[=oO3.^76GJX/"0%KHd#CCd~%@"JGU]M +%'!'7!~$J$4 (H$ "v ZHy.@L!dDK-PX@ #!(J@ #!(JYK PX@<~p    gg g W _ OK-PX@=~~    gg g W _ O@D~~~    gg g W _ OYY@BA0/HFALBL97/@0@"bA3 +D65&#"3&#"5265432633"#'2#"'&547>"3254&}Gq5KBAL717:]b<-*4+W71VcϕoJq=;dt=::%9R1:l+"% !sGpΗҴXcFdWF&dD@JU]M +D!'7!W$"d9 *dD@gW_O$$$  +D32#"&54$#"32654cbdc34HJ22KbccbH34IK23dx#>/3+3+dz1!5@2 J~_{K]|L%#$& +!'>54&##"'46723267!Up!Y/*xzY`F/z.˓I)0@13]FJ~|c_{L#%#" +#&'7674#'65&##"'>32#=kqj`Lx ^O9c]fG [ebKKzG$bbT =>S^I2]gd-0+7'bqB43V&VndV"+K@H+&   JGp~  g^SKTL*(t$ +!&##"5265#"&'>32;27"3"327VZa:RJ xPFz`F6tJ z$$F\*FDXvԐd.u/ /3+d dD@ Gt +D3'654'*f^(rNNdV dy &@# J H|L +5>754&#'>7&#"uZ, .&x%Xgcby>@L$  >-1>I8>d XJKPX@ga_L@ ggU]MY@ $$$" +#"&546324&#"326!'7!tF%*BF%1;'.wjilky^maxH Gd#DDd|F6"z"NJ| 3+d.6"z"Nzq 3+d|I6"t"NM| 3+d+U@J($ HK'PX@_XL@W_OY#$%& +454'6323654'63#"&.'>7dt2$V0&̒ 'YY' &[[&Go@:t2BXY' &[[& 'Y&$C ̰3+&$u ΰ3+k&$X 3+p&$ ڰ3+n&$j#3+3+3+"$z z3+aM@H  %$JHK/PX@7  ppee^ SK ^ TLK1PX@8  ~pee^ SK ^ TL@9  ~~ee^ SK ^ TLYY@ KJBA@<;:32/.-'"  ML + !3 7.#"3>74'&+3267$!"526=!3&#"726765.'5HfT?F>T5Fp_PR81Ujѩ6Z>!fk|^q TJAee2J;I]&r7!1S A7umOÞ ZJq; Z Z1;Z=T"&yX&(Cd ΰ3+X&(u ʰ3+Xn&(B 3+Xn&(j3+3+3+]&,Cr ΰ3+]&,u ʰ3+Xh&, 3+n&,j3+3+3+z2"'"p װ3+X{l&1k ְ3+=&2Cs ʰ3+=&2u ʰ3+=n&2t 3+=l&2" ְ3+=n&2jC3+3+3+d* 0+7'577''d<"44""44='9@6! JH G_[K_\L)#)' +!"''7&5!2&#"632xSÑotDW|{okƾaPc7<AVe++9#&8Co ϰ3+9#&8uW ̰3+9#p&8 3+9#n&8j|3+3+3+m&<u  ˰3+X.:@7&H~g]SK]TL2A'$ +3 >7654&/3&#"527654'327"q9}^$^v_oyj棵_+eÝ [.+Z Z+6Y@g,KZ ZKJ2/6@3J_UKTK_\L%$*&" +#"'6532654$54$54&#"&#"5>5322TvL@F6B~pXdddn:RhШ Js v|48Ʋb~ظ Z,p,4̜PjLB&DC 3+LB&Du 3+LB&Dn 3+g]&DM 3+h^&Dj=3+3+OE<"D 3+f9N@K+!650/ J~_VK_VK_\L#$"$#'$'% +367%65.##"&56$54&'#"&546763 327!"\N/b(Zcx|vj9RXNP%,;hHXb"kwENDbJ=P$M%ZQvWnʐp@nVj .(SJKoz6O"FyO&HC[ 3+?&Hu 3+?&H 3+G&Hjd3+3+3+dl&;C 3+qR&!uV 3+)&< 3+&Wj3+3+q" \2  3+T&Qf 3+O:&RC 3+?*&Ru 3+?*&R 3+G2&R> 3+G2&Rj_3+3+3+dg2#n/?~3+3+O:+"RR  3+Pv&XC+ 3+Pv&Xu 3+d&X 3+d&Xjh3+3+3+V&\uL 3+/ 'A@> JH$#G_^K_\L$'$$! +%32654&#"4&#"'67632#"''765bj~jb 2 lXT2@6BjPPB"~jR:F82X&\js3+3+"$p 3+h^"Dp= ʰ3+c"$.1 13+g]"DY[ [3+="$' а3+fB"D**3+=T"&u ʰ3+?"Fu 3+=Tr"&s 3+G"Fq 3+=Ti"&3+3+O"F03+3+=Ta"& 3+?"F 3+Xa"'P 3+O8"Gz& &3+O7"G 3+X"(p 3+G"HpX ˰3+Xb"(0 03+G"Hg\ \3+Xd"(3+3+O"HC3+3+X"( а3+Oh"HPP3+Xa"( 3+?"H 3+=az"* 3+c "Js 3+=ad"*2 23+c "JE\ \3+=ag"*U3+3+h%"J3+3+= a"*I3+c "J*Ұ3+{3+X0r"+ 3+Xn"K  3+zyAEk@h@JHe  e]SK  ] T LBBBEBEDCAA?>;:95430/,+*&%$2A +&'327"!&'327"3#3&#"5265!3&#"5265#'7!5(o*?k iv*g"puY+9ZZ7(^R,?ZZ>*U"hZ ZhjZ Zr^"iB"Kp 3+Sw", 3+8"k 3+",p 3+`"wp3+`",. .3+"t 3+]0", а3+t"L 3+]e",3+3+P1% @ H]TL@ +!&'5254#56731quptfΔrZRP(f_gR]",-!3+3+q"LMH 3+~r"-3+3+"M 3+X.".g3+X 8"N3+QX-K PX@)% J@)%   JYK PX@._VK_VK _TK _\LK1PX@+_VK_VK_TK _\L@)g_VK_TK _\LYY@-+$%""" +%#"'3&#"5254#5327"273&#"32>ZnrXVu|BBvZ'E[>/6y'CZ ZCCZZC Z@[lݖX "/u ΰ3+X/"Ou ̰3+X  "/3+d ;A"O 3+X "/z33+X,t"Oz`b b3+X "/xT3+/3+XtA"OxPP3+/3+&>"/4 dA"Or 3+X{"1u  ΰ3+P"Qu 3+X{"1P "Q3+X{`"1 3+L"Q 3+)"zQI3+X{>m@ 9 JKPX@#]SK]TK _XL@  c]SK]TLY@<:'AAA +&'3&#"5267654327&'.#5327"#"&547276_ :`F9[? ?yB=R  <`DSN9|Q+qN.$Z Z&&`]MZ LhS.,Z Z$#0t!F[/ jER'5*H@E% JH~c_^K_TL%%&"! +&#"3&#"527ȷ632#"&5473268\nu_^vhҗhئxs;SZ ZST(i@;Gfy0="2kaa3+F3+G2"R3+F3+=`"2P. .3+G2"Rl[ [3+="2 3+G2"Rx 3+= >g@21JHK PX@-~ne] SK^TLKPX@(~e] SK]TLKPX@-~ne] SK^TLKPX@(~e] SK]TLKPX@-~ne] SK^TL@3p~ne] SK^TLYYYYY@ 84/,)'$# ><$" +#"323 7.#"2674'&+3267$#! !2ĺļN6< v|*h\Lr&ddL**Ff4 fjGZ ZVV6iB"E'p 3+PO >@*JKPX@8p~ pg]SK^K ^TL@9p|| pg]SK ^TLY@76is$13! +%3265!"532654&#"%"3&'46332672!"$#"527674'&FyHO=!BĐBT{ tNY.'_#~~w]s /d ą ` ZH8߀+X",@ #JKPX@2pppg^SK^TL@3p~pg^SK^TLY@ 3""11e +!"$#"5276743!#4'!"323265!"'_#~0heb0ezHP>) ZH8v]_n "~i &@ &JKPX@-pp^SK_VK_\L@.p~^SK_VK_\LY@ $#11%! +%3>54'&'"&'3!#4'!"672!"';>.9uvhe0[ Ѥ[neV&._n 65X"0@-JHpg^TL3")e +!"$#"527674'$7323265!"'_#~ezHP>) ZH8K]El~y 0@- JH_VK_\L$(%! +%3>54'&'"'&'$7672!"';>.9uv[ Ѥ[ne=[r5BY=S+o@ %JK PX@$pg_[K_\L@%~g_[K_\LY@ $"$$%$% +.#"3 # !265!#&'65&'"]ɭ)~SXe=  k**@t(e@?-;G t'4FO-@&$ JK PX@%pg_VK_\LK-PX@&~g_VK_\L@*~gVK_VK_\LYY@ ""1$#$$ +.#327#"5672653#&'65&'"R/al n7۱I5 " h();p>-YFHQ]  3q%<8XP /K@H Jp|n]SK^TL )('! / /$! +%32!"%"#"54$332$3 !"$#"52654'&lvx Jfjb0qiHY3xHv̂-=+]?koʏ}p Z#6#-@ -JKPX@2pppg^SK^TL@3p~pg^SK^TLY@ #6aA2 +;&#!#5327"3&#"# $5467&# 327te0 Yeh0~#_'˸>PHz nZ]v#8HZ 鮈)X|M ,@ JGKPX@.pp^SK_VK_\L@/p~^SK_VK_\LY@ A3$$#! +&#2?5#"5432&#!#5327";LIasN*^x0Yeh]1e9FQ=$.L nZ.&VU 'o@'JK/PX@"~_^KXK_XL@%~~_^K_XLY@ !((#& +654&#"63232654432#"$#";țY5`-#B {a`'"Z6џ_U18RP_pF5T>FN2ETݠ|ZM  ]s6E R06p%O-@* J_$K_%L$$(&+32'654'$! ! %4#"Yʕ]  I{s*~ l*_5+)amMNl&A@>! J~g_[K_\L#"%#% +67.54632#"'654'"&' 67"5l[/ (d %aoa  Hbh~-|@ (JK'PX@,pee^SK_XL@)peec^SLY@ "#$!5A +432%.#"3276754'&+#"53265=f@ 9Q+Si05QQ30eՑOBo\GZm)`HQU^#5$>@;  Jgc_UL#%# +&#"3&##&'4732#'7353bOs&);2Dhp NB:FFZ|n8&O3"FVZZ^^&` :@=2@+ JK PX@,pgg_[K_\L@-~gg_[K_\LY@ $"&$$1$" +!"3275&#'; !265!#&'65&'";^1dz k1ih  k**@t,l P>O&;G t'4Fz!7,@)7-Jc]SL*AA +674.#5327"7654&'5327"&54?fo[HPI#7R8@E:LSHE3"f\; ZQQ l^$EZ Z. Z2¤2,ZZ%Hoy{ㄝXj5[@X0. JH_ VK_ VK_TK_\L31#%'"% +"&'&54#"3&#"527ȷ6323>54#"&563ʦ ZOr]\tfΔщvh{bymy4 6ăi;RZ ZRVR(f`ϩ7 4xaiE HKPX@n`\L@`\LY!! +3273!"4#567WN%fΔ8+R(f_zm",Zp װ3+X?@<: 1 JK PX@+ p]SK _ [K]TL@, ~]SK _ [K]TLY@?=9853aqa + 3&'&#"4'3&'&#"526543267"63&'67&'"{x)/g?%fsQ<|:<2i{59mk.,vp<6R!-lFyZOlPUZZΩ[ZZXO KAXJ9:@6 " J*&GK PX@!  g]VK_TLKPX@# _UK]VK_TLK1PX@!  g]VK_TL@  gg_TLYYY@97$"Ba +76543267"3.#"54'&3&#"525632&#"F;Z`*nJr`J73'#H@G _ SK _\L=<986421.,"#"$" +%#"&'#"&5327"!27.54#5327"!274#5327"36R;Fj@zou_^vA>Q t_^w<9Ju_^vhҗzHFPDIKSZ ZS(?@SZ ZS%(SZ ZSGT(i2j@# ,*JK+PX@]SKTK_XL@!~]SK_XLY@ $'AA +43274'.#5327"#&'#"'473272 JpB>Sj[ݞA]$$2m|d$Ɠ ZOO5*644u[OI&O 2+H@E!JHG~g_^K_\L$#!$#$! +&'52654+#"54323273&#"3262pqpq3/HH¼*p>7B-p}{p  Z5{72RU7|4LwSP< 7`@].J~|_ SK _ SK]TL 641/*($#" 77  +67>54'&%27632"'3&#"52654'#"54673@]]uqTTKMWt]Uhv4^9 .@#.J+'GK PX@(g_^K_\K_XLKPX@*_UK_^K_\K_XL@(g_^K_\K_XLYY@ "$$%$" +32654&#%32&#"632#"'3&#"527>^AJK qlOi^H\o-X;SeJF~Wt]%XZ ZCXf5@51#! JHKPX@8~ ~~SK ]VK]TLK+PX@6~ ~~  gSK]TL@3 ~~  g]TLYY@42-,"4"A +3&#"52764'327"633"!'>5!" 2miَ|zT<{N#ip4ddɶIM_Z Z12 B+.ZZ&; Z- lM$,@)#!  J_[K_\L')'  +323267# 5$54&#'6=P$h&ŏ~!d#b{ $ ISof4@@= J~_^K_\L  +"&54$54&#"'67632327NePL!C@@!J Hc]VK_\L"  +# #56!#327&'67276= I_e9S=-*U iR" t4AU6 X7)e JZK<&D@AJH~]SK]TL! &$ + 7.+3&#"52765!"#"'4$35}&= P`=}z[xxyW#}=v:/1Z Z7'mrK'nʅQ9#@  JK PX@)g]VK_VK_\LKPX@+_UK]VK_VK_\LK/PX@)g]VK_VK_\L@$gW]VK_\LYYY@ %##$ +!!327#&'&5#525432&'" %B9S=z%_{#ceBKat*"4A$,eRc0iOT<~WDO@J HK'PX@]SK_XL@c]SLY"#&6  +#"'67) 7.+327#"yMPZEL&= P`=}oBO<;=v:Ի#h9"8P1"X=N N3+`-<@9+J]SK_\L&$ -, +7&'&'#! #"'673! 3254&5!6HZ6T+JO,T6ZHtPB&d3"&wwa!(0y@ 0!JK PX@(p]SK_[K]TL@)~]SK_[K]TLY@ AA%" +>32&'654&#"3&#"5267.#5327"2wl 43#$55xjif;(N_pR|6[~q`:+0>)xNZ ZNt80DjZ Z0.^s&;@8&Jg]VK_XL1%!%  +!2&#"#"&54732&'.#5327"pF~2TpR( Z H#3B0ft0p.>Px$bH:2*(^LYKZ Z<XB"=p װ3+P"]pC 3+$T@Q JIH~||]SK`\L#5#$!" +#"$54332654&#"'!"'673!632zi}l?h3k*/mI(v퐒NN$ 90l$T@Q JI H~||]SK`\L#$#%3! +6327!267&#!&#"3272#"5l(Im/*k3h?l}iz9 ӗNN횄v'K#B@? J H~gc]VL#$#%#! +>327!27&#!&#"3272#"5KYACP:i%sYxqW?z(+L-v휆fI-@%$ J'HK1PX@.~ gg]VK_XL@+~ ggc]VLY@*(#! -- +23673#"&5467654#'!"'653!6aBGetf $ɗӳƌj";~18dX l`_h ήą dd-L+Ld"pv v3+zh,@, JK PX@3pnp]SK_VK`\LKPX@4pn~]SK_VK`\L@5p|~]SK_VK`\LYY@ 11$#$" +672 463264&#"'5&'3!#4'#"2nyQ@Eky&C|e0(2  9[;d)1._n 3o,@, JK PX@2pppg^VK`\LKPX@3pp~g^VK`\LK1PX@4p~~g^VK`\L@5~~~g^VK`\LYYY@ 11$#$" +672 '4632674&#"'67&'3!#4'#"F_|ߟ36zT|_4 aP2&s. -G ~OB'$KW(&S9@6JH~]VK_\L!( +#56!##"'4'732654$5_eN⢮k W<7U nR" t/,?ߔAyW.?5E$K)PX@ JHG@ JHGYK)PX@_^K_XL@~_^K_XLY@ +'" +3&#"5274#567632654&#"a} en6˴QdNZ ZKla)gm/Ne]rdl_dlD#_,_dl#_ CC3+3+3+dX \"'#= 3+d "' #]& 3+O7"G#] 3+X5"/-d"/ M 3+3+XBA"OMk3+3+X ~"1-dn"1 M3+3+P"QM3+3+f"$J 3+g]"Do 3+Xa", 3+)"P 3+=Z"2q 3+G2"R 3+9#b"8 3+d"X 3+9#"8#pj,$3+,3+3+3+Qw"X"jKs,3+3+3+3+F3+9#""8#j4ub$43+b3+3+3+q"X!"juu$3+3+3+3+9#%"8#j,Q$,3+Q3+3+3+d"X"j|#3+3+3+3+9#("8#j:Ch$:3+h3+3+3+q"X!"jC)$3+)3+3+3+f(@% J_&K_%L$$"%+326#"&54! # %42iYjoT~ YL%Z[Ne4.n"$#j6p$$63+3+3+3+h^b"D"jJr+3+ְ3+3+3+F3+"$#p63+63+3+g]E"D#q"3+3+3+F3+a"Xee3+F3+f"y3+F3+="*%8 83+}"J $, ,3+=aZ"* 3+c "Jc 3+X.f". 3+XZ"N 3+="2m3+OD"R.3+="Ud3+G<"3+f"v 3+b"Pq 3+"& 3+X "'=d "' ]&O7"G]=a"*uU Ұ3+c "Ju 3+X|D_@\9 7 J$H e ] SK _ ^K]TK _\LB@<:640.*)(%AA +!3&#"52654327"!4.#5327"32674&#"&567"5U/k!x33p+@l9SBw+r1xgI"$kZ Zi̚bZZ^ E@R0ZZbϝ&=Rb%S5$'@$$ Gc]SL%A# +%#"'765327"6763 //cv&Bhʴ9[bSP)dS?-Edfbl-7I\ Zx.=+/X{"1C а3+P"QC 3+"$#  Iΰ3+3+OE"D#u3+3+a"u  ΰ3+f"uR 3+="uU ʰ3+O:"u:  3+"$ ΰ3+OE"D 3+X"$p3+ 3+g]"D``3+ 3+X"(I Ͱ3+?"H 3+XW"(%3+ 3+G"H__3+ 3+", ΰ3+"b 3+P",3+ 3+"Z``3+ 3+="2 ΰ3+G2"Rb 3+=W"23+ 3+G2"R``3+ 3+X"5 ΰ3+T"Uh 3+XX"5 3+ 3+q"U+``3+ 3+9#"8 ΰ3+Qw"Xa 3+9#N"83+ 3+q"X!^^3+ 3+F ;"6$3+{ ."V3+5 "7I3+P "W3+S{p"%@"J G_[L"  +5$4&'5654&#'654'632;rcLlicثiXk:X'͇y+)MP4@ G_^L +5$4&'5$4'&54!.0}R?T^|^wSq? j"?eHBX0f"+ 3+X\"K 3+dp 'N@K"J HG~c_[K_TL&"#" +3&#"525!"3&#"525ȷ$32~QΛOQNѽ7ڽƷZ ZOISKZ Z Y7oMO-U)3]@Z*3  (%JH gg_VK _\L20$")$""! +%3674#"#"54324#567632"'#7&&#27h"H 6;R*^xfkb4zypLIasnO:$.[P[m_3R51l '(@%# J[K_\L%$&& +4%326# 4%&'&56%67&'5 KPrb8nP__ C f gtGg3>@})Pese^l)]KPX@ "J@ "JYKPX@_\L@_\LY(')( +654'632# 4%&546324'326pY%[4b>m5J7DIh]\WubmTAnr`+wHݚnˊ5jzX"4@1 JG]SK]TL "  +'67!"'67!27!2'654$#B/Jf#\5f)BhQ#IMH \;D T9`ޓ@T5#]P %>@; JH$"!G]VK_TL %% +!#'67#"'673!27632'65&dvv$?|[ET( ]{hU"@|IM Z$ CT V+Cѓ@T5#]e"$3+3+LB"D3+3+X"(yc3+O"Hy="2#pCjC)$3+)3+3+3+M8b"R"je+3+ְ3+3+3+F3+="2#pC: :3+3+M8f"R"D3+ڰ3+F3+=e"23+3+O:"R= 3+="2#pC03+03+3+G2h"R#5"3+ܰ3+3+F3+m"<Idd3+F3+X"\3+F3+i-fi?@<J HgW_O")"! +%3674#"%4#567632"'#7&"H 6;/fΔkb4zynO҈R(f_3hP-6`@] )41 JH g g_^K_TL320.''"""! +%3674#"#"3&#"527ȷ>32632"'#7&5"H 6;-9Ju_^vhҗ;Th,kb4zynOo/SZ ZST(i@HFNu3hP-F!D@A J Hgg]VL"$"! +%3674#"#56!#632"'#7&5"H 6;9_ekb4zynOR" t3hf$@!JH_XL' +#"'&547367654#567 ]B>18LM eZZ|0&8?!~c/_cP>POU (2_@\)2 (JH_VK_VK_\K_\L##$'$#$! +%3>54&#"#"54324#567672!"'&#27);>muv캎*^xfLIas[ Ѥe$.[P[m_5<1O 3>@| 5 4   (3JH0,G _^K _^K _\K_\K_XL><8621/-+*&$  $ +32654&##"&5432567>32#"&'3&#"527&#"32#0%K,gsxQomp4>\o:^BW 4u.BF@0-::!"?XZ ZC6%ϲҹ "$NR ذ3+=HT6"&N@O,"F!3+!3+X"/p װ3+7UC"7Nc 3+ 3+{&-=@:% J~|d_^L&*%'! +6'4'732654$54632&#"3267#"&2 W<7U ܕk%JF[t_W~~SLz"<঻^q"P-AZ Z>(WS(CZ Z;)Z"-. 9 3+XK9"(N3+3+O,"H5!3+!3+2"-1p 3+"M8p3+3+="G@D  J H_SK_\K_XL%$%$ +  !%27#"'&#"36U[Fz2 Zgy I Kh?dZ3aXhSO&v@ J HKPX@"~_^K\K_XL@~c_^K\LY@ $)$%$ +$"5432727#"'&=3&#"36 yEځR^(z E:Q 5&KJH%dYATz"52f]]3+3+2("U; 3+m"<%W 3+o"\%>>3+8. D ǰ3+ON (K$PX@J@JYKPX@ p_VK`\LK$PX@!~_VK`\L@+~_VK`\K_\LYY@%#"! $ +$7.#"3#"56763273327673#"'&'VfMXBWh\WgM `B/!kT4&NFc'X~::bE."IH  3+O9 "@ JK PX@g_VK_\LKPX@_UK_VK_\L@g_VK_\LYY@ %$$#$! +%3>54&#"5672!"'632&#";>muvJKzl [ ѤeT5SP_FP4O1 0>@;/J-,Gg_VK_\L%'%(# +&#"32765456% .#>32#"''67& #9 ?FO+T0doAD2WKN$:E{,Scf S49DC.\HJd5K@6qkUoH/O U +H@E JH~c_VK_\L$($##! +&#27#"54324#5673272#"5=LIas*^xf{?e709o]1/$.YR[m_dE-5NOW9(@(JGK PX@g_VK_\LKPX@ _UK_VK_\L@g_VK_\LYY@ ##%$$$ +5#"54325632&#"&#27N*^xQKzl LIasYe9FQ=$.{SP_F1O)@& J_^K_\L%#$  +!2# '73265%$&#"KϣEy\jYi*6Zb[Z%Cf" 3+feeU"QQ3+O*>@; Jg_^K_\L*)#!$"& +$7654'#"5432654!"!#"'&547636Ry]\ᱭkoQVp՛چ!^w*AG(*k|VjJwFMkEZ#"gp 3+K|+6[@X6,  J~~_[K_VK _\K`XL43$!$$%$" + 6723267#"&5635432#&#"&#"367ƭjc8+ k@VtBo907QSkF0DVe *!;|+Rb?;CN5-Ed~ ]K (F@C(' J~_VK_\K`XL$%$%! +&#"367 6723267#"&5637F0DVeƭjc8+ k@VxCM~ ] *!;|+Rb?@:OV >@; Jg_IK_KL$$"$$ +&#"3275&#';"54!2Y.𑘭_t of/E vJ*c[ft`F'0 0S@ &# JKPX@]VK_XL@c]VLY@ AA'$ +%32654"#"&54&'567"654'567]3-"4`%2n}ciwxww jjjj6G:9(a!FlȘdg~BCZZ'f&Z#N -6@3% J~_^K_\L&!"$($ +326544?#"#&5463232#&#"#"&#G*"/FKEMSg\gAZT>I.Tq`~R`*!2"<6S`c-#|v%#Iz\XpX K ǰ3+Lg/M@JJ G ~  g_^K_TL-+*)$"#"! +6323&#"527&#"3&#"527432#&#"|t_^w\nu_^vy907[I^N;SZ ZS;SZ ZSļ:N5-EdL Cg3W@T  J~   ~g  c_^K_TL1/.-%$!$"! +&#"3&#"527432#&#"632#"&54633265F\nu_^vy907[I^|o907QSPs;SZ ZS&N5-EdaN5-Ed"L'p. 3+)kkQ#@ ]CK]ELA@ +327"3&#"5276=4'&#]rpT<2c_َ Z&;^ZZ02+.EA"Ol? ?3+/QA#O    3+i lA)@&HW_O$( +4#5673272#"5fΔ^SQ709oوR(f_$dE-5NXA"OPd' Pw ǰ3+P/B@/J73'#H@> GK+PX@# _ VK _\L@!  g _\LY@=<986421.,"#"$" +%#"&'#"&5327"327.54#5327"3274#5327"365y;Fj@zou_^v>Q t_^w9Ju_^vhҗyHFPDIKSZ ZS(?@SZ ZS%dSZ ZST(i PC@)% /  J' HK+PX@5~   ~ _  ^K_TK _ X L@2~   ~ c _  ^K_TLY@A?>=9720,*"#"! +&#"3&#"527&#"3&#"527ȷ632632#"&54633265_u t_^w\nu_^vhҗhJho907QS\s@>R;SZ ZS;SZ ZST(i@H6?N5-Ed+@JHK+PX@0~~_^K_TK_XL@-~~c_^K_TLY@ !$#"& +ȷ6323&#"527&#"#"&54633265hҗht_^w\no907QSnT(i@;SZ ZS;N5-EdP+S@P JH~~_^K_TK_XL$%&"! +&#"3&#"527ȷ6323272#"56\nu_^vhҗhd]e-09os;SZ ZST(i@ͤnE-5NQ 3[JK#PX@]CK]EL@]CK]EKELY@ AA@ +327&'.#5327"#&'3&#"5267654&#S?:N  9\@PK6  ]; 7\C6W<  vv|*h\Lr&D**Ff4 njGZ ZV(@%J_^K]TL&A +3&#"5>7&'"&'47632x&rL\h*|vv >@~r3NDLLB"<v?Pe9FQUCD"$3<$3<"FC  Ȱ3+P0@- JH~VK`\L$%$ +4#5%325'632#"&5ND~h›3< 0ӲA YH İ3+P ZW 3+L \L İ3+C(6@3$ JH_CK^ELA"@ +327"654#5327"3&#"52675.#jNvjDGRH3{n!}8']F X5?0:X XN]jrIZ ZIofLJbPLr"]3+P1@ 3M@JJH1,+Gg]VK_TK_TL%#6%# +&#"32654#"'673!27>32'67#'6 #E?[ET( ]{hU"@SpYaANiAE{(Izvv$?f d|D CT V+/@6q\`oBy Z$I$H@EJH~||d]VL#%#$!" +#"&546732654&#"'!"'653!632m65W|O}%i:PCAYz^O^텔-L"+j :W@T)JH,+G~|gd]VL%:#%#( +327.#"654&#"'!"'653!632&'#"'&54632OF? 9#  ro|O}%i:PCAYc3y+($NKWDD94S I-L"+ǟ/N5D:kq6@]d/4 5@2 J~_SK^TL%(A +3&'52=&'&56% .#|x_z{R4,Z4kw L?nRZZR"Q .\HJ[3 S 3+q\&@# Jc_VL$%$" +#"% .#328T0do r`l>`e.\HJQ"2x-3+/3+Pj  3+O9.K@H)! Jgg_^K_\L$$$$1$$ +&#"3275;"543267632&#"W"暫BJH%Ĭ5pr ALE.'>4#56767#"&5467{ E)^#o 'YY' &[[&Heٔ d>.CM][l@4gM3c8ZY' &[[& 'YP*dZ!<"On\X]N N ʰ3+Q'_@ JHK1PX@p]CK^EL@~]CK^ELY@ E1 +327" 67$#"527674&#hxah?("Y>!K|:e Zprk Z14@wnO$/W@T/%   JG~_[K_^K _\K_XL.,$!$$#" +3&#"525#"&54325432#&#"&#"327\H~go907QSu:^BCnXZ ZXv.C/N5-Ed%ϲҹA"RpEb"S.pZE E3+OS7"G]YOG7"GP|O17"GObP 'B@?JHp]VK]TL  '&2 +#;2654$54 #56!2&#"!^錛U _ek%JF;953.,'%!  II +%3&#"52657354$32&#$7632#"&547326&#"3&#"527&f|*h\Lm+@d`~ vzFhئx\nu_^v3jRZ ZVd"TFf4 m@;Gfy0;SZ ZScXA,E@BJ H_^K]TK_\L'%''0 +%&#"5254#567!2654$54632&#"#"Me\tfΔ<Z7U ܕk%JF7&#!"-;[Et\tfΔRfh}U"@XR. wwv2I CT ZR-R(f_q V+/d4LK#uu3+3+/K PX@!pee TLKPX@"~ee TL@)~ eU]MYY@  +!#!!#!4MfM4Mf+\J-Z +S@P JG~_^K_VK_\L$%&"! +3274#5327"36#"&54&#""&54632\nu_^vhҗ|d]e-09oY;ZSZ ZSۋT(ip nE-5N 4_@\"J~  ~_^K_VK_\K _ X L20,+$"$$%" +%7#"&54&#""&546323274#5327"3272#"5F|d]e-09o\nu_^vd]e-09o t nE-5NЯ;ZSZ ZS nE-5Ndy'F@C'JHG~_~K|L#"&" +3&#"527ȷ>323&#"52=4#"099DP8;3mX0r@>:9DO8:u BB:;={-j[BB|dy0@J GKPX@. ~~ _}K_~K|L@, ~~  g_~K|LY@.,+*$"#"" +>323&#"52=4#"3&#"5274632#&#"00r@>:9DO8:u 99DP8;_x9R"#&!+3-j[BB|BB`+!)G-Rdvv**@'J*( H_L'&! +.'>#"'&547367654#567W..//l 0D^$")(?2|Pv.//.-h-c@P!%B)/:; 2dy+F@CJHG~~_~K|L$'" +3&#"5254#567632&#&66AL571hU3^d-3JBB79:P-yTH@dQ,tq@JHGK!PX@!~~~K_L@~_LY@ $'" +54#5327"36=#"'4736i66BK670hU3^d-3JgBB6::P.yTH@dt$@ JHKPX@+~~~K_K`LK!PX@(~~d~K_L@%~d_LYY@ $$"$! +#"'4736754#5327"3272#"&5i3^d-3JC66BK67"%"$"R:xRyTH@zBBAT+F)!*ady{0@.) JK PX@&pp_~K^|LK)PX@'~p_~K^|LK1PX@.~~p_~K^|L@,~~pg^|LYYY@ %av! +7263""&#"526=43267"3274&:'Z-'++I_ 0828M" %G.7tR$#o73;%;<?Q<+dks.@,  J&"HK PX@_~K  | LK PX@_~K   LKPX@_~K  | LKPX@_~K   LKPX@_~K  | LKPX@_~K   LKPX@_~K  | LKPX@_~K   LKPX@_~K  | LKPX@_~K   LKPX@_~K  | LK!PX@_~K   L@ g   LYYYYYYYYYYYY@.-+*""" +327"7'327"7654#5327"# #*-GU.'LD#,AW,'KT2-@4,: >tj<!BB &!BB BB![djs)Z@$ JIHK!PX@_~K_L@g_LY@ %&91 +327"654#5327"#.'673267\ 1i3X:]f5K$Z/%'>5,75#-:x(BBBB$IJQ5-# %K.ddD@ Ht +D7bZ#%d#wJwdFj 0+467.dti)vY>J8R4NVL(==d dD@ Gt  +D'654/>tVKXG/[kK d(i 0+>7.5dJ?Zv)is==(LVN4R7dPfF *dD@gW_O +D26544#d>NP2 &dD@ HW_O$! +D#"67327>|w!3q_4,+!d 3+dZZP *dD@gW_O$$$  +D32#"&54$#"32654jjjh066NL88NPjjhjN88NN88d4-dD@" JW`P#$ +D%327#"&54pR0(<6BjZn4z.8J6nRdj8dD@-JHGWg_O!#!! +D#"&#"'32327BY{72.#J\>GJ/G=B+I 8 E37C$AAu+Hq X9+#XER+d))&dD@U]M +D!#!5!)sd)),dD@!U]M +D!#!5!53)Dsd)),dD@!U]M +D!#!5!3)Ds3d)),dD@!U]M +D!#5!5!3)Dsd))&dD@U]M +D)5!3);Dsd&dD@U^N +D3!!di\dh90dD@%Ue]M +D73!!dk>h^d а3+d5*dD@eU]M +D!5!5!5!5//XZd\#zzd1!dD@Jt +D3#3N5L}Dud1!dD@Jt +D#3#'L5N{1ud-?0+%5%?%{N9M{d-?0+55%d%NM7N{d 9qI I3+dSC 3+dM#C C3+3+dM#uu3+3+dCdD@8 JH GWg_O#!# +D7#"&#"'6323qA;M39E=;SyA9a!XX]d~3+3+d;-dD@"JGU]M +D73#'d%>9d;-dD@"JGU]M +D'#'73>%U#9dP-dD@"JHU]M +D73#'d>%69dP-dD@"JHU]M +D#'737%> 9#d  )dD@ HU]M4 +D7!"=7!\7#?2</-d p &dD@HU]M! +D!"=7!p!G2<-df ZdDJKPX@noU^N@U^NY +D!#&'5673!fWFLMDZJNHLqCCmMIU.CR-uH4>@[v 3+E8 F3+j2B 3+|V29 3+^Qj3+3+=:dD@/ J~W_O#$%& +D#"'465&##&54632 /cT YpPsMEr')EfD:2.?6F< 3+5vR*4P$N:Pt#G.#CCuOn#3+3+_ [   3+dFjyzD( { z43+0 3+ 3+S 2dD@'J HGU]M +D'5#'7357A?+B} D 2dD@'JHGU]M +D'73#IA?+\?\n ް3+E/ dD@Jt& +D7654'632'(1AMOqd39H<ELF Z}rX X3+ j /dD@$JHU]M +D!'73573?K?B j /dD@$JGU]M +D'5#'7!#An+B?F T?dD@4JH GU]M +D573#'5#'7,[ X/[ ^ [)^ Z-4ox dD@U]M +D!5!xDo="(,dD@!W`P#! +D63326=3#"&5"907QSnokEdwN5q2,dD@!W`P#" +D#"=33272qod]e-09H5NЕnE0UwV V3+RTF#UUU3+U3+hD D3+4` 0+'654&'>7`x0]=U0F-BJA#44ly3+b 3+ }. 3+%8 0dD@%J GU]M +D'57!'5!A?AX323 A4dD@) JW_O!#"! +D#"'#"73273327FaQFGNeD/-KV-'5ML- %p < <3+z(  3+hBd d3+^8 F F3+6ql 3+OB6F3+ B3+#BB3+3+(J^v 3+u8 dD@U]M +D!5!v$ dD@U]M +D!5!^;dD@t +D #YJ;i} x|lX X3+KCc? ?3+& j >dD@3 JeU]M  +D35%7!!'v? ?檪22eCEe4dD@) JW_O!%"" +D>32632.#"#&#"e6bA[<@UCe3/"S+b+'+a,S, % \\ ? 0+''7'77M+--+7799|!g0+654&547|h_e_I29h0bN'.< p#ZYq 3+?8dD@-JHGWg_O!#!! +D#"&#"'632327e7'P?5n:"X9{]e]gWdzRR3+_sR#juC3+3+ w&dD@J Ht(! +D#"54'67327wd:;N8hHr] 8K 0dD@%J GU]M +D'57!'5!2A?Ak323Ce 4dD@) JeU]M +D!'7!7!'7!ff?B?B#3+3+ fV-dD@"JGU]M +D'5#'7!fA!5Bo>CdD@8 JH GWg_O#&#! +D327#"''7&#"'632?/3LE6o(I'JN&(FI5n4@)O9{.5'jy+9%.H4 %LdD@A%JggWg_O!#!"$#$" +D#"&54632#"&54632#"&#"'632327+ ,7+ ,7o71FI5nD,GJ%4!%33%4!%3qyq{8 XdD@MJIHGggWg_O!#!#!#!! +D#"&#"'632327#"&#"'632327hj)~1Z5!]t6~"OB"hj)~1P?!]t6~"OB}}IIII}IIII  4dD@) J H GU]M +D7!'7!'76PO88OuP8% 0+''7'A Y88Y3 Md d3+PF}||BV"_WC  3+ ް3+U ذ3+ ذ3+-#ذ3+ذ3+PF|rxUD /3+HdD@= JG~|W_O(#'! +D6327#"'#"'&547'632A$a'%8!K9e 1-Pk8+KS*6v,''33QD4p#qq73+3+,S{$ 0dD@% JHGU]M +D3'7#'7. HR/JT  '\ \3+'< &dD@ HW_O$! +D! 67! 7$BfMzh6+!#&dD@JU]M +D!'7!d4h%Vx6x&8 3+/L] ԰3+'< &dD@ GW_O$! +D! &! &'Bfh6+!  0dD@%JHGU]M +D7!'7'7!O88OyB5G )IdD@>)!J~gW_O'#"'"" +D#"'#"&54$54&#"#"'467232'327i7N[;9P$,@7jTKv| .9z7=;;T;jK0-Z44DFU,!,$,3dD@(JgW_O&$## +D327#"&546327654&#"MOK@1Yn|؈@/(1@3N"cV'ps%),Q 5dD@* HW]M  +D.'>&'5254#5673..//C;EB:3mX9.//.A :;=0", *dD@gW_O$$$" +D#"&546324&#"326ԍxkx~@$(<@#.7 ypbacboVdZn>AdD@6J HGW_O$" +D#"&=4#5732754#57_*V A@'M'& 9G#WTj,"Xj,"0;.@ 5dD@* JgW_O$%$" +D#"&5>72.#32&{^k 5A/2>NL6ASq R:,#XEYVBO #LdD@A " JH#GgW_O$##! +D&#327#"&5463254#567#DO.2PJ`}{103dT* ]_26ny:;7J/1;" SX'RdD@G'JHG~W_O#"&" +D3&#"527ȷ>323&#"52=4#"99DP9<3mX0r@>;:DO9;u zCC;;={.j[ BC{k@AadD@V>/J@H73'#G ~ W_ O=<986421.,"#"$" +D>32>323&#"52=4#"3&#"52754#"3&#"5275ȷ:2] &: 9e"B=;:FQ9;d::FQ9<b;:FQ9<4oZ$, &_` BB !! BB  BB <<>Ue-FRdD@GJHG~~W_O$%" +D3&#"5254#567632&#(67AK670hT3^c-2K0BB79:yTH@}?dD@4J HeW_O"  +D#"5#5653#327_0wGu8.*(<sN^-=dD@2JHW_O"" +D327"7654#5327"#,/JX/7eX4-D40< P"BB BB"\ 07^dD@S7) J.I3/#HG ~|W_O54+"+" +D3&#"5254/3&#"52?'327"7654#5327" 1;KQ6,:> 7,,6<w})1QS+! **'*:92-g,BBTJBB"#BB:2 BB!}e*?@< %$Je]/K]0L*)#AA +3&#"52654327"3>754'&# .j!w22o*?u.p_PR81UjZ ZrƐsZZo0R ELs]@*n@ %$JHKPX@ e]2K]0L@ge]0LY@*)#2A +3&#"52654327"3>754'&#+ge]00U(<\+p_PR81UNeZ ZlmZZj70R EEs]Pd4y. HK&PX@)p e  ] /K]0L@*~ e  ] /K]0LY@2/-,&%1A1 +"3&+#3$#"52765##"527654')276Xi@=dӎ~@iَEsV%d.+Ǯ20Z>/1Z Z7'pZ02+.d P6@3JH~]/K0L"3!+!#"&54) 7.+ wP^rH&= (`5uqyڞdwdF w) 3+e0Z%JK$PX@]/K]0L@]/K]0K0LY@ 9AA +3&#"5276#654'327"67327"2miَ bY|zT<R =By?^ZZ02v[t+Qaj+.Z Z&;kZhL ZM]@%%@JHKPX@~]2K]0LK&PX@~g]0L@!~g]0K0LYY@ A:+4#56767327"3&'525#65fΔM :?s7267@Q$ 25U6 '< *#"  ."_+@( J_2K_3L$%$ +$32674&'"&54!#"'7r od0Tζ8JH\.`U"Fx\3+/3+_"4x3+/3+f 3+y-du 3+Hs;"ju-3+3++#9D 3+]x /3+ *"9~H 3+ )+"9J 3+ -#9L 3+H+"9R 3+)"9}W 3+F()"9}[ 3+"kQ"ju$3+3+3+3+$c% eZJK*PX@p]/K]0L@~]/K]0LY@ A5A+7265432%.#"3&#"ev1=\6 9Q+S4pF?Zs"\GZm)`HFXZ @H]0L+ !!'7Kկ9~Txc$( cM= c;+ E "2M 3+h, c9. !@/K]0LAA+3&#"526733&#"52654';TJ7GT'~FQ\;M;5-Z Z1;bZ Z!0?'0c1 e#?[@X76.- <;)( J Hg_/K]0L%$31$?%?##  +'67$7&'&$767$'&'7"'654'7327674'&EK5T>>T5KEPT6ZH׺HZ6UOT08RP0)kk*/PR80p%%p%&  &%ks6h RR h6skE 2dGc3 S?@< JH]/K]0L +67&'&#! !2767&#!' 5!Jȋ>T5K5J %p!& JnR37 "9@6 J_7K_7K]0LA#$""++'632632&#"3&#"5276h +N<+_g'zlmipLg%_L/0[ [1&Q F5@2?1) J]/K]0L<;:654%$#+654%67654'&%&'327"3&#"52767&'&5476>/Y`,9 ?/W_- |zT<kl miَ jpP7iw87FN!2*9iw73.Z Z& if!1/ZZ0/ jcA; 9@39JIK2PX@.~_ /K _ /K]0L@+~]/K _ /K]0LY@6421$A(A +4'327"6323&#"5276=#&$&#'632|zT<!3w }E2miَ.pz+.Z Z&;e9*c@:z^ZZ02s`c!P-=@:J+I_7K]0L&$ -,+ &'73&5! 3267&#!5>54&#"!8!>Z6ahRemb6Z>!tW2olbؽ(j"Lj3+3+ j"Wj3+3+3+VD"c9 3+U"g9O 3+_=H"i-9 3+e"k)9 3+V"w"jYu$3+3+3+3+VD +B@?)%J+H_2K_3L#!  +%>7.#67"&'#"&5632654'674.yENf mK(0VpC5Sk u’ɚ T#R~ >=I3i!<,%c@$JGK0PX@~_1K_3L@~g_3LY)%$!+%2654&#'$7'"&''!2 SL  NWP5wLBq*a xr?vmX%$/7Ė\8-.@HGt+'7&'&#'67567.^c?3Wdt`ukS~-1"&K>A$V-$q@$JK(PX@%~~_1K_3L@#~~g_3LY@ !''#+'36"$#$%.'672327 {7$A7 |#I.\$)*'RՇFw% w/ 'V%z@%   JK2PX@%~g_2K_8L@#~gg_8LY@ '#"%+&#67&#67$'67&'4672367y9jOZ0(CJ&鋿' ЪP)j>j u  +y fYF1b ' Zo0C@JHGK,PX@ _7L@W_OY+'674$&'&'727o#PPhrC?iBdlb/Akg t"2=!3@0JH G_2L !!+ '654#'674&'5676=od@weL@ 7\9C00zf|#1Wq IA9Q m@ JK2PX@e_7K_3L@ge_3LY@     +"367426&#"#$32uq `^lpq Z|d{-l :dATCvzA<~%@"J H3L&+%"&54#567327~kLH3 "6jyiۙL">AE<T"W@T" JH G~~|_2K_3L!!+%"#'654#567632367T^[*1_>/s M~K*2`[yF2lLA9i 0Z\1#( 3@0  J G~g3L%+$367"'6.#'>32G(c{m}W4U:?(8w-9T/TuO[C8 `u`QP,D@A,J#" H G~_3L'"!+%"'&''4#567327&'6727Diz<czoia<^?c %]0  *M\~_xN#3+"iM3DG^fA&(@8q ]$@ HGt+'.#5>764'7]L_Qe5a5Q k81i7H, 2\L;<V$,@)J$H Gt#!#+27'674$%&'6?#&'7367 (@ #To/ '*_)n2#˚ wWqAxcc%e!@ NVA 1;Z /@,JH G_2L+2'67$%$'"  _c6% !  9K V*0%%4y6a $g9pQy\(@% JHGt!+#"'ȷ676767\Lpm3νv~lHrg/ɭ_#dF%<gnJ @N N!4"A,G3%R&@ JKPX@)p_7K_7K]0LK2PX@*~_7K_7K]0L@#~Wg]0LYY@ A$#"+#'63263"'67&#"3&#"5265VSf)7AԦ"a<'9Q"u_ot%f,R& <+4lufFp pNd.#9 3+(j" j3+3+3+V`|% "0+'67$%&'67%$5&<_a6\w*? H ? '<<*00B,"71c=>"A*oV7Q@N-+)'#! 4Jgg_3L6531&$  +67&%4'&'3674'6767&'6%67#&'$ G;V_\1̛ /b*>KS-8*|YA ~'"6T),<.,+)V5e+2B@?&#'J21.%H G~c_2L'*"$+&#"63&'$7&'"'654&'567632'&'67R J& ^9 ǟNZZ@&q0SESC!nj4 Uc7 % u^)4|xK ?9TR\(&:Q %.@+ J~b_7LA'$"+#"32&! 3&#"5265Ƚý >"iy%].C'EMr#fFw xNdV-< %d JK PX@~_2K^4L@~b_2LY@#"!  +"32654&&54323&#"5265Bg~kg~"iy%}Ļź_ 0fFw xNdQlJ?$@J#HGK PX@_7K_/K_8LK PX@_7K_/K_0L@_7K_/K_8LYY@ !$*$!"+"&#"32&'674&#"!2327JGQ=Ss$|76!"5z5oAqY# e@4#\%V7F@ H GK&PX@_2K_2L@c_2LY!/!!+#"&#"'674$323677z|[X\u'Wh 2t+\n@s6מFyu  v)T(?@<Jpg]/K]0LA'5A+7265432%.#"!4&+3&'"T)1l$1}&xL7{Zm,TZ^PQ8o $A<9<[z+hgp palfD LdZS@  JK0PX@g2L@W_OY#+3$5$76/; $kqb\. B t1 (K5@  * JK,PX@2  g  g]/K]0K _ 4L@/  g  g  c]/K]0LY@530.-+('!#$AA +&'5>54&'567632!"$#""&56!23 #"*{w.?fh=ʡ ^nL[,"Zl_hg\oGxSi  iVuq-G.0#V*9@ 2JK*PX@7g g  g  c_ 2K _3L@5g g g  g  c _3LY@9964-+*($#!$A"+3265"754#567"#"&#"3"&'>3232654&'#"54$IFc~~|wyxs|篨XGSb||qQr{+CSjDppD3Nht䒷Z_dA,/K2PX@/*!J@/*! JYK PX@"p _7K ]3LKPX@#~ _7K ]3LK2PX@-~_7K _7K ]3L@2~  |  pW g ]3LYYY@.-('&%$# ,, +#"&5>327632#"'65&'"3!527&!:QuRF^R{RMkG>/&5w8`A 08:MقR;~<74,nn*_,DF),/K2PX@ /*!J@ /*! JYK PX@#g _2K ]3LK2PX@-g_2K _2K ]3L@3   p g_2K _2K ]3LYY@.-('&%$# ,, +#"&5>72763#"'65&'"3!567&!=1IkL?yUyJptJGc@5(!Flzg)0s5E}vsJ6rz40.B&nn$8'*P/)JKPX@//K_/K_/K _2K_8LKPX@/_/K_/K _2K_8L@-g_/K _2K_8LYY@)((!!!%$ +! ! 76323273#"&#"$32654&#LuJʛNO6kgűP'?@<Jgh g_3L'&'!!!$$ +72#"5323273#"&#"632654&#H >5G$S>.}:m yQEtZ쬽a`N*2",⿹dX/L@I.*JH~ |]/K]0L-+A&2 +54327""5674'3&#"5265#&'4hyjXYG!_o%JZZ Ihgp palm*RfDo pLd+nd>9@6JHG]2L!2+4'"327"&'527'67eLuce4=)LAm*` pAm*`L%P &0@-& JH G_3L%#!+%#"&547'64&'567376%67327`uk4{dtB?E9~R3<('pp咣U$52L$=D*X:d },* 2= 9B j|*U7$A@>H   gg]/K]0L$$2A + 3&#"52654327"$.(~"_o%yjV OFo pNb^m]p pRg4K !Y@JHGK2PX@_2K_3L@g_3LY %!+%364&#%&'&''6767Pz[Kipi2gg(0r^5 9a A ]aZ."!h",+u Qh&#0#Z<>@#0J HK PX@%a ] 2K0K^3LKPX@%a ] 2K0K^0LK(PX@%a ] 2K0K^3LK.PX@(~a ] 2K^3L@&~  ga^3LYYYY@9543AA5 +6765'327"3&#"5267 #&' 3&#"526743278F =>~c*: vU\v&//k6'!vRI_)D-a(78 " s&BL*(p s!A}fnA|Y)n q/3q K{(#spP P3+Zq+@( J_7K_8L$%$ +3 !"'&'7!2#"'654'=eXS~)ӭ]eqa(E+)Qh"&x.3+/3+Zq"x3+/3+e& ΰ3+e&o"( j3+3+3+RE7W@T$ /.JH]K _&K]K_%L75#$"&6$A +3$#"52765#"'67) 7.+632#"'7324&#"=dӎyMPZEL&= P`=}۬^YB7/1Z Z7'p<;=v:1 bd"Fua ɰ3+H_"& M 3+ZO6i, (p", j3+3+3+-Ff,6@  J. IK PX@/   g]K_K  _LK PX@5p   g^K_K  _LKPX@/   g]K_K  _LKPX@5p   g^K_K  _LK'PX@5p   g^K_K  _LK1PX@>p   g^K_K  ]K  _L@<p   g^K_K ]K _LYYYYYY@---6-51/*)1&# +! #&'47367654&'5!3 !&'5>532654&#3-rS::JfD9-,RZZxxTW7"! tT-NzLYY##vᎦ\Gr d D\@YJH  g]K  ]  LBA@<;:76321,(&#"! "+32654&#4327"!4327"3 !&'5>5!3&#"5265M#k~##z~#fEZxx]N*`- jo_ _in_jo_ _inחY[qwiWbb_gR8R@O$  JH1-G]K _&K _L8632""&6$A +3$#"52765#"'67) 7.+$323&#"525#"=dӎyMPZEL&= P`=} vrr]\tP/1Z Z7'p<;=v:EűFRZ ZRp e"u ʰ3+eE"C ư3+ :dt" + +3+etG+n!HK)PX@! ] K ]L@'  p ] K ]LY@+*'&%"!!2 +4327"!"##!5>54327"!#~#IeمbeJ#z~#Ujo_ _inK]s]Kjo_ _in$eB e% eF,p!jJKPX@Q ]K]L@%pQ ^K]LY@!!2 +!3#.#!"#65.' !)eI>LKQYoI{XJ:u`P#e&( < $Kj@g.=872 J~_ K _ K ^K _ %LHGFBA@;9641/+)A$##"+!"'7327#"&5672354'327"23&#"327# '3&#"5276+YRMcx8XL|zT<LX8xcMRY2miَ8MQG\+.Z Z&;\QMr8^ZZ02\%<@9" Jg_$K_%L(%"#$+#&'7$!'$5&'"'654'632( 1 qc]& ¢i cI|+)MdD>:@7>J ] K]L987321AAA +&'327"3&#"52763&#"52764'327"y |zT<2miَmiَ|zT<D.Z Z&;^ZZ02Lu!/ZZ02N+.Z Z&;dDu" , ,3+d4U@R&0/* J  ~_K_K^K _ % L31.,$!AA +3&#"52764'327"23&#"327# ,2miَ|zT<LX8xcMRY^ZZ02N+.Z Z&;\QMr,&@ JK$PX@$]K_K_LK-PX@"]K]K_L@(p^K]K_LYY@ #A +3&#"5265!#&'67254'&'5!*~-^εN gw%$[R\HiW]]_g _ O8&%TTK,0e=+ H2 dG+XKPX@ ]K]L@! p^K]LY@('AA +3&#"52765!3&#"527654'&'5!~o%$fe%$i(/ZZ/0gi(/ZZ/0g7&%ZZ%&e3 H_& R7 :d*5@2*&! JHc_L%)*@+327 654'5367#"&'67267.' }DroooXsHNeXv)>eEH;eiH/eKPX@! Q]K ]   L@" a]K ]   LY@/.,+AA +3567654'327"!4'327"#4&#ee%$~%$fKvZ%&=i(/ZZ/0gi(/ZZ/0gɌ&% f2B@?-JH  h_K ]L0.*)A2%" +4327"3274327"3&#"5265#"&-bptj-`h-bpt-*mzl-YjoZ ZingVjoZ ZiniWZZ_gad4K'PX@ "J*H@ "I*HYK'PX@ ] K ]L@$p ] K ]LY@430/.+)(22 +4327"!4327"!5>54327"!-vt--vt-H[Y@-vt-YjoZ Zin joZ Zsd܌PZZ C"joZ Zin di" R@ +JKPX@,ppe^K]LK PX@-p~e^K]L@3p~pe^K]LYY@ 14d13! +%3265!"532#"&#"52674+"#!27""fh?a-[-H}5SDQ5?]B$(\IJ \\G8]ZCVd",d (dJK PX@e]K]L@%pe]K]LY@ Ad13!+%3265!"5632#"&#"52674327"ej>ay|Z-H|5B\||\B#'eױ \"VBZZBVH_"am3+i >", #2:MC 3+F0J@G.) Jp~~^K]K%L%av! + #&'7267$5%23267"3.#"5265.# :dd4pi#&J4ki=?ymVRt<$G+M-Zb PK~ݏgZZOVLDdZ'2KPX@2J@2JYKPX@%pg^K]L@+ppg^K]LY@ $13"ia+7267432632#"&#"%32654#"53267.#"ZXKM< ~TJCH/]g5 ,OvYL+/SMuN8Y l* }bz{^PcCXB\d[JK-PX@p]K]L@~]K]LY@ A%A+72654327.#"3&#"dl1=\6 9Q+^S94fF?Zs`\GZm)`HXZ d"hKPX@!a ]K]L@'  pa  ]K]LY@""2 +!"#.#!"#>7654'%!HK_< ;W66iByc"#Gx:UHdEK PX@+'$A@;7/ J@!+'$@;7/ AJYK PX@3 _K _ &K _K _ %L@/ _K _ &K_K _ %LY@DB?=:842-,"$##$"+3&#"525#"'7327&#"&5672354#5327"273&#"327#"uVXrnZ>9/>[E'ZvBB|Z'E[>/9>ZnCZ ZC*'Ly62Il[@ CZZC Z@[lݖ26yd%:@7" J~_&K`%L(*$+#&'7674''65&'"'654'632f2B'f mNccW[NrUgr a+}^ac:"';@5D@A5J0,H ~ K^L21/-+*AA" +.#5327"3&#"52653&#"52654327"p-Xpz|V7*mpl-L#m`l-7Xpk|V7Q\ \U5*]WZZ_[g_9GZZ_[1e\ \_5@"  3+ahPc%B@? J~]KK_%L$#"+4&'5!"3&#"5265! #&'473>7/Cw@0#J5 HKPX@# ~ KK^L@& ~~ K^LY@9643AA5 +6765'327"3&#"5267 #&' 3&#"52674327LF =>~c*: bU\b&//k6!bRIK)+-M(78 " _&BL*(Y \!AfnATY)W Z/3] K{A7C@@H  e _K ^ L7610/+*)&%A"@+327"!54327"3&#"526=!3&#"52654&#I(@> 4(JH0,GK$PX@)_ K_ K _!L@& c_ K_ LY@=;7521"$'$$" +32654&#&'"3274#567672#"'3&#"525"&543M7?MJ7MfΔZqr]\tuÆZ3i62ϲ=R(f<a^RZ ZR`.A@_[Ai+ [ Ȱ3+d-K@HJ H*& Gg_K  _  L,+)'"#" +"&'5327"3274#5327"3&#"5253yxW\TtX] s]Xe\Z Z\v4A\Z Z\IZ Z\A4=@:H ] K ^L43.-,('&#""A+)52654327"!4327!4327":;.GfzfC2y/Fbub5.x.Gf{fD15@ZA|qK[[GuUpL[[HsUqK[[KqapHAi" w2 +JKPX@&pg]K]LK'PX@'~g]K]L@-p~g^K]LYY@ 15d!3! +%32654#"532#"&#"527674+"#5!27"bKGd].2l!;4}^/-2@kJ)zbdWkb13a)#Ie):A="(|A (3@0Jg]K]LAd!3!+%32654#"532#"&#"527674327"KGd].2l!;4}^*UpRpP.zbdWkb13aqJZZGt_"4P| |3+@"(#RM ߰3+d0KPX@.) J@.) JYKPX@.p~~^K_%L@2p~~^K]K%LY@ %av! + #&'7267&56%23267"3.#"5265.#"Ma=-a8+@7`\[57iEUGd4=&L'NE EAmL|YNND<^U"HC 3+U"HjV3+3+(1A,N@K*J%#HG e_&K_L,+"*! +63256&#"3&#"525#'734#5673#ѺOfpir]\t$fΔ$ <&*Y֓RZ ZRbR(f_dd"uL 3+U"FM, ߰3+{.VeFL 3+"jL  3+3+3+cM3+3+d% 1K PX@, *JKPX@,  *JKPX@, *JKPX@,  *J@, *JYYYYK PX@0 p g]K^K _ % LKPX@* g]K]K _ % LKPX@0 p g]K^K _ % LKPX@* g]K]K _ % L@0 p g]K^K _ % LYYYY@/-)'S#3! +%32654!"&'5!"7 #&#"5265##&'473>:5ix*4?A[5wlbv9;x'#YAZVqU>YYYIqzZ@S T=694do;EX@U<Jg ] K ] K] LEC?=987321,+*&%$1$#A+!54327"32#"&#"5>=!3&#"52654327"32654&+4IlllJ:gJKww@=o3Jhhh@54AhhhH5r>;etiQ dVZZXbvtZIrqKZZIsqIZZHrrOOsWB 3+ah"uR@"Cy 3+^"\ 3+F+;@8  ]K ] L++)('&AA +4'!5265467"!467"3!EZ[T+*UuauL3+TuauM1*TVThXDxqJZZGtPpKZZGtcpLXjd DS@P3/- >#J ~g_ K _  % LA?=;7510$$A$% +!2"'674&#"67467"6##&'463 !&' IOL%!O7ń6SuuP9!%LO>[^X` '27$ rj\WW\jr f,Y2' `XT :0?*@'93!J,*(G]L84NA+%6=4&'5676=4&'567&'&=4&'56752DGsrGE15BIooA@YT2OpoW6.fy^@8ZZ3C]x{`D0ZZ -Dbv~[:7 ZZ<8[P4>K PX@$"!5 J@$"!5 JYK PX@)e  e ]K ]L@/  pe  e ]K ]LY@>;8621A&#d1& +3 7.+632#"&#"5267#"'67!3&'327"3265!"&= P`=}y|Z-H|5yMPZE!\||\!ej>a=v:ױ \<;L!ZZ!#'F 9S@P2"4 5J  gg ]K]L971/.-A&#d"#! +%32654#"532#"&#"5267#"'67;327"327.+KGd]^l!;4}^#E1yMPZE7 ipRpnU= P`=}2pzbdWkbnW(b;qr", #p3+3+dy"(#p3+߰3+2H@EH  e ] L220/.*)(&%  +3&#"5267673&#"52654'#3&'525wuO(;6JAGTp6'~PQ4;l|TSWmRVh#5-Z Z1;$bZ Z!0?ChRZZR5C@@&H e ] L10/+*)"!   +#3&'5276=#3&#"5>773&#"52654'%n5Vz:FOZ;1 pn!8dVcv:Ok25&#"56!! !YNOcPEV~~XES`LMV/;:ثch8M[  [Ls[qx((+=@:+( JGg]KL2E1 +!&#".#&'5>="&#"5>!! !CDCXo WW RhWEyTE'i >", #"$ 3+F"(#$  3+(I=Ve@KCMF< :9  JKPX@W~ W  g  gg _K_K _%K_!K(LK$PX@U~ W  g  ggg _K_K _%K(L@U~ W  g  ggg _K_K _%LYY@-VUSRPNJHA@?>7510/.+)(&#!  ==+#"&#"3267 #65&'"# 4632324ᒑ.#"'6563#"7672&#"#'&'eht,"1H1m%!I`w݆*"]X$r- 798-)  m!n'Ș}"Ў bO}?JIg#-WoGc" x;&"("K6O@D<F?& $# - JK$PX@T  ~ W  gggg _ &K _ K _ %K!L@T  ~ W  gggg _ &K _ K _ % LY@ ONLKIGCA:9875320)'!!"!#! +2632#65&'"# '723254%5265&''65672"&#3#"7672&#"#'&'jf? Ndb &s dvsi&*}S/ 798-)  m!n'pk6?<x  Ocdmyvt?hB7" x;&"2>@  J6HK PX@9 p g   g e ]K]L@: ~ g   g e ]K]LY@<;:75410,+*&%$A$""+33"'654#"#3&#"526=#.#567"34327"0{gL07GSbФ%_o(XE?hiB#)({xiy(/p%3DIjLZ ZThGZZ SkdZ Z^oTB"FxQJe2z?3+5WI>II0ASRR3>F!=&Vo o2->,o oMe8UA47J]U AK'PX@.* %< J@.* %< JYK$PX@)K _&K_%K _ ( LK'PX@& cK _&K_%L@- ~ cK_&K_%LYY@?=860/""$$$" +#"54324&#"326327"54#5327"#.'473267']38X]2BOB"FxQJe2z?3+5WI>II0AS$F̹&Vo o2->,o oMe8UA47J]_BNP/ @,($J Ht+>7.'$%.'>7$ D:8E g E8:D tyE8:D |xD:8E |)('&G $&v #&i|UPs+(0+%.'$%>7>76'.' <22<~ g <22< N522:cV7228Y %uu$mod{!&uu%Wr&is'_)~'mo'nH >" #9 ~86~3+63+ <"#89y 3+(LOs@J HJD><:4.(" GK PX@peL@~eLY@IE3/!&6!+5#"'67) 7.+654&'567654&'567$54&'567UyMPZEL&= P`=}7UwwO@5Yt~tT0BYh7;IttO@<;=v:y\O YYUXwuFQ YYWKFbF YY Gel?U@ POF93!JEIMHH,*(GK PX@ pg]L@ ~g]LY@@@@U@UTRLICA84NA +%6=4&'5676=4&'567&'&=4&'5675#"'673!27.+52DGsrGE15BIooA@YT2OpoW6.HE1yMPZEp= P`=}2@fy^@8ZZ3C]x{`D0ZZ -Dbv~[:7 ZZ<8[3<;=v:Fp&:@7 Ja_$K_%LA$($!+%# !2.#"3 3&'525bee]ݭ)~Srqupt1D?P)+(RZZRU"6@3 Ja_K_%LA$%$!+#"56% .#3273&'52523T0vd rrqupt .\HJTRZZRd{\ 0+'6/77/7'bskiz?S@ezho|@S>)>W+LVX(NWM'W(OWW)N gdD@  JKPX@nW`P@W`PY@ "+D7&'47f }L }[ [ P ,dD@!Ug_O!"!"+D#4&#"+4'32632U@11b|GI@JHLbB 0+>7&5478Om088*6AP>p8 0+'654&'>7:0mO97qp>PA8(88n8<ddD JKPX@gW_O@gW_OY@ ""!+D&$#"#"'!28h lV=5nw;KȺ''610 '1;EOdDKPX@c  ppp  po  ggg  g W_O@f ~~~  ~  ggg  g W_OY@:OMLKJHGFECBA@>=<;98764321/.-,*)('%$#" !!!! +D#4#"#32#4#"#32#4#"#32#4#"#32#4#"#32#4#"#32#4#"#32#4#"#32{}~{t{~}{{}~{{}~{{}~{tz~~{[{}~{{}~{'')''ũ''Q'1'N/Mk{dDK)PX@KQWR d> F,(#"   y u J43 HpoGK-PX@KQWR d> F,(#"   y u J43 HpoG@OQWR d> F,(#"   y u JI43 HpoGYYK PX@L   p  ~ggg g   gW_OK)PX@M   ~  ~ggg g   gW_OK-PX@[   ~~ ~  ~ggg g  gW_O@g   ~  |~ ~  ~  |ggg g  gW_OYYY@+! `^\[USPNMKIH:8&$ /!/+D547.#"'73267%2&#".'>5473263"&#"#"32&#"#"&#"#&54654&54'654&'>7$'654&#"#&'4654&567232632#"'732654&5472326323uU=hKtBYB=+<<~BOL35<<# R:1 ' ( *7H :#J9 "( P3uU= SC(  $ 3g7H :#@C ' " =AtBYC34==3uU=3uU=I7H :#6M "# } RM ' # `K~BEV=+<<7H :#J9 $ " S:1 " ' 3dDu"wP ,3+@"w0P 3+d@ -sJK PX@%e_ K]L@+pe_ K]LY@-,d33! +%3265!""632#"&#"52674Ȏ=33ej>a\By|Z-H|5B\\BB\#'BVzױ \"VBZBVVBd +:@7J gg]L+*d#3! +%32654#""32#"&#"527674춭3KGd].2~P.l!;4}^*UU*.PzbdGtkb13aqJZJqtGe"3  Fbb3+3+Jt"S kk3+3+d(dHK'PX@p]K]L@~]K]LY@ +3267&'3&#"526543£+Q9 Hi4pF?v1=\6H`)m FXZ Zs"\GZdh k@ JHK'PX@p]K]L@~]K]LY@  +3267&'3&#"5265432s(^+Q9 ‚9+4pF?v1=\6H`)m XZ Zs`\GZ<"Fp ٰ3+("p 3+d(0@ ' JKPX@7p p   g]K]K `!LK$PX@8p  ~   g]K]K `!LK+PX@5p  ~   g  d]K]L@6~  ~   g  d]K]LYYY@00,+$5AA +3&#"5265432%.#" #"'4725&4pF?v1=\6 9Q+S. VJXZ Zs"\GZm)`H)_xln3d0@ )JK$PX@+p g]K]K(LK-PX@+p g]K]L@,~ g]K]LYY@00$%AA +3&#"52654327.#" #&'47>54&4pF?v1=\6 9Q+^{9#QP*tXZ Zs`\GZm)`HoUj d LOn@k@!JIDJ ~Q _ K _ K^K_%LNMHFCA=;:9432.$##&A+$''3&#"52765!"'7327#"&5672354'327"23&#"327#n}2miَYRMcx8XL|zT<LX8xcMRYK+98^ZZ028MQG\+.Z Z&;\QMGdIK PX@.*'DC>:2  J@!.*'C>:2 D JYK PX@7 Q _K _ &K _K _%L@3  Q _K _ &K_K _%LY@HGB@=;750/"$##$"+$'&'3&#"525#"'7327&#"&5672354#5327"273&#"327#4WuVXrnZ>9/>[E'ZvBB|Z'E[>/9>EK6'CZ ZC*'Ly62Il[@ CZZC Z@[lݖ265Ͷ \x"y||3+dz"y~~3+d8R@O)32- J  ~ a_K_K^L761/$!AA +$''3&#"52764'327"23&#"327#m}2miَ|zT<LX8xcMRYK-98^ZZ02N+.Z Z&;\QMCdk1K PX@,+&"  J@+&",  JYK PX@' Q_K_&K_L@(  a_K_&K_LY@0/#$%"" +$'&'3&#"5254#5327"273&#"327#9WrXVu|BBvZ'E[>/9>8K-'CZ ZCCZZC Z@[lݖ26! dBb@_  "   J  ~ _K_K^K_%LBA<;AA##$' +7673&#"327# &''&'3&#"52764'327"2yuXN8xcMRY}Pu%(2miَ|zT<'~C1WD|\QM9_4Z ^ZZ02N+.Z Z&;d)8K PX@'3/    ($J@'3/    ($JYK PX@7   e  _ K_&K_K_%L@4   e  _ K_&K_K_%LY@875420"'##$% +573&#"327#"'&''&#3&#"5254#5327"20h䞕Z'E[>/9>ZnW1r&rErXVu|BBvIc"|D@[lݖ26y:$ CZ ZCCZZC<"^ ^3+(p5K PX@  J/+ H@  J/+ HYK PX@9  e  _ K_&K_K_%L@6  e  _ K_&K_K_%LY@554310.,*)"##$$+273&#"327#"'3&#"525#7354#5327"3Z'E[>/9>ZnrXVu"|BBv" Z@[lݖ26y'CZ ZCEnCZZCn24^@[ J  p~` K _ K^K_%L210-,+5A##$! +23&#"327# '3&#"52764+"#!27")LX8xcMRY2miَSDQ5f]Bu\QMr8^ZZ02G8]ZCVF52K PX@ J@ JYKPX@7p _ &K_ &K_K_%LK PX@8~ _ &K_ &K_K_%LK'PX@5~ _ &K_ &K_K_%LK)PX@;  p~` &K_ &K_K_%L@9  p~ ^ K_&K_K_%LYYYY@0/.+3"##$# +273&#"327#"'3&#"5254+"#5!27"Z'E[>/9>ZnrXVu/-2@kJ)b Z@[lݖ26y'CZ ZC)#Ie):ei=8I@F&He Q ] K ]L864321,+*'%$AA+%265!3&#"52654327"!4327"3#4&+d-\.cj!m22o*?k.&iv*g13cKvZhjZ ZrƐsZZo~ZZ}:hAi9J@G*&He R _ K ^L984321,+)'%$AA+%26=!3&#"52654327"!54327"3#4'&'#r*P+qeq00i(4 JKPX@4  p  g ]K]K ` ! LKPX@5   ~  g ]K]K ` ! LK$PX@; p   ~  g^K]K ` ! L@8 p   ~  g d^K]LYYY@>=986531-,('AA+3&#"52765!3&#"527654'&'5! #"'4725&!~o%$fe%$. VJi(/ZZ/0gi(/ZZ/0g7&%ZZ%&_xln3P8@ 1  JK$PX@)  g ]KK _ ( L@&  g c ]KLY@88.,('$#""+3&'5265!3&#"52654!" #&'47>54&05JpfpM1_5IpfpT+4K_G8#QP*zB[  [@|UpL[ [OmqIZZFtoUj H!)P@M$ Jg_K_L)' !! +&#27$%327&'#$$!ȕQ*E`o6#4TsRwr/*" >K]"  ]@57 mfU'K'PX@$"J@$"JYK'PX@g_&K_%L@)g_&K_%K_%LY@ ("3$+2 27&% 327"'# 6# Z#  -' <=):k)=`^Uj" -yw@vS@>^$$`uWHw_"& y){{3+Uy"Fy$}}3+Ri #7@4 J HQ]K]L"&6$+%2765#"'67) 7.+3#4&#!yMPZEL&= P`=}KvZ7'p<;=v:/1dix#7@4 J HQ]K]L"&6$+%2765#"'673!27.+3#4&#!6E1yMPZEp= P`=}2@KvZ7'<;=v:^/1 p< p)4@1& JHa_LA"@ +327"654#5327"3&#"52675&# cHmc?Bad/sfu4Is Z7;9# =Z ZyxMZ ZMt p"<p 3+ p"apq ް3+>i>H@E3$J.*H Q _K ] L><:9870/"1A +%654'3&#"5267 .#5327"7654#5327"3#4&#!oz:կY%IDHW]?U;ZE-vmWWcXQMM^01KBKvZ,)W@8 Z ZDRYKZZ.у4.Z Z2B<1@i_" RiZ4KPX@JH@JHYKPX@*Q ]K]K ]L@+ a ]K]K]LY@43,+A&6$" +#4&#!56765#"'673!27.+!4'327"ZKvte%$1yMPZE= P`=}2%$fiZ%&<;=v:i(/ZZ/0gɌ&%Ri}0J@GJ($H ~R_K ^L0/*)"6#" +#4&#!5265#"'67;27&'&'!4327"3}KvG81yMPZE= P`=>=15IpfpT+4KiZFt <;=v)UpL[ [OmbqI if3I@FJ!Hh Q_K  ]  L31/.-,2%"$ +%265#"&54327"3274327"3#4&+1l--bptj-`h-bpt-*mKvZ_gajoZ ZingVjoZ ZiniWdi" N f"#''3+3+3+d"#l3+l3+3+d  3+WBK<r*D@A% J~g_K_%L$$$#$$%+%654&#"! 327! '&'#"'&'47232̗Y݀2cI#)dL 6.J`5HN+N Q<.)u@$ JK PX@$ph_&K_%L@%~h_&K_%LY@ $"$#$%%+%654&#"543 327!"'&'#"'67232y*iYjKY\yEӅhD#g&+%SC%Z[b.eZӣ6h k$/r+& ,21J~ga_L$#$$)%+%654&#"#'&'&'&'#"'&'472327! 327̗Z:dΐ#)dL 6.J_Y݀2c`5=$,2miَ|zT<LX8x`_^ZZ02N+.Z Z&;\ylo "Gd3@# .,*JK$PX@/   ~_K_&K_K!L@/   ~_K_&K_LY@33%$%"" +3&#"5254#5327"273&#" #"'67>74&rXVu|BBvZ'E[ OPCZ ZCCZZC Z@[lD~u`` સ,"wQ Q3+Pc"wQ Q3+d<9"HK$PX@4   ~e ] K]K _ ! L@1   ~e c ] K]LY@7543/-('&#AA+!3&#"52654327"!4327"#"&54633265\.cj!m22o*?k.&iv*g1O8(.T29jZ ZrƐsZZo~ZZ}bJ<<?{@.8 6 J)%HK$PX@$_K]K _ ! L@! c_K]LY@;943"1A +3&#"5267 .#5327"7654#5327"#&'47>54'گY%IDHW]?U;ZE-vmWWcXQMM0&m6H-G8 Z ZDRYKZZ.у4.Z Z2ɠk@H8:=_R>,?Z ZK-NNZZ )x0&ZZI>";p װ3+@_"[pr 3+U (d JK PX@e]K]L@%pe]K]LY@ 4aA#0+&# 3274327"3&#"#"$54$32oa>jeB\||\B5|H-Z|yَ#VBZZBVއ\ ״U7GU :@ 9JKPX@/  g]K_ K_ LK1PX@4 U  g]K_ K_ L@: p V  g]K_ K_ LYY@ 8610/+*)$" : :#0 +&# 327 $54$324327"326=4&'567"#&'oa>jeZ|yB\||\BsqoFHsssGGӁxَ#״VBZZBVtt|]QQ]~66U7,6@ -!6 + J HK1PX@6~  |_&K _%K_%L@4~  |_&K_K _%LY@53$%"($ +#"54324#567326=.#5327"#"'&#27Y^*^xfYT]L+1VjiV,,;;LIas$.;R[m_^tbcI,0I I/-K~m5/1F4R@O310Jgg_ K_%L.,('&%! 44 +2326=4&'567"#&$'.#52654&'"'656ؠn[ZoFMvvUEnR%o)ւv/yrsxHS  TG}axsyO_3`@] J~~g _&K_%L/.-,(&!  33 +'65672326=467"#"&'.'52654&Tuf" aDD](;tSSt7(ڐ"`oxjn8 bP!}ozmjo^5,R  R+6KZ74'&'5!"UcbR/?fqp\;/n'#YAaC =55dnihf-4JJ0+XJH T=69$$VU9dE@ :6 J"HK PX@5  ~  ~ e ] K `LK1PX@?  ~  ~ e ] K_K `L@=  ~  ~ e ] K]K `LYY@CA<;9754/-('&#AA+!3&#"52654327"!4327"326=4&'5327"#"&'\.cj!m22o*?k.&iv*g1xrryPHxyxEZjZ ZrƐsZZo~ZZ}'t~~tRr]\ \]tFA7E&"HK)PX@4 U   g _ K]K _%L@5  ge _ K]K _%LY@CA<;:654/-('%#AA+!3&#"52654327"!54327"326=4327"#"&5pP+qeq00i(]ώ3-h]?fWe@ `$tRq* tT7Xy_TT_y{bmW2%@  JK$PX@!]K_%K_!LK1PX@c]K_%L@$pc^K_%LYY@ $%$#+!#&'473>=4&'5!"'473265"덐-'Z]l7Z|X9вU dq;p fI1OjSLLSj}lat2zM@J:*  J%!HK$PX@,_K] K  ] LK)PX@)_K  ]  K_L@-K]K  ]  K_LYY@%GFEA@?6540/.'&$"  MM+##&'67254'&'5!"7654#5327"3&#"5654'3&#"5267 ."εN gw%$[ mWWcXQMM^01KBarz:կY%IDHW]?U;Z2| _ O8&%TZ.у4.Z Z2B<1Z Z,)W@8 Z ZDRYK2qFd@aE<0"  :,( J H _ K _K _ % LFF?=9742.-"""+"7654#5327"3&#"5254/3&#"527&+ #&'473>754&'5BBec$NAtrOO> FWaWY!4?W[XWm;:Jn'#YAa/CZ )x0&ZZI`Z Z 1?Z ZK-NNf T=69HqH[e HM@J>* JFBGp| ]K _ LECA@;:aA% +>54&#"6!&'3&#"5265.#532632765432767" 3&#"4'uq@[UwxY2y_1B\a[ (D#C4'fwaXf+_ = \Z Zl}cQ;W sk&Z ZiZ OlJb M'KPX@(" '?1. IC J$HG@(" '?1.  IC J$HGYKPX@8  ] K_&K  _ K _%K_(LK$PX@6  ] K_&K _ K_%K_(L@3c  ] K_&K _ K_%LYY@HDBA=<;5("$$# +32654&##"&'3&#"5274#567>3276543267"3.#"54'&%K,E{ Fmp4R\oeQoj.F;Z`*nJv}`:k1LG 74hY!"?XZ ZC`>#P@0-:::GP[Z{zsZ:$ FI+K1PX@ E5C#"J0IH@ E5C#"J0IHYK)PX@3 p  |g] K]K % LK1PX@9p p  |g] K]K % L@@p~ p  |e] K]K % LYY@@?=;:942-,+%  IF +3 7.#"3>754'&+3267$'"5265.#  #&'7267$5%2ZF>T5Fp_PR81U_ѩ6Z>!l5Rt<$G+dd4pi#&|%p60R E6s] MZOM-Zb 25P@M+* 10Jp|~]K_%L#$!%%+%654&#".#" #&'7267&56%232>3 327!"*iYj=&Ma=-a8+@7`XKY\yEC%Z[b^L'NE oZӣ6 H4 UxT : MZd" $3+3+ah" c 3+2(9A@ 0 JKPX@>  p   g]K_K_K ` ! LK$PX@?   ~   g]K_K_K ` ! LK-PX@:   ~   g d]K]K_L@@p   ~   g d^K]K_LYYY@995321/-)($#A+3&#"5265!#&'673254'&'5! #"'47325&*m~l-^εN gw%$[HRH. VJniWYY_g _ `8&%TTK_xl~32<8@   1 JK$PX@/   g]KK_%K _ ( L@,   g c]KK_%LY@88.,$#" +3&#"5265! #&'473>754&'5!" #&'47>54&*Jh_rF:n'#EUa/C3=7#QP*oK[ [FtWf T=69HqH[ZFtoUj d(J@ AJ0HKPX@9p  g ] K]K`!LK$PX@:~  g ] K]K`!L@7~  gd ] K]LYY@$JJFECB@>:96541/.+*'&AAA+3&#"5265!3&#"52654327"!4327" #"'4725&3c ld-\.cj!m22o*?k.&iv*g1. VJʎhZ ZhjZ ZrƐsZZo~ZZ}xln3AJ@ CJ40HK$PX@-  g _ K^K(L@-  g _ K^LY@ JJ@>:96531/.+*'&AAA+3&#"526=!3&#"52654327"!54327" #&'47>54&M1ggr*P+qeq00i(t|>j7&iv*g13c ld-#WiZ Zg~ZZ}:hZ Zhj)9HK"PX@4   ~  e_K ^K _ ! L@1   ~  e c_K ^LY@7543/-*)&%A"A+4327"!54327"3&#"526=!#"&546332650i(;9876.-+(&% +!4'67&'&54327"!67"3#.#!"#676*Kʖ kPk-bptj-0-J,0b85t>LKUpkc7R>QjoZ Zin3 ZZ4*O40H@; :7) J= I>40HYK PX@+~a _ K ^L@6~a  _ K_ K ^LY@" 6531/.'&%$"?? +32746=!67"3#.+"#>7.'5327" TtuOb6.9RA,gFؔ EWGxgW\ Q(JU4B"&\X>noGtcEcQpr\` `\!`,i'@  JK-PX@)Q]K_ K_ L@/pQ^K_ K_ LY@'%# +%265!#&'67254'&'5!3#4&+X-^εN gw%$[R\H*Kv^_g _ O8&%TTKiW Pic" <T,0+#54##"54#5327"32654#5327"3!e=o_o_S~aZ ZēZ Z02/# 0+!2#54#!3&#"525432#54&#";_o\_񼇅xMCZ ZŭŒF +#0+4&#") 6763232#54+3&#"525||))|BK^uKPW/_o߉؄tELWgZ ZSF&0+543232#54+3&#"5254&#"F\_^uKPW/_oELughZ ZŒ<%#0+2#54#!326=3#"54#5327"?;ʳo_MCgēggZ Zdp"0+67'$$6332#54#!#3dYa"0 ;vd  MCF" 0+! #4#!!2#654'!4'327"NwVy:qyjp ѪYZNOLH mh-0Z Z0'ldL0+432#54&#"!2#54#!d\_񼇅}&ŭŒolHK~%-*&0+! !34&#"3&#"52543232#4+"325>l:ؼ_o\_bZ񟕔TOŒZ ZF( 0+! !2652#54+# )54#5327"-|OuKPW/4o_^pēELWglZ ZP,#0+4'327"632#54&#"3&#"52765gyjf o"|zk_okO-0Z Z0'gU؏Œf%!Z Z -e<80+%!2#54#!4'327"Q:qyjp ol\nh-0Y Y0'lM.;20+3&#"52764'327" 3274#5%5#"&=2miَ|zT<7C\LBmjq=xv2f^ZZ02N+.Z Z&;hC?3OVF_lM# 0+%4&#"3&#"5254323&#"52Y_o\__oŒZ ZZ ZF0+ $'7$.#"#5432X^El1b \= [F +Œ<K0+"'4323&#"527654&#'=HK_oxC'|]Z ZC#sdp ' 0+4&#"65&$43232#54#!#336ǡ:\ E ^G5dZoLꝷ$G88,MCF/+0+32#54+3&#"5254&#"3&#"525432C^uKPW/_o_oRUELgJZ Z򝺻Z ZF08 (,'0+"&'5327"3274#5327"32#54#!Ov}}{L_w}||^uKPW^;\Z Z\v+\Z Z\ELugZO6FC 0+54&#"3&#"525432R_o\_ŒZ ZϭZ*60+&0+32654&#"!6767'&54632 '&'"32654&cD_O5:lgo簬rf|4?LV@?MYC]K2jPP\\ PqYaom\_mnMD30+3&#"52764'327"6323#"&=4&#"2miَ|zT<c,;]|Mn^ZZ02N+.Z Z&;Zvb7 k~jTbQXd 2+0+! .#"!2#54#!3&#"52=#"=3;432)))||'mo_p%#KMB|GK%kZ Zkh.hH2 PT1 *  0+4#"3265%3267$5>7327" 67N]O.:I'Z<8h kk$9yAP"Gd@+%rۼRdp+47Z00+%&54#5%3274#5%5#"'&'#"&54#5%32NDC\LBmjq=x; RS=xvNDB-6c3 >3+_0+32735#"&54#5%!C\mjq=xvNDB< ?e9FQUCD/3<] B  0+%&#"32#"&543257!:^BCgA%ϲҹVv.C:_LA0+%!2#54#!4#567!!G&fΔBolHوR(f_g^  0+3&#"527&#"!!ȷ6323t_^w\nmhҗhK;SZ ZS;T(i@F5 0+#"3253&#"5254#56763232#4+! !34&#"΃zyr]\tfΔqO1pnOFϴ?RZ ZRKR(fZJr3.tWN]b0+!$%34#5673!# 3229 h:KH< a+oBYu6Z B'"0+3&#"527&#"3&#"527ȷ632Qt_^w\nu_^vhҗ|K;SZ ZS;SZ ZST(i_ X 0+ȷ!hҗ  T(iZ =B10+&#"3&#"527ȷ6323274#5%5#"&5T\nu_^vhҗ|C\L8js;SZ ZST(i?3ne9FQUCDc3PZmn9 ud602) 0+3274#5%5#"&5474#"'4%327C\LBmjq=xv7 3duV4H?33&#"#&'4gS_w[-B?2g R|hwq'I m.!'_Q2%$"0+$5454673>3&#"#&'46rDO-[-B?2g Gl>2P^F%|e'I m.!'lZ 4-0+%#"'&'#"&54#5%327&54#5%3274#5%3&'525.q=x; RS=xvNDBfNDC\LBrqpptsCDQ)S""c35&#"#&'467&$'4323>3h:_ 2g p ȟ[-B'maȷp'I m.Z%#0+3&'5254#5676367!5$!"rquptfΔ DBRZZRR(fsX̮ nIV|XZN0+4#5%!!#"&54#5%327LBnq=xvNDC\3<{CDc332#"&'!!3&#"5275#"5473Q%K,EeQomp4NR\oFrH>74Q>#P@0-::!"lXZ ZCRdp+47U@RF ', ,(0+3&#"525$47$!256'r]y\tSg#6$1nbRZ ZR8a YPU J yY=Z 0+%#"&54#5%3274#5%q=xvNDC\LBmjsCDW373*% 0+2##"'&'&'676765&567&#327&'&47%2.'"6365.#$7##"3$5&#"3>7 #"'#27&'1ː.iʅА d)RT|.K:-WSW!O~oy.a. L?|tXRڑ@LQ`{iaЁ͑f 偷gPy/V ')~ngB;f SVQ \0_REpt oz*.FS /E@ d a'4@LYfr@wsrk`ZYTGB>60)% 0+#"'"'&5476763%"6$%325#6365&%"672$#"'#>74'#"3&5>727&'4736##"$)d זi.8ђTR[SW-:K.ި~O!.Ày-t|?L .>@R߇`Q?i{ag幅f7Ɓ!p/뽀yP8n~׃' !,VS ;BN\ QR_tp.*z+@E Sda.&0+'735#'7354&#"#54323#3#3&#"52=""_\t$|t$|o_Th0h0ēгr&r&{Z Z{e"% >>3+d'"0+2#&+3273#'! %#"33 ޚ "3wUs}p RDZ'd+0+%6%&!"5265#$%67674327"v8)=3bG^Q*s"Qyj  Z1IIs42[p0h]Z ZWld)!0+!3&#"527654'&'5!6%&!"5265'^o#p o"#(9e3^K!j)#c c#1h$XX$ $ [3Qd *0+! /! '&5%75&'7!27$7&!#g1nݖֻ(9y3Q|T(9y3;%^pr\WŠ(T$$d( 0+!3&#"527654'&'5!3&#"5265;ro#po"%_(j)#c c#1h$XX$jLY YThd?#0+3&#"5265!3&#"527654'&'5!!3&#"5276=%_(;ro#po"p#ordjLY YTh j)#c c#1h$XX$X$h1#b b#)jFX %0+"32654&%632#"5&'7!2%"`gjgM(9y3Q ^KPٹ(4K $ W3Qd560+&#273&#"#$%2327"!3&#"5276=a{^s-{QQ4 hM`3p#or -c\  \7W}X$h1#c c#)j<+n0+3&#"52765&'7!2%"_(9y3Q ^Kj)#Y Y#1h $ W3Qd 2$0+"32654&3&#"52767#"5#4327"632fjf%_oR xiQڌOʿjJZ Z$,KV*udZ Z^{Xd] 3 0+"32654&632#"5!3&#"527654'&'5egjgo"Mro#pPٹۿ [3+a a(1`<Ol&0+32654#5327"#"5&'7!2%"Do_(9e3Q ^Kˢȣމ\ \"7 $ Y3QF om2/0+ 7.#5327"3&#"52653!$&'7!2!3B~jM0dtt++ttd0Qu(9y3QDQp93_o[ ZssZ [o5OU $dB>0+5&'327"32654327"6323&#"5265.#"#"'& xi(o_O Ke'iv~ؕHH,+a a^oșfTY Y 5%"36%&! 526743263!"'xnpo EAl#(9e3^K2b~Gr8g('+ } $ Z3QW5Z ybpZ 20+#"324#"# '&76! 6323&#"5265ǻ»^`ѹ"+w_o(!a4B~!>ۿ[\PH# Y YThd  : 2! 0+&#"3232654#"#"53253632#"'3&#"5265dQBG]B˳P̐EݛffE;|׵@PCr"j9uO``OjV{n nd /0+4327"6%&!"3&#"5265&'7!2 xi 7(9y3C_o((9y3QCikda a()K $QH# c cThq $d# 0+%4&#"3&#"5254323&#"52p_oY\_oɘZ ZZ ZZ ( 0+%# %3274327"3&#"52655u]Fs xi%_o(`oh&BBk\kdZ Z^ojLY YThd,-0+#"=33265# %2 3$7&'327"y{pf|6; xi ,((șLf. #H,+Z Z()P$0' 0+27"3&#"5265!3&#"52654327""in%h_og(%h_og( oxin a^ojLZ ZThyjLZ ZThMkdZ Z^oHVO0+!2754!532'5#$%2,rM0_9{i0#$KeD'Z-'Z ;4'0+!"3267!3&#"5276=###"543!5.#5327"Rgjg}f#~[rr 0dtj+@ k[$h1#d d#)juo[ ZsP  40+27>5%"3&#"526543263!"'36%'654'xnpo EA,R,2b~Gr8ť!])n('+ gybZ XezjW5\ ybp ף cBd)%0+%32655>32#&'65.'"#"$5x)_qgf ߩtG9&S4El?3@}'ᒕk[SJ-wg޶ʮdw20+%36%&! 52674327"!4327"3&#!7(9y3U^K(o_%(o_%iy $ M3QhTZ ZLj}}hTZ ZLjo^a   >8%0+!"7674!3&#"5254'3&#"52>7 .#&'7 %CR Qzp aae:OKOdn\|@Tb[C/3*]o(9y3|+!*zⴝ/'uS rMY Y&aRF*$Z Z*9D@H$ )9Fh6)0+4327"#"5!3&#"527654'&'5!3265(yW%Yhe#po"y{hTc cLj^j)#c c#1h$ZZ$|PșP%0+32;#"+3&#"52654327"貲ndlw%_o( xi#yffjLZ ZThMkdZ Z^oPk6 0+3263 $7$# # 0 ljB${6Z+ m6.}]BW 1? d+#0+%5# 4$7367&'327"3&#"5276l ? >xi_oGi r#J.0Z Z,+NaL%#[ ['(Z .0+3&#"52654327" 4327"~'`o*k"xi" "xi qoQ[ [Zlank\ \eri nk\ \,&@d) -8 4.% 0+32654&#"'>32+32;#"+##"$54$;#"3267 ;]e;8YŮzzt _baB`mXYm̀d{d*j@ &JK PX@#p|_7K_8L@$~|_7K_8LY@ '#%'"+! &554&#""5463232654'672VSF\)HXlpit`F\g.X}1K;<'prĖA5d |0+#&'7! %"36%&! 526'(9y3Q3 ^L膥7(9y3^L $ W4e $ W4] 0+6736$54%$]; &Z1Z [r鋹HQf]H( '$0+4&#"326#"54767654'6.R[PitxׇxS5Ƭ ׽yNVQZ )&0+4&#"326#"547675'#&'! ̉R[Pit`_ׇa1I,S !t׽s H'w]> :'0+"32654&!654'67&'&5432632#"547&#"}Xqz[Xq{K% }߶gc4EqfIб^NoO677\#B&+-,c,W[ d|Z0+ ! %32'"&5@<=f I@=sO=b K1^ d& 0+ ! %3254#525'"&5J<(f I uT=bg K'^ 12L 9 6#0+"32654&54'&#"3276#"&5463267632#"OnvSOnx-$21KP41!) deX^ ;RnqB4cgsu,8}`Tz܎bS$7] '0+32654&#654&#"#"5432632߆|be|br|L8ms {Ϻvޔl %fb] 0+"543 #654&#"Qy; )!D2 0+! %3254#5254'&'43<=f 8b sJ=bS,)%]B50+7263263 '6#&'65'&'65'"!654'67$4TZ0Kf_"ܛ $EO Px #HR O  1* 4<( Co) l6. %"7gB977PE&+,A_ &0+"32654&754'"&'! #"5432WoxZWozzHŎ"ͯ1 T0\ #Qd &0+32654&#&32#"5%2327"&#zoWZxoWj&:x&Ec#λͽYT@>C ]0+$#'65'$!26! 'ٟ1d6An# ffF0q)K1s]%0+4$'47! 5%3254#527>kk<=] oXN NM i3:XSZ*0+! 4%325$56765&'&547$7F=f ק uA7)w""`M*+.Hd-v: 4A˥%CDs#?al$M>#%HJ oJ!D >[1 lZp.0+67 ! 54%32&'#&'"#$'63232{%<v<=f v/MY 4Lc^V--)A^=b)pz[u_m 9%0+32654&#"$#"&5463263! %!254#525'5bLNkbLMl=/.׬׭WZ) \ bXPe՜HE aP?bSZo$0+4'"&54!2'$73! 6%325ǵi^By-~9ggB u ѿH.B(P 2$KIw3I6P]00+!654'67$4726%'6#'674&#R   4<q!ߦ[h1T^t677\#B&+-,,td{@ts&-mgsV0+3! 5%32# 336<=f 2Q ؆}sT=b' a1  3.0+"32654&##"5432&##5&'"&5%67 WoxZWozZjŏ9yv{kB cI%(?#ͯ6Dz)22d0Q adn  0+#$763 '67#"#! |v; ~xL T=b/jd}2$0+4$'47! %! 54#527pkk   pBVVn M ۤEh4'S]  0+"32654&#"54324%5 WoxZWozZŏ93#ͯ)>GA(m., 0+6'$!263#65&#'65&'67#$ ϣf^(1?~D,MXt(\& ?5ZjjtygngG0#Lk㱌 (  MI'0+32747&'">3&#327#"' 47672!$74&5#$'%267&$'47Y`f_ CoY+7%ubP7 t5/!T@82 sUHBkk"n),Up@*A3)#=Ϸ\)qUwƬz(LLqn  0+32654&#"'632#"&5367UoWZxoWX1.c9UͽC+D&12d-A0+2 65&#'63"' "/325&/%&#&5!27654#&'48VoXg偮[}_CM t|mu ڐd )=` Y V}u~n '܀Vh `Z-0+! 4673274 54ᘪ$'47<<v ty>kk @Na*C19T+8 zekD D}8} :d43:84-0+23674%7674'?65.547# 5&'"FǷϦ Y f,8 CQe {{M"""""NN"!OO!ǏzົmSSo oSSmN"!OO!"NPc0+&'#654'3&' ~H2"""(G1vn%UmSSo oS&h(P 0+67&'#654'367&' i\c"""i\e~[YaKHmSSo oS\aJP0+&'#654'367&' L["""um]hxn>QmSSo oSzPYb˫IP]0+$'#654'3$' %I"""IiUmSSo oSiP#0+&'#65&'75&'754'3&'k({""(ā(ā""({WG:xY*mSSo`J=xZ-J=xZ-oSSmH:xY*P0+&'#654'3&' +""""+I;xY&mSSo oSSmI#654'3$4'3$NN$#OO#""""+2""2|VWWVmSSo oSSmqSSkP0+67#65&54754'3y]""{{""^))q:CmSSo5m;oSSmP 0+673#&' #67&'3 0C/.C11C./C0)k^Nk iN^mTm^Ni&kN^kP#' '%" 0+#&' #67'7&'36737'%7'͘.C11C.˃/C00C/U!!L"LMiN^mTm^NiY-kN^k)k^NkMJLMKLP 0+ #654'372b"""]PmSSo oS P0+4'3#6=#654'3""""l""""oSSmmSSo|mSSo oSSmP 0+%#654'34'3#65 5l""""""""llmSSo oSSmoSSmmSSoP 0+7'#65'7'74'3WW""WW""s``mSSoc``XoSSmP, 0+#65&'&547674'312/*-;""2.<+/B""45YE59mSSoL/>V?8:$oSSmP0+&'#65&'74'3~/B""u.8""@0vN +"mAoSSmPB 0+%#654'3 """"mSSo oSSmP,Po! 0+ '67%'&'7%567&'oK:QJKR=ML:QHJR=NFFCDAHEAEP   0+7'5 #6=554'3yyz+""""cxxx6PmSSo PoSSmP0+'674'367#65{(ž""(ȥ""*Yx:HmSSo.Zx=JoSSmP0+'674'3#65{(ž""""*Yx:HmSSooSSmP0+&'#%7654'30l"/c"yr$mSyo! oSP0+%7'#654'37' 5OIZ""ZHP¦`-nSo oSr.aދP0+ #65754'3x`""_""n\mSSoq\\oSSmPq 0+&'567&'567հpɜVUaWP 0+%#654'3"""""ߣmSSooSSmqPzB 0+#6=4'3 """":mSSooSSmP,0+#"&547674'3>.*|gt+-@"":5MPxX<59CoSSmPA0+67#&'74'3HԚHЊ""dZrt\ioSSmPA 0+%#65'673&'""HԚHϊmSSo\trZP 0+%#65'673""H"mSSo\t\vP'  0+#65&'&54767'673;)#$+8""9..**AH"71F;09mSSoI53K;47X\t\vP  0+%  #654'3- 97G"" 8hSjlSo oSP0+4'36767#65r""(ȥ(ȥ""mSSo.Zx=J.Zx=JoSSmP!4D@ =5.' 0+2654&>54&#.'>2+654'3.'>&ŵ"NN"!OO!8>""ڼ/S"NN"!OO!&-Zq}0)xrKN"!OO!"NŒSo oSŦN"!OO!"NP<0+  #654'3 lnR""""^y`mSSo oSSmP 0+#654'3 &'3#65 """ >@ """ mSSo oS%.$SmmSSoP! 0+7'&'3#65%#654'3  """""" H2SmmSSo[mSSo oS2P 0+64'3#65$4'34'3""Z""Z"""" oSSm"mSSo{"nmSSooSSmP(0+&'&54632#65@.*}zb,08""72KF}XC39 lRRnP 0+4'3&'#65r"HЊ""v\t\oSSmP' 0+4'3&'#65&'&54767"HЊA+)-/9""8*%$(;v\t\74;K35oSSmK90;F17P] 0+67&'63#,]]]]ҰҲ0||||P 3& 0+&/76%67&'37673#&/#67&-de.-de./))./wv./))0/))./wv./)):7zz7::7zz7:2 1:88:1221:88:1 2P 0+  #&' #654'367 6$""FE""EF>}SmmSakriaSo oSairkaP` % 0+&/76%67  !&/!67 &589897J6po6KI7)6I:9K6)7BEEBBEEB/ADA//B@/BFFB/@gHBPN 0+67&'#65&'767EfrYy_^""^_yYrfVUqѺGoSSmHхqUVP 0+7'#65'7'74'3WW""WW""``|mSSo``9oSSmP0+4'37'#&''%F"ZHP"ZIO5oSr.aދoSn-`ԌP 0+%#6='4'3x""_z""|`mSSo\\qoSSm\P5  0+7'%7'7673#&/#6=#67'7&'354'3%$Q#%QR!22E2ן0F3F$$E4G0Չ1G22$$OLNOMN0kk^NkiN^mmSSom^NiY-kN^kkroSSmP %+@+( 0+%7'7'4'3%&'3#67%#65%5% :" HM "" "SYӈoS22SmmS22So]ЭP 0+#65%4'3#65'#65""""""""oSSmn"}mSSo"mSSo oSSmPB 3+PA 0+67#&'7654''673&HԚH΋HԚH&3&[rt]((]trP 0+&'3#65%5 """2SmmSSo[kPb  0+3#3##6=#53#534'3rzzߣnn"""tt""j,q0jmSSojjoSSmP.ux /3+P~3+3+PO0+7'7%%'YH QHHQ HOtNMu''MN'P 0+!#65'674'3&'#{(ž"HϋQs*Yx:HmS t]mP30+#65'#65#65%5$4'34'364'3""""""Z""""""ZP"mSSo mSSooSSmn""nmSSooSSm oSSm"P@ + 0+>54&#6=&'&5476754'3c_W""}yy}""}{U0 (mSSo'9oSSm:P 0+#654'367#4'@R""""N *?*,nmSSo oSSmffiN]nP0+74'3'#65r"""""@mSSo q{oSSmP* 0+#655%&'35%7*"" x&wiFmSSoQFJvu|P0+/74'3%53#65rC>t"".B>t"".H]mSSo-I\ZmSSo P0+&'567&'567&'567zwrpyuuy\u{huwzxvvxXq|UXl-YqmX0EpX-nZV{qX.XoqWP0+&'!67!4''676k1yQof 69SxnjOZnKx+4lOZlNw/7Pc0+#6=%#654'3 """""""mSSo =mSSo oSSmP 0+ '4'3a{""}bJ^oSSmS^{U"+@(Je]ELAA +73&#"52654'!3&#"5>7!1?xoLqC9420.,+!5AA +%5!3&#"5>7327.#"32674&+3267$#"52!? 'lcBoTHE!;\w #?$f3aT}`< >k'b.q3C:mri   bbA x;+Ju[c' AbO,@) J_CK_KL"% +#2# %2/Xkv[8&#  ,rZQ0@-J]CK]EL  a"! +%3$%"5265432$3"$#"yd}z3?Xdm 4Ui| c ]qnXE\AP" 3+Q1@!"JK'PX@-  pge^CK]EL@3  ppge^CK]ELY@10E""!5@ +327.#"32674&+3267$#"527674&#ep\ #?$p3aT}`< >k'b.q3C:m*t=@:0.J G ]DK]EL= (=y9*k@diE`C;o+a!RWVi`VTV:8TT_P(O (@%_CK_KL   +  544#326?R_1ғP%B@?JH~g]CK]EL#RA# +265&'"3&'"526543263#" ?M+u||vj+4Ms?"^x`i]==\j K<= ~"1@. J H]CK]ELA&6$ +72765#"'673!27.+3$#"̎E1yMPZEp= P`=}2@3dZ7'<;=v:^/1Z ))-@*]CK_KL)&&A% +">5'.#5327"#"&5432g*Rm 1E8:g&b{{P[}bJ+PP<0ѐ!WPb%)@& J]DKELA@ +327654327#4''&#|M9-lQ6PunkcM0Y8am'.kV)4rsD0YZrsu:, DQ?GB@?CA?9*J ] DK EL@@@G@F8432-,A1!A +'327632327"54327"#4#4&'327674#j?x\!!'$-KtQ(_~aoEm^AtH1t)H\^d%#   05IPX  2( QPX>>+ f$ 01MK #(`%,(%+1PF"P@! JHGK-PX@]CK_EL@c]CLY%851 +;27327>7&+"'67#"'6ڎIXKXE[8SFCbm!1h==Q9Bv cd;+O=#dzU!@g]|LA@ +327"3&#"527654'&#jj>=f2 Iu64wK EUB On'AA'aP"XHez'c@#JKPX@g]VK_XL@gc]VLY@ &### +!&#"!#"&'67&567 &'6$&$'`/>XTݶ_;TbFYanr>y\K^  .~dD@Gt +D!%'KX~BB$<F%dD@GW_O#$ +D654&#"'632޸0(<6BjZn$z.8J6nRA  0+7'7''(i/> pdD@JGK PX@n~W`P@~W`PY@ !&# +D%3267#"&#"'Ik(" $N8=\ #R'( '2n} Rr3+Y8<CdDK PX@.'!9832 JK PX@.'!9832 JKPX@.'!9832 J@.'!9832 JYYYK PX@%~gW_OK PX@*~WgW_OKPX@%~gW_O@*~WgW_OYYY@ #$"'#'$'% +D32?65.##"&56$54&'#"'&547>7632327#"u| .9i?(,79Hy;9P$'#"fDJ2VJ/Y3J?1Wr!) $#%%5SJNT;mH0, 9  +0#$XG9V'O] 4dDK-PX@0, J@0, JYK-PX@)~gWW_O@.~WgWW_OY@ #"'"$#'$" +D4&#"326%327632#"'#"&54$54&#"#"'4672@$(<@#.7| .9W9\~xzHqM9P$,@7jTU cboVdZnI!,$],^yTTT;jK0-Z44D= 1dDK-PX@-)$# J@-)$# JYK-PX@%~gW_ O@*~WgW_ OY@ 1 1"#"'%% +D327&'#"&54$54&#"#"'46727654#5327"| .9E=[;9P$,@7jTKvb4-D4/9!,$:;T;jK0-Z44DFUBB#]-2$6dD@+ J$ GW_O$%& +D&'&5>72.#327'654'L4E 5A/2>NL6H&iSI]U[I* 5Eq R:,#XEYV.AG .A,D:*"y "5dD@*JHgW_O$'$! +D&#"326546#"&54632&$547,12?FH;:D{rp8 :&VS`e[[Q󈫗nu X(5 2 8=dD@2"J540,+'# HgW_O$*$! +D&#"32654#"&54632&''6767&5476767,12?FH;:DX{rp8 |:MJA:&N("ejVS`e[[QY b󈫗nu F*F\; 6>(5 2aa[& >dD@6!J,HK PX@+g ggW_ OK PX@2~g ggW_ OKPX@+g ggW_ O@2~g ggW_ OYYY@ ;:53+*'% > >  +D2654&#""&54732654#"&547&54632367##"'1!1#+%/ T^`. $'C_QH\ta9@ F: Gw]( ?-K8>0I.G#83>2 !1=),6<4iQm8%"?W` Y HdD@= JggW_O$$1$$ +D&#"3275&#';"&54632ApDFQH-2CB3Yqx=R. WSHVf)%GF._%ptS5VdD@K2,%J+I" H GgW_ON"B +D3.#"54'&'3&#"5254#56776543267"z-E(5%.f#88BM792jVi %8/70Q8_DB"\BB89;R-dh%BB;?DX+dD@ HGt! +D&#"5254#5673D9DP8:3mX9B:;="?dD@4 JHpgW]ME1 +D327"267&#"5276754&#]<0g9A@"%x}B 6B16B=g]BC9/ @ZdD@O0#J5H,G~ gW`P9618E +D6765'327"3&#"5267'#&/3&#"52674327327"NJ83V*.Q73 FI 7O(%M--M \Y ocD& AC 2>'?)@B@ C$ @)MdD@B J"H G~W_O'"#" +D3&#"52754#"3&#"5275ȷ>32::FQ9<l;:FQ9<4oZ2g -9U BB  BB <<>U$+3=dD@2JgW]MAA@ +D3275&'.#5327"#&/3&#"52676=4&#VQ &4a '[-q - 6d!h3 ?*0Ɛ&?? 6.16$ ??+k(  0ٱdDK)PX@ 0%#*J@ 0%#*JYK PX@+ppgW_OK)PX@,p~gW_O@2p~~gW_OYY@ "qa3 +D65&#"3.#"526=432633"&#'St8.G% #M9380`J++2-Z& ,8$J!xT%ALt&ABvFT:BX#6?wPY$ >dD@3 J~gW]MA" +D>32&#3&#"5265#56pQ3##M 748e.&f<22Jdr(:"_Q32BB#D!,!CdD@8 JHGeW]M5651 +D;2763>7&+"'6?#"'68=>1%Q0AS(=E;;B&L1a) >:f,"Y^<^1W"$vI I3+f\"DP P3+Xo"%3+3+iB"E 3+XU"% V3+iUB"E V3+X"%dd3+3+iB"Edd3+3+=T"uO"u3Xj"'3+3+?~7"G 3+XU"' V3+OU7"G_ V3+X"'dd3+3+O7"Gdd3+3+X "'3+O7"GX'"' ߰3+O'7"G ߰3+X"(#pw .w3+Ͱ3+d"H#jCj3+3+F3+X"(#pt Vt3+ǰ3+G"H#kjuj3+3+F3+X"( հ3+O"H{ ְ3+Xt"(  3+Uq"H/ 3+X`".3+M"U`Xk")3+3+Tvo"I3+3+=a"*B__3+F3+c "JX3+F3+X0o"+A3+3+XB"K 3+XU0"+q V3+XUB"K V3+X0j"+jg3+3+3+X"Kj3+3+3+X0"+y  3+XB"Ky  3+X$0"+sj j3+X!B"Kg g3+xI", 3+{"LK 3+ ",#j0u`$03+`3+3+3+&#uf"`j#f3+3+3+3+X.".u ΰ3+X"Nu ɰ3+XU.".p V3+XU8"N V3+X.".dd3+3+X8"Ndd3+3+XU "/ V3+dU;A"O w V3+XU "/#``3+F3+V3+U2"O#w3+F3+V3+X "/dd3+3+A"Odd3+3+X "/ Ͱ3+ A"O  Ͱ3+?"0u ϰ3+P"Pu` 3+?o"03+3+P"P 3+?U"0 V3+PU"P V3+X{o"1b3+3+P"Qt 3+XU{"1 V3+PU"Q V3+X{"1dd3+3+P"Qdd3+3+X{"1 հ3+P"Q Ӱ3+="2#  uΰ3+3+G2"R"HubSİ3+S3+=$"2#">jCV$>3+V3+3+3+G2"R">j_$3+3+3+3+="2#pCn n3+Ͱ3+G2"R#VCV3+3+F3+="2#pCp p3+İ3+G2"R#juNj3+3+F3+X"3u ˰3+Fp"Sua 3+Xj"33+3+Fp"ST 3+Xo"53+3+P"U  3+XU"5 V3+SU("U k V3+XU"5# dd3+F3+V3+tU"U."^3+F3+V3+X"5<dd3+3+S("Udd3+3+F;o"6C3+3+i"V 3+FU;"6m V3+{U."V V3+Ff"6#xu3+3+/3+i"V#uGʰ3+G3+3+F;&"6#xWt3+t3+/3+q$"V"ذ3+3+3+FU;o"6#M3+3+V3+U5"V#3+V3+5o"7 3+3+Q"Wr3+3+5U"7> V3+PU"W V3+5"7\dd3+3+:-"Wdd3+3+5"7d հ3+:"W װ3+9T#"8bU3+U3+PTv"XU3+U3+9j#"8/ 3+Pqv"Xd 3+9#"8 Ұ3+Pv"X Ұ3+9#"8# u]3+]3+q"X!"]u:İ3+:3+9#"8#po=joB$=3+B3+3+3+Qw"X"xjP ,3+ 3+F3+3+3+!x"9  3+M"Y?!U"9$ V3+U:"YW V3+!":C ΰ3+I"ZC 3+!":us ΰ3+I"Zu 3+!j":j3+3+3+F"Zj>3+3+!k":3+3+I"Z 3+!U": V3+UI"ZK V3+Ae";3+3+Ts"[f 3+Aj";j?3+3+3+:Y"[jl3+3+mo"<3+3+V"\e 3+XBu"=R 3+T"]w 3+XUB"=, V3+PU"]M V3+XB"=dP"]add3+3+XB"Kdd3+3+>1"Wj̰3+3+3+IF"Z 3+XF"\ 3+f\F"D|Tjo"?3+3+ "?L ff3+&"?3pV V3+:-2l@iJI~||] SK ]TK`\L,+*&%$ 21 + 632#"&54732654&#"'&#!&#"52656$3ӇRws}l?=Zo|*h\Lr&l 횒NN# jGZ ZVM-fU"$ V3+fU\"D\ V3+"$  ߰3+LB"D% 3+"$#L\u2\3+23+Ly"D"ku3+3+"$#NC 63+63+l"D"~C3+3+"$#KD3+D3+J@"D">X3+3+"$#  {3+԰3+g]"D"e;}3+}3+UM"$#M3+V3+JU@"D"R"3+V3+)"$#)ufi3+i3+g]"D#UVuV3+հ3+&"$#0Cf3+f3+g]"D#KVCV3+ְ3+1"$#&v3+v3+g]"D#PVBV3+3+/"$# k2,23+3+h^"D#LV(7V3+73+UV"$#)$$3+V3+g_]"D#K`I `3+ 3+V3+XU"( V3+OU"HU V3+X^"( 3+O"Hb 3+Xd"( ΰ3+q#"H"KXl""(#ub3+b3+?4+"H#uk3+k3+X""(#Cb3+b3+"H#C3+3+XI'"(#tl3+l3+GG"H"srD3+D3+X"(# L 03+ǰ3+G-"H"s!3+3+XUp"(# 3+V3+GU"H"sM3+V3+]Z", 3+qR"![SS3+]U", V3+tUU"L} 3+=U"2M V3+OU:"Rq V3+=["2< 3+O:"R` 3+="2#tu ,3+,3+?"R#u 3+ 3+="2#wC033+33+C"R #C3+3+="2#t C3+C3+?"R#3+3+="2# % %3+Ѱ3+G2-"R#>3+3+=Up"2#tM3+V3+?U*"R#a3+V3+=|"_u 3+?"`u а3+=|"_CW 3+O"`C а3+=|"_5 3+O"`\ а3+=|d"_/ 3+G"`P а3+=U|c"_G 3+OU"`p а3+9U#"8[ V3+PUv"X V3+9#"8p ٰ3+Pv"XC3+9"nuP"ou( N3+9"nCP"oC N3+9"n}P"oN N3+9n"nsd,"oL N3+9U"nYPU1"oU N3+m"<C ΰ3+V"\CJ 3+Um"< V3+V"\: V3+m"< װ3+V"\ 3+mn"< ذ3+X"\f 3+X<@ 87J% HK)PX@" p]SK^ TLK-PX@# ~]SK^ TL@! ~g^ TLYY@3/+*)&$" <: +% 52767&'&'5327;6767&'&'#532732>7$!A|oxur>1N!xur>z_p>=Y>! Y144X Z+r+ 4ҋ4X Z+r+6]F )A#OR"O$ °3+a\JK-PX@ _[K]SK]TL@a_[K]SLY@ A"#" +%$!&'63 !4327"+='M9hPcX9w ) '.|lJZZIib@ JHTL +654'67#1scd3?foI`-B@?*$ J)%Hgc_SL*G""" +2&# # %2'.'5327 654'5367! a`kRS! 3+dA>3+dL 0+>7.5dj& %Y;`,WW':l{oKuO~B+ 3+3+dw#>԰3+԰3+d1#>3+3+dt#-(-((3+(3+d:j,7@4GWh_O$!%$! +#67#"&54632&54632>32#"&'$diN (04$$VV>..>VV"&40&"Pa:4cF6*(:JZ0>>.ZJ8**6Fd O[@X( B J h g g  gULNMLJFD=;6542.,+*$!%$! +67#"&546323.54632>32#"&#>32#"&'#"&547#"&54632&XN*(04$.BV>..>VV"&40&,FQPP*(02&$VV>..>Vl"&40&,N̖F6*(:Pd0>>. PJ8**6JD4**:LP(.>>.$Z E:*(6Dd0+.'>;HH;;HHH;;HH;;Hdc$0+ cNdFdVF"dG# #3+3+3+d.ux /3+dI$-9Ak@hJg  g_ [K _ TL;:/.&%?=:A;A53.9/9+)%-&-" $$  +'2#"&5462#"&546"325"325%2#"&546"325N\nXvvxF?xՉvvw .BŸ85TŸT8 d L$,8@LT·HGK/PX@5g  g_[K _ TL@3gg  g _ TLY@CNMBA:9.-&%RPMTNTHFALBL><9@:@42-8.8*(%,&, $$  +'2#"&546"3252#"&546"325%2#"&546"325%2#"&546"325ppVqv}qv}7qv}7qv}0V.«çWD«çWDW«çWDW«çWDdwd"<<Ld]"<#<K<dGKPXSLtY +7d#at( d!"??Ndk"?#??Ld 0+%'' mmbgL#L d>0+7d>>J2`\2d>0+ '7@R22Nd-pF/?vX@Ui[N<84,($ JmlfdHRQKI GgW_Outrqa_^]YXVUFDCB +.'>.'>.'>%.'>#"'&/4'&+76?'&/3276=7657;##OO###"PP"###OO###"PP":##OO###"PP"##OO###"PP"D-]Q+DD*^Q6 DG -[S*ED)VX6 _O###"PP"###OO###"PP"###OP#"#"QQ"#"#PP#"#"QQ"#"#PE)]Q6 DD:]R)CF*\R6 FC-VX+d"d-?1@.8*.$J G~[L;91/ +.'>#&5476765&'654#"&54654632 'YY' &[[&/$ MmShO- ?tB*0& *ZBd @ GW_O#! +! %dUia[T>d  0+''Q˦cclYa)B#B @dx# =X#  ZXX3+3+X3+d3,@)g]VL  +'654'7>74&giV UgnpgU Vi(j;OQ''QO;j(dH60+'lVrz6.'>.'>.'>&#"'65# '654'7!35'73273 7&!"#PP#"#"QQ"#"#PP#"#"QQ""#PP#"#"QQ"#"#PP#"#"QQ"'u-`!)/!c_%w-_f!)/" O###"PP"###OP#"#"QQ"#"#PEO###"PP"###OP#"#"QQ"#"#Pa!)/"g`(u-cf!)0#b'|-]#x!"xx/3+/3+/3+]#x!#x.#xx$/3+/3+/3+/3+diS @_{K_L$$$" +4&#"3>7#"&54632.%* +(+ieknysdzmzdwlx",@) HG|L"! +.'>&#"5254#5673..00;DO::3n[9x.00.C 8>>W/d#@ HG_|L +!'6735673&+9PNnŝZpd^ $5@2  Jgg_L%$$"$$ +32654&#"'632#"&54632&#=:.6?2/7A[Zxrw6CF9V[ rqF@GS18~_r+%6Ed9 @ J]{L +7#'654'!9M04 # T;dpc^ '#@ Jg_L((($ +32654'#"&547&54632654&#"?VC60AqjvacK8.*81S7D@1];_qY}84yQq]Jn /G&21!LI L "4@1 Jgc_{L%$$"$" +4&#"32#"&54632#"&5473>=9.6>404BU[tmxי8EP9VWjB?EO05y[n+'5;dk0@- J HGU]M +'5#'73573#gK }L{KKd[ @U]M +!5[  mmd % ,@) JeU]M +!'7!7!'7!%z!z!kKK|KKd 0+$%p+ךKU;d 0+'6'7,+ <<dw)i@ J"H GK2PX@~_~K|L@~g|LY@ '"#" +3&#"52754#"3&#"5275ȷ>32n:=EP<<j;=EP<<4p]/h -:VDDDD:?@Y  'd&Sj 3+d- z 3+d.1s 3+d=t 3+d|l 3+d]m 3+Z$dn 3+d9o 3+M$Lp 3+ILq 3+dr 3+dQ[s 3+d%t 3+dhu 3+dhv 3+dz1 )g@)!JK*PX@~_jK_sL@~g_sLY@ '#"'"" +#"'#"&54$54&#"#"'467232'327]k7QY;;P#+>9lUKx{-8e:E?;W.'0?ONbW*qt$(+Od$r, 323&#"52=4#"39;DO::3n[.sA?:>W/d+XA@>/J@H73'#GK*PX@" ~ _jK hL@ ~ g hLY@=<986421.,"#"$" +%>32>323&#"52=4#"3&#"52754#"3&#"5275ȷ7/^ &; 7f"C>;=EP<;b:=EP<<`;=EP<<4p] ("\aDD!!DDDD:?@Yd+Xw 3+d O*H@E  JHG_jK_hK_lL$%$'" +3&#"5274#567>32#"&32654&#.S;^I;:3e\O:Tp_8< #BPQU CC3A515 gpbWRXd!5=@:J~_jK_sL%'! +'4'732654&54632&#"#>DY$vOH>=#I yU'BNt$@BwGX;DX"5?xP\d$4@1J H]jK_pL"  +#"5#5653#327`0wKu6/-ܙ&?sR\0R:A/K1PX@560 J@ 560 JYK'PX@8p g e_SK^VK  ] T LK1PX@>p p g e_SK^VK ] T L@Ep  ~ p  g e_SK^VK ] T LYY@>=<831/-!5A" +$%2#54327.#"32674&+3267$#"52767J"#/Xkk'b.q3C:m*tI  @S@U x;+Ju[c' A \MBd}v ,3;J@G;73" JUK_[K_\L%, +73&'32#"'#7&'#&'&76?3&'31"~*10J O6>eBF>9"-.*;V ~V;a-6% x)+O(a z2D?Ѱp"Wm2.!dD3W@T$+"1-'J~g_[K_\L0.*(!  32 +%67# !2.#"4#56732&#qcKOظS|JfXz6(h(aD?P)+a'tF"XnR!w%i d"F 3+3+3+dsed'P"PE E3+d T@ JK$PX@;  e ]SK ] VK]TL@?  e ]SK ] VK]TKTLY@@ RNMLIHGFEDCB=<;76510-,)('&%$#"      +#''#%!5%!5&'.#5327"3#3##&'!3&#"52676=#535#5354327L`8s&s   <`DSN9bf :`F9[? ?yB=RIHssIByS.,Z Z$#0tyy_aQ+t2.$Z Z&&`byy]MZ Lhd M"3 dkdIk@h(  ; =* Jp  ~^SK _ ^K]TK] TLA?:80.'  IH +"!'>5!"3.#"52654326327654$54632&#"#ɶ+G$?ĎQ + b?d:". %ʰ3+d"7/# + +w3+w3+d#.8APK PX@95/( G JLKIGKPX@95/( G JLKIGKPX@95/( G JLKIGKPX@95/( G JLKIGK)PX@95/( G JLKIGK1PX@95/( G JLKIG@95/( G JLKIGYYYYYYK PX@Epgg  g _SK  _\K _\LKPX@:pgg  g _SK  _\LKPX@Epgg  g _SK  _\K _\LKPX@;~gg  g _SK  _\LK)PX@F~gg  g _SK  _\K _\LK1PX@F~gg  g _SK _\K  _\L@O~gg  g _SK _\K  _TK  _\LYYYYYY@POFD?><:8620,*%$!%#$ +!"&'#"&5476327"'54%672" '3 &#"32%367'%&''%(k"Pj.>g`!;'quY`fIaJAKVB5 \Yh_3rg-BS)3 x\G0B s@ 7U%x&=h>H) N,5(#d +7@0'  JK PX@#ggc_TLK PX@%gc_[K_TLKPX@#ggc_TLKPX@%gc_[K_TL@#ggc_TLYYYY@65&$#! ++ + #$'67327654'!&#&'%2364665%&#K"W|59bEZboʴ Ќ~I,P~왖 v!j\y *f  C[פzD7/ d[ Hy@v" Jpe e  g^SK  ] T LF?>=98765432.-,('&! # +&'&#"!$!!65473#3#"'3&#"52765#535#535&'327632#U@[EH.uf p%t]yKԀ!!\a[stYh+!O ,6"hJ:3JS ./V Z78}JJ@QZ rId"*'_W<<3+dW#N#$ $ 3+3+dY8S@P)'& J e  e_[K_\L887643&$)$ +3267# 547#536767!5!654&#'6=6323#!/Ҕ$h&$$jW Kz~!d#]:p5Y^b{ $ ITBVM(VOvSoM:1VK1Vd{"&'_II3+dB+\@Y% &  JHU  e_TK _ \ L++)'$"&" +3&#"525#5354#5673 !#327# r]\trrfΔJ!e9S=z6vRZ ZRRQR(f_ t4A-dN@ "&% HD M>;961JK+PX@* W_[K_TK  ]TL@( Wg_[K  ]TLY@KIGECA&-#3% +54#"3274#"%554$4$32'"#5"'#5&'#5&54726326326X2,)2+|P#d!~ˑJFnDJS$D8+c CMTCU&5.:ҾMoSɲ#)3[ev=ADDd +@(e]SKTL   +!5!#!5!e*)eN&ڧd# 0+3#3"!'6767!'7!&'!'7!!"1ip4dd[G$ #jx$"5b0hgZ-Nd2H@E10/.,+*J H~pSK]TL9" +54327"%%,5&'7"5265'?5'75_e~p/\]% @PY %czX X~ ollNolmɲ_LLֶV=Q/e-O.gdFPb,@L ? S;76/#JK PX@Fp g g W  ge _ SK`\LK1PX@G~ g g W  ge _ SK`\L@N~~ g g W  gg _ SK`\LYY@ _]YWVTPNJIFEB@:8!#%($# +6$32#"54654+#654'32654'632#"&547#'"'6326767#"&5673674&#"63232654&#"2%%輅)PQ/q]FTBi9F/!FP~uw9B{ BGA/S&N9EFgh1 6 wWs vDCcUvsY 0<p ;2PjR IWdV$@! J HVKTL +#%?#'f"nG WrKIhJ0O; =id,6^@[6 + &J p   e e]SK]TL53/-,,*)('A$a +.#532632!#!!3&#"52767#'735#'7!32654&#"B\a["Oy_$$@[ Q;W )Yc$.Z Z6*U b!ad+=@:)"  J+*$#H_SK]TL9)+ +'&#"!!73&575763257~k Ӥ!&㗣X|O=:(2t&gc{W {3碘2v-qd$C )/G @ 92-*&!0+#"'#"&54$54&#"#"'467232'327'#"&5>72.#32j6O\::O$,@7jUJw | .9~P&{^k 5A/2>NL67=;;T;jK0-Z44DFU,!,$PE_EMASq R:,#XEYVd$C )/O @ >0-*&!0+#"'#"&54$54&#"#"'467232'327''4'732654&54632&#"#j6O\::O$,@7jUJw | .9~Pq<@Z%uNG>8$J!xT7=;;T;jK0-Z44DFU,!,$PE_EMW%ALt&ABvFT:BX#6?wPYd+%0+.#"3 # !27&547']ɭ)~SXQe ymyQP)+(aD? Y(X,d"q&ydrC30+&'327"&'&'673 67$! 52767&'&5476vGQ exuhXS 6 ;#z;14TM>."Y>!|XAyAT_ a07Z Z8+N MT U/ q~VV"k Z13@u{?d$C)5 @ 2,&  0+#"&5>72.#32'#"&546324&#"326?&{^k 5A/2>NL6~Pxkx~@$(<@#.7ASq R:,#XEYVmE_EM]ypbacboVdZndC: :) 0+#"&5>72.#32'#"&=4#5732754#57?&{^k 5A/2>NL6~PT+U B?'L(& :ASq R:,#XEYVmE_EM#WTj,"Xj,"0;.dOd{" M 3+dA"q)cd;#0 )$0+67!"&54#"&54327327>"3254'&'\wPt3 ); >,x\*&TKR |"YS '史8=ہ#+&?dHA10+#"&54632265454-2327#"&#"!"&54633254#"aV[pOY*B@7Jd,6Of*H0L x_UA_\ceLQއm<<:80+327"!4327"3&#"5265!3&#"52654&#3#3#d*k.&ivg13cld-\.c!m22o Zo~ZZ}:hZ ZhjZ ZrƐs()dMP: 0+%674'&#"'3267632327#"'&567674'&#"o*я*34QDDW XE10ko@rr+Ri L% .m\ dP"j  3+d/-54."0+!"&5>32#&'"327.54$%6363267122cH;.Ɓ4gBD\6 OM0rl;;\&;P13B23fT:aő~/$ Y Xvrd72,0+7'67232654547# #"#"$#"327#"&5463232,7uO BjL;HG]x]zd~yA&IM?+ vh\d.44P(%3tZ^o$L!pd1;E C=820+327!"'#"&5463267$54632&#"!32'654'&#"$#"32iX X۪9- qĜ=$@Nlॾ#@wFChe;C?LE8OYNXN;/$g+ji44+CnQ!$+dS 0+32#"&56324'&#"`Q$X7[o K  Რ3!.e"d.B KG00+%3>54&#"3&#"525&56754#567354#567 765672&!672!"'m;>muvr]\tp}-xOfΔpfΊ zT.(Y~[ Ѥeo );G @ A<2*  0+7>54&#"3&#"5265.#532632&'2#"'&547>"3254n(21I?':\4(S7(L)'d my}f4&$Ta˒mHoSJ:9EpA'''.6u#%cQTq+qEnʔΰVa2due C9 0+%32654&72632#"&546323254&#"#"&5467&54@IJI3.>Qݼ! imUchSA(3,#n568e Wn_x^e(`>K`ZN@5e!ރB2tykX|1*5o@'OD&UcX{nNd )-9 @ 4.,*  0+7>54&#"3&#"5265.#53263 &'3#>54&']u]@[2՗1B\ybxY[$+_\Z Zl}cQ;W  $K$Í| bkd 1?M @ F@?9+0+#"32632327"'"&'6767$'&! %&547'!654'4·>fC%&ΪKkF0~QGOW졤WOGQN*i5iw4 3S3X_/FL[i _?CC: ?_귶idD\Q 0+32#"&54674'#"&5432654'!"&5632&#"3 %.# 32654'#"&54! 67fKY%Xg- %Z 5@{xE~ V2a381HQGh )ܳg[0GSc&IF8`K./1 %-|xtVaO3* 6'&i19b~}ۜt1+7"dZOK 0+327#"#&'?&'&#"327#"&#"'6326#"&54654$5432>3 ND5^t l81PP E?+JEh2$G4QU2oÜWk;L1g.*A> ?F~eΏV[KPE2 (f[9Y3Eoծ/Jd K @ G; 0+%3#&%7>54&'65#"3.#"5265432633"!'Khb Xx}:W;GQx+G$54&#"6&'3&#"5265.#5326327654#5327"3&#"5254/3&#"52?'&uq@[tcxY2y_1B\a[I$NAtrOO>FWaWY!>24?W[XWm;k6+_ # \Z Zl}cQ;W 罊j 0&ZZI`Z Z 1YE?Z ZKɋFdB[ Q2 0+65&'&#'67&#"63"&'3&'27"547&#"526543263&'%'7327632p>McIK?Wip4dd@) -,-# UnHJmy?=ik4J&mX!+ J\ i @.OiYZ-ZQ.ZQ "XZg#~KP " PKdl"^4& 0+&'"#"'54'732654$54632765327"3&#"5>5 #&'3&#"52674327-q9@?~TN/HK;B}l>u9+55 =?Q>6P:7- M0.T-+u36mhf5 -@z!T/\ffT0N ~JN?;1&I7EVA8)?A99%+52TL954.$d"^4&"0+2765#"'67;27.+3&#"%765327"3&#"5>5 #&'3&#"52674327 =:9,#0('ht#$8-6; ;x(_)^4R X.#6M6a3} ;~2P!Z/0=(R QV:$>H H:$6T8|*9(98CG5"9*9&99y9)PdB8MI0+&.#532%"7654'%'732763254&'5327"#4'&'27"54&P|LUN%:WQYLIJ/l#M;2( UnkNMZ Z(4#e+( PZ=81$Z Z5i=l3ԡ3f "Xb d>! 0+! 7! 67&! '67!"'6%#3f)Bh)O1+\Fv/Jf#\5rƷ T9$b \;D d00+3!2!2#"&5673265&%"'"'7#"'6DyFʢ {: +_|uTOv .>EWZ G= sz_D&1Jo F?!%(f,d"[d"pd3J@0+#"$54654#"&'63232654#""'67&5463232654&#"#"'6332$32%aܤK+Io?XT_P6YL k ް3+X.. z3+dB[/0+!"&5632&'"3 %&! 3274'#"&54! 67#"&54%3265&'#"'432654w T4c652LRxo员M#_?M7Wki?.Go-q+-Uq\MU_N2+ ;+(nEi҄$nwm۝7q7#)tsH[R6Cţ?/9d20*0+#"&#"'674546$3232%&#"! ! !2:]-!\9 2+$<V?>TXBcd.jc6[mM9 mPYAmqC6#a/~<d 0+&! !!$73! ! !pƟG[4e}(__nCD`d 0+327#"54!2$54&#"(nN'} mm%\IR*2;_Hj9dvBKHC"0+32654&# '!2#"5%&' $54632&#"3&54$32632#"'6$54&#"Dج]^@4)3hUGNMk\2a=6\.D&uX~wmrLG/\x-p^~\UYGq*-y5;d3S>80+!"&5632&#3 7'67767632&547#"&54632327#"$#"3267ν^5_;.0ՐYW4.9Bm; (۾akmEإ}ЉwȦXdU/-<,'hB5&"(yK@DM?3&5ښ]3ux޵  ) 3+d19#0+32!232#"5#"&5#"&5632&#"32!2 O#pi&iu|kW]J,V3#&;*asE~$60 CbxGVC5* 1)#2d#!0+!"54!2327#"'&547&#"3 oö+jBM# \X[>/9! *@Ũ8A3 1 i^[eo7Hd.! 0+7654&54%$54637&5463#&'#4#"'dQ:[Љ<\EX :\x}7K:O=?JjxS7caZ4jVwL|*dp@HKgd0+)63!&#!"&54733! 3dSQi/v70<'rd66MQ^@1jd!0+&'!5732=4$54739 SIpre3vV|/%@Hľshhds 0+%65%!"54733!2d4/w 73$fl+ Sjm\^D-NO~Ǥcd&" 0+!&#"5254#5$73.'>~}.77.-66 TRR(f_aR7.-66-.7d" 1(0+ ! $54$&5454'67&'&'! ! f(P5iw4$ S3X_]+rĿ>fC%&ΪKkF0%:d ^/RW @ {XWSI1+0+72654327.#"3276754'&+&#"73&#"52654'&'#3&#"5267632327"7654#5327"3&#"5254/3&#"526?'.#dP Bʏ&C\r2TR<E E:SS)j~? 6c g-#eP%(ZS# 4G8H6j/O,!11!'F# J&3]!b&.P1M="$XR*!y "@;H4'JcI!?) 5c2 k2 O,K L!88 Z] 99e@9 4MG299D~89 !sX199 "d#- ,'" 0++3273! 5# &'6"#!26#37&5#(RVI^&/ G<_g>`%nIRR~$yܣ&qp7X YT Ed#"0+'7&'&#'6756774'^g3Wd`u$xpkS~-1"&K>A$Z!8dX!0+72654!2%.#"3&#"3dv1=\6f 9Q+S4p{Zs"\GZm)`HFXZ td+/3 10-,%0+3&#"52765!3&#"527654'&'5!'3!3aʘoö%$fe%${i(/ZZ/0gi(/ZZ/0g7&%ZZ%&IId"!0+67&'&#! !2767&#!' 5! 3 #ȋ>T5K>7.'3qptfr&/jj/&&-ll-'''''i=ZRR(f_gRj/&&-ll-&&/jz''''+d)9? @ >;91"0+#"'&547367654#567.'>>7.'65 B>18LM e&/jj/&&-ll-'''' _9ZZ0&8?!~c/_aR>Pj/&&-ll-&&/jz''''p7d  0+2+!!##!332654&#¹ɣKռVi^WlԄ4̚gXLrd1;  0+367467.#'632#"&'4767.'3!567&#672ݴ^ExtSfy tŶ>OK^J65eh~eF&"[dZjl[ raMaF~mf6>87[idEQZ`fp@jgec][YUNJ0+2#654'!"47&54%654#&'"327#"&546323632632&546654&#"3&/"67&673274'"Ǹ?6ih$ a<2 !VE3LגDjFFoF+ $N6 *Vs bg6Uf_U4jp&(?X .,'g/:^cPG6tq Œea BJvy <V'Fw$<Ÿ@d$g!$*M @ K9(%#"0+73&#"52654/#3&#"526763'%&'"#"'74'732654$54632NCz')}5 &01o$!e+% A]>~PFu;Ac`_HKO=D|GR;+AA  svBBQtE_EMC\ 2%]Yo($D_`G8-a_b"-)0+"3$#"&'7327"'654'7354&'527z.:aг 6M)ZOe.2MM0-1~B)sjubWIU h'[EMPYRU  d[8@HP @ OJGB?:0+ '#"'#"'#'27&54632327&54632327&5463234#"6%4#"6%4#"6nkVmfnBfXQiQG_T=9tKHp1 <:641.*%#!  +#"$5463225&# 3275332!"63632#"'32654&#"&#"327# !26763 !"'&eWSHuttuHSV 99$=$99YgQq2oNNp2qQ`=ż_  :H~pBYP4dp2d1r: GKPX@ SL@ tY@  +2632'5&5463246.?N6AKKA6M@r6.e=%J9-@@-9J%.6d!5N@  ,!"J? HK1PX@B  ~ pghg ] SK^K ^  T L@@  ~ p  gghg^K ^  T LY@666N6IE@>=87$)4%$" +%32!"63632#"'67654'&'32654&#"5265432$3 !"$#"tuHSV V0480R99%=PSVPR11qaW2qQt9=E49gs?6 ǵoIM}PKZYoZ pd v1:CWs@ $ %  M ;2 }W JK1PX@=  g   h  g]SK ^K]TL@;g  g   h  g ^K]TLY@3]X~|{utkaXs]oVTPNLKEDCB431.*(#!  +%#"543225&# 3275332!"63632#"'67654'&%&'&547675&#"327# !26763 !"'&32654&#"eWSHuttuHSV V0480R/95/VPVSP=%99zT`Qq2qOMn2qQg,PSVP99%= E99=E749gs?66?sg948KP}MIoɵ :H~pIM}PKi ǵd6"j)"N{e 3+H 0 ɰ3+: < ߰3+d0+% !!7P|77dc0+ '#d&&ӧ@#E{d0+!5!' }Q7dc0+%37 6|E$d 0+ !' 7KP7PQ8Q77dc 0+%7  '&&D!DD Ddo0+%d1udv2dn0+ '' v1v1dbdn0+77nbv2/ad1vdo0+!2uai1vcdQL0+3!!#! 7654'&'&'!#"'&'&5 a^`_+*6'b1)nEZFN_cd!C| 0+% !'7 '7!7'_dRd_y_dRd______cd__dRSc_J____dc  0+' '7 7'7'_dc__cSRd_J^``^_cRc__dTd_``n``d#  0+#'#d_cddcccd#  0+#5'5'#5%ڍdcc_9cccd#  0+373!ddcdddcd#  0+%!5375753ccc#ddcd0+!! !!!rw^c c^Q"wUw^d  d^wd 0+5!'!5!'7 '7!5!7dVx"R_d d_xw^dd^wd-0+ 3232?6323276;#"#"/&#"#"'&#KP7P'$%$#($ (! #*77Q($$&\rrd-,*0+"#"/&#"#"'&+53232?63232?6;' 7+# )$(#$%#'Q7Qrr\&$$(Qdc 0+##535#53 '3#3ݧ&&  E#Emdc 0+#3#7 #535#533ҧCmE#E d @  0+3#) !;#%3#'3#8/P7P6ڊ77񌌌dc @  0+%#5 '#5#57#577񌌌Q7Q6Gډd @  0+#53)' 7!+53#53#53Q7Q6Gډ񌌌dc @  0+537 =35353U񌌌ԏ/Q7Q6ډd  0+3#! dc_P7P}77d 0+%#3' 7!5lj?Q7Q^nd"{ 0+%3!%!!5S^)Y&ddc  0+#'57#!!3'#&*Y%dUK]d"{  0+7!57#'575'!!dVF]ST ddc 0+!3'57337#!&TT dcKUG]dc @  0+!!!#'57#!5%!3'#3&**%%df--U?dc 0+#57#3!33'#3#!5#&~dfT^΀dc   0+#!5#7'##57#3!3CFUUFFU]dc   0+%!5#3'#3#!#57#3!3;$sTs$_UHUVT^dc" 0+#'75#'57##!3!3'53'#&*Yff%dddJUJWfcfdc*( 0+#'75#'57##3!3#!5#3'53'#&ffdddJUJjfUU5fd"{0+53#5!!!75'!5#35!U]饥VVGTUYpCddc  0+! #!1uΊckev2'cdc  0+!77 3!5nbv13_e1vYdc!0+3'573#'57##37#3'#3TTfddfUUd$0+3' 7##"'&'!5!676322654&#"Q7Q1MllL2J2LllM12II22II@2MM2@@2MM2H33II33Hdc  0+# 3&&$ҧyD  Dydc   0+ 7!5! 7!5! 7!5!8IsJ8IsH8Isߙ>ᛌd0+! !53!!#yP7Pl77d0+!' 7!#5!5!53[Q7Qznd0+! !53!' 7!#yP7PQ8Q{77d0+!!#5##5! !53353nYyP7P77d0+!' 7!#5##5!5!53353[Q7QzZd0+3' 7##5##5# 353353Q8QP7P77dh5  0+ !%*:fgߌdh5  0+5! 75'd;g! _dh5 0+!75' ! :;sfg! d  0+!3# ! =.MIhds 0+#"&54632#.#"3267ș䢦x_] x__x{ݜͅu]Emttd  "0+.#"326#"5432.#"'763 L_`A_ΰ WzzVbW]bTex?7d 0+!5!!5!!5L5tΛd} "1dVm 7 3$0+.#"4&'32>%4>32?#"&''7.690&u?UwDP;&u?UuF+PpXb0R3J^``0M6J\vd"*Mlb"*Ml]Z1>"nA=Tn>"gE9TdGPd G 3+d00+%! 3!!"!!30gf 9 |  |d70" 3+d0+%!"543!!"!!3<?İ3+3+d">xİ3+3+/3+dH6Ndm =M M3+dZb b3+dj4 İ3+d  0+##'7! !.|$6HL(f.&Hd"tl3+d"lqq3+dW +! 0+327&#"$# !"'&547632!27&#"327`e96==Z[ ti-Zd75_NIjklzWj*dkm '  0+27&#""32654&%2!2# !"&54eo|B\x* ż1l_NľchXzz'd*0+3!!d.:dHy0+!dhdsIX0+%!!'65!&'7&'/LB@d5qBsp<|gK^u~ʨdOU 0+%'67 &'7%654'M3Ebr:9sc@G3 Ion\[nEZpvWdl_dl#_U 3+dl"__hdl# dFK0+3 # dqq,.KdF+0+3 3dҞ+d040+33 #4#"dgfyf.fd0(0+! 33250(bvb0d 0+&#"#"&5673245432ZNl.LXdn,"d~P^fl@>XLh&jDd,@d{"d "#nd K 7 0+#&'&%67654'&'%&5432&#"##"&567324'&'&54767-'a_3B  (#ac07"d~ZNldN||>LLXdnjR|{BTI'ba6uȇnσ#ab._:,@8P^-lN|z>8@>XLh&,bR||Dd{ #{ @ T(! 0+&'&%654%327&'&'&#"&5432&#"632&5432&#"#"&567324'#"'#"&567324'&'&54762&Zi \gt lpsz"d~ZNlrtnl"d~ZNlQlLXdnxc[LXdn50mM!QYb]wmTfnRq v׃p.,@8P^/p7,@8P^<2Kfo{ o1@>XLh&-g +@>XLh&9{ngHd  -@ p2*& 0+&'&%$54'&%67&'&'&&'&'&5432&#"6767&5432&#"&5432&#"#"&567324'#"&567324'&'#"&567324'&'$5476-$~ >  u  "d~ZNl"d~ZNl"d~ZNl `LXdnLXdnLXdnFS\]VjWkr`\S"z #r̀".j҄% ~ 5,@8P^6& .,@8P^+c"I#,@8P^?,=fo{~4@>XLh&3}$'@>XLh&*Y $F$@>XLh&B{ng,d@&0+&5432&#"7'7&'&'&'#"&567324&'#67676"d~ZNl-)a=XcX2N LXdn  P+)M33a =,@8P^-m 6d14!Ɋ,*R, v^l@>XLh&jՃ 3NK]q\]?d" L L3+d"  3+d## 3+dt ##|Ű3+Ű3+d!(~3+3+d!#((~3+3+d"x3+3+/3+dI"@P#3+P3+~3+3+d5g#<"P<$~3+3+~3+3+dDj#RK~3+3+dxjadxj0+32$32&#"#"dePW7!##"&''73>323!.''*/WLE]1%( ~ '* ~ %(]ELWO'{r{ty3oGE,'{DG3oyt{rdO^  0+'7!'73>323!.''*%(U'* ~ %(]ELWO'{3o,'{DG3oyt{rdR#."[(.3+[3+3+f#*#/"Z*#3+/3+Z3+3+d#."Z#x^:,.3+Z3+^3+3+/3+d#."Z"x#^,.3+Z3+3+^3+/3+dr#/#["xx4/3+[3+3+3+/3+/3+du"\#1#H"\3+13+H3+߰3+dL!#("eq(3+e3+3+dT]" qg3+3+dT>" G3+3+dT " P3+3+dT " P3+3+dT"  t3+3+dT/"  q&3+3+dR 7Rb@i[SOF)! 0+!'7!7!'7!%&'&#"327654#5675#"&5463236?#"&547676327>5&'.#"%735463.#"7'3&#"525"$*"$* ,7:8 %B; } >N`E 5"6! *?HX*(<ni   /"R=@  WE;-0/.-h&rh&rMEGFGq5*/JV/*#!/ pRZ8 463Dt[W=; , $1a;4Ri$$  uA..dR#."ZV.3+Z3+V3+dTS '? @ 4($ 0+!'7!7!'7!#"'465&##&54632&'&'&'67676"$b"$bl +ZL QzfIh    h&rh&rb8  :b`SH!,BYM    d0+!!#7!'7!7!'7!73!!;w"_$a$$S1t$"_""0hpp&r&rkk0hd##3+3+İ3+d" iP3+3+İ3+d(D# , 3+3+dC#&/Ȱ3+԰3+dB#!/Ȱ3+԰3+d( #& #3+԰3+3+3+d( #! #3+԰3+3+3+d # 3+԰3+d #!Z 3+԰3+d{#%dz#!!d @"  d~"CC3+dx"%==3+dc"!((3+d" nȰ3+԰3+d" aȰ3+԰3+d#%,,3+ٰ3+d#!,,3+3+f"  ,3+ٰ3+d" !,3+3+dZo#%!3+3+dZP#!%ְ3+3+d)" $3+3+d} " %ְ3+3+db~N0+ %67&'$!dPz΂ΊzzShLnnLhTdb~N0+ 56767&'&'5!~zz΂ΊzP ThLnnLhSd~0+ %67&'$!&!5 dPz΂ΊzzzShLnnLhT? d~0+ 56767&'&'5!6! ~zz΂ΊzPzThLnnLhS[df~" (<a<3+3+df~" )2a23+3+dH~" (93+d1~" )I3+d00+%! 3!!"30gf |  |?d0 0+%275&#!5!2)5ʵ fg?dD0" 0 ǰ3+d;0" 1 3+d0+!"543!!"3!! G 1p[\9d 0+2675.#!5!2#!5!5!e G '1p9dR6'2*("0+3!!"'!!'67#5367&'&543!673#"J1R#uS);v-20L;4*4c&4+NѴ ! H2RZ=O c\2]F]@Ip:yd%.(& 0+&#!5!267+!!'67#5367#532$75&g !3A, NFK.p 7 nzIX<]@pO9"=O7$L:d" 4 63+d!" 5 63+d0("} }3+d0("x3+/3+d0("Snn3+dE0+!!!EI  dD0+!5!!5! Hvd  0+!!!!!|>d  0+!5!!5!!!I}}j&ڌdm0+#!# v dE0+3!3!dd$7C =8*0+#"32767>54&'&'$32#"&'&'&547676!!#!5!nkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbdd''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbeed$; . 0+!!#"32767>54&'&'$32#"&'&'&547676Jr$kk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbתa''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$7C C=*0+#"32767>54&'&'$32#"&'&'&547676''7'77nkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbxyx''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbxyxd$; . 0+ #"32767>54&'&'$32#"&'&'&547676pxgkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbpx''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$3O B4& 0+&'&'&'67676#"32767>54&'&'$32#"&'&'&547676 ?? @@ kk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cb'? @@ ?j''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$ 6R @ E7) 0+"32654&'2#"&54>#"32767>54&'&'$32#"&'&'&547676PnnPPnoO@v+..kk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbAoPOmmOOp1.-rB''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$8T G9+0+6327#"'#"'&547%632#"32767>54&'&'$32#"&'&'&547676&l<*2B>4\8|`RLkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cb^H|F.ZH@BTV&p''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$#? @ 2$0+!!!!#"32767>54&'&'$32#"&'&'&547676kk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbj''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$7; :8*0+#"32767>54&'&'$32#"&'&'&547676!!nkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cb8''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$ 0+!%!!!!#!5!X>ddYeed$ 0+!!!%!!JrPX>ת\d$   0+  ' 7 %!%!!kyykyjjX>xjyjjyk$d$  0+&'&'&'67676!%!! ?? @@ X>'? @@ ?hdN0+3!!#dRdN0+3#!5@@d 0+#!5!wvd 0+%3!!5Wd0+3!!#dd0+#3!!!mW W$$8d 0+!!!#3!../d  0+#!3!!# d  0+#!3!!##g   d 0+#!!!#3!☘ ɞW Wd7N" P3+3+d(" V3+3+d6" W;3+3+d7" YL3+3+dHV  0+5$54&#"'632 #"'732654dER@SGWTi|TWGS@R43HEjmvCCڥvmjEH3dHV 0+327#"&54$%,54632&#"R@SGWT|iTWGS@RE3HEjmvCCڥvmjEH3d1L0+ 5s d1L0+ s uu:dLQ 0+5! 5ds-dLQ 0+5! ds-uu:dt)$0+632#"'&'!#"&54632!6$#"32654OqpttM01PttqpS1T>>WW?>WFOrsM1IH1NttQ2IJX>>WW>=dt)$0+#"&54632!67632#"'&'!32654&#"6OpqttM0T1PttpqS14>>WW>?WOsrM1IH1NttQ2IJX>>WW=>dt 0+5!67632#"'&'%4&#"326dP.WqpttO1W>?XW??W;J-UttN1HH>XY=>WWd{  @ 0+!!%!!##d!8!siii[[[""d*80+#!5!btJdF+" 3+dF."r r3+dF4"x x3+d0<  0+33!%'d)K.'>*:~ff~:f66f1 'YY' &[[& 'YY' &[[&:f6f~~f6fY' &[[& 'YY' &[[& 'Yd"n 0+7 ' d"LFDaxxdd  0+%  !k׿DLFxd"n  0+5  5!d DFdd0+75 5dk4pFdd0+% 5 4kFd\j#N883+Ұ3+dF+ 0+33dNMP+m dFK 0+3#d. ld0" 0 ;d0" 1 3+d04$0+33 #4#"!4&#"#47632dgfnX??XVT}{yf.f?XX?3{VT{1d0($0+! 3325!32653#"&50X??XVT}{(bvb0)?XX?'{VT{d 0+#47673#4'&'#@N]rs]MA*Tfȍ|=|fTdb0+###!5!5!5!333!!!!'5#ম~~~~48Ȧ11d{"%xsKK3+/3+dz#!xKK3+/3+d{# %dz# !d|#%#7!3+3+3+d#!#7%3+3+ΰ3+d ^"%6 3+d `"!6 3+dN~R + 3+dD~H *  3+d~" *%UU3+d~" +SUU3+d/" ? 3+d;" @ 3+d:" ? \3+d8" @ \3+drk#E3+3+doB#! Ȱ3+3+d'~" ,  <3+3+d!~" - %23+3+d1L" `(3+d2L" a(3+3+dL" b 3+d$L" c 3+d#F#$F3+$3+3+d#j8#3+3+3+d"#$mF3+$3+F3+d#F#$mF3+$3+3+d#3+d0 0+!3!! 3!!"!53#Y fgf @|  |d 0+!3!!"543!!"!53#_u<qW{<!nwqwlwqwB?}Wp>}Vd;X0+5DiU/d  0+% !a`qbdd)0+% ' xbcdjdd)0+ 7 )xjdd) 0+% ' 5!xbc;dj {{d)_ 0+! ' 5!5!xbc;;j{{{{d 2C#0+'54&547654'&547654'&547654'&546=7?PPQQPPQQPPQQPP>QQPPQQPPQQPPQQVK.7E>77>>EE>>77>>EE>>77>>EE>>78\5)F-((\DE>>77>>DE>>77>>DE>>77>>DE>7d @0+!!d 4Kd @0+!5! Kd @0+!!,p@K4d @0+!5!p,@KdR0+3#3%!5dd dddR0+!#3'!5Rdd dddRx0+#3!5dd vdddRx0+#3!5Rdd vddd~0+7!!'d *Zfd^8ds0+632&547#"'6! %$! 001\\\\1111XXXda$ 3+ddkh 0+74$32'&'&$#"dtt}6UīS8dsjmiimdd  0+%'67632%" &'&TIaϿaJUdUI5ff5IU`x`df0+%&5432#"''$32654&#"fƥGܾٚhPaܘڙd?5% 0+6767!5!&'&'&'#!!3%#&'&'!5!6767673!Jbb )2[JNENJ[2* cbE vvEvw 3IT_@\WPKE@<;" 0+;54&#"72!54632+32#"&=!#"&546;#"&546!&#"3265326=#"4&+326[_V8Y__LFUP]X_Y8V_[]PUFL_sG[PXUکzwUXP[KKTXT[CK[TXT2~ n  3+dd #/;GS_kw/@,ĸztnhb\VPJD>82)$0+%#"&54632#"&546322#"&546!2#"&546#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632! 4$#"!5!5!55!%5!%5!#5!!5&'&476463232+#"&5476YY|ppѠѧi44ssϾ4$12G$8p-@@p??p??L??p??o@@bb[s3cc3s%V[ $G21$ d #/;GS_kw@{tnhb\VPJD>82,&  0+#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632!547!654'&5463!2#!"&54`1W11,-06C7  5H70N1NL2C)IG,  GI dg0+!#!dg0+5!#dSdp0+!!3vdp0+3!3!dvSd~F0+532#"~\xDh~|v{KkiB>dv60+#"&567324o[Lx6C§d! 0+&%'! Џ-9d! 0+! 7$7!Ӭ0Hdd# I#/3+3+d-  0+ !!!5!!5;`Qd[QE   0+   ' '! !!HHGgGHGc d[E   0+  ' 7 %!%!!OHGGr:eGHGA>Xqdc #/;GS_kw !-9EQ]iu)5AQUamy !-9EQ]iu)5AMYeq} #/A+% ztnhb\VPJD>82,& zvrlf`ZTNHB<60*$ |vpjd^XSRMC>82,& ~xrlf`ZTNHB<60*$ ztnhb\VPJD>82,& q0+#!"543!2;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";5#"375#5&'7"32654&6?#36+32=3;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+"2=4#!"32=4+"3%;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+"4+";;25%!5;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+"2=4#!"3;2=4+";2=4+";2=4+"2=4#!"3%;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+"2=4#!"3%;2=4+";2=4+";2=4'6=4+";254+"jP``jiijjjjiijjjjiikkjjiijjiijj}}lF>i$33$$22BFFl}}xiikkiiiiiijjjjiiiijjjjkkiijjjjjj jjjjjjiikkiiiiiijjjjjjii!0jjiijjjjkkiikkjjjjjjjjiiliijjjjjjjjiijjjjjjiikkii_ iijjiiiijjiijjiijjiijjiijjjjiijjkkiijjjjjjkkDnjjiiiiiiN``Qdjjkkkkjjkkkkjjjjjjkkjjjjkk;``?!hm`Az3$#33#$3zAamh!?``:kkkkkkjjjjkkjjjjkkjjkkkkjjjjkkjjjjii}iiiiiiiiiiiiiiiiiiiiiiiii}jjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkCiiiiiiii}iiiiiiiikkjjkkiiiiiikkkiiiiiijjkkkkiiiiiijjjjjjkkkkkkii}iijjii)d3 d3 d[QE   0+  ' 7 % !%!!!HGGgeGHGAaa>Xd( @  0+   7'3#pbb,888m8pp@_>Ebaabm.d8x+0+32>54.##3676323##"&'&ddcecce?PPwnwxdp '. -)  0+&$#" &5432#"'&#"6?%3267! ot6tKD)3鬮Ri]RiQ^&ʶ Srsw_t:z4 921)hdL 0+5!%5!5!d0H~PPPPPPd0+3767&'!767&'dMs fI J#@1Ms fI J#" Z|XJ| Z|XJRd1x ). @ -*0+>73#5&54753!&'3#67%.'.KK K 7888 F贵w{QEdd"0+%!3!3"BaadWdZ+ 0+ 3 ~ 4:d" #  :3+3+d4|x 0+7 !!26577 {ߗHla#e$FqQBHKG#c#k~Tkqdd@  0+!5!!!!!|K,Kd  0+&'.#"!5!!4$32!!!9 &;wu:' :o@@pLHmuumHLPJPfPd@ 0+#&'&54767312/*-;2.<+/B45YE59 />V?8:d)" X3+3+d####4#%&%&33+3+3+3+&3+&3+d<S#lrl3+3+d`a##8#4# 8# # 8 O3+3+3+а3+а3+3+3+3+ 3+dd ' @  0+%!!22$54$)!&54i!ߜcN}iccdߜߛpъZ!%+) 5EE5d  0+%!!5!!!!!3>u*q*]K.K<yKKd2V   0+ # 5 5!5!7'v0bn(Ds:# 00nnyyA8TppTdd 0+%5!!!5!!&'3'6i59OV22dnn0n/Xsefzd# dT* - @ % 0+&'&$#"3  676767#2#"$54$=GF>*+?FrztzsG>&ڟڞ&|uu|AuF=  =Fuڟ۞%&dT+$,@ ,% 0+!"$54$32'67654/&'&#"lڞ&z{r5%DrsD$6q{(%&OOڟ۞A =F|vCj>EE>jCu}F= dT+%,+(0+32#"$5476732$54$#"'fb&ڟڞO.E"F86P%8|Yڟ۞%U>\'0 .` TdZ/W @ N8-%0+2#".54>32>54.#"32>54.#"7#".546767&'.#"67632E;l::l;:m::m5''H''H''H''''H''H''H''W! 6::l;:m::7*-24hh` p!r{|{:l;;l::l;;l:rH''H''H''H''H''H''H''H'Fl;;l::l;;lf_`g3Wf={|ddxx 0+!!!!!5!,,x7K7Kddxw 0+)53 )633#3 47# p2,2S,pgc6c6R ddLL  0+ !5!Xv WvvW KKddLL  0+ !5! vvWWXvw KK WddLL 0+  !5!ee W~dKeW KKddLL 0+ ' !5! eeXWW3dKd1KK Wd?  @ 0+5!53!53!53dKO\!````````ddL 0+%! ! ! Q(kkttdZX0+7!dZ* dd~w '37;?@><:85420&"  0+55!5##53!3##53353'7!5#53!!7!!'!!533#3#tF]FtF4t\`F^@FNNF^]F/,tFtPQtF^zz^5EYF ddx  $*048CGK@IHED=;6531/-'%#!  0+!7'##535!!3#5!!3#53#533#5#353+5353%35 5!535353!535?tEEztT񊊊?FttFNFmt_EF`E.G^^GttE2FZFFFt1tF"zyyӿdE(q1 @ 0# 0+357!!! 7654'&'!! %&547675?!ҵ9HOH5555HOFfZEEEEZfEEY+J??PͳJJͲEEdfjw#'+@ +)'%#! 0+%! %&547$! ! 7654'&! '!II++Io888$8(&%م'$ڻUUUUGGǸGGEJ34;4;dd  0+!#7!!!'7 %PP b&BK(K  dm 0+% !25!)5 5! !!`lqd +ІKwr%Qd'0+! !5'==ad% 0+$6767u0ei1 R( d  0+$67677!5u0ei1 R( ssd  0+$6767!5u0ei1 R( ,ssd    0+$67677!5$6767 u0ei1W%u0ei1 R( ss R( d    0+$6767!5$6767 u0ei1W%u0ei1 R( ,ss R( d;%0+67&'$67673i1y~u0eځL *  R( d0+!3!ddd0+!3!3ddX d 0+3!3!3ldd dX  d`  0+!!5!5!5!c______d,  0+!=!#!3#!#5wKP3KKKd0+7! !dmLо0qd w #3 @ 0( 0+   32767654'&'&#"54>32#"& [SR+,IJXWJI,++,IJWXJI,nponnop"F"WQWWKI++++IKWWJJ++++JppnnppnndMP 3+dA0+!!İ>dLH   0+!&#"327!532!#"giRQhRQ\epp.KKd?H )%0+767&/#"''&54677632d=!%. L;D'W H7,/+)9N:8>n1GA&{kF@H24#%eA\#c"Ee:j:d("yx3+3+d0+7dA d0+  C=>d'n0+)%!'==@d'Z0+ ! !Fd 0+7#dAx >d 0+  #"x=>>d 0+7 ##dxx>>d #/;GS_kwOA&}xqle`YTMHA<50,&  0+"&54632!"&54632#"&54632#"&54632"&54632!"&54632%"&54632!"&54632"&54632!"&54632"&54632!"&54632#"'&'#"&546;6767463232$54$#&'&54>32 '&'&'67632#53###&'&54$32#'#"'&+$IHGIH!@-- #EEF@:#YTSSUY";@EFF#CCP22 S55R 22>Y ,-A!ݐ @EFF# 9-S S-9 #FFE@PP5U4̧~SSd! '3?KWco{'@$ĺ~xrlf`ZTNE@940*$ 0+! 4$32! 4$#"#"&54632#"&546322#"&546!2#"&546#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&546324632#"&5476'7''%#53##bbTTppѠѧY>+,=@/89/&8CCPc%Vp-58+,==,+089/%8PP5dr !-9EQ]iu#@ ~xrlf`ZTNHB<60*$0+%#"&54632!2#!#"&54632%#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&546322#"&546!2#"&546#"&54632! 4$#"! 4$32Y0 +,==,+`!XppѠѧ8bbTT7=,+>33p-Ӧc%V dZ #/;GS_kw@{tnhb\VPJD>82,&  0+"&54632'"&546323"&54632#"&54632'#"&546325#"&54632#"&54632#"&54632#"&54632#"&54632!&547!654'&5463!2#!"&54q?+<<% N!  R"  L(LJ)W+GE-  EG d_ |d_ rd_ nd_ xd ]0+!)! VV]]d_ \dr d2Z 3+0+2#"&5462327654'&54632#"'&5476):C '=>':d^w{'n A$\_!Z0514415018xz=[Q}81]ul̫d4Y ! 0+ ! 32$54$#"%&'6 {qqqrY{ ncLccc 0+5!50+#3  0+#! 0+#!5!50+3! ׌50+!5!3W )50+#3!  ׌50+#!5!3 ) 0+#!5!50+5!3!  )׌5 0+#!5!3!  )׌0+5!5!NԌT\50+#3#3h J  0+!!!!# T 0+#!!#]T  0+#!!!#\]Ci 0+!5!#!5! k\ 0+#!5!#]s\  0+#!=!#]v k5 0+3!!!!  W5mT5 0+333!TȠU)׌T5  0+3!!3!!U 5mA5 0+3!5!5!5W \5 0+5!333UȠ))K\5  0+3!55!3T H5  0+!!!!#3   T5 0+#3#3!hU K ׌T5  0+#3#!3!h U ,m5 0+!5!3#!5!  Jk\5 0+#33#!5\ )J\5   0+#3#!5!5!5!3\ U Jk  0+5!!5!!#WԌ 0+#!5!!#  0+5!#!5!#!Chik5  0+3!!55! NmH5  0+333!!5TȠUN ))׌5  0+3!!%3!55!U 5mH5" - 75" , 85  @  0+3!#!5)!#!5!3UC Um k50+!o0+!G50+! JX50+!Y JX40+!XY Kt'/7?GOW_gow9@6}yuqmiea]YUQMIEA=951-)%! 0+#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573XX|XX|XX|XXXX|XXX0U]!'/7?GOW_gowAD}yuqmiea]YUQMIEA=951-)%! !0+#'73#'73#'73%#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73 w, CGKOSW[_cgkosw{3@0~|zxvtrpnljhfdb`^\ZXVTRPNLJHFD0 0+#335#35#35#35##35#5!#3#3#3#3#3!535#35#35#35#335#35##335##335#35##335##3#3%#3#3%#3#3%#3#3qpNY^6tuut6!^!݊iꌀd_0+3!d__d_0+!!!M;__d_ 0+!2#!"543!254#!"MM;MMa_M;MMM`ad_ 0+!!'!&,_M;'d_M;d_ @ 0+3!'5!5!5!5!5!d_M;;;;;_Md_ @ 0+)!#3#3#3#3#3_M_M;;;;;d_ #'+/37;?CGKOSW[_cg9@6eda`]\YXUTQPMLIHEDA@=<985410-,)(%$!  0+3!5#!5#!5#!5#!5#5#!5#!5#!5#!5#5#!5#!5#!5#!5#5#!5#!5#!5#!5#5#!5#!5#!5#!5#d__[ d_ !@   0+5#!5#%!!%5#3!33vQEnQ_2&EEMsQEbo2 d_ !@!  0+#!#!!#35!35352QEbo_s2DEaQEnQ_M2&E*d_ !%*.26;?CGKPUY]bfjosw{Y@V~{ywusqoljhfdb_][YWUSPMKIGECA?=;96420.,*(%#! *0+'''#%'#'7'#'''%5''''5''''''#5'7'77'37'3/7'37'%7'77'77'7'77'77'%7'77'7'77'7'77'77'37/7'!!|iih$hkj(&h.$֐hki''iifg&iih$iihc'hi'iii%jhhE'i&ji'gjihhhi'iih$iih*&j'hi[hji%hkix'&h$֐hki'(iifg&iih$hki'hi&jii%jii'i&ji&hihiigh'iih$ijhz*%i'his_\iij$ijh'&ij%$hji&'i'hfj&ijh%ijh&'hi'ijh%hhjs&hl'ii&iiiihh(ijh%ijh(%ik&gjjji%jkiy'&ij%$ikh&'i'igi'ijh%ikh'&hi&hii%hii$L'i'ii&iii[ihh(ijh$hji\(%ik'hidY 0+!dYPdY 0+!'!dLYPMdX0+!d_XPdX0+!'!d_M;XPMd_0+3!d_d_0+)!!!QL_M;dX0+!dXPdX0+!!!dLXPcd_0+3 d_d_0+3 ' ds_MedY 0+ dXWYPdY 0+ ' dXW|YPMJd_0+3d__Pd_0+3#d__P3dY 0+dYdY 0+#%dJYJdX0+d_XdX0+!%d_!Xd_0+!d_P_d_0+  PQs<=__MedY 0+  PdY 0+ } PMJd_0+d_d_0+'d_M}edY 0+dYPdY 0+'dLJYP}dX0+d_YPdX0+'d_M!YPcd_0+ dPPQd_0+ 5 dPZPQVYYd_ 0+ 5 ! dPZFPQVYYd#] ) % 0+! 4$323254$#"#"&54>32xxBBXX敔x~|QJMQzDW~~NNNdX0+ {y' dr  0+! 4$32! 4$#"bbTTppѠѧc%Vp-d %4AN]kx%@"º~yqle_WQIC<6.( 0+4632#"&4632#"&>32#"&54>32#"&546632#"&54632#"&54>32#"&546632#"&546%2+"&546%2+"&546#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632  6<  d<846 F dr  '5@1*'!  0+&#"327!764'&'%!67'&'! 4$32...-,//-I2TWT2IIH&UbObU%HJbbTT#NAXY@%99'&c%Vd(b )7 @ 3,% 0+! 4$323254$#"#"&54>3232654.#"xxBB\\ᗖ}{QJMQ\\:j88j:yD[}}NMMO\\:i99idr  0+! 4$32bbTTc%Vdr  0+! 4$32 4$#bbTT=pѠc%Vp-dr  0+! 4$32!"bbTTpѧc%Vdr  0+! 4$32!4$#"bbTTѠѧc%V-dr  0+! 4$32! bbTTppc%Vpdr  0+! 4$32! !"bbTTppѧc%Vpvdr  0+! 4$32!"bbTTuѧc%Vvd&r0+ 4$3&bT%Vd'r0+ #d%rcڷdE8  0+4&#"326!vuuvzvuu+dd  0+7!! 4$#"2#"54$d_äð_=Tdd 0+&'&$#"#!!676$32WYäXW_ MNOLQd  0+! 53!!#"=PTd%r 0+4$3"dTVMQRӦd(r 0+4$+52ۧѠT-Md(0+!53 (bpcMpd%0+! bM%dr0+2#4$+"#4$%TMѠMTr-QRӦVd0+%3 3! 3%pMbbM:pc%d_0+3d__d_0+3d__d_0+3!d__d_0+!d__d  0+4632#"&2654&#"dvuuv]]^vuum]]^^d_0+3!'!d_M_M;d_0+3!!!d_Pb_;d_0+3!'d_M;_M;d_0+3!!d_M;_;d_ 0+3!!!!!d_*<<_;;d_ 0+3 ' 4632#"&dsZ@?Z[?@Y_Me_?YZ>@[Zd_0+3 'ds_Med_0+3 !dP<_d#|;  0+! !  ! '&q uwSU1tuKSXd_ 0+3!'!!!d_Mw=_Mw<d_ 0+)!!!!!_M;VdO'0+!dO>d_0+!7!Y_MY d_ #+2:J@B;730,)$   0+3#''%#&'5!!'5%!!'53'5%3'5%3#'2#".54>GG 48:8*7=A{j869GG%HNLKJLM_B99:3\IIIIxo:&6:nBJKJLLJKJdG"0+3263#!5276;'4?'4?26p&3!cM{7,2 &(@.,sR!g/1E` &.f/ U(_d4_>0+3 #.+"'&##"&'54;23265"#'57#&'#"#5676!=A' 4(fv>>>= ) N =>Z4_y=O +^0 =92@@294 0:9dg "?_9e<hpx0\oA6J4}yuqmiV@*~iS=(ycQB6' 0+273&'337&'67&'67&'67'32654'&'327654&#"3672#"&54767&'&547'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&543'4327632#"/#"57#"54?'&5432'4327632#/#"57#"54?'&5432''4327632#"/#"57#"54?'&5432'4327632+'#"57#"54?'&5432'4327632#"/#"57"54?'&5437'4327632#"/#"57#"54?'&54327'4327632#"/#"57#"54?'&5432&'67&'67&'67'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432J9nk!4m$&!$%#8 !jԕkWw4&9lOPv9&/z}r*GB_Ky{OdAA# " )( " # ()     %#   #$     %#   #$ X  &$   #$ u2O_N # ! !#-  $$   $%    %#   $% 8!>7632327>767654'&'&#" "   #   !  !  "   #  z !  "   #  r "   "   "   "  4* )*y>)!, )+z>+!   -[   -[9 +- -( ,0 *! * + + + + @ , , * +:!&!NDEa ;!$ "LDEb 49,L43;, MdE 0+!! d>=0-/j"R!dE  0+!! 7 ! !d>=0-/Aeq~.,j"R!` [dvh0+ 7%7&5476>6 R$Q=n h0# W$Y <W db_0+!2 7%7&547!&'6x<T#K 1kDB_M @_ c).\?>5dr ) % 0+! 4$32! 4$#"#"&54>32bbTTssϡΩ+gJHh/U,-U/d%Vr/ѨIggI/U..UdEr G B6 0+"32654&!"32654&%#"&54767654$#"#"&54767&54! GccGFdc-FddFGccW}|VNjttwTV}{Wu46cFFccFFccFFddFFcMV|{{|VNnmSV||||VLdEr G &0+4&#"326%4&#"326! 547&'&5463232$54'&'&54632dFGccGGctcGFddFGcRSuW{}VTwtAAtjNV|}WnHFccFFccFGbbGEcc"L쬇V{{{{VUnmNW{{{{Wdr 0+"32654&7#"5432W"\Q'9##Ud5r 5 + 0+"32654&"32654&#"&546327&54632#"/ssrsss%{{srrs?rssrZO`zFQ{d #5AMYe} "?Aymb\VPJD>8,%0+3#"'%&547654'!#"'4%653!76=332654&#"#"&54632'#"&54632#"&54632#"'&'&54767632#"'&'&54767632#"'&'&54767632#"'&'&54767632632#"'&'&5476%632#"'&'&54766732#"'&'&5467632#"'&'&54N #es; B!"C }@W?86/-&$ 0+3+&=43+&=4%3+&=43+&=4%3+&=4'3+&=43+&=4%3 #.+"'&##"&'54;23265"#'57#&'#"#5676!M0M/M0@M0M00L0L0A' 4(fv>>>= ) N =>Z4 #7.#6~#6f #7$5#6 #7y=O +^0 =92@@294 0:9dm*Th5FRGA"bNG?62)pbXE+%0+&54654'5467&'$&5>54'##&'&'&'&'&'676;67654'&'#6767674'&'&'532+367676&'&'3276&'&#36767+&&'47324732%&#"&'&'53276=4'&'327676='&#"'65327./&'&'%3276?#"&5476763267>54'.#"%;67;27#"'5#"'&5>7654'&'&+#".54>7672!@ 7'gNQWA)1 Z>I9RI.+ +IH!4{[\<, ճUU]5m^b) %=L_6VKD #*ϭF '4) H 37;  *,9A809{.dzp2~\jFnF ;F ="  ( !LO % !$IE>! " &0  :,    *"  ( /8    m]ZKUoNZ|Caq^vX]aMj_gIbSdG[|/ZNOT $ ,"߫- ;q3C <.!X  "   2 &=(?M#1*9m0 ?#B^ '!!' 4>= dU?FD@0+3"'43;27&'#"$4727%672567654'&545&fD3-Z5F x?{)C!  k8di`-@S@ vNF=4$0+3!&#!"!"'&=47632"'&=4763"'&=4767!2476?2#"'&554'&'7654'&'#7653254#"'&=!"'&=2+7v(9_- ,,}     !p  HvhJI+lMMMMlG!'-! ,+ !   -.$ .% - HJIh+XLLmmLLdi`/CW@ dYQG;1!0+2#!&'&#!"67!27672#%&'&=4?676363!#!&'&=4+&'&=476;"'#"'&54763!#!#"3275#++!-_9( Q 4! mLMMLm+IJhuJ G++ !-(  NMLmKlMMX*hIKI - %-%-dE&?Vj~@xnbXH@/'0+%"'&=47"'&547&5'!"'&=4763!5!2#"3!6763!2&'!"'&'"3%676=4/&'&#&#!3!676=4;676=4'&+27327654'&#!3!32#"'531""?"""W;+**+;}XYYX}r++ !-!9() Q  ! PmLMMLm8+IJhuJ E""//""/1 T"+*;;+*}YY|}XY++ !-(  NMLmKlMMX*hIKI - %-%-d &?Vj~@skaWPF9.0+%#!"'&53476;226326;2&547674'&+";27674'&+";27674'&+"";276754'&#+"'&'+"'&'5#3#"54'&+4'&+3!276=65 YX}|YY}*+;;*+"T 1/""//"" (-! ++ --%-% - IKIh*XMMlKmLM}XYYX};+**+;W"""?""1V(9!-! ++ )w  ! JuhJI+8mLMMLmdE&?Vj~@yog]M@5'0+%"'&54763!!2#!###!63!2!276=4'&#"276=4'&#!276=4'&'!"4'&'#"32765=4767'&=47673'&5#"543276=!276=!";3'}XYYX};+**+;W"""?""1V(9!-! ++ )w  ! JuhJI+8mLMMLmEYX}K|YY}*+;;*+"T 1/""//"" (-! ++ --%-% - IKIh*XMMlmLMd &?Vj~@skaWPF9.0+4763!2#+"'&5'"'#"'&5+"'&5&'&5&';27654'&/&+";2765+";27674'276754'&+"3;276;2763#&5432;;4'&#!"7dYX}K|YY}*+;;*+"T 1/""//"" (-! ++ --%-% - IKIh*XMMlmLM}XYYX}b;+**+;W"""?""1(9_-!++~   !p JuhJI+mLMMLmdN $(,048<{A<<:8642/-+)'%zd"0+ 3656;2#'7+"/#"'+"5&54775%"'5476;25'7&567635&56;374765'75'76=4'&+ +"'4!#"'5436365&5&#%#754'&5&&547'5367&547+&'&'735&2?"5%75537'7'3533553535'32767&5%2?&#%55'575775775A4[(!9?9Q8?VE:.?FA.( 4DPEa??#+6y a ]?  ?[Ps @tf"_N*3RF!"V<=\@/ /)V:[+ .#p>$-((Di3 (b  @hhF*g? @- 9Ve kRDpeb5-=<8z4"+j)b +&=tt\bbbVnB-* b6 Ann=V[n_~usPm81,C ]7+ \B#J+ !1P[*c*9 1 V PN H&=eom% t \S@# 0 8h-5m/0 @d$HW]NYC$\>>\OVC ,,1 .211/=;7777=10 0600y8/7fM%`[Cg+(f>17I00 011001 10d_&0+2%2#"'&=477654'#"'5473g1r Y)G ad= [ 3 Z_GHZ9QYR13d IJ: d& !3CS@OG;4)" 0+%#"';27!5%67%!&'&'2+"'&=4762#"$54$32$54$#"Z/81.Њ^]|^]"*zPQ7C)-P8G'0aa%;;æñ[XiWH^ :.1fNO%-G5Q%&H7C_cƯ:>d,Sq@~r`TE.+%0+67654'67&54&+&'6;&'&547#"'&'#"'32767654'7327323.#'54'567654'&&5476;'&'67&+")D&!##6AT =KS= Vr{I/ZEg;2*l-1Z=t\^z~SO659.C" ?6?l1DO\Dhv nD>S3wl, &cA?o}WYw(J?B \Xi$#+@5!N & ,m\OR$WD.J'-_[cKO)&FA`Wq(B34jn B ( FIVXrSt`~V+'TC&P; $HJdn '1Id|5cA0  wl]QG=/)'#0+327&#"&#"#"'7'632&'65#5473254'&#"#"'5&=67#&''5&'67'654'54'5$'67'6=4&'67&'6=&'''5$=6732#"'&#"&'65743&547"7&'7&'7&'7&'54'6546767675477&=?&''5&#""'6%5&'.54>32#67#&#" <1Sb!6 ?V L^   :)(6hCt/Mf,?HCfF_^fAB5CCC 7.aR2;EH8e h)Vi"&VrH-8u/7#]78-/7&[(iS'%#h[-HK8/C98$^7/-C)B&QL=Q%%O>KP& > `+:u9 )9A!h  s55&3, &]5T V(C@$'D+ ~ #[1 .P@%$Z5 )&GOA (} vtju8+)_T/< 9;-#6\;Q(xAgGGu[ x< s\4\VK#-;e;\'Ax@GR 76=.#;254+5!2#"&'7654+5!#";!532?5'&+5!#";254'G?7 7_Dl6rbpRRMJSQOJl^%5%GӋW&$gȃ^$j%TSB [F51kYFJ&^>hQV(deefE:N!)) Ύ((/Ì))"F("OdD_0+33#!!#'!'57!5#'5735_h5hd_+0+!#!573#'5!3!'573!#'73!#'5J aamii _mlaa mdr,$0+32#' 37+ &5%6323'#57'53#YCL3}oZ:Ş==r2۔B/e -TMwuuwd_L_p @ i`UM30+32732753"'#"'4323$4'5;+"'#"'53275'&'&54?72'#&'&547634%476=%u;*!(=?))K-   fF,JkCv@?4}7oOQs![k !X<{U$qHyxQ1U_E,,>)7((]|; rR <#[[%;iD&@[Db_Ag+çKMNdrZem jfb].0+2#27654'73&#"##"'&'#"56=+"'476=4#"4735#5&547/63654'%654q?Mw15qruݍqJ5q ( (9XKbgJ5' ID+Nmu:rpR€AT/'[<rGu+KNO]Frzjۥ+%'7.Ck78nIY 7=OK!';ܜq,rFWauDGcMwF;l]`:dh20+2#'#"'#&'663327'#&'756=4'&+"6`sȜ=ict<~o"ZnhǺzfQSzOajk  Ss!^?3dr !@ 0+! ! 67 654'd$'dbsVk&bd%rEjKZdr*6 @ 3-'! 0+3265! >32#"&546324&#"326%! ! & y8%'::'&7m8'(55('8db$'Ñڢ'77''99''99''79%d%&bdZ  0+7!!'5!!'5!!'5jSSSOOdZ @  0+7!!'5!!'5!!'5%!!'5jSS#6#OOdZ @  0+7!!'5!!'5%!!'5!!'5jS#6#SOPdZ'@ $  0+7!!'5!!'5%!!'5!!'5%!!'5jS#6##6#OPdZ @  0+7!!'5%!!'5!!'5!!'5j#6#SSPOdZ'@ $  0+7!!'5%!!'5!!'5!!'5%!!'5j#6#S#6#POdZ'@ $  0+7!!'5%!!'5!!'5%!!'5!!'5j#6##6#SPPdZ'/@,($  0+7!!'5%!!'5!!'5%!!'5!!'5%!!'5j#6##6##6#PP d#/Mkh/AJnbN90  0+32>54.#"343263!'&547#"'&547#"'%2#7632&547632&547&'&#"'#"'!6767&'&&'#"5#!6326323676'&547#"'&547#"/#67667"543&5#"'#"'%7632&547632&54?!&5&563263263&'63&'&547563267676?63233###"''&'&'&'#"'5&547&'&'&/767676---- A $&%#<     )3s  >$%$$ Bh%%%#  !@   }u0   (0u  $%&% Aa  yu1  5? ?5  +"P ## P#+  4> <6  ,#O $# P#--,,`'0u~   %%%#  #?  ~u/   (0u  $%%$ Af$&%#=  !A  }u0  =$%%% ?  -#L $# L#.  2< <4   ,#P%%P",  6< <dr "*2@ /+'#0+! ! 3254#""#%#&'67&'67d$'dbJM"FAD;?\hmehnc&bd%MKJio imio imd& "*2@ /+'#0+! ! 3254#"273$33&'67&'67d13RPY[^JD@alrimsg2PR2\YQint nrnt nrdr & @ %!0+! ! #$'#'"&'6%&'6d$'dbuJ~MW%wx}y}&bd y- ~  ~ d_'/7?GOW@WSOKFB>:62.*!  0+3#'3#'#"&54632%"32654&57!!%57!!?'?''57/7KKKKKwvvwOppOPppB B4 443 T444 3_BBgvvxHpPOppOPpKKKK3 3(4 44 43 3 dr* 0+;27$4'!"7 #"'56765%&'567K?$ `\veZ_퉉ycg@.(VYN.\&5aJ$ds*( 0+ ;27&'&5%67&7#"'$47!2A]a $~>L7bz؉`ZewBEW)z. K쳲5']rcdH`-<5. 0+3##5#535&'&54767&'&53367653#32654'&$!yxcvczz %% zSMj#iNRy!#jMSvsRN!wr[ `` \rw!"wSLLSw"WMRvwwvRMda\" 0+5#535&5! 3#254#"s tZ  a as ٰ  d^= $0+32654&#"%#"54767#53533#ԕԖі֕xؘύ/ڍq``d^  0+ #5!#5! !23254#"{\!z{OP[}  wzd_0+52654&#"#463233#!5rsrgՏPopp漢qw]d_0+#53533#632#4654&#"#aaded.dRozCqpjd;_ 4#0+"32654&7#"&54767!!53#5!!3!!#3!!3II33IH8-FecF,8叏  eI35HH53Ij,GdeedG-okkkcd_;0+%#5#535&'&'5'73'3#'73'676575'73'33p`G^\GappMM`HpGbQQŠodr_0+! #!!!'!27674'&#lw\62E=+wB!K_GWUxNxJxJ8dh&0+!#"#&5463 67!2#654'&#"kFmMw/kj0wLnFk*ʕ uxy{6.$$.ʬ{yxu 6d_ 10+"32654&'67>3"#"54767&'&#52 yGOZqx+'&,xqDNG8>dd&É'd!d>8d_0+&'5! %$! 56?632#"'@^^=klkkkklk0SS,9+SS0  d<{( #/G @ ?0)$ 0+"32654&,'532=&546322654&#" &%&#"#"&547>,Z~~ZY~ Q8t}ÌbEZ~~ZY~)ZQ8u}ÌbE~ZZ~~ZZ~')uPgČbII~ZZ}}ZZ~X&)uOfŌaIIdrT' 0+67654'&'&#"32463227#"&5454&#"#"'&'&54767632254'&HF%$#!H F$%!-ԫC_>xj^}x,$/o5598m,0o55GF-cF$$"!G E$%!"HȗѦ%uRDpriǷ~z9;]gRAl*.q43:8l+& Eid?t9D@;0+2>32>32#&'567''#'&+"#4'3>64'&+"u:p$F:K-y@7]+Ds+5|; &SSl"typœμupY'_nR9˻_,31jjJWBD?df$ 0+7!!!5!&54632!!5#67654&#"dvP@@pQttQ c||c PsttsPdEil4*0+%353'5#"&''#'&+"#4'3>32>32G327&'"d&&eqr)urb.=5"JE{&**&rAVy tlpϳ`|n_ҵ\SThd)f,YB6 0+32327632327632&#"#"'&#"#"'&#"#'32327632327632&#"#"'&#"#"'&#"#'d4n* 55QR5366Q)(ugY<[/9R5584PR4635R23o) 45QS4456Q)(vgY;[09S4585PQ5544R2%CCCCCC!02IHJACDCC]&CCEECC"02IHI@CDDC\d_ 0+!5!37!!' !ߜ!cCC7&'6d_!%Ue@ aY=&#"0+67&'&#"!3!67>54.#"!&'.54>325467675#53533#63232>54.#"!.EGGLKD;:EJLHGE/c'"?de_IF! cc`dd !FI_fd>#')**)y(%KJJ%%JJK%(` 1bcb!:2@PP@2:!bcb1  ((**dhHNRh~@sj]TPOJIF!0+&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32767>54.#"327732>54.#"327>54.#"732>54.#"Z 2371O33,)@12?#+32 RW)33 ^%I!"# &#"#m[#!#_. " c ! !X..;+U--*K-002*'..N~)..WSE8+:'  !  !K!  !B !! ' !! d%+0@ .,(&" 0+!35!#3!5357'5#5335!75!!5'57!mXXmmYYmu#NNEFꜜM99``mvv5&d6BQa @ ]UPH<740+&54767&'&'5676767&'&54>32!535#5##3654.#"!32>54.#"c 7!''(H)H&'H)G(((!6 l8)G(&G)9Xm22211580 $9CJJDF& $&'F''F'&$ &FDJJC8$ 08626rdssdr+C'I%%I'<2C 1122d,8Aw @ oc<93.0+654'&547!&5476='&'654'67&'&5476;+"'5#"=6&'76767%25#654'&'Bt*g V4, *J.D c3$[)AD '!I  8*Fb\!cN >%+ I   /Ycb57=m,Khtiq<,!. 2.\#:$ ]]+*HDF rtv11 h ( >GF( dgT_ @ YU;! 0+32>54.#"32>54.#"!5&54767&'&546767&'&54>32'&'.#"7`45`67a33`8 9O $%)PI)J'&J*HQ(#$ W54.#"!&'.54>325467675#53533#63232>54.#"!57!&'.54>3234'67632!!1FJJOMFFEGLNKIG1 V'$BfhcLH" ggcgg "IKchfA%'*++*9@Bq<;:&(9;=q@>9y(%KJJ%%JJK%(` 1bcb!:2@PP@2:!bcb1  ((** p=>p>  >p>=p dhHLP NMJIF!0+&'4>32"'4>32&'4>32&54>32&54>32#!5!5!Z 2371O33,)@12?#+32 RW)33 ^MMX..;+U--*K-002*'..N~)..WSIIJJd#' @ %$0+5!5!!35!#3!5357'5#5335!mXXmmYYmu#^^!qq4M99d4@:510+4767&'&'5676767&'&54>32!&535#5##3H 7!''(H)H&'H)G(((!6  l]80 $9CJJDF& $&'F''F'&$ &FDJJC8$ 0862 1rdssdrd6BKQ @ OLJE?90+654'&5473#!&547654'++7&'654'67654'&547;2547#";65'"3# 7Q !*h ƺ>o Ub.emT.^c4A)[#m D:2dH*$,ME - 57lcLNٴhb "#?s.!-=B2!"T*'dg00+&54767&'&546767&'&54>32o $%)PI)J'&J*HQ(#$ 55I#FLM& #(&H&&H&(# &MLF#I55dW#0+#"'##56'##"/547?d)9Df,X[(2[Q P_5QK'Z U|E,mdWi2%0+22732#&547636=4'&#"#4'&#"e `˵j z4gFųY=3K ?W]iIAHK =t)$h`#HѥAdr  0+ &&5 } 5AHrA` _R /3dWh70+236;2"'##'65##"'&5476;235&'&=476] n7CNX$A]KM]^8` dw4@5N AAeL `dW!;A ?<)"0++"'##56#+"'&57477;2732;276=4'3&'"އ[$2i,X\,V#=o|{*(, fF)Q Y[d]!2R @ 93)"0+3#&'&'5476%3#&'&'54763#&'&'5476#"$&5467332$654'&'  -LP1  .MPH  .MP*­°{HRQI|:Zumi/Q g=?W׉G~\aSGq弄V44 <;KVo'JJIJ 44;~F32.+)"  0+3353#5#3#7327654'&+%32##7254+3#3#3!567654#"#476323#!'7!27654'767327'7&+'6"'&547'7'3!GHH.E"QQ"EH>99>%{8H55C,!F c//HM./7DZO*(TΏ2F#TU[^Z"EE"@IU,+[][#E}}4st3A$$65%$@om//^}@ZAaAS9*,CS-+((BGGWPIIGHii>V44 <;KVo'JJIJ 44;d0`u@xuiL@-% 0+32##7254+%#3&'&#"3273#"'&547633254#"#547632#"'&=3327654#"#!'7!27654'767327'7&+'6"'&547'7'3!|8G55C-GJcc,^Y= I+*8Q*$$+[  dQb40DM1:IQ<5WH.2b$%m 7*(SЎ0G"STZ]Z"ED"@IT,*Z]Z#D|ol/.]|r9=<5TP5@vM@) C+'$*LB. ^K+'&)EVHIGGhh<U44<;MVn-JJII44: d$+7BEZn@xol]ZNDC<8-,(%# 0+333#7327654'&+%32##7254+3#3#35#533#'5#!'7!27654'767327'7&+'6"'&547'7'3!,H-E"RR"EH>99>*{8H66C]OOX_W*(TΏ2F#TU[^Z"EE"@IU,+[][#E}A}4st3A$$65%$@om//^}@ZAaAkMZUkmIIGHii>V44 <;KVo'JJIJ 44;d@Vj@tkhYUI,  0+32##7254+%32##7254+#632#"'&'3327654'&#"##!'7!27654'767327'7&+'6"'&547'7'3!d|8H55C|8H66BAJ.*76SF+/cL(#HW*(SЎ0G"?STZ]Z"ED"@IT,*Z]Z#Dol/.]ol/.]Uu73KR42"%QD-'ACBHIGGhh=Un)44<;NUn-JJII44;d8Tbx@{wkYUO;4 0+32##7254+3254'&'&547632#&#"#"=7632#54#"632#"'&57654#"3%#!'7!27654'767327'7&+'6"'&547'7'3!Z|9G66C;BO1O>1(;6$*J:H # *!;2*@'3pA,.bA]%AL.,34Pk,!R')*(SЎ0G"?STZ]Z"ED"@IT,*Z]Z#D|ol/.]_F3#  ;<A6-  @? vJc&(K 7$51LO65Q @*)sHIGGhh<U44<;MVn-JJII44:d(= 2)&0+#!'7!27654'767327'7&+'6"'&547'7'3!u*(SЎ0G"STZ]Z"ED"@IT,*Z]Z#DHIGGhh<U44<;MVn-JJII44:d&'9HR@LIF:/(! 0+!273!567&#2$'76+&67'#'6765'533!273+#'!"/479 Ib`" eh)10Q`'|oOc ]r.SS}65 `[V/X'e:9o >)[( :s s#/1dr%2<J\e@c]NKC=;5-' 0+3 + &=%62!67#&'&#367&#&#"3274/"34?3'35732?5##!'53v[hN*"1r7 |OJ?0Z1J ]p]_( KG I݀z#9d =erfHp1L|f) wsv-I92s/9?*Ww[`c% V'dr /:BR`j@ea^SLC?;40)!0+ # &5%6; 65%&# !27!57&/#2#&'676+'%!#'#&'47'3!27##'%!#"/6(auYr'E,LTU*'36MgIJU+q+}e_J RJ4M%rpT_PmL]A\)!1$ CPy zS/ .ZQa)/dr +6R@ @:0,&!0+ &5%63 %&+ 3 62654&#"!267&#"67632#"'&'#"&54632%afY+UNhTcX{{XjY SMh?X{{CTwwwwTUvwwvUTToOpPØM@|WX{{XW|xTwvTTvwTd!/#0+2!2!!7&!"4#".547673267ɘ   0( Tpzz|?!/'SRR*D.dx(W|>{z{p;.;CRSSK1d_' $0+2#".54>!2#!"543!254#!": :: 9ysssM&y&&&>: 99 :!sssyss&&y&d_+7 @ 4.% 0+2#".54>2#".54>!2#!"543!254#!": :: 9: :: 9ysssM&y&&&: 99 ::9 9 9 9sssyss&&y&d_/;G@ D>50' 0+2#".54>2#".54>2#".54>!2#!"543!254#!": :: 9: :: 9: :: 9ysssM&y&&&: 99 ::9 9 9 9n: 99 :!sssyss&&y&d_/?KW@TNE@;3+#0+2#".54>2#".54>4>32#".4>32#".!2#!"543!254#!": :: 9: :: 9:: :9 :: :9 ysssM&y&&&: 99 ::9 9 9 9x 8 8 ::99 ::`sssyss&&y&d_/?O[g@d^UPG@;3+#0+2#".54>2#".54>4>32#".4>32#".2#".54>!2#!"543!254#!": :: 9: :: 9:: :9 :: :9 : :: 9ysssM&y&&&: 99 ::9 9 9 9x 8 8 ::99 ::: 99 :!sssyss&&y&d_/?O_kw@tne`[SG@;3+#0+2#".54>2#".54>4>32#".4>32#".2#".54>4>32#".!2#!"543!254#!": :: 9: :: 9:: :9 :: :9 : :: 91:: :9 ysssM&y&&&: 99 ::9 9 9 9x 8 8 ::99 ::: 99 :x 99 ::sssyss&&y&dr/ +#0+2#"$54$32$54$#"4>32#".&QQB*+֞ըa98 !88 rOU=ץ)-ӣ 99 99dr/? @ 70+#0+2#"$54$32$54$#"4>32#".%2#".54>&QQB*+֞ըa98 !88 9 98 !7rOU=ץ)-ӣ 99 999 99 9dr0+2#"$54$2>54.#"&QQ8! 89 8rOU9 99 9dr/ +#0+2#"$54$2>54.#"%32>54.#"&QQ8! 89 8 89 97!rOU9 99 9v99 99d0+7!!'5jSd 0+7!!'5%!!'5j#6#d 0+7!!'5!!'5jSSOd  0+7!!'5!!'5%!!'5jS#6#Od  0+7!!'5%!!'5!!'5j#6#SPd @  0+7!!'5%!!'5!!'5%!!'5j#6##6#Pd_,+0+632327#"'&#"/#'!#632327#"'&#"#5;~EH4415aJ J43LKhePF]eIN 3 WtU11pUHHFd_0+#'!#632327#"'&#"#J J43LKhePF].11pUHHFd2_0+ '7'77 '77 ''%ͧ(})02(~)>!У$"J4()4*(i˥&ڪdrR5 0+32>54.#"##"'5##"$'&'!5!5&'.54>32!!676?'%'$C$%B&'B$#C%#$P RQD|fl^9@As>=tB@9T]X{EQ R Pk$C%%C$%D##DMYQ<2r<Q-&w/ s?@t??t@?s .w` -Q7.6. 4GVX:8*CbW%a??`$Wc<&G;XWGgi 56S/'uR(!Rp'-Y<C1= 6:nE=( J6?//?6D !IEn:6a` j k6WF>#5R&2#>FT=dr 6Wh@ `X>85&0+3254'&#"#"'5&=67#&$'54%'6=&'''$'6732#"'&#"5$574%'.54>320   "<HHH >2jZ5A"bgH((P  ><, ;L,,l="h[+>%/+R[K,1!.![@1.m96 e **** dr < 9 0+% 32% 3232+#"&'&=!#"&'&'#&=4;7337{{zwzz{3%)+SS+((+SR+*3..rt/$$$&'@::BB:7= ?8:BB::@+-ӑd_(0+632#"'&'&'&#"'#!#!#y/-B 'qC>*)cI"#*ElhZxPRxZP $JM777"%D2!?AAA; dRj3A ~ohU3 0+767#&=&$32632#"'#"/#"'&547"'&=4?&5476;267&54?2654/"57&'&54?27&'&+"63267654/"2?54/#";27'#&547327&#"%632"';2?4/#";2?#'#"'547'%#"'"'32?4/32?4'"'547kj@$3')(Svi S%,!\&DZY#)4'%W$4 O*,0WB##) 2"'(!2IJETZ*25I8/?!uG9( OL7 UH S:": -tm'H@ "ow2Lo 63!qs- ?A 3:P5 %4(  4.? :#B 0DB2!'2 YY$׏~䛑{rhiUb #&$ ' U"," K,-0SX')4!+Y +(@-s)|m'0%  !or9FOk8)!.'+  Nk ,:F2(B | ? MDE=2!64 !3P#(-!2CA7#  U643I?pF?+~ LP5Im6 ?I5qn! -A!id__ H( 0+32>54.#"%2#".54>''#/'7''7''7/5?'77'77'7?3777'/}~瀄z{$A&%A%$A&&B*Ak8ULB"\!BKV8iA;%{#` ut _$x&:Aj8UMB \"BKV7kA;%{#a ut _$x&}}~}} $B%$A&&A$%B$A;%{#a vu _$x&:Aj8ULB!\"BKV6kA;%{#a vu `$y&;Ak7ULB"\!BKV7dr  %*/;BIOTY^#@ ~][XVSQNKGC?<50-+(&#! 0+3&547"654754'7&'7&'7&'7&"32654&7&'7&='547676767&#"#"&5476;267675&'.54>32#67632#"'&#"#"'&'&547a57@-A:B+/e5BC)8pD/f3HH33IH@75AA*nB:Q}5di7*p/y :8n~i//E+%2%$2&*G//km892%2 1%2+>2\T u9 r[FtUAdHc;T*B,#7wG13GG31G32 Tk 9u#^rFV[AL<;c0!#,BZ=%"  $ S #$$# R %  G>YE1&A&1Ed^r #+;Gow}#@ ~|xvq]IE@6.($"0+2#"&546&'327&%327654''67&'&'67654654'&#"%632632#"'#"'#"'&547&547632&#"6&%67&'&#"676&5467&67327&/BB//AA]DQ4"$#!4QCUC11 #]DP3oo+%vJ`dd`Iv&+oo)%vJbdd`Hv' U}{Velm|LRoZYqR"3PD\B22CQMQpRLZlgW{}Vf B//AA//BGOqU+%YbttbZ$+UqN9:9:8;$@\IX~!t\"cdM;75C&E-+O #-m8Ap)R{{S(pABb,$ O+-DE&C67:NdXƚr] d5w #&+1;@;5.,)'%$   0+#''!7'7#!!'7#7 3?'# !! 3b)Ac()8Nh@@8#*ۇ3TAW9=7*U2:7442g12.{2MzTx ]n|Ar.c<J Nd 0+!5%7' Ssso>no=nd 0+!5'73 Rssno*nodA "3 @ ,%! 0+#".54>7#"&554632 672#!"&547'$&%&B&0'4+:G"LHI|/C$$$$ji 5)*V&.56%2o?$& ?n?ȝ" `oQF apRF?Fݜg#]ߞp@d{X5AP @ NH<6+0+67654&#"!!#5!5!5&'&54;632'%'#654'&&'&54732ZZHpPDRDy%ۙ&7o_f.eUpQkVoS(QD4[GpޞOGp&D݀jaa8( >o?fpRgpQB&E݀jHpd ,0+4&#"326'%'3##5#53&'&5432ԕԖԃe.f xz*}ؘg>o? ڍq__8t.d (#0+"32654&7#"54327'77'%'yޞ>7p^@<5e*h4=wߞߋg98(gNePW>oWgeWg/g}ؘ/mMfNU</o;VNfMl##';o<``,טd^S )"0+"32654&'#5#537#7#3#3#"5476aԖwwx֕zXɚؘɎvggvq/ڍtd '#0+4&#"3267353355##5##"5432țؘȏvggvr/ڌuԖ◗qxx**zdy  0+#"54$323254.#"z|Jˀ~~dy  0+#"54$32JdS  0+#"&54>3232654.#"rijqˏ\XW]nmmoˏ\YYdd !)7 @ 5/&"0+32654&#"#"5432632#"654&547&#"32@JțJ?yp0֓psّwjic܃=JؘJ\ԕC*+DCiiiďԖd9 ) 0+32654&#"5&'&#"3276#5#&5476;253632#"_SlɚlSQdؘdQИҋjlQjԕjQlzqrUjԖjU*Ӗd C 5 !0+4&#"326%4&#"326%#"5432!67632#"'&'ԕԖԕԖ~*ҕww*ӕ~ؘɚؘTv/yyvdK0+%db&bd_0+!&5476=#5!#< qnq{>![#>p RR}d^ 0+4&#"326&5432#&ԕԖ/*+x|ؘύ/ڙqmd 0+%#432654&#"'632!!#5!5!H͐pr*ybBpmԋp\\db 0+  !#5!5!`aLMH`aH\\d_0+7!!'!#5!5!'7!5!'73VDVUEU֓&VyUp\\UyV4d._!  0+#654'&5473 ! !! !|y//y.YIZ^fjMRQ3333QRRQ3333Q798%s[d_ #0+"32654&'#"$5476737 '磌fV!VEN76NN67NM5>XW||WX>4VUd60+&'&5432#"'!#5!5!W=!;7K>HV@G-A! %BښK&__d0+!! '!5!7 jsjhrhdhieihd 0+35!3 3!dE"!Dz%%zd 0+!# #!5ޏz%%zdr7  0+)!!!!!!!5eaș($b}] dr %/9CM[n@zqmcTNJD@:60,&"  0+6327&#"63267&'&#"! ! 76767''&'&/%676&'&7467&'654'.'6&'676765467&'&'&FF_==_CuklI6CAB>>GYTB\8Ibb%$<-F"!!V12COIXWdPD11VsWX;,;!"&!3GOl+7?j2T~ ;5J8ksS-i<:zO5J#C/#(Yz;5 "d6))$_BJWVVSb$%b6_9;UMdgf J*%#Eb??E$$*I(??OU::_4zfgCHD|AGm;K=X;_hA:0,M;!#!*7D?'6_" >LX0, dr #)/jv@pkN1,*(%"  0+'6'673'67&'7'&'73&7&67&#"&'&'6767327&'&'7676'&''676 ! 1*::>z1)8:3:*10%>:/8)1.P:Ξ!01š1/c&$bI':@IBGR$:@FHBMS@:'BGBL@:$?SMBHno")'bd'  )3%%bcd_ $(, @ *)&%0+"32654&3##&'&546323!7!@ZZ@?ZZR>X~|Y?QxR8>,,==,,>9)QcK3GeffeG3RER_ do)5AMY_ekqw}@{xuroljgda^[QNGB>8/*&   0+#"'&'67632%"32$54$#"&54632%"32654&#"&54632'"32654&3 $=! '&'5&'5&'5%565656 =>¿`ˏ'kKKjjKKk6NN67NN6k&!!! !!!!!!!!U! U!!!wTXXTw4vVVVVvllllMnnMLnnBT::UU::T!--! --FFE C " x* d)5AMY_ekqw}-@*~{xuroljgda^[QNGB>8/*&  0+#"'&'67632%"32$54$#"&54632%"32654&#"&54632'"32654&3 $=! '&'5&'5&'5%5656563 $=! '&'5&'5&'5%565656 =>¿`ˏ'kKKjjKKk6NN67NN6k&!!! !!!!!!!!U! U!!!6k&!!! !!!!!!!!U! U!!!wTXXTwRwVVVVwllllLnnLMnnBT;:TT:;T -- !--GGEC " w*  mFFE C " x*  do)5AMSY_ekq@pmjgda]ZWTQNEB>8/*&   0+#"'&'67632%"32654&#"&54632%"32654&#"&546323 $=! '5&5&5&%675675675 ̏ˏKjjKKkk:N76NN67N]6!!!U! U!!!!!! !!!!!wTXXTw4vVVVVvnLMnnMLn:UU::TT- !--! -M.#C+  IC " d)5AMSY_ekq}+@(~urpmjgda]ZWTQNEB>8/*&  0+#"'&'67632%"32654&#"&54632%"32654&#"&546323 $=! '5&5&5&%6756756753 $=! '5&5&5&%675675675 ̏ˏKjjKKkk:N76NN67N]6!!!U! U!!!!!! !!!!!6!!!U! U!!!!!! !!!!!wTXXTwSwVVVVwnMLnnLMn:TT:;TT-! -- !-N.$D+  HC ! G.#D+  I C ! d "?_gow@tplhd`QB6'  0+273&'337&'67&'67&'67'32654'&'327654&#"3672#"&54767&'&547&'67&'67&'679ok!4m#%!$&"8 !kԖjXw4&9kPPv9&/z~q*GA_Kz{OeAA # ! !#8!>GPYbkt}7@4ƿ~wunlec\ZSQJHA?86/-&$ 0+3+&=43+&=4%3+&=43+&=4%3+&=4'3+&=43+&=43+&=43+&=4%3+&=43+&=4%3+&=43+&=43+&=43+&=43+&=43+&=4'3+&=43+&=43+&=43+&=4%3+&=43+&=43+&=43+&=4M0M0L0@M0M00L0 M0L0L0M0@L0M0M0 M/=M0M0M/L0M0L0L0|M0cL0M0M0 #7/#6#6f #7$5#6 "86 "8.$6$6e #7#6#6 "8] #7G#6d$5 $6$5%#6_ #8o#6+$6$6$6dg "BnHr LT\d@kA4.~hc_[WSO:$vaL6  r\F4%! 0+"'#67##7&'6'&'6&'6672#"&54767&'&547'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&543'4327632#"/#"57#"54?'&5432'4327632#/#"57"54?'&5432''4327632#"/#"57#"54?'&5432'4327632#"/#"57"54?'&5432'4327632#"/#"57#"54?'&54327'4327632#"/#"57#"54?'&54327'4327632#"/#"57#"54?'&5432&'6&'67&'6'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&543224!ko9{!%#$"&$$! !A~q*GA_Kz{OeAA$ ")(" # ')     %$   #$     &$   #$ X  %#   $% u1O^M# ! ! "#! -  %$   $%    %#   $% 8!<>!x%'''%(&c"#!fjUijJ@iѕiD Jji@5 6  4 2  2 2 / - D2 2 / - 0 0 . , O                    2     {"#!!#"#!#"^0 0  . ,  /      _  2 2 / -  dH"+4=FOXau~@xvtk[YRPIG@>75.,%# 0+3263#!5276;'4?'4?263+&=43+&=4%3+&=43+&=4%3+&=4'3+&=43+&=42'4'"5%5'#3+&=43+&=43+&=4%3+&=4p%4!cLz7,2 %)@.,sSL0L0M0@L0M00M0 M0[4( M0/M0L0)M0S"h/1E` %.g/ V(_ "8.$5$5e$6#6$5 "8 # $6+$5#6$5d&  0+7! ! NVPErABk\d,0+7! NVP<kd_ $0@*%! 0+4#!#!"3!3!25=&#"327!2#!"54S%gR$$% " ysss1%%SU%%r!" sssysd_   0+#5!3#53#5׍.׈;:_)ҍC:da 1 @ ! 0+2!57! "63!2&##"="5>?63!2##"=>RU#/":1& E  :%;  F %29\XO%%O.Ol#44#lO.O%%Od6?:70+332654'7#"'3673+"'#"&5&#"&546323265(>2>3H>qX33l*A 3qsRLM6EH>qMIPP?LM:UY!ZG]>linÅ1q;6=HS(F*Hg2Vos~sYBC d'0+#&'7677$^!|P2, $X0G'6'DA:Qt!w {ib)A *..4.4& X H  9  {볬! a W '#HaV'PS*R"+V 3=)R.#3!% ()vb N=Ra ۭ a B ` {q%[Q L a d6r/6 20+ 0++3356;5#"=#"=677632+#"'&7325  p QN NO b  ߲  k 13 21 Ϫ9dt %  0+?32?654'?&#" ! ~Za|XRņƃ~!&cb}RY}{_Xcb$&d_/K@ _L800+32654'&'#"5%67654'&'#"=543267654'&'#"=54323#4'&'#"=#47675&'&547675&'&535432676&'&547675&'&5476753#%J65L&&'&&&'%%'&x&&&'%%'&S>0@@0>>0@@0>S&&'%T?/??/??/??/?T%'&&A/>>/@@/>>/@M@0>>0@@0>>0@L 'bcMMcb'$## &cc& ## &cc& /##- &cc& ## &cc& /##؅=/ /==/ /$,( 6 }C_1  f;K ?1t(    d0+"'&543!2654#!"32;j2K2k#W# 04-'--'-  d_ @ 0+#!#3#3##3#/fje9999v99_q_[owd_ @ 0+ ! ! ! !=& a c _d_  0+65!"!27!"wm  lw_d  ("!0+!2322+#"'!#"'5!"=#"54!5#YaY% &(4:< _ƶ~|d_ @  0+#!3#3#3#3#ERip88888888_֔}zxd_  0+ 3!7!dHX;n_Nk;dlU=I F@8$ 0+32767654'&'&#"7#"'&'&54767675#535#7#3#"&54632/<[=9pg/=Z=9p))jG7{CFkF7dk.U;=UU=;Uh[<:oh/;[;:oh0ߕ 8{DEiG7zDGk9 LLj=TT=J @ GA;51# 0+32767654'&'&#"7#"'&'&54767673#"&54632#"&54632/<[=9pg/=Z=9p))jG7{CFkF7dke]BB^^BB]^BB]]BB^h[<:oh/;[;:oh0J 8{DEiG7zDGk9 B^^BB]]BB^^BB]]dS @ 0+! !3737'377'2L6EM&U5UES[6\SACO傊ݰkkdS @  0+#%#'!''77!72FSB@AN>oó@j_%0O:./DF&O%٘.dS @  0+'#'!#7!'77BSF+Az>Nnj@ͳH0#P.OD>/LOF%).'d7 @ 0+! !#%'#7'#'%'9٨UL6TES[5"\0 RAN僊ޱMkkd_   0+!!#!5!55&5!'65!5g00P)()YG:-*-:B2&C&2d,_  0+##!##5!,R_5˔?d_! 0+3##!%!#55#5352!46jTUEUSZ_v2${W$vJNMMNd_0+!#!!!#!40ʒ4_ ndid # 0+#"&54632#"&54632#"&54632Յ^^^^^^^^^^^^^^^^^^^^^^d_ 3! 0+4&#"3263!!#&''&'!5!6776qOOppOOqSN@ =4 y 4 :@QSSB</ ~ 2:APppPOppy 0 BFJ#@ HGDC@?<;87430/,+*(%$!  0+3233!$3533!3533533735335%353573533735335337!35'35Χ%Zq [я2Dž<{<{2ga>|;C|<Ʌ_rccț-țțțțdW @  0+! 32$7%!"!!"$'!!3!+|85(I,BFuq '^OngVU舥~/d_  + @ &! 0+3!!"&5!#!5!25463!!"!4#!5!2\ Zn_nZ ] nZ\`]Znep]]pe]peep]d_ Z <0+#"&5463267&'%%#"&5>32%654'&567#"''76767632%&5476732#"'&'hIIggIIh3 o Q+LB2%;A '0 G- !2?.j{,AWW>?WW?>WW>?W}ݗ=iDi=p*B)F0?WW?>WW>WW>?WWd`  0+3%%%I2W{e9`N7 d#r0+ 654'!  ! &547jk̤̤gg Ńƃde_  0+!!5!!!5!!!!5!efn_;;;d^(,*)"0+!2323254/7#"'4+!!5346!56th0*,0(0 ZNv07'Hr,^kWxF_)c=T^YD^Ann냂d_)1;@42-*&0+!! $54'! 32+%3!273254!5&! % ! '6#"'532B67BVSY A_z}bQxzuuvv\}}__eJ;;JMm`mژj''02202dL_ 0+!#!5!5L6_\E_d= #U @ M+ 0+"32654&&#"3265654&#"34'"&5463232%632 #"'%+#"&54636W>@UU@>WWWW>@UU@NrrSRq8++E7J7G)+"0 qRSrrNU^^B?^^?_A@__@A_74{UW||WGP?9D AB6Q RU}}UU}3d/ /t @ v]=+ 0+&#"32767654'&654'&'&#"3276%'&/#"'&'&54767632327654%&'&547676323!!'&#"32767654'&-3/2.3-L֓  C(+J" D),^UJ" D)+I$B )<4<:       (+  ')* '+  E: $"7 <%#7*#K=%"9<%$9;9#$=J#*8$$=8#% 8Dp    dt GS_k@se`\VMH=0+"32654&4&#"326'"3265&'6732?65 4/&#"&'674&#"37"32654&#"&54632"&546324'"&5463232%632 #"'%+#"&546367#"&54632)3FF31GGGG13FF31GzEaaGEb$[#F*G#a(bEGaaE|W>@UU@>W@UU@>WWNrrSRq8+%JHJ%+"0 qRSrrN(''(kM64LL46M6LL66LLjJJkkJE/W8: V7AKjjLIk9NMu?^^?B^^_A@__@A_74{UW||WGP:87;Q RU}}UU}36((((d0% 0+&/;274#"72+"'4768="F,p$f7W0,[&Q'~_|H;/= 8`N6[vd_H0+% ! '&! !#5.'&5477632#"'&#"3272+3q *n}_C. &'Oe9pq )mm Q: %$9  !&ed_ #)/9@51-*)&  0+! !  ! #"&5463267!&'%632&#"nmQqq:wTTwwTTwFt .D- sKRFFFEmmZpqUvvUTvv]=))=]7 d_?60+'3%253232#32#;2+"2+2++4#%#.Jg-GYIwZ*%$NL)%"C4R}}R4C"%)LN$%*ZwIY-gJ[fD-{\`?>`\{-DgZds @  0+! ' HHssc$}d *cow@ztpmgaY(& 0+632# 54672&546325632632&#"#"&547#&'#"&546732654&+"3254'&$#"32654&#"67&65&'&#")(BTiOss@3,AX`$G((4π p%#<5,oB@B##E;5'|,C= :NUII )S Zo4`Ag$W?9_ #aA?w)  v(:1H'@W+-sQ\&*BFS:S/*5 7 * dW%0\hu@ rif`[J.*0+632632327>32#"$46763267&#"#"'&#""'67&'"6$6767&#"#"&5&'67&5&#"2"&54>I\-!:?A&~?00AfP ed -,4%>1/ ?0'"XA)D%9G'd =9*2<3c# $"`I GI`fNSH2$Eu Vl)تB^k$!5*=7d&08ly@|zvpkc52.)0+23632!"547654'&5463254663&#5&#"32&=#"'#"&547654'&+3 54'$'"32=.#"67#"wgT_?+F{7΂|#&+O$W 52,1V~'3$ O, DNulD(MI"rI2)B+ ))-C+ &GAz>?fXey5 !/=TxF68>X O4mR/3/\5 15)ld\W܊*L1s"3DBE&d_ 4Fmw|@|xrncGA;2% 0+32?6547543!!''"'#5'67>32726767&#%27#!"654'7327;27654'&'3654'2765__' SX@R,G"ӭ*lL4~;PD5R36f(>#p01g)vyg9&D=^%R8Abi@- bX&B.Σ@>D<4ҋ"FD6* S7JFH]`I 7S䘐0fW7> ++)( ;1*#$,~x}wyz˲~Cd  ,D@<0+# 0+#%737'#6767 67 327654'#"'&'&54767632?# )0mۿ4/FVlbFMZ( gO#-$! ( /# ( =.)!D/:N@4\(QM-& .& dU $+0<@93/,&% 0+!2#!'5775'!&'7654'%!654'!65!'#"&54632:e7/4E걾4Ke2w  (x !!  )%)?7A5Aloor2,"7542w;<6LL66MMd  ,8@5/'! 0+37%2%!7'!&'&''&'%654'&#"#"&54632nd3) ";xxl5R"V*`MFg '^G21GG12G"(-<)r:1$\4@(KQ72FF21GGd#<&OD20+72632327#&'673&#"#"&+"3'#4;2327>32!&'67!#"&'&#"#&`SHY3Y5rxys8Y3ZFR_r1r@"rGr]APMNQ]rGr #?rRxe`}~` dyQ.55V VU W55瀃-d-2) 0+#4;2327>32!&'367!#"&'&#"#&enC)lEma`qZUUZa`nDl)Co3z5,`]\`-5z3d0+2+"'476P)(Z)Ia} /Z4< gd0+2#"'476?%ln_*T!>\,Ch[dt  0+ 7   '( 0+ __ ]___d0+37 #"'647732-==Lr[)Gs>-+}6D^ 7  C每" d"0+2'#'#'4#&'&67356;3/X]GHI+/mj,#'PGIg  d_3,0+"#"&54632;4&5463232632#"&+#"&5465A@[[@Aգ?}YAAY}?@@ZZ@@ͬ?}YAAY}}Z@AZ}@?[[?@}ZA@Z}A?[[?Ad_O/0+54'&54632327632#"'&+#"&5476=&'&'#"#"&54632;676P-YAAY-PJA,@@ZZ@@,AJP-YAAY-PAI,A@[[@A,IA AJ,A?[[?A,JAO.ZA@Z-P@J-@?[[?@-J@P-Z@AZ.Od_O/0+4&'&54632267632#"'.##"&547>5&'&'"#"&5463236767-FccG%1  ;A&EebbeE,A,  1%GccH+7 ,@-FccccF'A9 .+A,EddddE'A: 0&FdcG+7 :A'FccccF,A+ 7,FcdF&0 d_Y0+#"&54632&'&54632672#"'!&5463267632#"'&'#"&547!632#"'#"&54767#"&54632!#"&547#"&54632&54632"+??+ ?,,?  +??+"?,,> -,>>,- >,,?"+??+" ?,,?  "+??+"?,,> +,??,+ =,,?>-,= ,,??,, =,->!+??+! =-,> !,>>,!>-,< +,??,+ =,->!,>>,! >,-> !+??+!dZ0+%$ZdZ 0+%$ -2qpZbeqed/?G@D@=5-% 0+%$76?'&/&'676?'&/76?'&/7&'6yXuuY;:<;;<:;=;:ONNONOON?NNONOON:=;:2NvYtN''<;;<'(W';:'NOONXXXXNOONXXXX';:'d _  0+! !! !)AA=A(EfhdeFVCG [d_  0+! !! ! EfidfFnmn[mmd _  0+! !4&#"326)AA=A(wwwwVCG xxwd _   0+! !! !#"&54632)AA=A(EfhdeF____VCG [``_d _   0+! !! !!''!)AA=A(EfhdeFUVWUVCG [d _   0+%%%%'7'?RA=Rm%HhdH$mq)(qMfM7p7k>'qq'd _ @ 0+! !-7%5 ')AA=A(b ccyVCG 4KEKd_ 0+! '!!%%!QIT?fPU2]G|LJyGn_/3*4.96d_0+% %!'-7!{}}| Idj` @ 0+3'!%7#`=>``>=`W d_ 0+''%5!73!!C`kD;lC`Dl;C==iE_Cj=Dk_lDd_0+% % -zIfgHggfI~fg|d_1AA90+'&'#'"76?37'3/75'"#76757'% % -3-xg[Yx!-33.yxć.3eIfgHg߳z)*/2-C6n߳xƄ-2/*y~gfI~fg|d _ 0+%%#55&5I0/Iс_3t v6vJ 6td_0+ % %  RsPOuP!POvOLd_0+ !  % !lmFkpd_ 0+ -% %mLWBGXLmDAKXKnHAnKXd_H0+4;263632%632!2#!#'%#"'"'+"5#'&57#"/&547"/47%!"=43!%&5763&54?632&54?2   v -  v   x  - x(-  v    y  - x  !v d4_ 1Iay@|sb[JI61 0+4&54632#"&5465>7632#"'&#"#"'&'&54767632327'&#"#"'&'&54767632327632#"'./#"&54632]>BX}}XB>]lI6&(=!7%: RVlI7$&?8&9 RVXQ!9&7!='&7HmFVR:%7>Il#C//CC//Ck}@?[[?@}~@?[[?@~2? 7$'>!1?5&'= 11!>'$7 ?1 ='&5?v/CC/0CCd4_@0+6767632+";2#"'&'&'#"&54767'&'#"'&'&547676;27&54?&+"'&'&54767676326767&'&54767632&'&#"32767654-m096&(=!72j`rnc v67#(&7>1f 3>,"*AY>3 .e3<8&'=!86w bn q`k28"'&79.n 3?-#*BX>3 $   E #IWi 7&'=!8 5 ='%& lXF |VkA?. [?AkV| #FXl8%'= 5 8!='&$  iWI Tg@?. [?@gTq     d4_}v70+7>7632+";2#"'./#"&546=#"'&'&547676;2?'&+"'&'&547676763254&54767632%s6&(=!72iv$${ v67#(&7{%},"*AY~%z8&'=!86w z%%tj28"'&7r%~-#*BX}V 7&'=!SP ='%& Q*A?. [?A֣*Q8%'= PS!='&$  V*@?. [?@ͭdL_ -@ W/% 0+67&'32&'3276=4632&547654#"432327632#"'&#+"5474#"#"'54%654'4%&=4?2365654'&4&#"326)" k)Q2i l SDy*~. oV$Z;e4o"U'f.D X#\=e4vNߢn+_.%1 >,,>>,,>f"$Fu?*PC> A9 Ei-nnUzT>;#O6%:8Q NS+Q;4 Vz>-;7R aQ+ )h+-==-,==d^GSMHA#0+%#"'&'&=6767'&'&54767632&546327632#"'&'&"32654&St0)MTI5v58EJcbKE85u 4KTN)0tUccb)&t( 8vzr# ,bEC^% Ɏ %^CEb, $r{v; )s'dbbdd e1^fp ,6FWgwK PXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGK PXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGK$PXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/ 1.  1 J4IGK'PXA.)($+)oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4$c$}Q zK/ 1.  1 J4$IGK)PXA.)($+),,+oi0& ,m< *X3 5ht%vjP%6%U6nV. 4x?;e4$c$}Q zK/ 1.  1 J4$IGK1PXA.)($+),,+oi0& ,m< *X3 5ht%vjP%6%U6nV. 4x?;e4#c#}Q zK/ 1.  1 J4IGA.)($+),,+oi0& , m< *X3 5ht%vjP%6%U6nV. 4x?;e4#c#}Q zK/ 1.  1 J4IGYYYYYYYYYYYK PX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_^K&_'VLK PX@0~5%5%~%65%6|2/./2.~*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_SK_^K&_'VLK PX@0~5%5%~%65%6|2/./2.~*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  gc_SK_^K&_'VLKPX@0~5%5%~%65%6|(g*)(-,+(+g g5W3755g64 64g 8   hg"!$#g / h2/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_SK_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|(g*)(-,+(+g g5W3755g64 64g 8   hg"!$#g / h2/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  gc_^K&_'VLK$PX@0~5%5%~%65%6|2/./2.~1. .1 ~(g*)(-,+(+g g'&g7U5g3535g64 64g 8   hg"!$#g / h/.1/.h  gc_^LK'PX@0~5%5%~%65%6|$$~2/./2.~1. .1 ~(g()+(W*)-,+)+g g'&g7U5g3535g64 64g 8   hWg"!#g / h/.1/.h  gc_^LK)PX@0~5%5%~%65%6|$$~2/./2.~1. .1 ~(g*(+,(+g)-,),g g'&g7U5g3535g64 64g 8   hWg"!#g / h/.1/.h  gc_^LK-PX@0~~5%5%~%65%6|$##~2/./2.~1. .1 ~(g*(-+,(+g),),g g'&g7U5g3535g64 64g 8   hWg"!g / h/.1/.h  gc_^LK1PX@0~~5%5%~%65%6|$##~2/./2.~1. .1 ~(g*(-+,(+g),),g g'&g7U5g3535g64 64g 8   hgg"!g / h/.1/.h  gc_^L@  ~0~|~5%5%~%65%6|$##~2/./2.~1. .1 ~(g*(-+,(+g),),gg'&g7U5g3535g64 64g 8   hgg"!g / h/.1/.h  gc_^LYYYYYYYYYYYYYYYAp--qq|a_^]OMFBA@>=98-6-630  qq~a`^\XVOM$%,&')9 +#"'&'#"'&547C&5434'>7267654&#"&#"33673>54'&'32654&#"67&674&'#"''65&547&'7327>326736;2#"'6%&+36732654'32654&'654'&#"'67&&'"'&5467&#67&#"'67&7"&5467>32%632654&'.'6326763227#&#""767>54'#"7&'&'ɸ#".'&56&546;232632&#"#"&#"#"'>54%&54>32.547232#"&546#"32654M&*L3k7'4"0!?C *bA9cV:G.6L }<}zN)}QPqS Y*I<J00BB00B"!/0 !1~gc7>6}#AOC> bhbN7'Y AG'BM(U(W5dLLT,zBgfj9N\kZE[ DaRTp** ! : G,*!S$IK@ /,On1?U!4/ @H(ei1 2 (@WD4+MO >44;$C&- Bu@ $H $',*!,  o-!(&),A4,*8!n   y*1[j%T )6'Z25@*/) *&.%h    /     ~ #0( $3 ,J .DFeDc9@T"p\0&;;q:C* Y<]iB00BB00 /!"01!! dd>Vn /Axj[TA 0+2632#"'#"/#"'&547"'&=4?&5476;267&54?2654/"57&'&54?27&'&+"63267654/"2?54/#";27'#&547327&#"%632"';2?4/#";2?#'#"'547'%#"'"'32?4/32?4'"'547<H5>/n'#)182BU?;:T#D /GN$,/k18 9B'Q8@$A5Rw#x o2 DQVw\L!f5]t]@ /#$|Z'u3 _6 0_H?ui7RzU4WR%5Ig%h*S]%W=T"#@ )TKe]:)*k14Nok#R5?'Q5d1/.:=;4>7H7yH -IN$3+#&?BU5E3 F@iI1C @M!=6 \r#ZB7K?+!F"~F#]sQA2,l3.e5~(o0p+c-Q5 WU5T/8AI5Ql2h&Y9.XURxf(*sfF. {+WwWf&w#V4Ii6 d_ #)/5;G@D>7620,+%$  0+"32654&7 632%676 &54%&'&#"77-'! ! [[[cc-66'&bUr-&'cc-66t&'bV-'&nm[ZZ[V-'&dc-66'%bVu.%'cd.66p&'mm d1_ %8K^q|@}{rk_XLK=8*"  0+4&54632#"&54657#"&54632#"'&'&54767>7%>7632!.'&'&54767632#"'.'7654'&'.'327>7'&'&#""32654&5#yW==XyyX==WyT<976M6}7&(<877679>(%8}6L778<(&7}6(/010/; 2"!/24"!/w;4Kr 5Kqp>A?[[?A>>A?[[?A>;TT;A?[[?A>>A?[[?A>3JJ34JJFQ:)):PP:)):Q6eie6d55c d_ &3CGKOS@SQOMJHFDA9,' 0+"#"&546323!2632#"&##"&54654&54632#"'&547632    T?A@[[@A??A@ZZ@A?xW=>WyyW>=WxI***;;+**+;;e6e5d72f5wV=>WxxW>=Vw>A?[[?A>>A?[[?A>[*<;****;<**q6e5ce6d5d4_K0+54'&5463276767632#"'&#"327632#"'&'&/#"&5476=#"'&'&5476763232?'&#"#"'&'&54767632Q-Z@AY,Q96&(=!7$)5(''(5)$7!=(&69Q,YA@Z-Q88&'=!8&'5)'')5'&8!='&88AJ,A?[[?A,JAv!j= 7&'=!vu ='%8>j!v@J-@?[[?@-J@v!j>8%'= uv!='&7 =j! d_ %2?Rex@xl]SJ@;5.("  0+4&54632#"&54657#"&54632"#"&546323!2632#"&#%.'&'&547632#"'&'.'##"'&54767>7>767632Q:))9PP9)):QI44II44I?A@[[@A??A@ZZ@A?,--  4.-_,,.-  5/,_,,_-.4  --,,_,/5  -.,p>A?[[?A>>A?[[?A>3JJ34JJFQ:)):PP:)):Q-_,.5! .--,_,.4! .----. !4.,_,--. !5.,_- d_ &3DUfw@zwkf[NE=4/)"  0+4&54632#"&5465'"#"&546323!2632#"&#%.'&'5476;2+&'.'##"'&=67>7>76;2#"&54632yW>=XyyX=>Wy?A@[[@A??A@ZZ@A?--/+*>?--B,--/*+=@--B.,B--?>*+/--.B--@=+*/-- T;;UU;;Tp>A?[[?A>>A?[[?A>xW=>WxxW>=Wx-B-.?>**..,,B.->=*+.-,,-.+*=>-.B,,..**>?.-B-t;TT;ZC>d  0+!#!3!_CC C_M;d_ 0+3!!%!d_C:_`;d 0+)7!!}%:_C;do!0+2&54$654&'"'6"&54632ōA]OkFTP~D^^DD^^NjoV5?h┣g^AA^^AA^d!7C @ =8*" 0+63747$54$#"4&#"3262&54$654&'"'6"&54632>[MpU+ U>>UU>>UK'XdUe@LbJggJJggt rC;M s;UU;;UUDЏk^x0:^IgGGggGGgd #/ @ ,'  0+"32654&">54&#"&54632.54632aaaam+,ܛmmmm)>=}~aaaaԔ\\ƛpmmmʔʭd[  @  0+ d8786Q8787877:H8d 0+%#"&54632.54632mmmm)>=}~mmmʔʭd_0+#{__dY_0+#Y__dP_0+!P__d"0+!33{O"_1d"0+!##d_{N2d"  0+!33!33{O1{O"_1_1d"  0+!##!##d_{N1_{N2^2d\0+!##d_{N\2d\  0+!##!##d_{N1_{N\2^2dJ_% 0+3"54;533#+"&54632265zooؚ\\[w{~jjz[]]5-d^ 0+%#"&54632&$54632bccbPOccc~~d_  0+%#"&546322&$546326bccb>}PO~11ccc ԕ~~{{d_  0+23246̈zܥMT__xrod_0+4%$5463 327#"!"&d_wd Zˈzܧ/d_5>a [?<8 0+2#"''67&'&#"#"'4632&547632327654&546654&#2632265432#"546"]UYMRq Gm9x5 3HG qi%=l/ bIb,BI D-:/"VigFPB 2|_~n.!.27pIl57.54665"@]`$vKO9A*1ꎿR-Z^ >$0 A3w)&# maGYP[! .l9CC/PYgD<#^aiL!#1)*1W- 11E:66d` 0+%$'&76%s:fd`  0+7$%5dq8z:d_ 0+#K_XWYWd_ 0+#YJ_XWYWd_0+#z_PQd_0+#߿{_PQd9_0+ # 9 !_PQd9_0+ # Y !_PQd_0+!_PQd_0+!O_PQd_0+#'7z_d_0+#7'߿{_d_0+6543!"3!"54dzqzX++Xd_0+#!5257&4#5!2O{}}p{++dr /# 0+! 4$32#"326323254#"'74#"372abTTl,/RN'%MR11g% =#~c%UCm&%&%mES).1 $$ dr 63 0+! 4$32%3276323!2=4#"+"54?654&#"abTT**IT9J$+_2:R ric%U:&vSD5FNk*>,&2 ކwgidr ><0 0+! 4$32%32763232632#"&#"3254&'654&'"abTTT&6V/4OUO#T?\m7N* 0NPpd\c%U#Z)235P-*#%lZvR$!"@~ ApJQZdr I> 0+! 4$32#"326323254#"=4;2=4+"=4#+"547654#"3!2abTTV.1..TC##C-f'  '6c%Um'#$&mL #" 2'.   - dr /. 0+! 4$32;2#"32$54&'&5767%6?4#abTTC_6U̓%%AR4 "c%U0.Ljw(#|5 ,P%dr 3 0+! 4$3232654&#"32632#"&547654abTTQVĿ|p?k%()O:68m$c%UCu\Ѥł|@"!oqmf i "dr '$ 0+! 4$32%63!2;2765&#!"abTTR?! 3c%UB$" M C dr "-8 @ 3.(# 0+! 4$32%32654&'654&#"%2'&546#"&54abTT\OzCSXNgGmaX?AUc%U$;?o{Zp!;bxFWEf#$*X4KL+)n?W_Idr 6 0+! 4$32>7654&#";27654'"#"&54632abTTfQVÿ}DCm>45#(*M:67n$c%ULu\ѣł~KM  opmgi "dr /?O @ G@;3# 0+! 4$32#"326323254#"'74#"37232>54.#"%2#".54>abTTa(+KE#"EK**^  7!q JKMJLKJK!;&%;;%%<c%U]b""#!b J% *+  joojkmmS^]UU]^Sdr & " 0+35733!! 4$32! 4$#"abTTopџҧM)+%d%Up-dr*8 4-&0+!!5>7>54&#"5>32%! 4$32! 4$#"L 8+XH5ziY8,9abTTopџҧvG9O%:H#5!t6_Bd%Up-dr D >! 0+! 4$32! 4$#"#"&'532654&+532654&#"5>32abTTopџҧ? ldz<|RUs?jkc[SQVS0ocX}8`d%Up-ӂwU+IFAH848:~jJidr ) @ % 0+333##5!5%! 4$32! 4$#"+gXabTTopџҧ+ƒid%Up-dr+9 5.' 0+!!7632#"&'532654&#"%! 4$32! 4$#"į;zQVo>`mm`.\TabTTopџҧf,XNPZ"d%Up-dr )7E @ A:3,& 0+"32654&.#"327632#"&54632! 4$32! 4$#"HTTHHTTMY-mu+;Hظ0babTTopџҧZSS[[SSZ| IRd%Up-dr"  0+!#!! 4$32! 4$#"u6VabTTopџҧYEd%Up-dr #/=K@ G@92,&0+"32654&%.54632#"&546732654&#"! 4$32! 4$#"'MWWMNWWb`mlQJGELLEGJTabTTopџҧKCCJKBCKClLk}}kLlyTTy7==7;<@ :3,% 0+35733!"32654&'2#"&546! 4$32! 4$#"nlb<>><:@@:w~~wy}}/abTTopџҧ$~'ovqmd%Up-dr  0+!5##7#! 4$328ɔabTT+),d%Udr*&0+>54&#">32!5!>%! 4$329,8Yiz5HX+8 LnntabTTB_6t!5#H:%O9Fvk*d%Udr(62+0+4&#">32+32#"&'32654&'26! 4$32T8}Xco0SVQS[ckj?sUR|32#"&'32654&#"5!5!! 4$32T\.`mm`>oVQz;ĿqabTT"ZPNX,Hd%Udr )7 3, 0+#"&54632"32654&#"#"547>325.! 4$32THHTTHHTgرH;+um-YMDbfabTTS[[SSZZ褆I Ad%Udr 0+!35!! 4$32ʱPabTT&EUd%Udr #/= @ 92)$0+#"&5463232654&'>54&#"2#"&546! 4$32WNMWWMNW m`blNELLEGJJ abTTBKJCCKKCTylLk}}kLly<;7==7;><:@}yw~~wy}abTT+v'~$ d%Udrc  0+#!5!3rQ=YMIHd^  0+!!!!!!  d?0+!d^ dd  0+!#"&54632#"&54632d^X??XX??XX??XX??X D?XX?>YYZ>YY>?XXdXAf0+!777Avz3m{X~Qdk0+ 555+dXAf0+'''%{Pmz2Q~dZ0+!5!='[Bar{KJd] 0+463!&546323##"&547!"&d@.%@/-@@-/@%=e.@.?D,AAAA,C@d0+!5!5ir{dZ0+!5!5 m VBdZ  @  0+#3)5 5!+3#3CCV2m||``st=dQ @  0+#3!355+3#3#3FFUU^ee#ύ###d(60+!!5 m tåyydw0+7 )d%Nd{0+ !f%iLnd_0+ d8_PdY^ 0+ 5%"'3!mV2jcjct3d  0+!"#67!5 mjcj V2sdR_0+ d)LNPQLd0+!55deeeád 0+ !!53 #5-@p9`S`Q. d 0+ !!53 #5p@p|`S`Q. d 0+ 5!5!7!!?t_ufɾ77td 0+!5!5!!4oU |fF_17>sd 0+%5!'!5 !!~Ek*gdlI 0+ 5!7!5!!.aF,Ii(0dV 0+ 5!'7!7!!'smm6_lx6V:3tPW*d  0+4&'326"&547463"MC\\郞۞I^=xKKx=d  0+!'7!5 !!mms 'll_kr4:(WQdb0+ !676! ! '&/(1\n\/'%p[nm]g d!%)-15@32/.+*'&#" 0+!!&547&547!!3'33'33'33'37337337337kD1hnnh1{J0Q)K/K֖K0Q/Q/K,GTAPRWFE.+d"0+%7&54767&#"&54767.MO4 *z`6:3:{)"ATW$!/ѱ('I.N#,8/GI2&;d-0+!7!5!'!!&547&547~?>a0hooh0*,GTAPRWFE.do"0+'%%&'&547327&'&547OL-3@$"'<6:2`#0 $V S>%3>E3:-&G0='(d$-0+'3'&547&547&#&#"67'&#"%632&N*,  3`l-6JkRa@FVieKIJD _T1-iWNJ857nd0+7"'327&5!!&547!!47- kkXȀ{@Aߒ{Xd[9*&0+7#7#"'%32?&'3273&547&547V@aRkJ6-l`3  ,F*Nn75~7Yg.0U_DKIKeidU! 0+67632!$543232#"#"54% #"'&'d01Zfm"bxM>>MxfZ10Z,+gqpg-+Yd?0+&547""&'473'>33&547ffj-VV-Fjff8C4;..:4Cd Q*0+#"=7654#"#!"543!23254/5432GQ#0O[,Y]QQY,[O0#QG:R /X_EE_W/ S9d]*0+#"=654#"#!"543!23254'5432GQ#0O[,Y]QQY,[O0#QG]  +MӏL+  \d!?!  0+!5!&'67!5!#6%$'335I@#aIIa@Ig|Uk} }kU|g?,Z``Z,.jllj.d = '0+4&'326%4&'326"#"&547463263"#"&547&MC\\JMC\\l郞۞I^^^==xKKKKx==dP @ 0+ ' %!!dJ ~Id& 0+$5&#"'67rTl-8"p&w'P)d&0+$6%&#"d8-lTr)J'w"dX 0+ !!{yN'6d30+7 dB,DU^"j~$d30+' 7D,B$"^d3# | d3# | d+F0+6767&'&'&'&'6767BefuufeBAfeuuefBcۣlcڣ7vefAAffttffABefףplףpldWT 0+3!!+33342 aa+2'$6dWT 0+#'>7!!'>7;#1A4 aa+3I&%6d7_# X# , d[ g 3+dZ_#3+3+dC. 0+&547#";!"&=4&+5326=463K20IC5UU5l>>lmGСBk>DdW0XdtsݓdC." 0+7&54&'>5!2;#"#!532654&+I02Kl>>l5UU5D>kB0GmstݔdXЎWd3" x: /3+d3" [x /3+dd2F  0+73!!%!!dS"dd(b d#] d  @ 0+% 5-Yo|e_y_7yd2 0+%#3 5nnlE2/d2 0+73% do(CpM2`:d0+7 7dacӄhHd0+7 'dac.hHSZd0+7 dead0+  cdcZd0+5  5dde9[dW 0+ ! !!5!hqSQa+dW0+ ! !hadgr)5 0*'! 0+!67632#"'&'!#"&5463232654&#" #"326544WuvyyT3Q3QyyuvSO9:OO9999OO:9ODC4UyyR3BC3QxwS89OO99PP99OO98d 0+!#654'3!54'3#65%!5!8$$$$8$$$$8"bhXXjejXXha_jXXhhXXjڲd~a0+!!#6=!'7!5!'7!54'3!!-5"$$$-$-$$5"^hXXj\^jXXh^d_0+ PQ=__Med_0+ QPs=__Med"0+ `d? "FAV~3+3+df 0+3!3!!#!#!5L3ͨ--Ӫ--df0+333333#######53Ϩ---Ӫ---dO0+7'7%%'mH QHHQ HOtNMu''MN'dHP6#NTNd0+% %9?>;;<<d0+ 9>>v<;d0+ ! ??6B43d0+! s=<<::z,"/" 3+3+3+QA"Od 3+3+3+c"/Yaz3+d"3*/ 3+a,K@H! 'Jp~|^SK\K_XL"%%"q +432633"!'>5!"327#"=ik4J&#ip4ddɶ+G$xBOs~KP Z-ʻ#hf\;"DIP"W 3+Xi.>D@A6"J Q]SK _ TL>=;:98aQ +!4'3&#"526543267"65432767" 3#4&#XfsQ<|d2i{59mk.,vp<(D#C4'fwKvOlPUZ ZթTZZQ&Z ZiXi84M@J, JHQ]VK_ TL43a" +!54'&3&#"5254#56776543267"3#4&#5 :Lo[YqcǐF;Z`*nJv}`Kv:$+T9JOZ ZO2O'c}\P[Z{zsXB4@1JG]SK]TL  +% 7.!#'67!"'67!27& Z\+f/Jf#\5f)BhQ  \;D T9`PN>@; JHG]VK]TL  +!'67#"'673!27 7.#`vv$?|[ET( ]{hU"@t .Rb Z$ CT V+C 4~= #@#JK PX@*p_SK`\K_\L@+~_SK`\K_\LY@"  $ +$7.#"3#"7632733253!"'i|o_}\~o+:}Xy,7peҷ$]ҶTT|}?<=@"8 JHKPX@']SKTK]TK _XL@*~]SK]TK _XLY@;9'G2A + #&'3&#"52674327 5327"#"&5473254Pi::6qS+fG J8i~e@O@e@jJp_dd^tEENgCZ ZMSN9Z #lH;R Z;Qe'JNY 9@ $" 3+K  I 3+!LmK PX@HF ;:%#  JIKPX@HF ;:%#  JKPX@HF ;:%#  JIKPX@HF ;:%#  J@HF ;:%#  JIYYYYK PX@2  p  p] SK ] SKTLK PX@.  p  p]SK _ SKTLKPX@-  ~ ] SK ] SKTLKPX@3  p  ~] SK ] SKTLKPX@-  ~ ] SK ] SKTLKPX@3  p  ~] SK ] SKTLK)PX@/  p  ~]SK _ SKTL@.  p  ~]SK _ S LYYYYYYY@KIEC@>8760/+*)  +"654#4&#4&.#536767&'.#532763227"632"'65&#"-2+*AbBp3Io#32/ W=9B%JCU+%-]HzZiH{vi|.&Rv<M#,D0#(1Z  Z$4#e秡eZ Z$\$f7,KPX@ )" J H@  )" JYKPX@"_VK _VKTLK"PX@_VK _VKTLK1PX@ _VK _V L@  g _V LYYY@,*&"" +# #327"'327"!&#"Lb]!NEEM!!?BBLy[ {(R>NZZ1SNZZ2Vtn h%{K PX@%JKPX@%JKPX@%JKPX@%J@%JYYYYK PX@_^K_VKTLKPX@_^K_VKTLKPX@_^K_VKTLKPX@_^K_VKTLK"PX@_^K_VKTLK/PX@_^K_VL@g_^LYYYYYY@ "! +4'"6654#5327"#&''63?G u\hEjIqÆzPZ^e&$&Yq/ ' =s^;nC%Z[bw .eZk{ ; ʰ3+O:#R 3+L 2 ɰ3+d***L@J*( HKPX@_lL@W_OY@ '&! +.'>#"'&547367654#567W..//l 0D^$")(?2|P*.//.-h-c@P!%B)/:; 2dnbU% JK PX@g|LK PX@gLK PX@g|LKPX@gLKPX@g|LKPX@gLKPX@g|L@gLYYYYYYY@ A@ +327">54&'5327"#4&.#d3WI0],&c+ 6w#%&-TA1BB2M&j `"F:'0B@? $# J~c_[K_\L'&'*" +3272"'4654'732654$4$32'"!"7oPx@&h$P#d!~P'U$ $ {bҾMoSɲX~ _@ JKPX@]SK_TK_XL@c]SK_TLY@ !$!E$ +'67!"'67!27 327! #"/S]#\5f)Bh%M蒌o \HzD T9$X P 0+'674$4! 7$%F CawYPKj1Z8%y&w|aQ=V  V+ 0+%5#"&54#5%3274#5%! 673 54'&q=xvNDC\LB%dtm_N%CDc3RGSZ ZS;SZ ZST(i@H(o0+$!'63&'&'7!27";M]pӽe%8F1jPYp d{{\ Ý V=QU! 1)0+4&#"326676323&#"527&#"#"5432&R[Pit%lҳTh,t_^wJ c*K@Nu;SZ ZSC׽?<0+%3&#"525&'7!2%"$Hۊ\k%BP1jeAPYXZ ZX ͝ V=QV {%# 0+6323&#"527#"&54#5%&#"32Ƚrvt_^wëvNDpaJWNSZ ZSđW3<t/A_0 2/"0+4&#"326%5#"3&#"527ȷ632632#"R[Pit/9Ju_^vhҗܩ|>w99SZ ZST(iJZZZNo#  0+!$%3&'7! 7"2&#!# 32R# $%LZ1jPYoooP W Ý V=QD hf1ךQ&V A5 0+%4#5673&#"525#"'&'#"&54#5%327&54#5%32 fΔr]\tq=x; xxvNDC\NDCR(f_WRZ ZRCDQ$c3R;SZ ZS;SZ ZST(i@HK%$0+$%&!"67 !$'47236!"'4"%8Z1Wpj   _YP ͝U :7?Q=V V%!0+4#5%3254#5%#"'3274'63!.ND\CLBvxak +8wj3UXo@b`#L;WIDL G^W W 0=W (t/%Z)1+0+&#"3&#"527ȷ6323274#5%5#"&5@\nu_^vhҗhC\L8jyxs;SZ ZST(i@?30+&#275#"54325632&#"6323&#"527&#"HLIasN*^xQKzl ht_^w\]1lRe9FQ=$.{SP_F;SZ ZSFp\] dX@]SL +!!#dVRed)  3+d&)  3+ d!%)-159EQbs/@JVUHgfGK PX@Y e  eee g  e  ee_VLKPX@[  eee g  e  ee]UK_VLKPX@Y e  eee g  e  ee_VLK-PX@^ e  eeUe g  e  ee_VL@_ e  eege g  e  ee_VLYYYY@*qo`^PNJHDB><9876543210/.-,+*)(&%$ +4>32!!#".547!5!&!!!5!!!!5!!!!5!32654&#"532654&#"467.'654&'>7#00#=#00#<<ww`HH888 *TLVA-6TLVA-6M0##0 g0##0g mm9ll,mm(w<&9>7,,(w;&8?7,,d"! #x# 3+а3+3+/3+dz=# R R3+3+d ^,D@A+*(&#'%$"!  J,)HGt +77%%%%%'7777777'@+ 8(:|Aco*d^s.2Iu,Y,&c0\% K':pqG t6z@'6%!%2QDA?T<E; Td)a@Jt +7#7s,(.a_q`d)a@Jt +%#'-(,sa`_rdjo"ax`3+3+/3+dOj"a(wP(3+P3+d.JK/PX@eUL@U]MY@  +!#3.춶|^^d.JK/PX@eUL@U]MY@  +3#!5x|dfXJ*@'JU]M +!!d-#f"ndiZJ*@'JU]M +!'7!/#iQ"ndZ*@'JU^N +!!" .%/'idW*@'JU^N +!'7!W8+ %kTd[>KPX@a]VL@eU]MY%!%  +!"3!!"'&5463!?,,X?j{VU|k,->?XVT}{d[>KPX@a]VL@eU]MY%!%  +!2#!5!2654'&#!dk|UV{j?X,,?{}TVX?>-,d,@# D d,@#  4dt Ű3+Ű3+d 3+d#J~3+3+dg#x#x]T#x]#x]x-/3+/3+/3+/3+/3+dD2Z@J2,& GKPX@~_[L@~W_OY%#  +%"'654'"#"'65&'&'&'&'676767q/Q*@ N ( 8877lk0&Щz6DQ7887|!gd 2 d\ 7MM@JC#!,+)(%  0J H321Gc_SL74"! +3&#'$%5767357&'67'#&'5&'.5467675R7?+&v )YaX5;YX_(97oD5/!\\Y1YooY20nkkn0R @Q70VYYX^3`A3b ab j*(%yLX 7K 3qq4 4qq3dT 3+3+d_Z  0+%1..3PPZ{[*X|)N+daZ  0+'7'77'a1..NNj`|X[{)*d Z-2@/-#" J_$K_%L$$4"$4$ +$24$#"'6763 ! ' !2&#"36d9ffR C.~\Vh-CRhYô&څ$3—[ 3I@X0yXGB0H@E+ JH_^K_TK_XL&(("! +&#"3&#"527ȷ>32#"'&5473>5P 18Lla 91RZ ZR.R(f_FYűxZ|0&8?!~}5*;"7v> >3+P+,.b@_ -,JH~|~d ]VK_\L..$!$##" +327# #56!632#"&546732654&#"'9S=z_e`Ym65W|O}%n4AeR" +z^O^텔-L4Q/F@CJpge^CK ] E L/+$"%A +7265432%.#"3276754'&+&'"Qz/:b1 6M)YO73[-3MM1-W52~B)VkuXHV h'\DMQYRV  FP/@, J_IK_KL%'%$ +&#"'654'73674$5%27u> g4nhbSKNAY 3"eH>d ?8@5> H e ] TL987321-,AA +!!773&#"52654/!3&#"52654/!3&#"526767;u6'~PQ\;Q E4'~PQ\;Q f;TJAGTp):!$bZ Z!0:}bZ Z!0:;5-Z Z1;$Gf@JP@M:6A) #J~ _ VK_\LIG><"'$"#$%'% +32732767672327#"'#"'&'#"&54$54&#"#"'467267$54&#"\N/b\N/b cB(F&h pjJyj$J"He_[K]TK_\L$*A"$# +!%#"32$#!3&#"526767676! ! '&uAkf;TJAGTpC<0E&DVH,M(L;5-Z Z1;$JAYYDfY 4Q@N0, J~_^K_^K_\K_\L#"'"$#'$" +4&#"326%327632#"'#"&54$54&#"#"'4672?R[Pit_\N/bxj@;He]SK]TK _ \ L1/A*A! +!#!3&#"5267673264327"! '&Baf;TJAGTp(p1~SLz-?׍;5-Z Z1;$1B%j-XZ ZvRَ7fv,5SK PX@  5-)'J!H(GK PX@  5-)'J!H(GKPX@  5-)'J!H(G@  5-)'J!H(GYYYK PX@!~_VK_\LK PX@(~~_VK_\LKPX@!~_VK_\L@(~~_VK_\LYYY@ &$$#"'! +%#"&54$54&#"#"'46723274#5%5#"327τjQYLIJ/l׍;5-Z Z1;$r81$Z Z5i=6f1@-)# JK/PX@-~_VK_VK_ \LK1PX@'~W_VK_ \L@+~ W_VK_\LYY@ 1 1"#"'%% +327&'#"&54$54&#"#"'4672654#5327"\N/bvh pjQYLIJ/l>3& +%׍ -l$e;5-Z Z1;$!x81$Z Z5i{p\m_f7:K1PX@%!90 J@%!90 JYK/PX@:~  e_VK_VK _  \ LK1PX@4~W  e_VK _  \ L@8~ W  e_VK _ \ LYY@ 88 8:8: 7 631.-,+*)"#"%#  +#"32754&#"#"'46723654#5327"3!#&'#"&5!7N/bRb%\ ǣvthEjIj%yh pjBD=Q3@f V[ eE׍;5-Z Z1;$lK@YW  WerrKO;%OK2f@K PX@(# @: JKPX@(# @: JKPX@(# @: JKPX@(# @: J@(# @: JYYYYK PX@5~_VK]VK_\K _XLKPX@*~_VK_\K _XLKPX@5~_VK]VK_\K _XLKPX@*~_VK_\K _XL@5~_VK]VK_\K _XLYYYY@=;&2#"'%% +327&'#"&54$54&#"#"'467254#5327"#.'67326?\N/bbVpj."Y>!|:exuh?k Z144wnZ Zpr4+*A .@+ JH G_TL" +4#5673&#"5257fΔ'r]\tوR(f_?RZ ZR1?z."/$3 33+)A"O&z z3+G"2^&Q3+>'2@/ e_^K _\L%#### +!&'&#"#73676323##"'&%!3276 4ER[A0خ'hd)u͔K=EPi:15QivX{}v{Savc= &+@(!J_[K_\L"$%'$" +#"32$7&'"! ! 63 o#3 Vi&$PM(eY0;O %9@6 J_^K_^K_\L"$$'$" +4&#"32665&'"#"543263 R[Pitkpf y { !Sz׽?mv= #22O#RRX"3#g g3+Dn"S 3+ D@    +/9 JKPX@7 p  g g]SK _ TK]TL@5 p  g g  g]SK]TLY@DB;:64$A$a$! +32654&#".#532632"'3&#"5265&'"'473654&5>39Rͩ@[B\a[xY2y_1|] ;\Qi32#"'3&#"527&#"'473654&5>32HTEeQorR\oh] 'RQi#P@0-::>DXZ ZC97jYN`VJd >aHw+z ?G@64  JK PX@1 p   g]SK _ SK]TLKPX@3 p   g_ SK_ SK]TLKPX@1 p   g]SK _ SK]TLKPX@3 p   g_ SK_ SK]TL@1 p   g]SK _ SK]TLYYYY@ ? ?97#Aa% +>54&#"6.#532632!3&#"526=#"&5465&'&5672uq@[lB\a[V2y_132#"'3&#"527&'&5465&'&567232654&#VeQo~R\o_k\w7 v'SFz\@E0>#P@0-::fXZ ZCGR\uNd !;Z[VPCnϵ =F ;@+*13-:9JK PX@1~n|c_[K_\L@2~||c_[K_\LY@ $%(%#$" +#"32&#"&'6767$'&! 632%327"'&'7OQKkF0%:ɶR=C%&Ϊ^N*U(S3X_/FL85iCR*(w4 NO"T 3+="4 < 3+O"T S 3+5K3@0 J~|_SK\L""# +65#"!3"!'ƶW #ip4dd՛%Z-A8@5 J~|_^K\L""# +65&#"33"!'0ӊ}^gמ8a-=aM^ EN'd *~@ %JK PX@+p|o_SK^TL@+~|_SK^TLY@ %"&& +%3>7#!#7!'67&'"'%!654'47MZGAd?&w  tܖ/BHrT k] koe ,@ 'JK PX@%~o_^K^TLKPX@$~_^K^TL@"~g^TLYY@ %%%&  +%3>7#!#6?!'67&'"'6%!654'47IGAd?ˊ{G+%v  Y>ܖ/BHr~l:*Sh}] vko!h"9 3+:1"Y< 3+!FHx@H:($ J40HK)PX@" ]SK  ] TKTL@" ]SK  ] T LY@EDC?>=65"AA +#4&.#532%"7'.#5327">54#5327"3&#"5267FLUN%:W7654&/3&#"52765#53&'327"3 q9}^$^v_oyjMܙ_+[ U[.+Z Z+6Y9iKZ ZK (iN " 3+z4Q@NH~g  e]SK  ] T L4432/.-)'$#2 +4'327"3 >7654&/3#3&#"52767#5yjq9}^$^ v_o Fg,KZ ZKҏ_!e s0+Z Z+!-s8 " 5 53+Sp'!qK)PX@JH@JHYK)PX@a_SL@~a_SLY@ #A +3&#"5265ȷ$!&563 *~-eę 7=i!iWZZ_g7R&MyAy? d!X@JHK+PX@a_^L@gW]MY@ #A +3&#"5265ȷ4#&5632*Y}~pX-eęT |77QCPPIP[wD;]3/> S{"%@"J G_[L"  +5$4&'5654&#'654'632s[O WTl Pɥث1X:X'͇y+)MP@ G_^L +5$4&'5$4'&54!uXdBD2Cc^wSq? j"?eHBF'#-@@=) Jg_[K_\L%$$-%-)($ +$54$32!"'4654'732654%56"654&껮&h$~`dtcI $ {b`E3oSY_^ &A@>  J~c_[L%#  +2#"'67265'636754654#"<T7;(k4,.T?)AIɆyRH$y6{`v@'@$JGc_SL$! +'67#$63'$ L _W(# @q7 wdTU%@"JG_VL$! +'67#$63'$֯ I '$}# ;g\ Gm^LdF@ JGKPX@_{L@W_OY$ +&'27#&'>3'6aOU F R rs1 \v1/"O7 ?d@a;:0 J%#H G~_VK` TK`\L ? >#&$$(#! +&#27'7#"5#"54324#567;54'6323267&#=LIasg)hN+p*^xf* C8qlJ(' S)]1,))$.;R[m_eduL W7C,|OXA/@JH,&% GK PX@`TLK PX@p`TLKPX@`TL@p`TLYYY@ 63%H +4#567;2754'63227>7&''7&#"525fΔ3'DC8qlX0,"Qd)fe^vوR(f_L$owL W/58Z ,) ZSP L^K PX@>84 [ZO%J6 H]-) GK PX@>84 [ZO% J6 H]-) GKPX@>84 [ZO%J6 H]-) G@>84 [ZO% J6 H]-) GYYYK PX@7~  _  ^K`TK _TLK PX@7  ~  _  ^K `TK _TLKPX@7~  _  ^K`TK _TL@7  ~  _  ^K `TK _TLYYY@ ^^XURPKGB@<:32/."#"#6 +%'7&#"525#"3&#"527#"3&#"527ȷ>32>32;2754'63227>7&d)fe^v>Q t_^w9Ju_^vhҗ;Fj@zo1'DC8qlX0,"Q,) ZSn(?@;SZ ZSl%SZ ZST(i@HFPDIK;$owL W/58Z PEK PX@%!A@5 J#HC GK PX@%!A@5 J#HC GKPX@%!A@5 J#HC G@%!A@5 J#HC GYYYK PX@1   ~_^K ` TK_ TLK PX@1  ~_^K ` TK_ TLKPX@1   ~_^K ` TK_ TL@1  ~_^K ` TK_ TLYYY@ED>;86&'"#6 +%'7&#"525#"3&#"527ȷ>32;54'63227>7&'Ge)fY^v9Ju_^vhҗ;Th,1'DC8qlX0,"V,)" ZSl/SZ ZST(i@HFNu;$kvL W458ZPH.E@B%#-,)'J G~^K_TL&" +3&#"5254#567;654'632&''6qglXWnač6,%JHYW<&YB\[\5NZZN N&az[A95X;P"b*cQZEKPX@ 1+)7-<JDCG@ 1+)7-<JDC GYKPX@9p~~^VK_ TK_ TL@7p~~^VK]TK _ \ LY@?=*qa% +%&'&!'>5&#"3.#"526543263654'6323"''0$^&=4dGKEi75[\`-@!יI[C8ql:-QWb)?4V^ąDNNY|mAE EXL W: '',)FP z*y@)('JK$PX@%~SK]VK_\L@"]VK_\LY@ #%#" +#327# #563&'&#"676323#'F9S=z_e! I"#Y<M&n4AeR" :'b $RtC!hO*5=bK PX@=42$JK PX@=42$JKPX@=42$J@=42$JYYYK PX@(~_^K_\K_XLK PX@,~VK_^K_\K_XLKPX@(~_^K_\K_XL@,~VK_^K_\K_XLYYY@ )%"$(!) +7&'4'7&'&5463227#"'367"&54&#"65432654'8, W!J)5ܬ@XDA$*2-P?3% dZ<EtrZi#LT QZ  bf7:c.  0M /W 3+qKH O 3+Sk4@1 J Hg_[L'! +#"#ȷ>323 '+9Jhҗ;Th,{/T(i@HFNu!W>hk 6@3 J H_VK_TL'! +#"#ȷ>323 '@9Jhҗ;Th,{/l/T(i@HFNu+W>Sn3@0 JH~_[L$' +#4#567632&#ač<-s0>N&az[6ݕ*uDn 3@0 JH~_^L$' +#4#567632&#ač<-snFN&az[6ݕ*u9E8@5JH_[K_SK_\L##"!! +%6722%! 7$b3 q B / !V zf{8@5JH_^K_VK_\L##"!! +%63227+27$gZ)憶鼝 )/=UL#d0 3+d~3+3+dT 3+3+oi .JKPX@ [L@ tY$! +#&'632i&,HJUV4#8@fFw 5JKPX@ _[L@W_OY$! +#&'632A&,HKVV4#: 9J5 *9@6H  e ]SK]TL*)&%A2@ +327"!4327"3&#"5265!4*?k.&iv*g13c ld-^2oZo~ZZ}:hZ Zhs/QA#O    3+d.ux /3+Xn{78@5J Q]SK]TL32AAA +3&#"5267654327&'.#5327"3#%&' :`F9[? ?yB=R  <`DSN91rKY9N.$Z Z&&`]MZ LhS.,Z Z$#0tqg>kPi"Q _"&;3+"F3 ְ3+O"F\\3+XB"K113+5rB`@];JH~  e ]SK ] TL><8610/+*)&%"!  BA +327"!4327"3&#"5265!3&#"52654&#"#&'463*?k.&iv*g13c ld-\.cj!m22oEh{Zo~ZZ}:hZ ZhjZ ZrƐsL$RidW (r@(' JK"PX@%~g_SK`XL@"~gd_SLY@ $%$"%! +&#"367 672!267#"37[? wp IB=9SpCW#{`b8,mmD$UMp"/f  x  3+5':@7#"J H G]SK]TL&6!&6  +%3267&) &'7;#"'67) 7.+yMPZE= P`=}yMPZEB&= P`=}<;=v:d<;=v:: .h 3+ 7 3+h9y@5& JH0 GK$PX@ ~  aSL@%  W ] MY@9821/,1"! +327"54#5327" 3&#"5654'3&#"5267 .#8-vmcXQMM^01KBarz:%IDHW]?U;ZE`;(C;``@gVUM?` `95p R) ` `Wj\ts`Sp% ;L@I! # Jpg a]SK]TL87AYa3#$0 +3267.#"3265!"432632!"'&#3&#"5276#BzyBUzHP>0heY/鳸'miٔjg |v_X M//ZZ024p+"JKPX@+~na_[K`\LK'PX@)~nha_[L@*~|ha_[LYY@ (#A$ +$2654&#'$7&'"3&'525!2"'47WQv HQrqQptiQcpi; RZZRV4^= _Op{d|K)PX@Ue]MK-PX@ee]M@!Uee]MYY@34 +654'33!2653#4'&)"d Z&;{^ZZ02+.|zT<2miَdy|UAEn@k@J5 H G    g ee_|LBBBEBEDCAA?>;:96430/,+*&%$21 +3&#"526=!3&#"5265#'73&'327"!&'327"3!!5"66_55`59@$5 :{9 <7Z;|7 ?#>^E,BB,QP-BA1M%R BB#BBRAAdp|2<@9/.*)%J_~K_K_L##"&#(&# +4'&#"3276?65.##"'&54763263227#"&#) ($.?-(79??wlJR@MzqDFu0J?2Thpf;*65#"'654'7;&#"'6732%"3+F4e03QQ50iS£+Q9 @f=1 ZVP^UQH`)mZL\{pd )9@6 Jp|]SK]TLAd" +&#"&54$32327"3&#"5267E[@qu]Yx[a\B1_yՈ2P+$$ ½ W;Q}lZ Z\d;D@A;"! JG~]SK ] TL8432AA3 +&#"5265.#5327"6734&'5327"3&#"4O@e~i8J Gf+Sq6:c:iPaS@nFX@e@Yl# Z9NSMZ ZCgNEEtG2Z Z=>eQ;Z R;HdpFK"PX@a]UL@gW]MY@ A@ +327"3&#"52764'&#p|zT<2miَ Z&;^ZZ02B+.d =X'JK)PX@] SK]TL@a] SLY@:9AA +65354&'5327"#4'&#4'& &#"52>53V&#T“>QYLIJ/l# `#“>QYLIJ/ls#(`#l;[81$Z Z5i=l?=lEr81$Z Z5ij=l3*p7U@R7) J3/#HG~c _ VKTL5420.-""" +%3&#"5254/3&#"527 327"7654#5327"FWaWY!44?W[XWm;8:JNABec$NAtrOO>غ`Z Z 1?Z ZKNNZZ )x0&ZZIda)9@6'J_^K]TL#! )( + &'7;54$323267&+5654&#"#_??%X4]v7Y&>?aQ龍ZbnF FnϦ~̐d  0+&'7>7y#'' 8 y#. Cd( 0+'67>L('=-,(dv0+''73v=AςB|{Adv0+#'77A=A{|Bd#0+"&#'672367hn:n-A+FW}=m*2<MO MTd$ 0+&'767&'76;Ip CRsLa#3Mg ]& je%pdg 0+'672'672hF5hGBG)_Q9!l "\r dd 0+&'6767[S.EG/˶rrd 0+67&'&d]\1MC+$trd?  0+32#"&546#"32654LLkiNLi$$13""4?[BAZZAB*,-d8A0+#"5>74##&'67239s?1 63 .D -*C $Gdl+/$ 0+&'&'&'67676%&'&'&'67676 '' (( '' ((+W )5^">5'.#5327"#"&5432#"32$'&! 2!$7! !&'47>76Ug*Rm 1E8:g&b{{%:ɶ,Udc_Me_6F9[%+P[}bJ+PP<0ѐ!WPN*D/FL8-HHdMb4< !&W (Q%#"&54#5%3274#5%#"32$'&! 2!$7! !&'47>76 2q=xvNDC\LBmj%:ɶ,Udc_Me_6F9[%+sCDc354&#"T0do r83-%9S=z_vPq^_C@.\HJT`@Mt4AeReKW}a`DZ8 4R@O'!JI~gc_CK_ KL 4 4.$!$$# +54#326367"##&'676767&'&54!  A'"Nئ]n5a230XwR?ғf&>*Cq)32/(zv=A@>9) JH _CK ^ EL=<6540A"0 +327"7654#5327"3&#"5654/3&#"5267.#&c\I$%ITJEA@mx(*?7R_g1pOK=9=IN5ܲ2L: L&s?2n,&L L*82)LL%"Iok/LL9EK?W%-<@9~ g]CK]EL-,#$AA +3&#"5276=4'327"3 >54'2c_َrpT<rڲE1do6M^ZZ02+.Z Z&  +yj  #.7@2/%$ 0+5!&/67!!&'67326;2#"&#"#"'&'7!R2oM N;%%"` r{jfCjo<4B}\tb %GS:IGR>FJJQ>FIxBBǚ::?>:2dI 0+25&'43$5672d<[ ]74'&+3267$!"526767&'3&#"726765.'5HfĖ@T?F>T5Fp_PR81Ujѩ6Z>!fk||F  TJAee2J;I]PU&r7!1S A7umOÞ Z!0?; Z Z1;ZU!&73&#"52654'&'#3&#"5>731?xoLqCC}NEnF_m7< a!',bb(4m/ bb<FK%67'&'#3&#"5>7327.#"32674&+3267$#"52763' 'lcBoTHE!;\w #?$f3aT}`< >k'b.q3C:mrs)=)` 0m  bbA x;+Ju[c' Ab E33773&#"52654'&%#3&#"52654'&%#3&#"526767ذTذTt6'~PQ\;`E4'~PQ\;`f;TJAGTpP{P"$bZ Z!0?}bZ Z!0?;5-Z Z1;$G L43%#"32&'#3&#"526767676! ! '&ذTnf;TJAGTpC<0E&DV7P~M(o;5-Z Z1;$JAYY9 63&%#3&#"5267673264327"! '&ذT_`f;TJAGTp(p1~SLz-?P;5-Z Z1;$1B%j-XZ ZvRَ723'&%#3&#"52676754&'5327"#4'&ذTfcf;TJAGTp “>QYLIJ/l# P;5-Z Z1;$r81$Z Z5i=l$:83%#3&#"526767654'5367#"&'67267ذVxPf;TJAGTpDroooXsHNeXv)>eE:;5-Z Z1;$lK@YW  WerrKO;%OK2d% MB!0+3&#"327 '&7676!&#"!2#!327 '&'&57676'I$&ڟsr&$$I̸J+I#&E;f#+2"#$IUyR+-o Ks?S`V358bV&Sxd*  0+$67'6]+vt(Hwk]wmdz)\ @ A.$ 0+"&'467'67654&654&#"&'>32632#"&'4672#332654'#"'\5Y<2:~Q$76Z|%Eb.3$/ |un3ssXDDPP<WLt-0= _F9L{lX>3Y~<*[j®p(l~vgBq]A:R$TS 95d+7 4.("0+74&#"32632#"&54632 #"&54632#"&54632dZEPy ,EL7@Y/-"+.!)-"+.!)8^O. C08IXEwԆkJ$.2!#.1$.2!#.1P <JMLKB0+!3&#"726767327"!4327"3&#"526=!#"53265!> T^Aee2J *'G|>j7&iv*g13c ld-\ՑOBo^=; Z Z1;_IZ ZgT~ZZ}:hZ Zh#7de@60+#"'67) 7.+!4327"3&#"5265!#"532654yMPZEB&= P`=}&iv*g13c ld-ՑOBo<;=v:7~ZZ}:hZ Zh#Wd UI=0+3&#"5>5#&'3&#"52674327 52767633"!'>5!"XFn@SPi::6qS+fG J8i~e@OE6D#ip4ddɶ+G$Pe>=Z Z2GtEENgCZ ZMSN9Z #lH;R Z-dU*$0+! 4$32&'&#"327$#"&54>32j^\eWLN>~ѐfVQOf$V\7_tV*Eu^RUHbZd# L =# " M=# =3+=3+3+ 3+d# M ># " L># (>3+3+>3+3+ 3+d2 7t?0+2#"'!"!5 5!3!5!!5!"'&#!+"'&54763232763!>O@E23o.ZCT=/)QX=Y[|a2@BQ lGNYf UtP8"L;#p[ԌŒ op2_6MzOQ\  PdE4>d R , 0+%3265!"53267.#"754'3#6=&'&'#6=5267454'3676zHP>#BzyBUP$$y~鳸$$<5$$8~)0hoQ$$>F|wjg jXXhY^MtrhXXjhXXjZv_XjXXhT?54$32&#7'3&#"5265!3&#"52657354$32&#`~ vz.*h\Lm+*h\Lm+@d`~ vzȘTFf4 jRZ ZVd6jRZ ZVd6fTFf4 T:2!3&#"52657354$32&#!673&'5254g{*h\Lm+@dj~ vΔrquptJjRZ ZVd6TFf4 P_gRZZRT<A.#"7'3&#"52657354$32673&#"525.*h\Lm+@d̏>r]\td jRZ ZVd,')[_KRZ ZRTPP3&#"5265!3&#"52657354$32&#!54$32&#!673&'5254#*h\Lm+*h\Lm+@d`~ vz"t~ vΔrquptfJjRZ ZVd6jRZ ZVd6fTFf4 TFf4 P_gRZZRT\UL!3&#"52657354$32&#!54$32673&#"525! 7'3&#"5265*h\Lm+@d`~ vz"֙>r]\t.*h\Lm+JjRZ ZVd6fTFf4 ')[_7RZ ZR jRZ ZVdT.4#"&#"5265#5656$32!#327# #56*h\Lr&dd9S=z_вjGZ ZVV6f|xt4AeR"{ Bm@j9 12J~ _[K_^K _^K_ \K_ \L?=8753"%'!'$ +&#"#"'4'732654$54632&54632!#327# #5654&#"%JFKIJJG@'/-)C9B#> KIJJGYKPX@5p ~_UK _VK _ \LK1PX@6~ ~_UK _VK _ \L@<~ ~  |_UK _VK _ \LYY@TSOMHGA@=;"+"$% +5#"&54#5%327#"'47463"'65&#$73274#5%5#"&54#mjq=xvNDC\o Fb~bh@#+]EC\LBmjq=xvmPe9FQUCDc3<:96410"$#$%  +#"5#"&54#5%327! >32&#"525#"3&#"527큂mjq=xvNDC\xw~9vrt_]u<76$$#$%! +4#"5#"&54#5%327! >323274#5%5#"&=#"3&#"527큂mjq=xvNDC\xw~9v^C\LBmjq=x8 9$ 9D99F89G89H89R89T89V89X9 9 9 9 9 9 9 99989898989 9 9 999898989898998939H89`89b89g99i9o989 9 9 9 9998989 9 999 9 98989 989898989 98989 989 8989898989899989L9L9 89.9389489589689798999<79G9I9J9K9L9U(9XJ9Y89^89a89b89c899989899 999#89%89'89)89/89y8999999 999 9 9 9 9 9 9 9 9 9 9 989898989999999999999999 9=999E9 99 89 89 89 9  9 99  9 99  9 99  9 99  9 99  9 99 /89 189 4+9 59 989 ;89 S89 v89 ~C9 89 9 8:$ :D9:F8:G8:H8:R8:T8:V8:X: : : : : : : :9:8:8:8:8: : : :9:8:8:8:8:8::8:3:H8:`8:b8:g9:i:o:8: : : : :9:8:8: : :9: : :8:8: :8:8:8:8: :8:8: :8: 8:8:8:8:8:8:9:8:L:L: 8:.:38:48:58:68:7:8:9:<7:G:I:J:K:L:U(:XJ:Y8:^8:a8:b8:c8:::8:8:: :9:#8:%8:'8:)8:/8:y8::::9: :9: : : : : : : : : : : :8:8:8:8:::::::::::::::: :=::9E: 9: 8: 8: 8: :  : 9:  : 9:  : 9:  : 9:  : 9:  : 9: /8: 18: 4+: 5: 98: ;8: S8: v8: ~C: 8: : 8;YA;ZA;\B;l1;x;{1;B;5A;sI;E;;!A;"/;C;l;m;pL;r?;s?;A;A;A;A;A;I;A;A;B;A; B; B; B;9; A; 8; =; AA; CA; aK; q<<<D<<FC<GC<HC<RC<St<TC<V`<X<x<<<<<C<C<<C<C<<<C<C<C<C<C<<<<C<3<6<8<HC<L2<`C<bC<g<<i<o<<<C<I<<<C<<C<<<<<`<C<C<C<<C<C<C<`<<C< C<C<C<C<C<C<I<<<C<K<?<?< C<.<3C<4C<5C<6C<86<G<I<LJ<U><X:<YC<^C<_<aC<bC<cC<J<C<C<<<<#C<%C<'C<)C</C<12<E<y`<<<<<<<<<C<C<C<C<<<< < <<;<;<;<;<;<&<.<&<;<;<#<;<)<L<9< << C< C< C< < << << << << << << -%< /C< 1C< 3t< 9C< ;C< Q2< SC< a+< iI< q<< u%< vC< C< < `=\~=~=~= ~= ~= ~DuDKD=D D EEEE@ECEEREuEAEEEE E 2FFFGFHFRFTFFFFFFFFFFFHF`FbFFFFFFFFFFF FFFFFFF F3F4F5F6FYF^FaFbFcFFF#F%F'F)F/FFFFF F F F F /F 1F 9F ;F SF vF H[HR:HuH H 5IIIIIEIiIIIIIIRI_IuIIEI 6I nJFJGJHJRJTJJJJJJJJJJJHJQJ`JbJJJJJJJJJJJ JJJJJJJ J3J4J5J6JAJYJ^JaJbJcJJJ#J%J'J)J/JJJJJ J J J ,J /J 1J 9J ;J SJ vJ J KRIKuKHKAK K N PR8PuP8P7P P QRIQuQHQAQ Q RERKRNRORSRYRZR[R\RRRRRRRR5R@RCRTRRRRR!R,RR(RhRiRuR9RRRRRR9R;R=R?RARGRIRKRRRRRRRRR R R R R R R R %R 3R AR CR TR wR -SR/SuS S >TMTQ TT0ITATBTuCT T 5T >T U7U8kU9UJ UK ULUTUUUUUUUUJUUUUUUU U U (U 5U Vu?V W "Xu?X X 7YFYGYHYRYTYYYYYYYYYYYHY`YbYYYYYYYYYYY YYYYYYY Y3Y4Y5Y6Y72Y8Y9BYJHYKHYLEYYY^YaYbYcYEY!YYY#Y%Y'Y)Y/YYYYYYYYYYYY(YY Y Y Y Y Y /Y 1Y 5KY 9Y ;Y SY vY Y ZFZGZHZRZTZZZZZZZZZZZHZ`ZbZZZZZZZZZZZ ZZZZZZZ Z3Z4Z5Z6Z72Z8Z9BZJHZKHZLEZYZ^ZaZbZcZEZ!ZZZ#Z%Z'Z)Z/ZZZZZZZZZZZZ(ZZ Z Z Z Z Z /Z 1Z 5KZ 9Z ;Z SZ vZ Z [F[G[H[R[T[[[[[[[[[[[H[`[b[[[[[[[[[[[ [[[[[[[ [3[4[5[6[Y[^[a[b[c[[[#[%['[)[/[[[[[ [ [ [ %[ /[ 1[ 9[ ;[ S[ v[ \7\8\9*\J0\K0\L,\T?\,\\\\\\\\\\\2\ \ \ 5A\ ]uJ] ] @l;@llll7l8l9lT9ll@l@l4l 5%l ~&l x7&x9Ex:Ex;x< x=9xx x"&x$&x&6x4Ex6 x8 x99x;9x=9xSExh xmxrExv@xx@xx&x9x x"x x Gx7x8mx9xJBxKBxL7xRxTx7xx&x&x&x&xExExExExExExExxx x9x9x9x x x x xx 9x x Ex x 9x &x 5x >x @Ex BEx D$x }dx ~x  x 1x {;@{{{{7{8{9{T9{{@{@{4{ 5%{ ~&{ 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3x>92 @ q>DEJKNO@CTg,hi9;=?AGIKF !        % T Z w I LDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay 7       ! / 1 3 9 ; S U V W Z s v > DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay 7       ! / 1 3 9 ; S U V W Z s v > DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay 7       ! / 1 3 9 ; S U V W Z s v > DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay 7       ! / 1 3 9 ; S U V W Z s v > <D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  `;*789/LITBI**$J  1 5* }/ ~K =RGn3o3q3r0st3u33)3k3w3 t R n- 3 RGn3o3q3r0st3u33)3k3w3 t R n- 3 r?s;u+EI RI I .r3s0u@  :r?s;u+EI RI I .u9 FGHRTH`b  3456Y^abc#%')/  / 1 9 ; S v u? R/u >uH 9 %uI RIu! CEKNOSYZ[\5@CT!,R(hiu99;=?AGIK    % 3 A C T w -RIu! C 4RIu! Cu? 7u? 7 I789*J0K0L,T?,2 5A EKNOSYZ[\5@CT!,R(hiu99;=?AGIK    % 3 A C T w -789*J0K0L,,2 5 5A 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *r3s0u@  :-V79:<3Mz\x13V("$&463783AIPVQS\KckmrsH3h. 40ABkD7[nopqrstu~v;BCQS@@33  3  3 3)kw 9  (J )J 5R 6 < @ B M O. R b mJ n o q1 x   Mz\%7Q1R0ABWD#[u7&*CQ    5H M O uJ @ 9 9DEJKNO@CTg,hi9;=?AGIKF !        % T Z w IO 6 YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3RJu# 9Mx2Q0AB 5 q2 Q0AR+u? ! YZ[\tx3t5!t t t t A C q3uH Q0ABD " 5 Q0ABD " 5 Q0ABD " 5 Q0ABD " 5 RIuHA RIuHA ix>92 @ q>x>92 @ q>-MPQ_\0A_BD[C 5 O QM+Q[&0A]B&D[C 5 O b FGHRTXY<Z<\LlKxa{KL35<H`bo K. !<"6.3456C GIY^abclm<<#%')/<<<D<<L< L L L9 < 3 / 1 9 ; = A< C< S qa v   G79:<"$&468AISckNmQr@ CRDlmnoqrstu  kw  ( ) 6 ( ) I*D*F*G*H*J*P*Q*R*S*T*U*V*]*****************<*H*]*`*b*g*u******************** ********* */*1*3*4*5*6*N*O*Y*^*a*b*c*****#*%*'*)*/*U*W*Y*[*]*_*a*y********* * * * * * 7* * * * * * * !* /* 1* 3* 9* ;* S* U* V* W* Z* s* v* * >* + I,D,F,G,H,J,P,Q,R,S,T,U,V,],,,,,,,,,,,,,,,,,<,H,],`,b,g,u,,,,,,,,,,,,,,,,,,,, ,,,,,,,,, ,/,1,3,4,5,6,N,O,Y,^,a,b,c,,,,,#,%,',),/,U,W,Y,[,],_,a,y,,,,,,,,, , , , , , 7, , , , , , , !, /, 1, 3, 9, ;, S, U, V, W, Z, s, v, , >, - I.D.F.G.H.J.P.Q.R.S.T.U.V.].................<.H.].`.b.g.u.................... ......... ./.1.3.4.5.6.N.O.Y.^.a.b.c.....#.%.'.)./.U.W.Y.[.]._.a.y......... . . . . . 7. . . . . . . !. /. 1. 3. 9. ;. S. U. V. W. Z. s. v. . >. / I0D0F0G0H0J0P0Q0R0S0T0U0V0]00000000000000000<0H0]0`0b0g0u00000000000000000000 000000000 0/01030405060N0O0Y0^0a0b0c00000#0%0'0)0/0U0W0Y0[0]0_0a0y000000000 0 0 0 0 0 70 0 0 0 0 0 0 !0 /0 10 30 90 ;0 S0 U0 V0 W0 Z0 s0 v0 0 >0 1 I2D2F2G2H2J2P2Q2R2S2T2U2V2]22222222222222222<2H2]2`2b2g2u22222222222222222222 222222222 2/21232425262N2O2Y2^2a2b2c22222#2%2'2)2/2U2W2Y2[2]2_2a2y222222222 2 2 2 2 2 72 2 2 2 2 2 2 !2 /2 12 32 92 ;2 S2 U2 V2 W2 Z2 s2 v2 2 >2 3RL3u3;3 3 4$ 4D94F84G84H84R84T84V84X4 4 4 4 4 4 4 49484848484 4 4 494848484848448434H84`84b84g94i4o484 4 4 4 4948484 4 494 4 48484 484848484 48484 484 8484848484849484L4L4 84.4384484584684748494<74G4I4J4K4L4U(4XJ4Y84^84a84b84c844484844 494#84%84'84)84/84y8444494 494 4 4 4 4 4 4 4 4 4 4 484848484444444444444444 4=449E4 94 84 84 84 4  4 94  4 94  4 94  4 94  4 94  4 94 /84 184 4+4 54 984 ;84 S84 v84 ~C4 84 4 85F5G5H5R5T55555555555H5`5b55555555555 5555555 535455565725859B5JH5KH5LE5Y5^5a5b5c5E5!555#5%5'5)5/555555555555(55 5 5 5 5 5 /5 15 5K5 95 ;5 S5 v5 5 6<6D<6FC6GC6HC6RC6St6TC6V`6X6x<66<6C6C66C6C6<6C6C6C6C6C6666C6366686HC6L26`C6bC6g<6i6o666C6I6<6C66C6<666`6C6C6C66C6C6C6`66C6 C6C6C6C6C6C6I6<6C6K6?6?6 C6.63C64C65C66C6866G6I6LJ6U>6X:6YC6^C6_6aC6bC6cC6J6C6C66<6#C6%C6'C6)C6/C6126E6y`66666<6<6C6C6C6C6666 6 66;6;6;6;6;6&6.6&6;6;6#6;6)6L696 <6 C6 C6 C6 6 <6 <6 <6 <6 <6 <6 -%6 /C6 1C6 3t6 9C6 ;C6 Q26 SC6 a+6 iI6 q<6 u%6 vC6 C6 6 `777879*7J07K07L,7T?7,7777777777727 7 7 5A7 8<8D<8FC8GC8HC8RC8St8TC8V`8X8x<88<8C8C88C8C8<8C8C8C8C8C8888C8386888HC8L28`C8bC8g<8i8o888C8I8<8C88C8<888`8C8C8C88C8C8C8`88C8 C8C8C8C8C8C8I8<8C8K8?8?8 C8.83C84C85C86C8868G8I8LJ8U>8X:8YC8^C8_8aC8bC8cC8J8C8C88<8#C8%C8'C8)C8/C8128E8y`88888<8<8C8C8C8C8888 8 88;8;8;8;8;8&8.8&8;8;8#8;8)8L898 <8 C8 C8 C8 8 <8 <8 <8 <8 <8 <8 -%8 /C8 1C8 3t8 9C8 ;C8 Q28 SC8 a+8 iI8 q<8 u%8 vC8 C8 8 `:uJ: : @<uJ< < @> 9??E?K?N?O????????????? ?@?C?E?T?iI? ? ???????? ??????+?,?R?_?h?i?j?n?o?q?t?u?v????? ?????9?;?=???A?E?G?I?K?O????k?w? ? ? ? #? %? '? +? G? I? R? T? n? w? ? ? ? @E@@@@C@@R@u@A@@@@ @ 2A %D7xD9D:D<DD"xD$xD&D4D6D8DADIDSDcDkDmWDrDxDD D DR7DsDuD'DxDxDxDxDDDDDDDDDD D DD D D D xD (!D )!D <D @D BD D6D RLD b!D xD D LD ER/EuE E >FDFEFJFKFNFOFFFFFFFFF@FCFTFgFFFFFFFF,FhFiFFFFF9F;F=F?FAFGFIFKFFFFFF F F !F F F F F F F F %F TF ZF wF IGGGGGGGGGDGOIGGGG HHHHHiHHHHH8"HEH9<H H 7H 0IDIEIJIKINIOIIIIIIIII@ICITIgIIIIIIII,IhIiIIIII9I;I=I?IAIGIIIKIIIIFI I I !I I I I I I I I %I TI ZI wI IL0LR2LuL L NDNENJNKNNNONNNNNNNNN@NCNTNgNNNNNNNN,NhNiNNNNN9N;N=N?NANGNINKNNNNFN N N !N N N N N N N N %N TN ZN wN IOxO9O qP$PDjPF`PG`PH`PPtPQtPR`PT`PUtPVLPWPXtPYPZP\`P]tPPPPPPPPjP`P`P`P`P`PPPPjP`P`P`P`P`PtPtPtP`PtP#P%P3tP5Pb c$cccccccccccccccccccccc7c8gc9cJcKcLcTHcccccccccccccccc+c+c+c+c+c+c+cJc+ccc c Jc c c c c c c c 4Ac 5c ~c d 4e-]e7 e9 e: e<eMe\eeee]e2e" e$ e&e4 e6e7e8eP]eQeS e\Eemer eSe eeeeueAeee +ee0eAeBYeD!eR5e[ eue5e?eC eQe e eAeAe e e e e e e eeeee e e e e eeee e e e  e 56e 4n?.n@nEnG7nHKnI7nJnKnLnN+nO+nP?nQ.nUnW3nXnYFnZ4n]4n^Fn_naFnbFncFnhninjnnnonqntnunnnnnnnFn4n3n4n1n4nFn3nGn+nn7nnnnnnn#Fn%Fn'Fn)Fn/Fn13n9n;n=n?nAnD5nEnGnInKnOinU+nW+nY+nZn[+n\n]+n^n_+n`na+nq(nu(nynn7nn7nn7nnnnnnnnnnn<nnn+n+nnnnnnnnn>nnnnnnnnnFn:nnnFn:nFnFnn7nnnnnnn7nn n nnnnnknwnnnnnn nn nnnnnnnJnn9n n n n +n n n Fn Fn Fn 4n n n n 4n /n n n n n n n n n n n n n !+n %n (n )n /Fn 1Fn 33n 4Hn 5n 6n 9Fn ;Fn ?n @n Bn EKn Gn In Q3n Rn SFn Tn U+n V+n W+n X4n Z(n [n ^Dn a>n dn e n gDn hn in mn nn on qn rn s+n vFn wn }n n n Fn n n 4n n n n !n o 7q7Kq8 q,q7q7q7q7q7q7q7q7q Aq r$rrrrrrrrrrrrrrrrrFrrrrrr7r8vr9r<'rJrKrLrUrrhrrFrrrrrrrrrrrrrFrFrFr r r r r rr rr r rr rrrrr9r r r r r r r r -r 4r 5r ur ~r gs7s8?s9sJsKsLsTBss&ssssssOs%sOsssssss9:s s -Ds 5s uDs uu?u xMxQx0xAxBxRAx x 5x yQy0yAy y z >| H}RA}n}o}q}r#}s&}t}u}}}}}}}k}w} f} R} n*} } } ~R/~u~ ~ >-M\7PQ#\dis+0,ABD[lmCOQS    , 5 G I M O ^ f g t  E-M\7PQ#\dis+0,ABD[lmCOQS    , 5 G I M O ^ f g t  E , 9-MPQ0ABD[C , 5 O ^ f g t -MPQ0ABD[C , 5 O ^ f g t 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *u)  7DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  I[R:u  579:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *u)  7YZ[\tx3t5!t t t t  A C q3u9  CMQL0EAMBD[C 5 O JQ0ABD " 5 FGHRTXY<Z<\LlKxa{KL35<H`bo K. !<"6.3456C GIY^abclm<<#%')/<<<D<<L< L L L9 < 3    / 1 9 ; = A< C< S qa v   'Ru  RF F   'u< Q0ABD " 5  1uJ  @Q0ABD " 5 9,:,<&(4,68S,mr,; 1R(u,,,,,,,  =  ,  @, B, D3 x@ } (((7$89/J9K9L:: K  5* ~J  LRIuHA  79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r?s;u+EI  RI I .YZ[\tx3t5!t t t t  A C q3u9 RIu!  C79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r?s;u+EI  RI I .79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :YZ[\tx3t5!t t t t  A C q3uH YZ[\tx3t5!t t t t  A C q3uH x>92 @ q>DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w I 4DFGHRTVXYZ\x:35H`bgo  !.3456GIY^abcp:u::#%')/y     &            / 1 9 ; A C S q: v  @ 78n9J K LT J   I 5 DFGHRTVXYZ\x:35H`bgo  !.3456GIY^abcp:u::#%')/y     &            / 1 9 ; A C S q: v  @ 789*J0K0L,,2 5  5A DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > u?  7DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  I Fu? $/DF G H JP"Q"R T U"V5XYZ\$]"x//////    $///     """ "35<"H L]"` b giosu" "///&  "/D//5 "/  "  / 5"/  = "     6 !./"1"3 4 5 6 789<#@5GIJKLMN"O"UXY ^ a b c   "/D# % ' ) / 1U"W"Y"["]"_"a"y5$""//////////// D D D  $ $ $/=$9  "     ^ < /  /  /  /  /  /  !" - /  1  4  5G 9  ;  A C Q S  U" V" W" Z a i q s" u v  ~=  !  5  %R1uB  RIuHA  -MPQ0\0qA5BD 5 O +l&x{&C8l+m+nopqrstuv kw  R n q     F #Ml8x{8Q?A"J0@A?BCFD[l+m+p'r;s9C9 J ,@ 5 =. q HQ0AuJ9J  5 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *uK=  YZ[\tx3t5!t t t t  A C q3[R:u  5DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IEKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  C<D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  `789*J0K0L,,2 5  5A l/x{/CCl9m9nopqrstuv  kw  R n q    l x{ C%lmnopqrstuvf\kw  R n q   { xDp3uvD&D  qD $ & EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -x9r,s$ 5 q9 979:<"$&468AISckNmQr@ CRDlmnoqrstu  kw     (  )  6  %i8K 4 >79:< x; "$&46 8 A I Sc kmr4  RLnop&qrstuv&     kw   ?  (/ )/ 6 < @ B LI R b mK n  o q; x    YZ[\tx3t5!t t t t  A C q3 8H A -J Jz Mq S \  S  e e z e  J     T z 7 Lc PJ Q \2 d s xM y ~    e Z C e a    b  )     + 0 : ; @$ A Bj D) F P Q5 [ 5 ; 1c 7e B C M O Q S k m qT s uT               { { { { {    { {  { "  3 5m D/ E GT I J K Ll M O) Qc Zz ]o ^ ` a da eD fY g zu  a    J M S \6 6 4    74 L Q d s! ~     A 4   % t   0- : A B D] P [s  1 Cs Q S k m 6 4  6  6  6 4 m    3 5 G I K MA O Q Z ^ a g    D F G H R T V X Y Z \ x:               3 5 H ` b g o                            ! . 3 4 5 6 G I Y ^ a b c p: u: :       # % ' ) / y                          &            / 1 9 ; A C S q: v  @  7 8k 9 J  K  L T        J         ( 5  DC FL GL HL RL TL C L L  L L C L L L L L    L HL L= `L bL gC i   L C L L C   L L L L L L L  L L L L L L C L B B  L 3L 4L 5L 6L 7; 8 9D J= K= L9 U: XC YL ^L aL bL cL 9 L L C #L %L 'L )L /L 1= E C C L L L L ' ' ' ' '    ' '  '  B 9 C L L L  C C C C C C -' /L 1L 9L ;L Q= SL a> u' vL L 7G825555555K5  7 ARKu):  R0uF  7 %EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -R<uI JMS!\   7LQKd1sjxy~ [  }VV0o:=AKBDP1Q[17 CQSkkmquaa   T F 3! 5 E2 G I' K3 M O Q Z ^< aP g< L F e`E1K:LMN:O:l{ 6Y :1a:::: !#+@1C1EaKT:YZi`>>:kn :>:1$%)+1,:RM[_\h:i:jbnJoJpqJrstJurvYrJJ@hJ111379:;:=:?:A:CEG:I:K:MOUQSs}#:S8 22SkJwJ  :  # F : # %: '$ + 7' GL IG O R^ T: c/ nr w: J ^ @  k !EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -Cl m neoeqerOsteueeeekewe z R# e #FGHRTH`b  3456Y^abc#%')/     / 1 9 ; S v u7  IRBn$o$q$rIs't$u$$$($k$w$  R( $ (EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -RIuI?  <EKNO((( @CETiN((+,R_hijknoqtuv'9;=?AE(GIKOkw    # % ' + G I R T c n w      &  [ R: u  5!7F!8! ! G! ?"7"8"9""JK"KK"LI"R,"T/"I" """""""" ""K" " " 5" 5@" #M#Q##0,#A#B# 5# $u+$ $ 1%u&% % 3& A'u?' ' 7(F(G(H(R(T(((((((((((H(`(b((((((((((( ((((((( (3(4(5(6(Y(^(a(b(c(((#(%('()(/((((( ( ( ( ( /( 1( 9( ;( S( v( ) C+J+M+S!+\++++ + ++ ++++7+L+QK+d1+sj+x+y+~ +++[+ +++ +++++}++V+V+0o+:=+AK+B+D+P1+Q+[+++1+7 +C+Q+Sk+k+m+q+u+a+a+++ + + +++++++++++++T++ F+ 3!+ 5+ E2+ G+ I'+ K3+ M+ O+ Q+ Z+ ^<+ aP+ g<+ L+ F+ e,F,G,H,R,T,,,,,,,,,,,H,Q,`,b,,,,,,,,,,, ,,,,,,, ,3,4,5,6,A,Y,^,a,b,c,,,#,%,',),/,,,,, , , , ,, /, 1, 9, ;, S, v, , .Q.0.A.RF. 2. /Q/A/R;/u/ / '/ 0RI0u0H0A0 0 1J:1MI1S]1\11411;1;1:1;1111:171L%1Qs1dj1s1x1y1~_111w1;1311;11181111`1`101:j1@1As1BB1D1PM1Q1[1u%11 11%17;1C1M1Q1S1k[1m[1q1u11111 1 1 1111111 1 1 3]1 5S1 ES1 G/1 IX1 Kh1 M1 O1 Q%1 Z:1 ^f1 a1 e1 gf1 1 :1 w1 3E3K3N3O3S3Y3Z3[3\3333333353@3C3T33333!3,3R(3h3i3u3933333393;3=3?3A3G3I3K333333333 3 3 3 3 3 3 3 %3 33 A3 C3 T3 w3 -4uJ4 4 @5R&5sH5u55 5 RJ5 J5 6E6K6N6O6S6Y6Z6[6\6666666656@6C6T66666!6,6R(6h6i6u6966666696;6=6?6A6G6I6K666666666 6 6 6 6 6 6 6 %6 36 A6 C6 T6 w6 -7 8889J9M9S9\V9V9T99999997T9L9Q$9d9s?9x9y9~999B99999G9T999@99990Y9: 9A$9B9D9P9[9991979C9Qw9S<9k9m999V9T9 V9 V9 V9T99999999999999  9 G9 39 59 E9 G9 I9 K9 MG9 O9 Q9 Z9 ^9 a 9 g9 9 9 C:7:8a:9:J:K:L:T:_B:::::::::::::3: : : 8: ;0;7;8o;9;J&;K&;L;T;_*;;;L;*; ; ; <7J<8<C<C<C<C<C<C<C<9<C< < < 5=u=?= = = RE= E= >RJ>u>D>6> > @Q@0@A@B@u+@ @ C@ AAEAKANAOAAA8AAAAA8A8AAAAAAA A@ACAEATAZAifA7A7AAAAAA'AAEAA8A8AAA+A,AR A_ AhAiAjAnAoAqAtAu#AvA"AAAA'AAAAA9A;A=A?AAAE8AGAIAKAMAO AQASAAAAAAAkAwA A  A A #A %A 'A +A GA IA RA TA cA n-A wA A A A "A BBBBBBBi BBBBBBBBB_BnBoBqBtBuBBBBBBEBOBBBkBwB B GB RB nB B B B CJCMCS(C\CCCCCCCCCCC7CLCQDCd0CsqCxCyC~*C5C5C]CC CCCCC CC{CC4C4C0kC:8C@CADCBCDCP2CQC[Cs6CuC3CCCC1C7CCCOCQCSbCk&Cm&CqCuC3C3CCC C C CCCCCCCCCCCCCCCC <C jC 3(C 5 C E3C GC I2C K4C MC OC QC R/C ZC ^4C aAC eC g4C DC /C C >C ZDDEDKDNDODDD(DDDDD(D(DDDDDD D@DCDEDTDiNDDDDDDDDDDDD(D(DDD+D,DRD_DhDiDjDkDnDoDqDtDuDvDDDDD'DDDDD9D;D=D?DADE(DGDIDKDODDDDDkDwD D D D #D %D 'D +D GD ID RD TD cD nD wD D D D D EuE E (FJFMFSF\FFFFDFFFFFFF7DFQ FdFs2FxFyF~FFF FFFFF0FDFFF2FnFFF0>F:FA FBFDFPF[F~F7FCFQOFSFkFmFFFFFDF FF FF FFDFFFFFF  F 3F 5F EF IF KF M0F OF ZF ^F aF gF F F /G[GR:GuG G 5HR2HuJH IR/Iu%I Jn9Jo9Jq9Jr"JsJt9JuJJ9J9J9JJ9Jk9Jw9J BJ RJ n!J 9J J J BKn9Ko9Kq9Kr"KsKt9KuKK9K9K9KK9Kk9Kw9K BK RK n!K 9K K K BLx7LLLlJLmJL q7MFMGMHMRMTMMMMMMMMMMMHM`MbMMMMMMMMMMM MMMMMMM M3M4M5M6M72M8M9BMJHMKHMLEMYM^MaMbMcMEM!MMM#M%M'M)M/MMMMMMMMMMMM(MM M M M M M /M 1M 5KM 9M ;M SM vM M NJNMNSN\fNfNNdNNNNNNN7dNLNQ$NdNs=NxNyN~N'N'N@NNNNNdNdNNNSNN1N1N0HN:NA$NBNDNP(NQN[NuN!NHNNN1N7NCNQNS=NkNmN&N&NfNdN fN fN fNdN[NNNNNN*NON*NNN NN N N 3N 5N EN GN IN KN MdN ON QN ZN ^N aN eN gN %N N N 8ORIOuOHOAO O PuBPBP P 8QQQ0QAQuJQ9JQ Q 5Q R8:R=RCRCRCRCRCRCRCRHRCR *R ,R 4SSSSSESi SSSSSSES nTuKT UQU0U7 U8U9 UAUT%UEU U U VDVEVJVKVNVOVVVVVVVVV@VCVTVgVVVVVVVV,VhViVVVVV9V;V=V?VAVGVIVKVVVVFV V V !V V V V V V V V %V TV ZV wV IWEWKWNWOWSWYWZW[W\WWWWWWWW5W@WCWTWWWWW!W,WR(WhWiWuW9WWWWWW9W;W=W?WAWGWIWKWWWWWWWWW W W W W W W W %W 3W AW CW TW wW -XRFXuX YYYYYEYiYYYYYRYYEY ;Y RY Y ZFZGZHZRZTZZZZZZZZZZZHZ`ZbZZZZZZZZZZZ ZZZZZZZ Z3Z4Z5Z6ZYZ^ZaZbZcZZZ#Z%Z'Z)Z/ZZZZZ Z Z Z Z /Z 1Z 9Z ;Z SZ vZ [[\Q\0\A\R=\ \ ]x0]"E]*9]C]RD]l]m]n]o]p]q]r]s]t]u,]v]]]]]d]]k]w] ] Rz] n] p9] q0] ] z] ] ^^E^K^M^N^O^^^^^^^^^^^^^^ ^@^C^E^Q^T^iC^^^^^^^^^^^^^+^,^0^A^R^_^h^i^j^n^o^q^t^u^v^^^^^^^^^^9^;^=^?^A^E^G^I^K^^^k^w^ ^ ^ ^ #^ %^ '^ +^ G^ R^ T^ c^ n^ w^ ^ ^ ^ ^ ^ _8_ ._ @auJa a @bQb0bAbuJb9Jb b 5b cR8cuc8c7c c d[dR:dud d 5eeEeKeNeOeee8eeeee8e8eeeeeee e@eCeEeTeZeife7e7eeeeee'eeEee8e8eee+e,eR e_ eheiejeneoeqeteu#eve"eeee'eeeee9e;e=e?eAeE8eGeIeKeMeO eQeSeeeeeeekewe e  e e #e %e 'e +e Ge Ie Re Te ce n-e we e e e "e fR<fuIf gR?gug g 0h[hR:huh h 5iuJi i @lMlQlll0AlA#lBl 5l mJmMmSm\bmbmm`mmmmmmmm7`mLmQ3md!msNm~mmmFmmmmmtm`mmmRmmmm0Pm:mA3mBmDmPm[mm1m7mCmQmSqmkmmmqmummmbm`m bm bm bm`mmQm Fm 3m 5m Em Gm Im Km Mtm Om Qm Zm ^m aTm gm $m Am an$nnnnnnnnnnnnnnnnnnnnnn7n8{n9nJnKnLnnZnnnnnnnnnnnnnnn%n9*n n n n n n n 4 n 5n ~n to$oooooooooooooooooooooo7o8{o9oJoKoLooZooooooooooooooo%o9*o o o o o o o 4 o 5o ~o tp$GpGpGpGpGpGpGppGpGpGpipGpGpGppGppGpGpGpGpGp7p8p9pJ=pK=pL+p+ppGpGpGpGpGpGpGpGpGpGpGpGpGpGp Gp Gp Gp Gp Gp Gp 5 p ~ p q$qD qF!qG!qH!qJ:qR!qT!qV;qqqqqqqq q!q!q!q!qqqq q!q!q!q!q!qHq8q!qHqH!qLq`!qb!qg q!qq<qqqq q+q!q!q8qqq q!qqq;q!qq!q!q!q!qq!q;qq!q !q!q!q!q!q!q<q q!qqqq !q3!q4!q5!q6!q7Lq8jq9eq<q@;qD>qJmqKmqLhqUqX"qY!q^!qa!qb!qc!qhqq!q!q=qq q!q#!q%!q'!q)!q/!q1qy;q qq qqqqqqqqqqqq!q!q!q!q!q!q!qqqq9q q !q !q !q >q q  q q  q q  q q  q q  q q  q -q /!q 1!q 4q 5\q 9!q ;!q Qq S!q Z:q aq i<q uq v!q ~q !q q ;r$rrrrrrrrrrrrrrrrrrrrrr7r8{r9rJrKrLrrZrrrrrrrrrrrrrrr%r9*r r r r r r r 4 r 5r ~r ts$6s6s6s6s6s6s6ss6s6s6s6s6s6ss6ss6s6s6s6s6s7s8Qs9sJ3sK3sL%sT%s%ss6s6s6s6s6s6s6s6s6s6s6s6s6s6s 5s 6s 6s 6s 6s 6s 6s 5s ~s t$tttttttttttttttttttttt7t8mt9tuJmuKmuLhuUuX"uY!u^!ua!ub!uc!uhuu!u!u=uu u!u#!u%!u'!u)!u/!u1uy;u uu uuuuuuuuuuuu!u!u!u!u!u!u!uuuu9u u !u !u !u >u u  u u  u u  u u  u u  u u  u -u /!u 1!u 4u 5\u 9!u ;!u Qu S!u Z:u au i<u uu v!u ~u !u u ;v$vD vFDvGDvHDvRDvTDvvvvvvvv vDvDvDvDvvvv vDvDvDvDvDvDvHDvL6v`DvbDvg vDvvvvv vHvDvDvvv vFvvvDvvDvDvDvDvvDvvDv DvDvDvDvDvDv vDv/vvv Dv3Dv4Dv5Dv6Dv7Hv8]v9\v< vD>vJsvKsvLwvUvX/vYDv^DvaDvbDvcDvwvvDvDvGvv vFv#Dv%Dv'Dv)Dv/Dv16v vv vvvvvvvvvvvvDvFvDvFvDvFvDvvvv9v v Dv Dv Dv v  v v  v v  v v  v v  v v  v -/v /Dv 1Dv 4v 5^v 9Dv ;Dv Q6v SDv aKv u/v vDv ~v Dv $LLL7n8m9~JKLG        43 5 ~ X$78{9JKLZ%9*       4  5 ~ t$78{9JKLZ%9*       4  5 ~ t$78{9JKLZ%9*       4  5 ~ t$78@9EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w - u@G9B  ; EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -8J  D789"JKKKLIR,T/I  K   5 5@ FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v   !$78{9JKLZ%9*       4  5 ~ t[R:u  5Q0A 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *uI;   %R<u+  ? %E@CRuA  2 %R.u  FFGHRTH`b  3456Y^abc#%')/     / 1 9 ; S v  D E J K N O         @ C T g        , h i     9 ; = ? A G I K    F   !        % T Z w I"D"E"J"K"N"O"""""""""@"C"T"g"""""""","h"i"""""9";"="?"A"G"I"K""""F" " " !" " " " " " " " %" T" Z" w" I$D$E$J$K$N$O$$$$$$$$$@$C$T$g$$$$$$$$,$h$i$$$$$9$;$=$?$A$G$I$K$$$$F$ $ $ !$ $ $ $ $ $ $ $ %$ T$ Z$ w$ I&D&E&J&K&N&O&&&&&&&&&@&C&T&g&&&&&&&&,&h&i&&&&&9&;&=&?&A&G&I&K&&&&F& & & !& & & & & & & & %& T& Z& w& I(D(E(J(K(N(O(((((((((@(C(T(g((((((((,(h(i(((((9(;(=(?(A(G(I(K((((F( ( ( !( ( ( ( ( ( ( ( %( T( Z( w( I*Y*Z*[*\t*x3*t*5*!********t** t* t* t* * A* C* q3,Y,Z,[,\t,x3,t,5,!,,,,,,,,t,, t, t, t, , A, C, q3.Y.Z.[.\t.x3.t.5.!........t.. t. t. t. . A. C. q3/R*/u/C/ / %0Y0Z0[0\t0x30t050!00000000t00 t0 t0 t0 0 A0 C0 q31R*1u1C1 1 %2Y2Z2[2\t2x32t252!22222222t22 t2 t2 t2 2 A2 C2 q33uH3 4$4Dj4F`4G`4H`4Pt4Qt4R`4T`4Ut4VL4W4Xt4Y4Z4\`4]t44444444j4`4`4`4`4`4444j4`4`4`4`4`4t4t4t4`4t4#4%43t454D92D @D q>FFFGFHFRFTFXFY<FZ<F\LFlKFxaF{KFFFFFLFFFFFFF3F5<FHF`FbFoFFFFFFFFFFF FKF.FFFFFFF F!<F"6F.F3F4F5F6FC FGFIFYF^FaFbFcFlFmFFF<F<FF#F%F'F)F/FFFF<F<F<FDF<F<FLF<FFFFFFF LF LF LF9F <F 3F F F F /F 1F 9F ;F =F A<F C<F SF qaF vF G HFHGHHHRHTHXHY<HZ<H\LHlKHxaH{KHHHHHLHHHHHHH3H5<HHH`HbHoHHHHHHHHHHH HKH.HHHHHHH H!<H"6H.H3H4H5H6HC HGHIHYH^HaHbHcHlHmHHH<H<HH#H%H'H)H/HHHH<H<H<HDH<H<HLH<HHHHHHH LH LH LH9H <H 3H H H H /H 1H 9H ;H =H A<H C<H SH qaH vH I JFJGJHJRJTJXJY<JZ<J\LJlKJxaJ{KJJJJJLJJJJJJJ3J5<JHJ`JbJoJJJJJJJJJJJ JKJ.JJJJJJJ J!<J"6J.J3J4J5J6JC JGJIJYJ^JaJbJcJlJmJJJ<J<JJ#J%J'J)J/JJJJ<J<J<JDJ<J<JLJ<JJJJJJJ LJ LJ LJ9J <J 3J J J J /J 1J 9J ;J =J A<J C<J SJ qaJ vJ K L7L9L:L<LL"L$L&L4L6L8LALILSLcLkNLmQLrLLL@L LCLRDLlLmLnLoLqLrLsLtLuLLLLLLLLLLLLLLLLLLLL L LLkLwL L L L L ( L ) L 6L l$llllllllllllllllllllll7l8gl9lJlKlLlTHllllllllllllllll+l+l+l+l+l+l+lJl+lll l Jl l l l l l l l 4Al 5l ~l mR/mum m >nDnFnGnHnRnTnVnXnYnZn\nx:nnnnnnnnnnnnnnn3n5nHn`nbngnonnnnnnnnnnnnnnnnn nnnnnnnn n!n.n3n4n5n6nGnInYn^nanbncnp:nu:n:nnnnnnn#n%n'n)n/nynnnnnnnnnnnnnnnnnnn n n n n &n n n n n n n n n n n n /n 1n 9n ;n An Cn Sn q:n vn n @n o7o8no9oJ oK oLoT ooooooooJooooooo o o Io 5o pDpFpGpHpRpTpVpXpYpZp\px:ppppppppppppppp3p5pHp`pbpgpoppppppppppppppppp pppppppp p!p.p3p4p5p6pGpIpYp^papbpcpp:pu:p:ppppppp#p%p'p)p/pyppppppppppppppppppp p p p p &p p p p p p p p p p p p /p 1p 9p ;p Ap Cp Sp q:p vp p @p q7q8kq9qJ qK qLqTqqqqqqqqJqqqqqqq q q (q 5q rDrFrGrHrRrTrVrXrYrZr\rx:rrrrrrrrrrrrrrr3r5rHr`rbrgrorrrrrrrrrrrrrrrrr rrrrrrrr r!r.r3r4r5r6rGrIrYr^rarbrcrp:ru:r:rrrrrrr#r%r'r)r/ryrrrrrrrrrrrrrrrrrrr r r r r &r r r r r r r r r r r r /r 1r 9r ;r Ar Cr Sr q:r vr r @r s7s8s9*sJ0sK0sL,s,sssssssssss2s 5s s 5As tDtFtGtHtRtTtVtXtYtZt\tx:ttttttttttttttt3t5tHt`tbtgtottttttttttttttttt tttttttt t!t.t3t4t5t6tGtItYt^tatbtctp:tu:t:ttttttt#t%t't)t/tyttttttttttttttttttt t t t t &t t t t t t t t t t t t /t 1t 9t ;t At Ct St q:t vt t @t u7%u8u9uT1u u $v FwuHw x Fyu?y | F~ F +$/DF G H JP"Q"R T U"V5XYZ\$]"x//////    $///     """ "35<"H L]"` b giosu" "///&  "/D//5 "/  "  / 5"/  = "     6 !./"1"3 4 5 6 789<#@5GIJKLMN"O"UXY ^ a b c   "/D# % ' ) / 1U"W"Y"["]"_"a"y5$""//////////// D D D  $ $ $/=$9  "     ^ < /  /  /  /  /  /  !" - /  1  4  5G 9  ;  A C Q S  U" V" W" Z a i q s" u v  ~=  !  5$/DF G H JP"Q"R T U"V5XYZ\$]"x//////    $///     """ "35<"H L]"` b giosu" "///&  "/D//5 "/  "  / 5"/  = "     6 !./"1"3 4 5 6 789<#@5GIJKLMN"O"UXY ^ a b c   "/D# % ' ) / 1U"W"Y"["]"_"a"y5$""//////////// D D D  $ $ $/=$9  "     ^ < /  /  /  /  /  /  !" - /  1  4  5G 9  ;  A C Q S  U" V" W" Z a i q s" u v  ~=  !  5 $KDFGHJ=RTV4Y Z \%xKKKKKK%KKK5 HL`bgis KKKKFKK4KK4K >88 ! 3456789<2@DJ/K/L#MUXY^abc#  KF#%')/1y4     % KKKKKKKKKKKKFFF % % %         K@,9       < K  K  K  K  K  K  - / 1 4 9 ; A  C  Q S Z= a i q u v ~>    4MQ 0ABD  5 $4DFGHJ@RTV:YZx4444444445HL`bgi4#444I44:44:4 #11 !34567 89<(@0J K L MUXY^abc $64I#%')/1y:444444444444III4B)9       A 4  4  4  4  4  4  - / 1 4 9 ; A C Q S Z@ a7 i# q u v ~B  &  :MQ0JA(B  5 DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > RLu;  DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > RLu;  DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > u/  'DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  I$ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8789*J0K0L,,2 5  5A $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  YAZA\Bl1x{1B5AsIE!A"/ClmpLr?s?AAAAAIAABA B B B9 A 8 = AA CA aK q  GYAZA\Bl1x{1B5AsIE!A"/ClmpLr?s?AAAAAIAABA B B B9 A 8 = AA CA aK q<D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  `789*J0K0L,T?,2   5A \~~~ ~ ~ ~ 9\~~~ ~ ~ ~uJ  @\~~~ ~ ~ ~uJ  @RIuHA  FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  789*J0K0L,T?,2   5A EKNO @CETiI   +,R_hijnoqtuv 9;=?AEGIKOkw    # % ' + G I R T n w    i8H Ei+R_noqtuEkw ' G R n     %79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *uK=  79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *u)  779:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *sL79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *rIsFu0  879:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r?s;u+EI  RI I .79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r;s8 I79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :YZ[\tx3t5!t t t t  A C q3[R:u  5YZ[\tx3t5!t t t t  A C q3RJu#  9YZ[\tx3t5!t t t t  A C q3RJsF J KYZ[\tx3t5!t t t t  A C q3uH YZ[\tx3t5!t t t t  A C q3YZ[\tx3t5!t t t t  A C q3YZ[\tx3t5!t t t t  A C q3u? DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IEKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  C8,H======== 3 8KFFFFFFFF  +8,H======== 3 8KFFFFFFFF  +8,H======== 3 8KFFFFFFFF  +8,H======== 3 8KDDDDDDDD  '8,H======== 3 8KFFFFFFFF  +DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > u?  7DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > u?  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7<D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  ` 7 8 9* J0 K0 L, T? ,           2   5A  < D< FC GC HC RC St TC V` X x<  < C C  C C < C C C C C    C 3 6 8 HC L2 `C bC g< i o   C I < C  C <   ` C C C  C C C `  C  C C C C C C I < C K ? ?  C . 3C 4C 5C 6C 86 G I LJ U> X: YC ^C _ aC bC cC J C C  < #C %C 'C )C /C 12 E y`     < < C C C C         ; ; ; ; ; & . & ; ; # ; ) L 9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  ` 7@ 8 9@ C  : < D< FC GC HC RC St TC V` X x<  < C C  C C < C C C C C    C 3 6 8 HC L2 `C bC g< i o   C I < C  C <   ` C C C  C C C `  C  C C C C C C I < C K ? ?  C . 3C 4C 5C 6C 86 G I LJ U> X: YC ^C _ aC bC cC J C C  < #C %C 'C )C /C 12 E y`     < < C C C C         ; ; ; ; ; & . & ; ; # ; ) L 9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  ` 7 8 9* J0 K0 L, T? ,           2   5A <D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  `789*J0K0L,,2 5  5A 79:<"$&468AISckNmQr@ CRDlmnoqrstu  kw     (  )  6 $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  k$kkkkkkkkkkkikkkkkkkkkkkk7k8k9kJkKkLkk]kkkkkkkkkkkkkk=kk5k9$k k k k k k k k 4k 5k ~k tw$wwwwwwwwwwwwwwwwwwwwww7w8{w9wJwKwLwwZwwwwwwwwwwwwwww%w9*w w w w w w w 4 w 5w ~w t78.9Z:Z<Y"Z"lB{B...."$&(.*.,...0.2.4Z5"68AIQ7SZckLm5n.p5rZ....... >!""9*=A7BCDR-SBlm"".....Z Z"Z"Z"Z%Z"Z"".......  9 7 @ Z " I  ( ) ,J 5 6 < =  @Z A" BZ C" [B b h. o p= x * 79:<"$&468AIQSckhmVr ABC Dlm  9H r   (4 )4 5 6 <; @ B b o x ] G79:<"$&468AIQSckhmVr ABC Dlm  9H r   (4 )4 5 6 <; @ B b o x ] G79:< M "$&46 8 AIQ:SckNmQr  0A:BCDR>lm      r   ( ) 5 6 !""9*=A7BCDR-SBlm"".....Z Z"Z"Z"Z%Z"Z"".......  9 7 @ Z " I  ( ) ,J 5 6 < =  @Z A" BZ C" [B b h. o p= x * 79:< M "$&46 8 AIQ:SckNmQr  0A:BCDR>lm      r   ( ) 5 6 lm      r   ( ) 5 6 lm      r   ( ) 5 6 lm      r   ( ) 5 6 9k9m9r 99J9999 9R9nH9oH9qH9tH9u9H9H99H99999 9 9 9 9 9 9 9#9#99J9J9J99 9 999kH9wH9@9@9@9@9@9@9@9@9 J9 9 9 9 J9 9 *9 @ 9 B 9 D9 R9 b9 x9 yJ9 }9 9 H9 9 9 7 9 : < " $ & 4 6 8 A I S c kN mQ r   @  C RD l m n o q r s t u                       k w  ( ) 6 A ?A G@ H L R@ ]/ ^@ _@ ` a@ b g j; oE u/ xC z |, ~L <  / 2 @ @ % I % I  2 2 9  @  @  @  @  @  / 2 9  @  2 2  @ @ A I  ;  / 2   @ @ @  @ @ / ;    2 @   / 2   @    4  B /              -E .E // 0G 1/ 3 4 5 6 7 86 9 :" ;6 < @ A; B D EC F GE HE IE J K L N/ O/ PG Q? T, U V@ X Y ^ a b c d; e; f; gA  g    / E  2  @  ! # % ' ) + / 1 5A 6@ U/ W/ Y/ [/ ]/ _/ a/ b@ d@ f@ h@ k m o q1 u1 w9 y {9  ; ' ' E E E I  A / /  A   2  2  2 . 2 2 K 2 2 K 2 2 2 2 2    % % @  @  @  @ @  @ @  @  @  @  @ @  E 7 7 7 7 E 6 2  N 9g ; / @ . ;  2  2  2  2  2  2  !/ ,K - .@ / 0@ 1 3= 4} 5 8@ 9 :@ ; ? EI Q S U/ V/ W/ Y; Z \ ^@ `? a e g@ i s/ u v z# ~ 2 @ J A A A A A A -O D F G H M R T V4 \ x            O   7 H PO Q \9 ` b g s    .    Q   4          4   4         .   &     0 3 4 5 6 8# : A B DV P X Y [: ^ a b c  V   # % ' ) / B C: Q S y4               N             9     E       - / 1 4 5 9 ; E M O4 S ^ a g i. q u v    4 u3   F 73 9# :# <4 4 "3 $3 &/ 4# 64 84 S# m r# 3 4  L u 8 H 3 3 4 4 # # # # # # # 4 4  4  4 4   #   3  <  @#  B#   uB B   8 7G 8 2 5 5 5 5 5 5 5 K 5    7 R< u+   F 7 9 : <0 Y Z \~ xG  0 ~ " $ & 4 5 60 80 A) I) S c) k m r    0  6 ! n o p3 q r s t u v7                         0 ~  0  ~  0  ~  0  ~ 0 k w     L    5  62  <  @  A  B  C  R  b  n  o  qG  x!     * u K =    D E J K N O         @ C T g        , h i     9 ; = ? A G I K    F    !                %  T  Z  w  I u#  D F G H J P Q R S T U V ]                 < H ] ` b g u                              / 1 3 4 5 6 N O Y ^ a b c     # % ' ) / U W Y [ ] _ a y               7              !  /  1  3  9  ;  S  U  V  W  Z  s  v   >  u?   7 $ D9 F8 G8 H8 R8 T8 V8 X        9 8 8 8 8    9 8 8 8 8 8  8 3 H8 `8 b8 g9 i o 8     9 8 8   9   8 8  8 8 8 8  8 8  8  8 8 8 8 8 8 9 8 L L  8 . 38 48 58 68 7 8 9 <7 G I J K L U( XJ Y8 ^8 a8 b8 c8   8 8   9 #8 %8 '8 )8 /8 y8    9  9            8 8 8 8                 =  9E  9  8  8  8     9    9    9    9    9    9  /8  18  4+  5  98  ;8  S8  v8  ~C  8   8 F G H R T           H ` b                   3 4 5 6 72 8 9B JH KH LE Y ^ a b c E !   # % ' ) /            (        /  1  5K  9  ;  S  v    / / / 7 8 !  5&     $- 9 : < DA - - - - - -   A   - - - A    4 6 8 E S gA i r   -  - -  A  -  A - -   -  -  -  A 7 8 9 <> J K L U2 _    - A E         A - A - - - - - - - - - - -                   -   A    -  A  -  A  -  A  -  A  -  A  -  A  (  )  47  5  6  @  B  G  L  n  x  }    7 8 9* J0 K0 L, T? ,           2    5A  D E J K N O  @ C T g        , h i     9 ; = ? A G I K    F !        % T Z w I !E !K !N !O !S !Y !Z ![ !\ ! ! ! ! ! ! ! !5 !@ !C !T ! ! ! ! !! !, !R( !h !i !u !9 ! ! ! ! ! !9 !; != !? !A !G !I !K ! ! ! ! ! ! ! ! ! ! ! ! ! ! !  ! % ! 3 ! A ! C ! T ! w ! - "xT " " " "C2 "l "m "9 " =* " qT #  $F $G $H $R $T $X $Y< $Z< $\L $lK $xa ${K $ $ $ $ $L $ $ $ $ $ $ $3 $5< $H $` $b $o $ $ $ $ $ $ $ $ $ $ $ $K $. $ $ $ $ $ $ $ $!< $"6 $. $3 $4 $5 $6 $C $G $I $Y $^ $a $b $c $l $m $ $ $< $< $ $# $% $' $) $/ $ $ $ $< $< $< $D $< $< $L $< $ $ $ $ $ $ $ L $ L $ L $9 $ < $ 3 $ $ $ $ / $ 1 $ 9 $ ; $ = $ A< $ C< $ S $ qa $ v $ %  % G &F &G &H &R &T &X &Y< &Z< &\L &lK &xa &{K & & & & &L & & & & & & &3 &5< &H &` &b &o & & & & & & & & & & & &K &. & & & & & & & &!< &"6 &. &3 &4 &5 &6 &C &G &I &Y &^ &a &b &c &l &m & & &< &< & &# &% &' &) &/ & & & &< &< &< &D &< &< &L &< & & & & & & & L & L & L &9 & < & 3 & & & & / & 1 & 9 & ; & = & A< & C< & S & qa & v & 'uC ' ' 9 (7 (9 (: (< ( (" ($ (& (4 (6 (8 (A (I (S (c (kN (mQ (r ( ( (@ ( (C (RD (l (m (n (o (q (r (s (t (u ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (k (w ( ( ( (  ( ( ( ) ( 6 ( 4 , DD , } , " -R -r@ -s/ -u - - c - R -  -  .$ . . . . . . .O . . . . . . .O . .O . . . . . .7 .8 .9 . 4$ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 47 48g 49 4J 4K 4L 4TH 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4+ 4+ 4+ 4+ 4+ 4+ 4+ 4J 4+ 4 4 4 4 J 4 4  4  4  4  4  4  4 4A 4 5 4 ~ 4 5E 5K 5N 5O 5S 5Y 5Z 5[ 5\ 5 5 5 5 5 5 5 55 5@ 5C 5T 5 5 5 5 5! 5, 5R( 5h 5i 5u 59 5 5 5 5 5 59 5; 5= 5? 5A 5G 5I 5K 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5  5 % 5 3 5 A 5 C 5 T 5 w 5 - 6$ 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 67 68g 69 6J 6K 6L 6TH 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6+ 6+ 6+ 6+ 6+ 6+ 6+ 6J 6+ 6 6 6 6 J 6 6  6  6  6  6  6  6 4A 6 5 6 ~ 6 7R/ 7u 7 7 > 8- 8M 8 8P 8Q? 8 8 8 80L 8AL 8B 8D 8[ 8 8C 8 8  8 5 8 O 8 C 9M 9 9Q1 9 9 90Y 9A: 9B 9D 9[ 9uI 9C 9 9 9 5 9 D 9 9 :-2 :MX :X :\ : : :2 : :3 :7 :P2 :Q :\ :o :' : :7 : : : : :. :0 :A :B` :D, :G :I :[ : : :C : : : : : : : : : : : : : : 5[ : O :  :  ;r: ;s' ;u ; ;L ; ; z ; R! ; n2 ; ! ; < < < < ' =RJ =u =D =6 = = >7 >9 >: >< > >" >$ >& >4 >6 >8 >A5 >I5 >S >c5 >k >m >r > > > 3 >nL >oL >qL >s3 >tL >u >& >L >L >F > >L > > > > > > > > > > > > > >  >  > >kL >wL > > > z >  > < > @ > B > R > b > o@ > x# > L > >  ?RE ?s# ?u ? ?- ? v ? nE ? @$ @D9 @F8 @G8 @H8 @R8 @T8 @V8 @X @ @ @ @ @ @ @ @9 @8 @8 @8 @8 @ @ @ @9 @8 @8 @8 @8 @8 @ @8 @3 @H8 @`8 @b8 @g9 @i @o @8 @ @ @ @ @9 @8 @8 @ @ @9 @ @ @8 @8 @ @8 @8 @8 @8 @ @8 @8 @ @8 @ 8 @8 @8 @8 @8 @8 @9 @8 @L @L @ 8 @. @38 @48 @58 @68 @7 @8 @9 @<7 @G @I @J @K @L @U( @XJ @Y8 @^8 @a8 @b8 @c8 @ @ @8 @8 @ @ @9 @#8 @%8 @'8 @)8 @/8 @y8 @ @ @ @9 @ @9 @ @ @ @ @ @ @ @ @ @ @ @8 @8 @8 @8 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @= @ @9E @ 9 @ 8 @ 8 @ 8 @ @  @ 9 @  @ 9 @  @ 9 @  @ 9 @  @ 9 @  @ 9 @ /8 @ 18 @ 4+ @ 5 @ 98 @ ;8 @ S8 @ v8 @ ~C @ 8 @ @ 8 AF AG AH AR AT A A A A A A A A A A AH A` Ab A A A A A A A A A A A A A A A A A A A3 A4 A5 A6 A72 A8 A9B AJH AKH ALE AY A^ Aa Ab Ac AE A! A A A# A% A' A) A/ A A A A A A A A A A A A( A A A A A A A / A 1 A 5K A 9 A ; A S A v A A  B< BD< BFC BGC BHC BRC BSt BTC BV` BX Bx< B B< BC BC B BC BC B< BC BC BC BC BC B B B BC B3 B6 B8 BHC BL2 B`C BbC Bg< Bi Bo B B BC BI B< BC B BC B< B B B` BC BC BC B BC BC BC B` B BC B C BC BC BC BC BC BI B< BC BK B? B? B C B. B3C B4C B5C B6C B86 BG BI BLJ BU> BX: BYC B^C B_ BaC BbC BcC BJ BC BC B B< B#C B%C B'C B)C B/C B12 BE By` B B B B B< B< BC BC BC BC B B B B B B B; B; B; B; B; B& B. B& B; B; B# B; B) BL B9 B < B C B C B C B B < B < B < B < B < B < B -% B /C B 1C B 3t B 9C B ;C B Q2 B SC B a+ B iI B q< B u% B vC B C B  B ` C7 C8 C9* CJ0 CK0 CL, CT? C, C C C C C C C C C C C2 C C C 5A C D D D D : D En5 Eo5 Ep8 Eq5 Er+ Es! Et5 Eu Ev: E E5 E5 E( E E5 Ek5 Ew5 E q E R E n* E 5 E  E E K E F;6 F<2 F2 F62 F82 Fm& F2 F< FI FR7 FuF F6 F6 F2 F2 F 2 F 2 F2 F F 9 F F DH F } F 5 F D GE GK GN GO GS GY GZ G[ G\ G G G G G G G G5 G@ GC GT G G G G G! G, GR( Gh Gi Gu G9 G G G G G G9 G; G= G? GA GG GI GK G G G G G G G G G G G G G G G  G % G 3 G A G C G T G w G - H;* H H H H7 H8 H9/ HLI HTB HI H H* H* H$ H H H H H H H HJ H H  H 1 H 5* H }/ H ~K H IE IK IN IO IS IY IZ I[ I\ I I I I I I I I5 I@ IC IT I I I I I! I, IR( Ih Ii Iu I9 I I I I I I9 I; I= I? IA IG II IK I I I I I I I I I I I I I I I  I % I 3 I A I C I T I w I - J$ J J J J J J Jn J J J J J J Jn J Jn J J J J J J7 J8 J9 JJ JK JL J Jg J J J J J J J J J J J J J J, J, J, J, J, J, J, J_ J, J J J J J  J  J  J  J  J  J 44 J 5 J ~ J K8 KJ K  K D L 5 MRB Mu M M $ Oi O O O7K O8 OF OF OF OF OF OF OF O? OF O O 3 P7( P8 P94 PJ@ PK@ PL@ PTI P@ P8 P P P P P P P P P P7 P 7 P P E P ~; P QE QK QN QO QS QY QZ Q[ Q\ Q Q Q Q Q Q Q Q5 Q@ QC QT Q Q Q Q Q! Q, QR( Qh Qi Qu Q9 Q Q Q Q Q Q9 Q; Q= Q? QA QG QI QK Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q  Q % Q 3 Q A Q C Q T Q w Q - R$ R R R R R R R R R R R R R R R R R R R R R R7 R8m R9 R Z % [D [E [J [K [N [O [ [ [ [ [ [ [ [ [@ [C [T [g [ [ [ [ [ [ [ [, [h [i [ [ [ [ [9 [; [= [? [A [G [I [K [ [ [ [F [ [ [ ! [  [  [  [  [  [  [  [ % [ T [ Z [ w [ I \ % ]x ]9 ] D ] a? ] q ^R< ^ A ^ ! _i _< _CL _lG _mG _ H ` 1 aQ a0 aA aR+ au a? a a ! a dB d 5L d  eR6 eu e8 e. e e  f$ fD fF fG fH fJ fP+ fQ+ fR fT fU+ fV fYL fZL f]+ fx f f f f f f f f f f f f f f f f f f f f f fL f+ f+ f+ f ( f f+ f5L f<+ fH fL f]+ f` fb fg fi fsL fu+ f f+ f f f f f f f f f fL f+ f f f f7 f f f f f+ f f f f+ f f f f f f+ f f f f < f f+ f f f f f f f f< f f f f!L f/+ f1+ f3 f4 f5 f6 f7 f8 f9 f:1 f< f@ fJ fK fL fME fN+ fO+ fU fX fY f^ fa fb fc f f f f fL fL f+ f f f f7 f# f% f' f) f/ f1 fU+ fW+ fY+ f[+ f]+ f_+ fa+ fy fL fL fL fL fL f+ f+ fL f f f f f f f f f f f f f f f f7 f f7 f f7 f f f f f f f f f f f f f f f f f f9 f f + f L f f f f p f  f  f  f  f  f  f  f  f  f  f  f  f  f !+ f - f / f 1 f 4 f 5I f 9 f ; f AL f CL f Q f S f U+ f V+ f W+ f Z f ^L f a f e f gL f i f q f s+ f u f v f ~ f f f f  g7 g8a g9 gJ gK gL gT g_B g g g g g g g g g g g g g3 g g g 8 g h=E hC hl hm m$C mC mC mC mC mC mC m& mC mC mC mC mC mC m& mC m& mC mC mC mC mC m7) m8 m9A mJ- mK- mL) m) m mC mC mC mC mC mC mC mC mC mC mC mC mC mC m C m C m C m C m C m C m 5+ m n7 n8w n9 nJ nK nL n nh n+ n 5 n q7& q9E q:E q; q< q=9 q q q"& q$& q&6 q4E q6 q8 q99 q;9 q=9 qSE qh qm qrE qv@ q q@ q q& q9 q q" q q G q7 q8m q9 qJB qKB qL7 qR qT q7 q q& q& q& q& qE qE qE qE qE qE qE q q q q9 q9 q9 q q q q q q 9 q  q E q q 9 q & q 5 q > q @E q BE q D$ q }d q ~ q  q 1 q rM rQ5 r0 rA5 rB rD r 5 r  sM sQ5 s s0 sA5 sB sD sRL su s2 s- s s s 5 s s  u " vQ vA vu= v v wM wQ5 w w0 wA5 wB wD wRL wu w2 w- w w w 5 w w  {7 {9 {: {< { {" {$ {& {4 {6 {8 {A {I {S {c {kN {mQ {r { { {@ { {C {RD {l {m {n {o {q {r {s {t {u { { { { { { { { { { { { { { { { { { { { { { {k {w { { { {  { ( { ) { 6 { ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  uni00A0uni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0237uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02C9uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0370uni0371uni0372uni0373uni0374uni0375uni0376uni0377uni037Auni037Buni037Cuni037Duni037Euni037Ftonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03CFuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni0514uni0515uni0516uni0517uni0518uni0519uni051Auni051Buni051Cuni051Duni051Euni051Funi0520uni0521uni0522uni0523uni0524uni0525uni0526uni0527uni0528uni0529uni052Auni052Buni052Cuni052Duni052Euni052Funi0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni058Duni058Euni058Funi0E3Funi10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10C1uni10C2uni10C3uni10C4uni10C5uni10C7uni10CDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni10FDuni10FEuni10FFuni16A0uni16A1uni16A2uni16A3uni16A4uni16A5uni16A6uni16A7uni16A8uni16A9uni16AAuni16ABuni16ACuni16ADuni16AEuni16AFuni16B0uni16B1uni16B2uni16B3uni16B4uni16B5uni16B6uni16B7uni16B8uni16B9uni16BAuni16BBuni16BCuni16BDuni16BEuni16BFuni16C0uni16C1uni16C2uni16C3uni16C4uni16C5uni16C6uni16C7uni16C8uni16C9uni16CAuni16CBuni16CCuni16CDuni16CEuni16CFuni16D0uni16D1uni16D2uni16D3uni16D4uni16D5uni16D6uni16D7uni16D8uni16D9uni16DAuni16DBuni16DCuni16DDuni16DEuni16DFuni16E0uni16E1uni16E2uni16E3uni16E4uni16E5uni16E6uni16E7uni16E8uni16E9uni16EAuni16EBuni16ECuni16EDuni16EEuni16EFuni16F0uni16F1uni16F2uni16F3uni16F4uni16F5uni16F6uni16F7uni16F8uni1D00uni1D01uni1D04uni1D05uni1D06uni1D07uni1D0Auni1D0Buni1D0Duni1D0Funi1D18uni1D1Buni1D1Cuni1D20uni1D21uni1D22uni1D35uni1D6Buni1D79uni1DCDuni1DCEuni1DCFuni1DD0uni1DD1uni1DD2uni1DD4uni1DD5uni1DD6uni1DD7uni1DD8uni1DD9uni1DDAuni1DDBuni1DDCuni1DDDuni1DDEuni1DDFuni1DE0uni1DE1uni1DE2uni1DE3uni1DE4uni1DE5uni1DE6uni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9Cuni1E9Duni1E9Euni1E9Funi1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1EFAuni1EFBuni1EFCuni1EFDuni1EFEuni1EFFuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleaderuni2027uni2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B6uni20B7uni20B8uni20B9uni20BAuni20BBuni20BCuni20BDuni20BEuni2100uni2101uni2102uni2103uni2104uni2105uni2106uni2107uni2108uni2109uni210Auni210Buni210Cuni210Duni210Euni210Funi2110Ifrakturuni2112uni2113uni2114uni2115uni2116uni2117 weierstrassuni2119uni211Auni211BRfrakturuni211D prescriptionuni211Funi2120uni2121uni2123uni2124uni2125uni2127uni2128uni2129uni212Auni212Buni212Cuni212D estimateduni212Funi2130uni2131uni2132uni2133uni2134alephuni2136uni2137uni2138uni2139uni213Auni213Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Auni214Buni214Cuni214Duni214Euni214Funi2150uni2151uni2152onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217Funi2180uni2181uni2182uni2183uni2184uni2185uni2186uni2187uni2188uni2189uni218Auni218B arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2214uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2221uni2222uni2223uni2224uni2225uni2226 logicaland logicalor intersectionunionuni222Cuni222Duni222Euni222Funi2230uni2231uni2232uni2233 thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni223Euni223Funi2240uni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Auni226Buni226Cuni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Cuni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22A6uni22A7uni22A8uni22A9uni22AAuni22ABuni22ACuni22ADuni22AEuni22AFuni22B0uni22B1uni22B2uni22B3uni22B4uni22B5uni22B6uni22B7uni22B8uni22B9uni22BAuni22BBuni22BCuni22BDuni22BEuni22BFuni22C0uni22C1uni22C2uni22C3uni22C4dotmathuni22C6uni22C7uni22C8uni22C9uni22CAuni22CBuni22CCuni22CDuni22CEuni22CFuni22D0uni22D1uni22D2uni22D3uni22D4uni22D5uni22D6uni22D7uni22D8uni22D9uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EAuni22EBuni22ECuni22EDuni22EEuni22EFuni22F0uni22F1uni22F2uni22F3uni22F4uni22F5uni22F6uni22F7uni22F8uni22F9uni22FAuni22FBuni22FCuni22FDuni22FEuni22FFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2307uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2316uni2317uni2318uni2319uni231Auni231Buni231Cuni231Duni231Euni231F integraltp integralbtuni2322uni2323uni2324uni2325uni2326uni2327uni2328 angleleft anglerightuni232Buni232Cuni232Duni232Euni232Funi2330uni2331uni2332uni2333uni2334uni2335uni237Buni237Cuni237Duni237Euni237Funi2380uni2381uni2382uni2383uni2384uni2385uni2386uni2387uni2388uni2389uni238Auni238Buni238Cuni238Duni238Euni238Funi2390uni2391uni2392uni2393uni2394uni2396uni2397uni2398uni2399uni239Auni23CDuni23CEuni23CFuni23D1uni23D2uni23D3uni23D4uni23D5uni23D6uni23D7uni23D8uni23D9uni23DAuni23DBuni23E2uni23E3uni23E4uni23E5uni23E6uni23E7uni23E8uni23E9uni23EAuni23EBuni23ECuni23EDuni23EEuni23EFuni23F0uni23F1uni23F2uni23F3uni23F4uni23F5uni23F6uni23F7uni23F8uni23F9uni23FAuni23FBuni23FCSF100000SF110000SF010000SF030000SF020000SF040000SF080000SF090000SF060000SF070000SF050000SF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2630uni2631uni2632uni2633uni2634uni2635uni2636uni2637uni2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni268Cuni268Duni268Euni268Funi2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni269Duni269Euni269Funi26A0uni26A1uni26A2uni26A3uni26A4uni26A5uni26A6uni26A7uni26A8uni26A9uni26AAuni26ABuni26ACuni26ADuni26AEuni26AFuni26B0uni26B1uni26B2uni26B3uni26B4uni26B5uni26B6uni26B7uni26B8uni26B9uni26BAuni26BBuni26BCuni26BDuni26BEuni26BFuni26C0uni26C1uni26C2uni26C3uni26C4uni26C5uni26C6uni26C7uni26C8uni26C9uni26CAuni26CBuni26CCuni26CDuni26CEuni26CFuni26D0uni26D1uni26D2uni26D3uni26D4uni26D5uni26D6uni26D7uni26D8uni26D9uni26DAuni26DBuni26DCuni26DDuni26DEuni26DFuni26E0uni26E1uni26E2uni26E3uni26E4uni26E5uni26E6uni26E7uni26E8uni26E9uni26EAuni26EBuni26ECuni26EDuni26EEuni26EFuni26F0uni26F1uni26F2uni26F3uni26F4uni26F5uni26F6uni26F7uni26F8uni26F9uni26FAuni26FBuni26FCuni26FDuni26FEuni26FFuni2700uni2701uni2702uni2703uni2704uni2705uni2706uni2707uni2708uni2709uni270Auni270Buni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2728uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Cuni274Duni274Euni274Funi2750uni2751uni2752uni2753uni2754uni2755uni2756uni2757uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni275Funi2760uni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi2780uni2781uni2782uni2783uni2784uni2785uni2786uni2787uni2788uni2789uni278Auni278Buni278Cuni278Duni278Euni278Funi2790uni2791uni2792uni2793uni2794uni2795uni2796uni2797uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B0uni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27BFuni27C0uni27C1uni27C2uni27C3uni27C4uni27C5uni27C6uni27C7uni27E1uni27E6uni27E7uni2980uni2981uni2982uni2983uni2984uni2991uni2992uni299Cuni29BEuni29BFuni29CEuni29CFuni29D0uni29D1uni29D2uni29D3uni29D4uni29D5uni29D6uni29D7uni29DFuni29E6uni29E7uni29E8uni29E9uni29EBuni29F4uni29FAuni29FBuni29FEuni2AFDuni2B16uni2B17uni2B18uni2B19uni2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C6Euni2C6Funi2C70uni2C72uni2C73uni2C74uni2C77uni2C78uni2C79uni2C7Auni2C7Buni2C7Cuni2C7Duni2C7Euni2C7Funi2D00uni2D01uni2D02uni2D03uni2D04uni2D05uni2D06uni2D07uni2D08uni2D09uni2D0Auni2D0Buni2D0Cuni2D0Duni2D0Euni2D0Funi2D10uni2D11uni2D12uni2D13uni2D14uni2D15uni2D16uni2D17uni2D18uni2D19uni2D1Auni2D1Buni2D1Cuni2D1Duni2D1Euni2D1Funi2D20uni2D21uni2D22uni2D23uni2D24uni2D25uni2D27uni2D2Duni2E00uni2E0Cuni2E0Duni2E0Euni2E16uni2E17uni2E19uni2E1Cuni2E1Duni2E1Euni2E1Funi2E20uni2E21uni2E22uni2E23uni2E24uni2E25uni2E26uni2E27uni2E28uni2E29uni2E2Auni2E2Buni2E2Cuni2E2Duni2E2Euni2E2Funi2E3Euni2E3Funi2E40uni3018uni3019uniA64CuniA726uniA727uniA728uniA729uniA730uniA731uniA732uniA733uniA734uniA735uniA736uniA737uniA738uniA739uniA73AuniA73BuniA73CuniA73DuniA73EuniA73FuniA740uniA741uniA742uniA743uniA744uniA745uniA746uniA747uniA748uniA749uniA74AuniA74BuniA74CuniA74DuniA74EuniA74FuniA750uniA751uniA752uniA753uniA754uniA755uniA756uniA757uniA758uniA759uniA75AuniA75BuniA75CuniA75DuniA75EuniA75FuniA760uniA761uniA762uniA763uniA764uniA765uniA766uniA767uniA768uniA769uniA76AuniA76BuniA76CuniA76DuniA76EuniA76FuniA770uniA771uniA772uniA773uniA774uniA775uniA776uniA777uniA778uniA779uniA77AuniA77BuniA77CuniA77DuniA77EuniA77FuniA780uniA781uniA782uniA783uniA784uniA785uniA786uniA787uniA788uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA78FuniA790uniA791uniA792uniA793uniA794uniA795uniA7AAuniA7ABuniA7ACuniA7ADuniA7AEuniA7B0uniA7B1uniA7B3uniA7B4uniA7B5uniA7B6uniA7B7uniA7F7uniA7F8uniA7F9uniA7FAuniA7FBuniA7FCuniA7FDuniA7FEuniA7FFuniAB57uniAB65LP_graveLP_acute LP_circumflexLP_caronLP_tilde LP_2_grave LP_2_acuteLP_breve LP_un_breveLP_ringLP_hook LP_diaresis Qu.lig.smallQu.ligctQ.smallX.small Thorn.smalluniF000 Cyrilic_BreveuniF6D5uniF6D6uniF6D7uniF6D8uniF6D9uniF6DAuniF6DBuniF6DCuniF6DDuniF6DEuniF6DFuniF6E0CE_markstrokeTrebleBassAJHTJHMRPwr_PlgCtr_PosCtr_NegUSBBitcoinuniFB00uniFB01uniFB02uniFB03uniFB04uniFB05uniFB06uniFB13uniFB14uniFB15uniFB16uniFB17Spike|}*+45;<;<<=            *8latn NLD kern & :{\ng0~G)637L2!*%!FIt3`j`tLtFD(; 97 9 88(=+CEL7JABL??1E/I8IK<<C`6J>;&.#)LK2I?:%+t~K=A25:6,HAI8789-(>/C> I(k J?"?7K2BHE!( %A*0,2?J@%4&9@&E 6G&1mB7"  9 @$d>@21*$/IJKB*/=30)t-G?;+EII.30@:9H9%I!CI4 IA*0,2?A*0,25314~@9RJVz(KHh.k7;)J7&Hz%1RW#* 96#9J2?!+"__Q+[&]&bGI2 /:5/5("':DI ,(!?:K?8.63FIn J w% G0E(7?!*H.y"HA4D0= /3C;L9 I  xW'xL! 7!6I0"<2J* =4 *-!0KF22 DHL J 4 S&,H=3+KF 0q5+ ]$%')./1=DFHKNNP]ll*xx+{{,-48@JQRWXfghiklmstuvwxy{   "8::<<>ADILLNTWZ\eghkkuu~~!"'(.035  68:;<  ='(>,,@00A34B66DGGEMMFOOGVWHZZJaaKcdLhiNPTUWXYZ ]""_$$`&&a((b**c,,d..e00f25g77k99l;;m==n??oDDpFJqLMvPPxRRyUUzWW{Y_|bbddftvy||~~               ! # $ & & ( ( * * 0 7 : :( @ C) G I- Q Q0 X X1 [ \2 a a4 e e5 q q6 u u7 { {8 9 = > @ A-$$%%''(())..//112233 44 55 66 77 889:;;<<==DDEEFFHHIIJJKKNNPPQQRRSSTTUUVV WW!XX"YZ#[[$\\%]]&ll'xx({{')*+,-.-/ 01234454"6789..:;&<<=>?@0AAAAB))CDEFGHIJKLM  N  O    554 P  Q      "" ##R$$ %%S&&T'' (())7**++7,,--7..//7001172233U4455#6677888::&<<&>>V??W@@AADDXEEFFGGYHHZIILL[NNOO\PPQQ]RRYSSTT^WW_XX!YY`ZZa\\]]b^^__c``daaebbcc dd5eefgg>hhkk uu ~~V477777/AA&A-/4-.00)45 P 9"7   Re 49<     2  ''"((,,003344&66GGMM#OOVVWWZZaa&ccddhhii& >#  ""$$&&((**,,..0022330445577A99;;==??DD)FFGGHHIIJJLLMMHPPRRUUWWYYZZ[[\\]]^^__bbddffgg5hhii5jj kkll mmnn ooPpp qqrr ss9tt vv ww0xx yy || ~~   RUU779######G8V&#8W.-....>0 4444cdcdcdccd""  8      89#  `   R #    O          "    #  %  ! ! # # $ $ & & ( ( * * 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 : : @ @ A A# B B C C% G G H H* I I Q Q X X [ [ \ \2 a a@ e eN q q( u u! { {  5     $  G$$*--R779:;;z<<=={DD#EE$FH+JJ%KK&MMSNO&PQ,RR+SSsTT+UU,VV-WW.XX/YZ[[)\\]],llBxx{{B*#+u++T***#++++&$tuu,RU&&&&,,  +,""##.$$%%.&&33/44556677T8899{;;{<<,=={@@$AA CC$EEyHH+II LLePPRQQVSSTT&\\W]],``+bb+cc gg#hh|ii0jj.kk mm oo/rrssfuu,vv}v+&,*g**#h&+}X+,*#i**uu-.&+{,*++T$,.Y+*+L-,w*+Z[  +  CD+,+g#+\j  +!!""E++,,&..///,00]11,36+771882993<<k@@lAA^BB_CCFDD`GG/II/JK4LL5MMmNO,RRMTTPUU6XXnYY+[[a^^+__xac+df.hi&jjlmGno ppqq rrsstt uuvv 57+b+, /*#$$$i##+%%+''+))+//+11e99&;;&==&??&AA&BBCCaDDEEuGG&II&KK&OOQQSSUU,WW,YY,[[,]],__,aa,yy-.///Hzz{{,{,&T#*#***********+i+i+i+//          T'ckk ww 89:98;8<*=>99I # . & { ,    J + Q + ?  {  &    .  o  *  #  *  #  *  #  *  #  *  #  *  # ! !, # # % %& ' ' ( )N + + - -p / /+ 1 1+ 3 3s 4 4@ 5 5 6 6 7 7 9 9+ ; ;+ < < = =K > >~ @ @ A A B B C C D D G G I I M M O O[ Q Qe R R S S+ T T& U W, Y Y. Z Z% a aq b b i ig m m n n o o q q s s, u up v v+ w w& x x } } ~ ~A  O + r  ! " ( d -noq?2ESuA+Y!5 5?A6A4%DBGn,~:7!+JJ%KL+GF439  J/H+754)( @J4 )G7.K.3i<>:4 7AK ,7 Fv'h  g:?&O%DBA>HAf*#&#,E)7CLEMJ'F<1(;1( @,=3*($/9:JK1B+&8 #?@?HA;9+@8F'JJ. 9/C \{f %D$&D3D&9,$KZN<]u0|K9G=E(4@@8 7;I74K>L? ; /K&& 4IHA2Cb)j)5mzqeezec${"JSTMa5;TDY/lZou64At-]sm !%B>CL=;D=9:C'B'KG257AK:)0F7<IKoKe!   1j [}V=1kaTF2'3<PLFMrhF@#G!r^r`1:Y>kn1\bJUS82SLk@Ya 6#a$'/z#eOe 7IB(($I'$I?<I'N(GF?, "KI K/^efijlmnoqrsxyz|}   !"&+DQbf  P ]eeffiijjllmmnnooqq rr ss xx yy zz||}} !"#$%&'()*+,-  .  /  0123456789:;<$!!="">&&-++6DD<QQbbff5+>  1 P P( + +Xh$$D,,i--j11i7788k9:l;;m<<nDDEEEoFHFJJ#KKpLLMM$NOpPQqRRFSS%TTFUUqVVGXXrYZH[[s\\]]qllxxI{{DJitiknEFuFFvDDDEFFFF&'()pottutuiiqjpwpppiqiqi    i  xFqy(!!""$$&&((k**k++,,k..k00k22k33r44l55H66n7788n<<q@@oAACCoEEHHFIIKKLLKPPjQQSSlTTpUUzYYZZ[[z\\]]q``FbbFccdd*eeiggEhh{ii@kkmmnnkoorqqzrrlss+uuqxx|yy}||~~~,-hFpiqDkkkkkLDDJE.&pFF)iqDJEMDDtutukkG pFqDFFnoq FDFGq DF    F  N  /FqFLEF0  F!!H""##$%''((w))++,,p--..r//q0011q22w36F77O88P99Q::1;;<<R>>w??@@SAABBCCDDEEFFGGrHHIIrJKTLLUMMVNOqPP2QQRRTTUUWWWXXXYYFZZw[[]]w^^F__acFhipjjkklmnoppqqrrssttuuvvAUYFwwwFHqrDEoooM##F%%F''F))F//F11K3377'99p;;p==p??pAApBBCCDDtEEuGGpIIpKKpMMOOQQSS3UUqWWqYYqZZi[[q\\i]]q^^i__q``iaaqkk4mm4qqyssuuyyyG}}Z55krkrkrkkllHlHlHl[lHlHmmnqqpHEDEDDDDDDDDDDDFMiiFMFMFkrkkkkkkrn    n    n  nzkkww\]^]\6\_D`a99? z E p q  l H F F 7   p    w  b  D  E  D  E  D  E  D  E  D  E  D  E ! !q # # % %p ' ' ( ) + + , , - -c / /F 1 1F 3 3% 4 4d 5 5 6 6 7 7 9 9F ; ;F < < = = ? ? @ @l A AH B Bl C CH D D E E8 G G I I9 J J K K: L L M M O O Q QK R RB S SF T Tp U Wq X Xw Z Z# [ [ ] ] ^ ^; ` ` a a< b b c c d d e e f f g g; h hk i iL m m n nC o o q qI r ri s sq t t u uc v vF w wp x x z z } } ~ ~e   = F f B w ! > g " G\]n_K5@,+1&3C2F';SIs8sB%::]4;;:;%j_w3`jM [S/Xhfw &HJ8G$Y$C VT?BG@ w< 8aB3 o&*L*5 9CJ E?J6D+C # 7E' "8f' -" j D kDZ<(0q*5] {482b&3C3244AD>6/3( > / FD2 02n~OJ2%/B99!"B7J$H$8fd='@dS1(=&[*O %H!B8B4*HC: K %EF;=,Ddz0E9C@.0?A#3P3aFb`!NFtRqQT$At{Z%* =+G \ :H8+;>=Ljemh !;Q3%%569mF1.=^6H/>GKH]\sw DF //Xnm~GL3 (0@;6K8BEX GG-7@;GBDJ!;I+?<F.%*CIAHB BM ~XBXcD;~%J$e?$)t,F*F<*MM@$%1+=% >8D  /#,K>4F2@<   @106  $)4:#I(Bc"#$%)./15789:;<=>@ABCEFHIJKLNPRSTUXY[\]^_eglmnopqrstuv/1ABCKNOQSauw  ) / = K R T U V g ]""##$$%%))..//1155 77 88 99 :: ;;<<==>>@@AABBCCEEFFHHIIJKLLNNPPRRSSTT UU!XX"YY#[[$\\%]]&^^'__(eegg)ll*mm+no,pp-qq.rr,ss/tt0uu.vv12,345678,9:;<//=11=AA>BB?CC@KKANNBOOCQQDSSEaa>uuFGHIJww,   ) ) / /7 = = K K7 R R0 T V g g ,S$$y779:<<DD~EETFHJJKKUMMNOURRSSTTVVYZ\\xxqyz~VWXyyy~UTYXXUUUU  W""$$&&4455667788@@TAACCTEEZHHIILLQQSSTTUZZ[``bbccddgg~ii\kkmmrrssxxyy~~ !S]]U^y_yyz~"U#$]yz~yyXX%UyTyy&    '~()  !!""u**v++`,,U003677G88H99I::*<<==s@@+AABB CCwDD,JKJLLKMMPP-QQ.RRTTLUUXXYY[[/^^__MachiUjjalmrnobppxqqbrrossCttbuu vvcRbdDKN0b1y~TTT##%%''))//117799U;;U==U??UAAUCC/EEXGGUIIUKKUMMOOeQQ2SS3kk4mm4qquuyy55Uf~y~yyygyyyyyyyyhh          i6kkbwwbF787F9FOyP99{ ~ U  Q    U      y  ~  y  ~  y  ~  y  ~  y  ~  y  ~ # #j % %U ' 'k ( ) + +W , ,t - - / / 1 1 3 3 4 4| 5 5 6 6 9 9 ; ; < < @ @ A A B B C C E E: G G; I I< K K= M M% O O& Q Q R RE S S T TU Z Z ^ ^> a a? b b c cl e e@ g g> i i n nm o o p pv q qq u u v v w wU x x ~ ~} A  b E p n B  ~NA7B&J(/'J@H+%L08FII8;JKJF 'KD:C@@t]=5$77*-.Z"BL55>9=B %7@IJ B]HhV r4;G::X> NQ rAJ''{5<% H@  G#J>*JMM9:<+2+* 3-:H4U4q 6K 35 $-4;=IJIfH;#,GJ<D"D;;:}JG; 6g29Ng4K6?@A/=;E-0.7%%-1 IC ,L<@BE"6CEG?,9 'K.I@#2E#QVN:V9O4&4. 8H3#4/L4+F<#&!/7-A>22*TGC9" :9D%L 4D7c /@<u@O(:A.?LLC1Y:9IDz!2':L'zL& 3 53 @#FvE-E# :q5*!+K8:(DF72&96 ? D E F J L M O S W Z ] ^ _ ` d f h m n r s v w ~  U      kk99              !  "  #  $  %  & " "' % %( ' ') , ,* - -+ . ., 8 8- 9 9. ; ;/ < <0 > >1 ? ?2 D D3 E E4 F F5 J J6 L L7 M M8 O O9 S S: W W; Z Z< ] ]= ^ ^> _ _? ` `@ d dA f fB h hC m mD n nE r rF s sG v vH w wG ~ ~I  J K  L Me$$1&&{**{--w22{44{7788899::;;]<<;==^DD|FH}II~JJMM PQRR}SSTT}UUVVWWXXYZ<[[\\]]ll=xxh{{=12{k{{9;|}~}}111|{{{}{}}}{{{{kkkw    {{{{}~""8##$$8%%&&>''((9))**9,,9--..9009112293344:55<66;7788;99^::;;^<<==^>?~AA?EEGG{HH}II?LLPPwQQ RR{SS:\\l]]^_{``}aa{bb}cc?gg|hh_iijjkk@mmAnn9ooppBrr:ssuuxxzz||~~}1{99999112|{{{}{}{12|{11kk{{~998m}^1}{{{}{; }1{}`aC1}x  {  }    DE}}|}y  }!!<""F**G--..//00 1136}77.8899/::;;<<==@@AA BBCCHDDIEEFFGGHHIIJK3LL4MMNOPPQQRRSSJTTUUVV{XXYY}[[i^^}__ ac}dfgg~lmKno!pptqq!rr+ss*tt!uuvvu"!v#4,}j}<!1|{!!##}%%}''}))}++//}1155~66{BBCCiDDkEEQQSSUUWWYY[[]]__aabb{dd{ff{hh{kkmmooqquuwwyy{{88LL99999:M:<:<:<:N:<:<]];^~^^n<|~1|11111111111}{}{{{{{{{{}{{{}9999999;    ;    ;  ;$b\kk!ww!-o5o-p-q16997 | ^ { O P : < Q } 0 }   ^  8      1  |  1  |  1  |  1  |  1  |  1  | ! ! ' '% ( )R , ,S - - . .{ / /} 0 0{ 1 1} 3 3 4 4 5 5 6 6T 8 8{ 9 9} : :{ ; ;} < <U = =V > >c ? ? @ @: A A< B B: C C< D Dd E E G G& I Ir L Ls M M O Ox Q Q R R' S S} U W Y Y Z Z [ [W \ \ ^ ^ ` `z a a b bX e e g g h h9 i i n n( o oY p pG q qh s s t t u u v v} x xZ y ye z z } }f ~ ~  g { }  ! '  [ )   ~  6latn NLD dlig,frac4hlig:liga@loclFpcapLsaltR"*2:BJ@tP:2 ( X  W W4FV6 ,     ! !)B   "( IL IO I L OIDW  Z(]2 >  M 4 D]  ~< &.6>FNV~}     R$:F -- MM - M,L:Dnx $ $ 2 8 9 < 02 $ D R X Y \ 1R W$2DR?N $*06<BH$               $     vedo-2025.5.3/vedo/fonts/Normografo.npz000066400000000000000000003306461474667405700176750ustar00rootroot00000000000000PK!4m font.npy ̽|U7>I =$! iГ-3;DņbAD@EE,4AJ(byTlA{n>}ޝ9|93Kk*~Lh=3GFJ4w[*Os3oNi4q:2zeM/t^>uƕӯԧ+gLiաЧMmlrЛB]Щ̳7^_짹nvr9oߍ@@tt#daB+[nvTB{aWXyyGd&Wv䊘jדIuEJkS\1䊝93_J M-Żti'Nn1GΞ`uߖoH$[f[$D&Y)I-8͖8]olVC06 ?A䣎 k؁#6&;ꨶ֯^_4PVt*[~jK~&W';8tr%p+IY>8U4 ċvkQ,_/ ڂA AB0hhP! m^6Dh6DD"D B4m, !^G$64mg(t m7.BwnB:hwhh/=h2@}A3@3+GWխ]3\钫{!U͇⼓醽 Ix&m/lO!>^&qO?Lh Y5񽰽;qS6ZWV+䥮ɕ<>\|Tgq^^*:CEk?*E2NVjuxDD^s[MfHu `llX-#jXrcJVo__V8#::A=WA7~[:#./'ecT w nr WgUaFx +^ &a 1U1W\|B!1rM14lgRqᢓJj[l!*ijM'u^hR=!H"QE6mRHl@y/BO=傶Em' =4?_½ !ea"Ao"m$zA/04c<pn0B(Aba$h v0Z%#+ZvP.V:AJB-jm=h`Ԏ&8IAe CMP (h=IDt2+@' S@&W j S+q)\tsW :H{iw0:Ch]@o8hFlw#_7R tu5T\EاKrRpW:)(Tރz:'JAb=*hսF)=&e:[/?:ݚaKyiP 8JRt|\ DU!M*]z,3ؓl ZmRg~%;[}A]0bN]֯ў,uc$@ވ+R{m}z(gi >%Z78rmE:0z6{=aײY_7ۣ_o'x)XQuM[E}NfΫF͟f(Pcq(6GPAyObpa;1}>L{K}LZ6G=(_|#k*GBA\l|EKuGjT=?{4(v#Uxs8O,j{x̦[{X-kW/ct`a`}*q/3;WƯL0cѸݘbld,7ٟ4T8Δ\)હu^ﳝ@'ǟu(Y=am0"+[;Q= #&  ^ h{RɾI$ m ΠZ"D;w)8G7|8Xt!YbN'{\D= 3@Dj={YBAdj"՞1E/<jy zAA;JhvpPr\%<JyH߱ǣ-;(*@'@ B QՀVQ蕂yj.&\ \t1)bRŤK AKAEŤI.&^ 孀r%^Lʼ*\5hAcL@LcDlBJ)S^I}:P|/WMPnv^v jYlЫk@g s@ ׂG;O<ho'zp3M-7 ",U tp;m"@o$.F;I $a IRehA':6棽t"ڻqw +@ Vރ;Y)܋J\M &twUHJTqrpO- |yP^/?(!S@ݬ<R\ah4;oy)TR%g屎7-^P^``埅? ˽2:Uj#@۠? ۾flKP::X+}~hOqr_L=~c]SˍUXcR^g/-˨g2g?gn>Fu_ל睩 8:C5d6 l(jPҐP4M倨'kY|l3EkjuNV+]=DIAGlݣ|II.K< vO[PG^}4c3lFZQkF=1qVU^ff-N/YdTa sKGvV{CB9㌞FQi|e=,QKJK=ծ~HLx*aK+<|1T=-ʛRխ*/*JtR*=r-կUy*y8ڧ8 ?vu<λ`ww଍=UN *kƅmv\^ Sy5r A 8(`@@A)v"@(Ma3O<'6!`7Pq Z<t $͠A eolO8v';z)LLAR A咯622 Y8z0ǯPhPf`f7@M>L6y3dpf7F*xpd 440$b{5r<^N%n(R&N} S}u[9ڰE6`U$ 8ENS~ GI@0@9@?$_$?$p"r (DOT$hl$l4Py5 r6zs.sћ 8Öml6 y#s .7 y3r./`ʁs!B䝠 P9Cmd\cFo!nh WD> .@PXv Y qȘx!G> 㠏'pIO}SZO Ϡ]#GY|[:azlوmO ϡ}JxS h7a6 /e/[о[h^* U5mоu ›o;@!}KSxt۠uM.4 ]% :ʥy:7 `͵חkk=j(?$gm6?PyO-H2zF ^R{eIkq5.MQ; f{$JPV˷%NJLi(k5M렽.Sei*qB EQRf2?˻$Rݭ}tݍp5{pUu,WʯQmYTl]jg;B&=do%V,=6w{XvvZa6QCߴil{Yor#='>k|VQq+1YK|T`\CF+wKl&;?32+ >`FQ<;uRc#W~IQnSv)kKm[r[ca${eMuߍpXQż/-wx>{jM0JklOZ?c-G&9D͉:>W9{mk,j"mz%88őG>dȃ#O6m 11Pq]q-1 xa?~AxVqV JJ"#,C6Tl ;3ः : D`F|/#e? t2 I)!x2~&BGBAdUk2yɧL|~qtCǩ}y=ZJ;yZ]^Jq|vrlQi8@abbmݳ/R}OyfkgOKV)JCz#2gSw^aF|8q\99c5k4=Ѻ#m7;4G~xQh#u>U2j>bE>18wQoYۮ\uYOwjʺ:z^(w+yM> U|+8?V Uu#9~<~8qiʧЋ78.&˘Ls)4y 6۸[ĸTBTBTBt߬38gM8k:V:!W:9@S5^bghKhGX6D` l^!Y!ZXYYYYY\s`Š<;t1|*,\tKGt<0+++++#7MMM1ErÅ+nrι".8ԣbs濿O?F3Go>EYK[)HVKծTyHlUoQvwQ˿|??n24ET(~oϷ{)G dm_>th56?vԁn.:D#et G 1͕z ՖR>[ᔆ9;b\O._Bۧ}o!F/}8h5::3P;\wq1\K<⸔~d8rHB`s:7c 4M=" LALD3E*:A 6$$d7œInn\v 1djDۃ/yC!nH6gӌ'|۹$<“5@id0`nm^3'Bgb8ܜ.J>3]|tgz R_<52R)JTڤB+@u*^sV-56EkZ{8r9}\49sYY[gC+/-MRl쫬oPGTfa[`Ψzgy.y>{=W _? 'ųlfU'#IL_ ·*I*Sg۽S R^}z?찞z~<%uR}riۤveNV2o{dGm%N|e\Di\@ 㢴R_Qy̡ 5ɓP3MlKB'# E_ƛԁD# P'ڃ&$x3Э+t_&P..;H̲CAu\LAw_yPh%DP44;"zp0 @M]4@ &&Kq="cI=^z?|Or+?Ls66*<3`ֵ7Yj#dTݳݛ&IcVuIMjV5 ]"GGSjޖ}rWyQi|ۧlFC^"#JNѕ+~}_QxʵBg9p&ñ~ǯɯk GI7y> {R.V)J]anfN7'nfzRo_'/OJ)-\G.7Xо<-]mIAvB{Dre-<(76(|_rmyq/WU;WkRl-Fɿ;b6{bkqIVb;hU-̱xo?}e'&js^K(muY㶸҉ן{b͵^WʵŽʋLN N&@B,H]R)v1;D#$ځOpfh_ku߀nFM߀F' vӧZd\lK6%WY<+ɋIr\eo{&N߀Wv߀_^UEn)" (2 ʜK 8`h; \t\{}*[xgK- {,$L?8dVD#.ؿk[{:]#߭зj{Yg%C߲6> !~\GU<rg =\\ڎQRg;21ameZ &1sK;/*)ec>gw~d ef {ma/0ˬSc )wf`7+{ީM -Z1qߠi3|>6r|s^BKĆ(2r$l{h6l%hr/%W_*7Ru>PrvzZkWc |D+(x/Vb/ _w@ٚu9C>/͕BZ1Zjl}=ZC!*8c2;Y_fk}v{,-`l09c1(0αnFN;+6հl ul=>?B/[CpOd7>5bk10 #ϸdT#O'sljqq?VF۪wٟ6F7}hSME7UF)/*6~Xԟe%,}hiw~U= 7/4sI"̉` մ `ad4Mc7`Rehbh2pIESƳ$h"̍$s @dJDE"PnZ$Ho"1&yHc"h{dfDMF47FMF4AGdjڐ9h0V0&1Rb Σ GLƧ&(q1R@!yPHc!q c,Do#Wme}}8k!7XH~c!\Hy4 QHuX7{<`M9v䏠d0rFPN {M_L1Oy|[w·ݹke;cp2O*-Q)Ge6(+ikw夼NY~8RPyOUs5 pz[N?2vg;5_?_}O*1nPA5mYɬ ROG^Mw3Yt\W\Jpn?UnP~ ]!J >& +&AA::`-<8PPCIB)MEvhWy<4lx6&w[PfH > 6''w]fp~fe+UNZU}[MaxV YO7y}CU~Xvs-kmqAp-bt@QMԢ$9lKCqpY TKԧԉڽNO:_oc5WT'nެ=P`^-V<_vŸ6Xް՘]{ 4a?P N85JpK?M댻! ;H?Wo0$d6Ԏe܃;J*G|Gchph,2h{I7(t/0tWF.FmspǑGAw"=ͨ`a}iyg9!`$ߌ #}Yҏ(*8W,͖R멪5/GٗOKG1[.jށ8oHwTƱ VڳH3m<˅f@cߧ3JC)a(}=7]&ԏ ] SQQdmvu^hcKvV{tLzΑec&hz> mmkqgT߆*]{Xhb.>*v}6!qx:dj˟0U;UhaD~V?Wh+ZqV?;f?B;K`d3a߳c_}Iݮ<_M8>\̆y*%2ncU]Guaz aVu:V~" J8G2~G޲Z'(Iz7yJ{xJr#D~KeP n˴}B2ڪIP5PDNZgE&,zWhɦB[wQ@ʢ- 6WZ!U[8VN-TZHzaXGu @q,FSi&zb)&RXrKm442SLug/ KILfR/G7#CHPjzhjc8MkR3?z#8 UB|Og +ʧ3 hLL(\P>QAi%UdVAZNi)d!ZJh)dzb*UDhEd!" z:eCS> OJAza0 c hpa*MCJa:#[\ c<&ab)15`b)&Rc)15Vm,%ƂTRz)Rz)RZQJ+;J)r_JiG)hFxzi7-|J]-lBPbBa!Bʅ)Bʉ)ύ)drʈ)̘rʌ)ܘrʈ)̘rʌ)̘rJ`-rJLqum @LNҝnJ7_}z>M_M\֋cr1 Um*WUXX3.ޯrTկV}GgKJg8Rft5 =HCoϱjo?892+ WɊ*Aة,6<Njo'9e/>ᶼH3H%RqZ6ǡCoZ.Eǁ7t\0PkCKFKmG9Q Dz:͉!ג)lRHK&P$Z%cM<@JY襡%NƜGy&u=&\{f~`_su? H%-ss<Ÿ4к3ipc?qܘe>lz 9Sʹ146ͬ/w֗[޳S_emޱ_YX޴^wJ:nT -[,ˬl*÷zw͂9s[V{Y$|-bz:N[E蛠Ұqb6OcۤGq5j$fbPVikgLO?p?wQb0gՁ{Q\n'wG&˻0Z2Ŀ7[Ja$hv4Xv7[;6N;njیɀuhmR*/`8BY/4K(nF0IU=&I2G;6IcSb~ Zubei#.ZG>`O7[/Գ?;OFE< c<%)LI+$YOS­:+%4yKdvHeЋ'3(Oי|;u&ߩ3LFGg2>fffQ 5LLFHs)xgH2;FbcxD,̎pU;L`2>SB`Z?:Pf0zzi5`TC(W<F4j0RaRHF*5Tk)T>!kOmiϷ*+~dDK(]zV<9-LN8U@s5~KB%RFQQjGd; G' 7x:giX-%U:tyrhiRHN e AR1ܓ#O.<9"BUSf#SLEpuM2e6z *𛼜J V!uYT+{5ԛFBZPC~[ m5ՐVC~ޛ7 yo,Yo0eX@ڋVo zׁ tTɟ&.liC6yoeM~[6m]-ǑoRPnJ S*q4cC-sznʌ͕_T\sw-ϰ(֧huKkm告WVOT?bÏ^/ƅ h wZukRcG-Gyi\ԛ-bTS %AXc`"(a&yr^y\^f!dmBrBB ! @d%`x6z֏W4Eaqr%7әcj'jK_oB zޚ` fem~H=PW]i XXHJ'ؗكDU<&^% rt`i?`OW_h6ZrLzk7!J }M)Q $PŽ(!l(4 dOӜ1m~VߠMzG7ilhWNKs60i~>G}CӴՋYUە#6n}=f!w$vĞ[ :1ӡi*?q@}Hfg8n=["Xg7b#D^#)7duՍ*5O''-XJEkT| ?P/':sWc&F1xդ/{ [Gƅߜu+đjkLӉ~KT&$˖ { a &IPyҙ?eqa 4K bI =c # Q4m}z&b!de b7R27&SӉ8W/J ʧ)KyΝA] ݻԕ\JL]]JR (mݥ3<4GiSS(RBER(6rRszД}Ӆ*dB3n[B)O@R7Xm10#_DBz9Y (>Jw! [TN[F p#Ĭ#g.֑UGU *&Q䶚ܨjr$ڧ.>h]D$SqW6 i^0+A]LvAO5,*4p5(_8*̠<3h x1޻7"3(;! B3g7@[򵌍~*4JF򵌍~Šp;IXZc{"Ǥ1ٔ+H~Ǖ&||T4e#we2H(uJ_~w-n{(#m[J3-Sb$ͥv}ju?EƲ[ͶwA_jV5ȵɖG-IV?vvz]STTVڱapWMۢt 9eql6ߥbGm=3ٯr`5_{I+a=Yօ}ҿ>QU12Zv9>{%Tg^ӟ0o&IbEl7l#eq愂-4gg0pCƳpq-fb_ؓ:֞հ%z?}vFM?qG"Ù]R9vK_[=G*:^w+3#*8޸M#gYO}_q)1~G1ax}%kM^wJ\95L7YE, ф)6bZtfлN8lH[hK.g F{lc5DS(_pܴDGpX!1rcZbLҋ!!IUMIX\[rK{QtN@7AmY[S6R߹8k|Û6t" /@ci8EŠu嫶9`c L1c908l3aUP `0jlk ޠ,*g(˪B٠Sb-Kt {Z3Jkϼ.7]:u~r)J$ R#(_߻5 G3;>%$ .WhI n֘7~@1־֋3ѪZ Ə~^ܹi}7 ŝOjG=|<ܥ,ݥS$G=ooe%,Г%2Fߧoԯsib)Űoe|]LJt( cqsqx҇`Lmjc8?g{_[޳<iڵ-\7 qݺ\9i7V*GN(lK$ 3,f3o,+{f!=V[آ[g=*G*P!>U%O餜c- QUstϷkDbkCE#)ɕDj=$%"ã"W4I*IBG_|a wozżWƷ7>?̘h;NB$>ͶIX]sW{ &$1C<,Kmm6[[Gɶ-0[x@c$OC"}lYm/~ړjG.e<[$*Muӯ׃CVPY^;fJJI׵??t4;"\ِߗrWP*j:S]R=fq;a6FF1xb7)!w76~gifڻuQ{E}IKg%j[_ϕZ *J3p\n 6R3l?u!Sש~.=m@mA鯔)v-׉k7LyXd"3lej7/oK51|.OM#Uod]%0/Y~Y)B $LQwɔ>5h_Km(ZeVEZSp/hb0Q#V@ X BR:y-bqP!"4ٜA vΠ ZA<[jX9WyFY&j˴sYj*,8G?n?xb5ǝ8:W[/qsp"aƲoú:@Z٭Z|+:b#\7^ڿ>=3Ǟe$ߛ fX>f;m+܁\-:bus#a^UvZW!U3غL SUAdmg {IȾO"{'&崽<q˨\"+++Z .Wu@ %^OՖ^t| /4u1uyf%OuUd9]@.Rz) VB3C(=C(=2Q9~.U/c^$J)ݒ+UAUIɧU/U azs~B@/= |zP8ppp zT8,=&|RZd4im455p3ic@?fX`wR@iT"y_~LGޫȪpOYN[*O[ViOCQG<Rwٗ;3pѯ)Ks wmlg+UpM]DzYcaEcc*nZ"7mW8*5HP)\_2jlϲʊ9Ut'[#͇}ǭ&4<.cښfB(6\ЎL4.*J 4I L?wAPQ@.-EÔtʮ;&ڤڰ}hf*L8ݟn"=QF_{4Mn~űWVy56Gcz, jWmTA;=ՍlG#ͮe#YKc_1qBsZv̾y|y:T{A_7ޡZ**f蟊юNە|u&;%Z|u;ClqP+ |9F3!ѪO ;V?]ӿ[CVKcDo\q\`|ְnJ6UDoǦtWn-$g =o;SH&7!P3I35Q5(&LPIEy)Rߞ%ChĂ 9??_QGfeA{Q2{O_2{ dvy?.~rh&P96b}aET2RaRdPb[#d1Q)x Nh ҟxP?~%o=%.*/f]byYEJ*rk(Yd$E ѣA8"Б1^6l h{(,RKY(ԙE ), uf"œE'Ozpϱ@>%9TR9(uj\ZB^J~F~N~$,f Ē4Oϟ+V'åm9px=aX۸1da,Rj#S*=@TBO`VX6W Mv5!eL8;(t7{|/V/UZ?uM˜1lqJ[VC_e ~z%tBϘ z&"RɝWx*2S?} A!‚ma߰Dc1h 16֩1>3~0-ϟnP $[)sCi|Q͗9{ 5[Ky=2x>E]P)*?]\48BI-0@ Chro"~Tʣ* Ygo>4I%-QB_.Ƣn+6(T$㏡do(,ϓRxzaQ)Y)"+ܽ6;]xtGxFhOĘ|2gG?I|A_yZܷZlO׮V38hլ'/f9:+4\Z'﫚l@ZܲM6!65-.Yu=˽c!-L6_E˗InQ]B%`Z; YJAL*WEY[y[ro.L'|%Rp 5ͥZ(Nҁ,a@HB^V5X¸ͨ(Ǡ"⮨3 Bq\qA>uBdos%]}嵍±i0Vine:l j2 h<x'Xq|%()[nR:R4D|$#Fh]>:ċC'|#u$#5@5C1jA̮1ѕyR$"rWDR$"fW])bvtf1 ^}ӌV7FX8A󼵊1^׏OZ,IO!Y7Qfbm@fjy$j4Z�_Ӷҷ ;^ bg'ej7Zu[Xq(ʗ3I݊sV5[1&`&ZeAIb^xLȂ?5ɺRNpv3ܿ'F4}b!:n1#"}`"i0;JyqHm9ӎ:? ʡ1iL1LyRSAӬ:]HVdX3Ĩ:2ZS:!n}+)-dmW*V%~_5~_}QkR[;jc z8)ؠ@f=6-إo`MbEwMN81EGs7n}ԅ¨7XQܚVΧ%#|HLe M=fj؟\vؾ38Qa<_;eBU#ERޢWz{b<79JDUGm-m|1syKܿ#Hgcims9Njg?uYÍYSŔĔqj| md3Cϥ 1ݟܞAb󙁄U Fc_cn>M猙:e0`-ܐO`:ИO\ s0`H8ao$qH& F,$8kM# GŊVK$H T 1 q4+bX9V:7]4}XcX:l䯴Fk>-u,iRj}w@Y[hnU[*VWͪ~iu7lWӣjeK:vtm5ȚT˻69yV?WyVଵ' ҄(vwll %؎Y=znu'C&A|lE 8^t A"adMh\RyY9oxA\@y.|D6 s oGNc8/mBLVR +.+rVQERrvڵ#WbmG=ۨ.Rԥ_߿D.wmۺcOU }%ʹV[4As7bAZ8 t+CKYe\\j]?Sq|)Ky'wT^&,mry36W=O)w+LE}Fݪzmu~TQCoG;]NwOiw|~$Z>ٮUT{֊ѳzՎxԏzwFuoƝ[\T^U7N#bSwd,/<$sB&m!ˍ|{; ]2No< 5{P_3VUH;Ƕ2f}0C'?0: #M@#y?7) +? fB1F&Б]z|c71n²5D3AѷX)zX[R[ė ޺=(BiŹԙώucXHMռ*z.mI3!ld[2TVkU6; )2ΪCz;dR'pKeg =3r:gf^ %*ƀ^c@1]@@x6}lП~H/sU/(`(+C[bC:@P#qd@.α`j Q,>PJ+U]bjtg܏}4e\e|(4kom}o}g< b\3#3Zc>}>!s 3O 1?^ђ5bf.J\ߐγ}Cn*{^n--*=Jg3~ӵlv[ D3~mC@<Û rLG/$&Z*ǔ VՑB{Jmfk>Ek<~ψ\|68 v_Stцm)m,q6tOo Oo-JVLE /JE{_. X 6gH1Z2N111H7Zhw?[{"&Gd VB }PD@RN l0x$-U+6y,/u6ZYE/a_k}1gMuxFP+w0Mӓջ ғӥ2W}' ӥ2^OڄkIW]BdžU]SnܥSgR~UWVN:}]mQ~H#vַ;~}OvNWyýgkwU֕T] ZCv%__K:R5Ny)qfjg՟/|};<-zOYXY-%KY>Q"&鶆C ǃ_/+Kk}3cvnC+ZXt̲yPVxU&b3 Y"D" a@$D@G]9  4%;HfR;A1pA4p 0> VOs[J;o2aȄ9 C8L 6τV.L0y"4rfO'`D0y"=fBLD7T^]FcV0 i!Xn|i4r]]]]]]]]]4ON|a(%MAVxrY^K1\7ht(O}.]]h[@.3K^g%P9 >y! I+Ѩc"ni&x3$.k .n||@[PۄH.%}Ziw\_asp1wdm\&k9*:Z^xQ3}6GGILߤ4uu鐒eQ[.l1Yt Jҕe_j[uj6x-,noc5ޱbw` N=B$}tGtVIG~$'`{z!o:N=Jl>:Fp5@E(@wGJ"!"!"!"!h䂖ܣ sMc}{o{6)I\`A`A`A`A`A`A`DJ~傗gYfiL?i&SE!y:UOʅ(QR FAH qx~Qg=uoQj޺_j7,lLqWSyok#EQ]ĎL"Suy|nD+7:8/zF?@蘯c=+.e뙬Pgs]p'(ݿ7Z[}ųF&up;񄻫{FZ9,xf>KAz@=Sϑ+|G~ͽ5TZ$ q=$Ycngƚ5u3W69>Nh8$-FKkȦXTo'tzf#3u?mZG'pHe'~O)b)R}SPj Ƒe;R^Te*.ldT5һ !"2Dёx>W0֨l> !JFZF`mQ6H9Rd`kM㳎*ۦ m rܦ@La3js<Cn+Gv[9,Vt}\tp %xc(l1rhxPG9r`)H9Fʁ](lߪ~|.c!'bv"m`JrO9/q1YEL*n9pˁ_rFN1SN1SN1S<ήz9L#`Ns$0'9 I8[@ e`ǏBʡVO ʕ"rJNQ+ŴKJg|wkCy`?} oܰnݾT3lڸs ֪IiKnJ#޾})m0>_g=K3a&&AT,%&,p=| ; ,6) &`78fp4]n2 }"z[Q+A|'&{LbҦqQX <**'kHTjnbz9*g:t.l̖ py]dUt6KŮj<tl]'*+Azu+FKۥNy~<=+a{4 ]}ڶ 9Xf,p$WǹZVq͞U}|6g̪.MsgGŽԕZ=BZcs3ŵuG8J?==Hx#z<)vng&ɳO1SAVIs}bޢ(1DUm;0,yt с D2Ȁ̠3_ 92hN#׍03`gHπ#=1z2zc:9l:2ӡ-ӡ#ӡ+ӡ+ӡ+ӡ-OH?!22Fz:}T{kLXqRkEX`#d"mmF{]nJN'knm|̑]zl;|Qr|NPE3#uuB" YOY~J?Hn%q7WO8f5oT5?t#"߆=Bo9qVpVlhT uфhA8");M ArrČ`OT_JdlD.DшaY8q b%ڽњy޺{r tu<}s3{wv^Jc9Z?-IKWU6)w+_(SI~˗" :әBZI|N/h!{̟٫$>U1ؚy>#i}Wo'O}t\$a.zDlKT aM`>2ٻBuU%,RIbtvGD[izLи[)WLItAx=Bh@: u#"5bkd g><ѝ[")u,fd Ѣ ZLb1KG7G9;u^RbA5m lR׳7|+Rm mJ:FOjQuZ4z}ِ_>Vs^ygNϏ& ENѳf3?I!FnΕ=ϭaSupuzZzSJwFXzdD޻1l\u7eRY jTmrK@=DkԀ`.(D~U$%ؗ,r"A}ekȪ]{LHٌAe9!V*f8 3LlRE܂[`Vn֚W[[ō&7M¯竈6{Cw6]҇PGJčRˉgeu;mZsۙt!I7z/͝ ̹p?AZ0h`CYӊxyat"BdDnvAP(W䉜ƹB54XIcEaҸxށ}ȵ׹w~r&x$ByFYY|My9ɻo ^jj5!wIַs{|b֥Pދ{/7/%b׵\$0SiYfA51<ZفK'i!79N6.]Z"Ktu|%nKRDskR_6jz~p{[y3^W]~mÈ5OW[.R}|X[Sn+m]̬z gb.M}%4qF$n薀.Z{ݧ9;<(w&Ir*[* s\9vIv._|cӍeZ6{nE+:Ev HcۖE 5v1;{ Mb܅):[p'ҕNݫULVޖ/uLk|[/{էOTKR/upNkZe|!{x ^{dZ&W[<'2QZ*q4Ўt#mDAn_g|kޅ*YUnskMO}LJU}-EMfAJB$W}Y 3?/6Q~()/L# kDQ#j֑Qv8vi;fp:Zj~̤V9I dx U<=Ԫ (e0zƷ3Y4B+v4H}* (V33 aکWl9ȅA-A-U؀ܟ*PhDSu^T&档f6q KG7|.x>$H,sVA 5z ( -1´nqne߲SA;.T#|Ŵ1lZv.g;Zv>gY\& ߹yZ4Oj=HկpVKZvFII>FڷQ6xFx-SNCnCc]~ܵ}+5w;se36][s!kdkBC Y3i:uMDL=jmuM6zxթ>nLU6d`ڍQHܳ 㥓REd|MNJ0Î[UEKVXMXWrxUm Aa;B!Wj,5jj{z&@KS|ddnm1 ? Cib*iob2RaOX! PU`TAXHxHU A ""!Pɰ-!*\@GnWpQQ((2pDFYt ,YY!Y!Y'`Od!=0 wY˂Ȣ3 "x ĵ9$4u-V7Aoo zx[ dq&VL[$Yhqm8VIm-*iq.? Gh*mxnK"-6$~LV#INwжԹ-]?z[ba.whێkQ(637CaQ ;b2pP\8q0`RKQ˅a!$:-avuibDF0ǢE,)PaNÒpu{HG/Xaq 12۔\L ]@!(^dn;[*51J4!)l3ȦbތE#C`GpD1 ^g4DM`Wp2b:Z!.QX D1 waC qn]/&17Qxl]1ee|VP圉 &Z#}(PDas;sk;˵uvgO&i7'e@[lx!MهjE6[lH1/k|WЧ'((&u#MDG8߀,m24n)%R 6H1lb р A&dlq{3BBݹv.Q"*90F#+:] p 4@kpv.WC٣GͶ@!4li'M,oJq=Ji3{W]"5c@j䑠<|; -JBDf/u2_9%_-=ٞ>5IPW@lZjxTWΦ@idۨD|uz\F,}GWW.R7u,Lavs|#b=Lv)WdV  Aq8u;+G5 @`xC H, 'W9nX-7c?b^ ©T?~R hG#UyUm;:ʃʃʃʃ%!GnthiKdsv`Qv EՏ[Lc-J[@'@'>r;9yubU4)v|,s<<=!ŹiT0+lo3>#,/gz_/Ӎ8LIOw[EO/9{o3I0<-xD-"jN+i+'^m3-G~P284r? %u&uԪD2 ,Ȗe31I! g%[)^bgr K1)lR1/nhAsu;M=f7Oj|޾_Ç{|֤67>qUgo?W{p;&1^-Mαݏ9&9[i_|"Jw1IqtXHd s()4x;Զt-77v`Esw;Ws8ЖiD\HsYniY7MFdNyn*Z:MLy_Ly?{@kQD4n`Ɖ̆6.t^6|X}&o o0Bن "NpOAz?ŶE igy7+lh5Vͭ/a|=K:Qߠ5)G{cMUC|%OΗ_PLUCyyay)8kּ8ğgX) S;LE1Qx7mMRA#%᭎:enJ-:[g)<7q @ytΟs#ӟ\PjRŊ`E ŊZ$(Y9pb%\@TyT^\)Ws:eZdQrPid´[Dh{K.QXA :*#l Z[%v 8:ғmA&SA!Tf*U6MaUY?B<-zҹ4R6 t e&CQdÂ|cxKMMkt2aqw-ϻ-;/5MjKg*7+WfezP*,Miok~Ӻz?}^; ߴ"c~B_zSJv'w7ULS('\eMӊ8m fԹ[l͐N $߼3Eݠ=h'ВPKN1Iվn8ᴝo9-o~7 $תխ_ Sj'Vnf?zJA%dh=NڋϬ?= \鬽_6Ax>]y^)W)Xr+;NK= K=],<Ύ/o7x6by"^*;t%y"`/gU+fNk׬PӃ{ ;rDLvc'^Np FΜsbT9ΣN3Lܚj"ܨ*QUFU@^ pW00!FFFF<;x5M<2P@RʐT2$,mv9lN:s V;W8pщnv:S6FJEg.y .N#w•7gp]+K ]9pv.̈́1d[Z *V5KPr5(&"Uk6=$mlm֢PZwt&7ܳ|;I'ljo)9^;h m}cٓ .lEH4TSKw=1uV!Q/Sh696E ǐhpئf;@D΁TV2ZDLS\,$I:a,ĢMdzO?KTlhQ&C@ba4fiw.< < < < <X28 1B f+Ŋp21,i}6y]=+]qr}pnXݮ_GA}vs/GYɺ*mRzY&(Xm&k_lKkƲyn${]u;ٓoO7.ݑLyk3ڙݩk"_%L>@JRUX>1H>KcG'k+}LrHnvZ/_֩-Jr\(&}39ܹČ`UT+1@["~}+zgxf`o]qo^`7;09nh/4;큍],}W cU}t]C:}#!kCOC;CKCKǃ㡥㡥{v-_dV[fgC<9Œ(`l`=Li"Qdj"h"0]):L^X#?ur-yvGvzvUxQm/E/ːGzBMa-9CWϮhuӜgpxYF=:>2$5EvX0bEY||oqp/_Mi V@f( +8# ġN|A<3_`fb1z7_Z1ch!F9Nt[oh)y$T*å0MVH {"k4TF`ף~#Igis}:}{G\d -sRK8Kg"bY'?DmKGI:W`R-R)T$>^g`@ Xh`GZ ضa,0m7OGsJ{-8&a N73?DTd =+hsÝ J5aߛpK. y[Zs&al{_ױha"IHp1mVpRJHDBpL0J(D)~ 2O-H37A#'((G*ο5 kC0* ,/v$ në%ZyS@Ge;Bܘ*JEW4æਓ3Wj`c>Ά=y60s=TI>7ۙ[áôrT0erb~n, +o\Y;fBg6ØVq0Л*<g|D=|nq%E#?s΃-^@w*|ƹVy>|XGk>Z~G>Z~͡OWҵ<0?#? X,Y~,@۳4|9t\H9fижF [l"d!.F Kh9ȉDNl&d4hhi-?2jDDVDXE󃂧ր[C`J`zl)j oW[ʃG E-$ʖs*Tgj5NB$*ZPV^c0UEܼh~m8},igW/{Wy/%Az\ o=SH̏5k 5k r~{ZotzYkdVу-a O]'us'lG=Yqbw_Ax+*(1<\=.D^\8TD$tThb } h `AA]'2oͶ8`B&0HQo%ID8n#6ڣ$4 n>jl("D^veP܇* 4V(i*v%vXUDz\m>}{Kr4Nh2Y|%c%c%c%c%H)@Gi: w[p_h<ZzVUg'Ї_%M~DPQlmi?Ugk4Fzե<񬒦qz-4-zaTW0-[}ݘe#P&Z킀U%c)L@A8Op AQ: BR"u ơhE"4I apc7"&x6]nUt3MRE8Иe"bcJwŜ7c-SZm˱9ay]!uz'ctcb5I%Oݩ,P"qj szYMVj[-/57~iqqOO}zZՕ}j&_9j8P>pBN4d_٭,Vʍu]>0fee|^y Y[j/q?[ja>^ s)ѢuJȷ."Su͔+=0h1MxwK3o Lo S*Ylh GɻA4r+/yXx87 56e]jeR1_`38e}%,3nNJwJFI펚:dz=;f8r]I۱?krk -!kZfQVWXmgTHt7:75lt{>+'@+RKj#eggw+]! F{<Ὗ$Wթp᎑=[<{ߡO}˔+6մ3Yho3kM_N=~ͷyeyKS"ғU5뤁x >d_~쵗^~KX[G-Qe6:l,bTQO,V1 4veIu&)oWd9_V}-V Fvf$Syqo0oY4헅1̇ @˽1ghW cMD$ &}-\đ{~H \U ߪW=@PlԦ؃FɚOtl֦c6ly˿:v-Atl܊ѩr<\hs19W.F|bx*'m C2DOVAMPZ̭[ 1Hm"Ŵy;#x;n^&ww,G>qyݓd^e?YV5kuu49q;ppΠ1LVM)vKbXΜpLxLD+l]. gxg tknRQ X],ñpew!;n$e+9LV.kt3^.jE) R#"S=BEvDHK0'*2̙ekZomNYZVcO հZ4-Zr򄒮KMj:M֊Z`E3Q7l-dX\VIRSʛ\ntdԳ}sT {Ox+}|Io|wzɥݾ> ]{F[;N'z}T<ϪE: JMQWS~Rjd?/п߃&-UۻzyAUvmyߗ۴}ڦlKRӪ]/7r]^}ĎQԮ쯴]@ :}|Vm SloG=aY^]>ԇSWȳeJm޺`:mcCgMn/ /Z}UEm-~OҽOѠ.d 2s#Ot=3iΪ}DD54!A8!n$|h\w5&@N*3d͒PU9jrҭI2N`=e^ΩMt 7r^J`<3\-@9 l >syύ]rg7縂iU\y=F[k!4:6?}a90!h3v.Cf>!@snd2Y W<SCWӵ9ţq>/qRypf>]N#0Y@gdM.ƁNtC{mK/s)F0bs)F0]@ sc2LpqqHn-*;svw:{^v^t9'wʥ^y Ow/SH?Y:kY-ȩZ-=ƐLikDYcޭ2է69=Eꏎd gs|DUJG呮?vIBo/FMP?STUu7^4V@+E S B aPRc'@1Cc:}*ih^>HTA#dtfb^\/F^T"h ΃*n})5S=C~wFOo}{/{g(7)TqI4n2)okQ{[i>0mW7'nszc*}o.}2z}WT:>QJύfya;Cy)d~<%.?%&Gs9`OOӞa5E~u:@+A5s 3&bNJ$WUndˠ3^4a@˰uz ٭3@vVsvb][DlcJ".LuweVT(3ON_77W(g(J=2N'DRLn-h nc%3o[x6^nAܪVP6Z,-2B ɀ& f' "#Yej"=BqR+\kr2!]b 14n%'9ֹbZpr:Gҧ CFm6}ZoӮiwjh%mNu,-49RF*46+M[TVV }D/.rK>\"o(׫GdV)#$޾ob=a:{е*z#%U7F6ɹ>x&xts.þoiZѶ\(rm~y]9zW+O}_}5-I[WX^R%促v,JOZ7hT\5B?w{/wP ?B"| ˝rQ>gٷ)7լhWk6Y}˶h3}N s˜+K䧕9?\)?.s=JYdZ^;t]3Ew*߯iz<<.D);$˕KԢwGUmmZH( Z!!Hr>3tbTAl(^ Q;W "+IN({gS3sZ^{wvbX@/>N EۛhُB黅@Ǻb R1Q"klN G( Ł9xP(ethO~F翝<$tHD \H,iRK<-%iīF$Ӑ> Qi-w{iLL4i4c= i0Ow! i1א|[βA4 CPEcC|Y>d7|Y@dW OGs(tOx һE{uM)m0 ={Bt<%K>|Ng"ۆ††LBG3gC4 F+h!t:<3A1䙉JYt D:> 4΅'3l:: t\YHE4.gW沀G}Rke%==˾bXPˌ"bqУmY6d#5!~k+YIOڕ ^c`/p^nl7&ojZ xWސW۬ͽus4{^hyn#nsV'qnlWOOb2k5֚oWr\F䩟S?*_-Qd Ga+!V6'ZފVs:6ҎϷ"*, Vc궊ҵR vd^lݱjIʸ(s] H] [-Gka?ZK"t3s+2O 'S"!ss^fΞ-d]1q-etth,N H[/C&"@*LS3}lGc&atw/D(ҐCG;Ҵw|n:1˥³׸5Z).s .s+F>ISͩ6ך'#.vs53O_Шd1G9ZJl2 Y,E]v~{QЎh{/gU{gƾvXz+ zmTovG.ٌؚ}g$ #x 9k/g_2|ܪ@qnsQ"J=#K*p*өeG6j@_w>FWhKz4xܼ\fN|ulis?ӳsy9 ,l'ٓ>̞Ti3v=I7icylo ckԩLZ)B+GR%<'8^.5wytˢ{{.REiV,e5b쮪IQ*@ @H_n ruUu NS8RrZ|}T*橮A8 1('TTj/* 1L, L2z50YܦҘya2l8%YdCQ:6|dИT /ug9db+"KlfE:ާ#>At sE0ABle4tb[֋m[/ͬȒd9hbS{S@[iOÆVlvETԧ `*ͦV ElcWmI&v&3}6=[8Ӹ3h FIR[JǙv&3I4m4gz렸֖X[6ז2?e~+H)KL:NfGx57PjYj9#M{Xk#/3dU3JQ&%l9&rH >ˏ!v`1`Ozse-{]LoIueph0)x~.*:m'[7;Yݼ}ϲʻ.>}ox#Nn$Oc8u:gUB^UrI_l+H.@ŊŠr(eȪyWxXp9tUaTYEX$+^1\|M&Lc%#$t5_i9n`>8X8X8XNҤ,<30p*{@TvwwAro{¥ Btk6y9./@ OKMh@Wc2haػrP' I&g1 39b*_ؐOWnwOy|}*=,=#޽{=^ML|,b9~bgeOkXc[ވܵEIS.:))z>2ίa+q?b#+tXG!, ?S[Kyi/E%k]ˡ<_Kܹg͈EÖ?SѨtm7R.R[C` 4- auE^"e.ru]Ц$Yhe4_.cEV`s\Pt >ƾ2Nњ*Dc~pwӥC/A^vNy_U1¤N:ԡ$Χ!پm,ըk~lALV{wLhʷ(^_->>rI3ma<&U dk?{Ӻ^bI{=3YVUgn3ב]zlgALfk==zAzpLp&2=+U)t >|""v_n{s̓?o0o0_?Uuk8ͻGҽ8*FBHK7.?4s;$w ]"l߻z (TѰ pPV&: KV$a )h$4Ԩ tNۣL:RRUMJUYGiG#zIݺ#( ,*R%d{c&-z 'e&G[ؙe"~Ks ֜C2|X^BsFW2YF~yU鬊uW?]IM=o8[cLe2^}KcgIO椠'?=c./1vxyD|7t-dKi|-ҿ#u3o1xE;nNܞH7A3Zx[`(80,X7[{Aщ?jMe>j$Lɼ#v4 +vbkk*^8cR C NH1Lh[R s*jēZ^Ő_xx"YNg:KM#Xoi zY7;#ͩª55i v(ۖTbD ؑML;O/*C&lLOg&fG,G{}/I Dx9A* 0ITa@yd=Qy"A-KȇOWǾzIZz5Ni'(,BzֈJ- f-t`{>C@J> On jHKo$at!ahL=fI.{<]7B})>jo3E Q&XKd5o#w/^2VkcanCKW~y7ib3vC|ǏJ>|*OmIͰᮈtUJtU/P lRF`m= Z _/qNrӯotH32cW^Juf{w_ۧ/h=vbD6Bm_~>׏%ךO% &%I[yI_E7WmT&".3/5|Wyeq'*ڕ\[>Z&׶҆i,suXݭRcQN}||/y?'YCIPרkz|_SU{G[kֆ%izSk?7j(-GN(X;޾ o(,|4f'oT;7:c=}G>>3?[~tZq](].͇X?]bY%ɞK Zm6\y1p2 PG.̷wѼ,[鸔,ϓ\Kf=Vmϲ}2;`o=P[~|hWخNto7`uRJذOg1aMr-eN 5@. $`J%%_\u w_,4Yhع7_>Xw=z{c^QsO_^R}jS 2+_*UvRna2L1517~2Jg-a'K;V.e9tsnlo"&{=ȬkͱZF}/D#L@O}mM'ZfgS|)&8nk*Om3%DՉu~r̡,Ϊ =ƲAᚐ4wƎ5 )jHJPMQM5a,"ak iW@ %BRZ(SAi-7[È.C&A=*Z[ 2uv*xSGAma>wD#fEEKK\f=nJukVkypDZfxwuookxqR?l6P([Uȸ9}wڻUߩYR'mi@ח=޳=a4>353?1ӌ,vGFņwNI8"g>;5tcz[Oi+ 2Kdz'a[7-ͻImy]p]Avnh/K:KF1BjAE]9(RT8ɻ%3%l!8VW$ "w"j#͇IR&ݐ&IFQUSU5CQUdBz_[9Г-ʯ.)`9' @` Y; P| OZ)TvJy@s+Ūf}k6[?CxU5U[1KWO+ Oxm,1*lW7찵kumSrV䞰?=+O_؇{g8{=FcCcm %?\>[}|1,F6b b-`RWEoW!xma6ZX&qehc9q?p7NRe/Нl[Eh|QfLG֐fi˒hh4([EŻN7Pwx4faII2ْa/,CDxyeV P:I^ʰ#9vF9\xwr_t~A0dEѶύ~&/NF "MLg%Ph6FS@I!a4!Fkxh>t%T. et O w)!胤/x78bһvWi7hC~InRjM+򀚩N$H al8k*[lVШHM&4jE\,Uyo\坂XX1ddFѭ>lx#;ǡ"9`_C{/&Dޘ)_LA obBZd莵 z#B5C d: OV'uRr\ۻWV]k`[ 1¯%*eKq\Ԛ!YIvH5UsR&i CSxh'6ZcvVofKhDۭLT3vu4&D1;.f#3ظ˘b7;fENCϓha;K44=f'[Ze#AY|+Ư&cXkn5OOMnN1{ s /u1o6a/T^RmPESbER$XND2~wD0H-=G*˼Dd%ªODF_m'ªOU/Fa'H> nV}YxŚ)G yoTrKɦu4.MVXƀ4LAßBDVe48MFME&Ԓh.GAT@W Y ]Lf3EĜMY2Z?Ny\6C) l9fl9flXG8tyͣy>cqlq7{q k}'i['iF㓞hNSiyF1{~}X8u0:oyS- %~oi|Ljr>Tdf,?ex-~'1!<{Ψj(jEr}r3yǖY1Ǫc34 _2u,;\uZE=Q+Uh>W}GY{o{V4wށ'ʗgf5x@-WH/,vtбiǪ|"|boE_BVv-rh-IW6ڇkïN->xxZq#Jyc3>qY'F\b+Ol՗m|Tk#{Z^[}ldhc8 ̣/s7߿wmʻo>Iߨ TVnl}'AՑ8:t[s,g\\pbri\ #EdX5mGQ֔/!vWRfgu~nM[[jĒ*K91./˗o:LƬ%j}",rfH76%Td'KW_`w;I:&#lFXaj5.NuK(W)`K_){V r8FJGqs:TXұ'4XQœ-D"X.de++[؇F5:ެFXaav0VEuƺgc?6cލź7 ғd˰C 'X_4bS AǗ拳ݨ9IePp+yrti&j&Xߧ/i=^AG -=m}egV{𡄝 O[=?vYY+X+,o~n1o1lZIۡv^R?Wkkodc1GXK7)Ynm/9;o߈ b0d~BٓG0.cl߀̝1گ=|.xeP n Zz:teH CyK!\hwh_(<yeSz9NѮL+K3&2.ΞN][SZFA 4&fyD+9IXMìް 1Vr 5V$9Y8IE I$âiH4H"($#DmA۶^9xm;6}М/ 6sOrOxsz"%pGv":n4C= s'|.t\͹ڭ93e<ۭ9hFy39Bcv z:ƤI{&I7cY@Z"t&hA ! y4gtgwPZ9n͙+OKR;$eJolgku+lJǢNc7D #B(f=K=/ܲa4Hv1*]#b}kiG'6yȭȓBchg"sKï  ߭=1Z]ʩs {Mb"օ42F{v r8ҼYONCcy#m`ϑ&6:y[8_ky/^/n59m /YQS!z3R>|%gY1f=Nk<|eYYVYhg gOG֥b ӻ4} Zw@+T+_xw2}{GKi^g_Uld#XCvVWVz+,ЅnJ& ӊwxU7ō:Sr)6h}cMxч/n@i \_iA͹:?C~W=vmqb;Nܣ)딯Kv:vקeGv?bȷ{r"kc}vxmLJnzc{|η}F={$6Yņw.?鼧]|ʜoY͔vGi}Y+)]ԠggAsB Rc *j!Qa)@7JqQڣ¿P$!5GNt פInY&ەA:94~- l&=Nme]o}o$s+]h ;}0DͽR͐McO v'JVH*Tفm P &Jꋺ\`Hə35htab [l\9C_PECrP嗀\D 5Xh+l ]OrJ6ld;zU]]3=DLɄGMIdϕ4^jWcrU5lg:E)ė@Acg6ͮq"bMWE9tV2ym"Eɋh&/M^D&(D&;gs& 4 Ι Ι@y%}k1kH" k=Y~fzE*PRz\OC~1""3(eĉ^ m.% y:!L7+) %#4N3vήb>BMbZٖϨLD?q_m qS+n zWS#Tq/OSҽ22HQU~7o}W0Y}I}Vf>X^^^gG? 6c>0yȂC\%-v2CNs(v>s^S=iz D](|[OJzK+Vj74q<%AkrtfFQK k%dB+-ͦmV}%.Wdž ^ڈyU::>;ʾ> %ύ.Z7>17usq%s5$y'n&n7ƒe8{I`G#b+:^.G1P~ - Na#` F#^M8|&I+ty)B?:Y>U#TT`?ȴNQPV?0~ŸO?s)_@@v|-y^U'N W Zv6Y륭 -Z4'ws^⨝#gxGgG}@ DI690T/qnq+iy<|j](^)1RRd^UcMJE dMXS28= -a^Nrp/NIV=IWiM@| ۦ  \*\NKb]ڠT[ ڡ]{KQZm!%!v?gy>_KŮ6Y-rުEC 2H V;\{W>VSODIRwֺ7Q,VNu8I~Gt}2!C/!-ijck8pn h$Oqc&1sSp3<<<\z, S8BQ\ ] ] vA5XPDPO*SݰD,m[hCBXn&Myǻl͈$aaja:,$$$vFt @HXʸ t`]S) #\m).i3&-7&pkRKySp[*5I tV*('|I3n=*m! :M= 7NS\$}F>ax:oIB mnZ^Gm~lUlnu]iN\9vTmF,U>5Wz?%މ绬zok x̒UlV][RW+g/LsZn5n({6aFQ u Ň;g;OѸ;x*u\qhGPݠ'T/t 2 B6MǵB_un\˄6)x}0^3.T.t$XNLS(b6RB."0Ahz;+,c:Y]^^U6`i$!E! \;I =OZMO~'!]"4wkBGǛhy*ihr!tt)ЪIl*S*@ElKNk/$t)-W1wRa3>a،`8ˤ2iaL[Ck>O!p}6ٴ5X$9&=%A( =le#i!LZ ~ڲkMpRơkq$h 4Q 8PnE8(rR;B;IZ\grIOͳf6bbȞ~&~1k*j_c{6j@l t@ @BYcc[fGOsL{=lggys;în2XXuxgϯ+ʍtcy~Ǫkb67ZoͶFe֒^KxВ9RK2/=?53o up <.YCT&B0dO s:9'A=y2s==]HӘ$s!n\(*<(rEH"Ѝ"QdH)4տ"(RQ e],8ۨ ±][<јK4iϻ\tGn?ܨt{!IBN'Pl-f3q|[ֻ 4qnR5oշ~214m9vq/ƟG,묟V^7ϟ@W^́v .l c"фfI4{o4BmZ8-G2xVIwY#&*Y4SaMi9 .3jNjU*ԂTI- XLt̟ИpNLtsxa#.T\T|ԍ?!ќ#y!|xr.ϻ#u6oSy&k6_==ww?93~^fϱw٧%|_ηj>vTZ?D ;J1xbMex_TٮXQ(*,PP_ bEBHgaJd>f7kuV/) \IjhXOEE(%@Fm<1^xH>s/=`h-¸(Cb9 SQ$@R*I(]7a*Gt.(Er]P(wl=Q&KrvG~wuuG@F}6CLr 1>tN.9Zs2Rz2P8L̀_* `bp03/b-K'l=EYRo;+{I] pQ. Du DI4Gx5zev.+ Y7='y n{?Eo$3 'opG}߶z:H8g )/<O7$eN77}}"-A% .7xA10X.=6+PG\@Kǰ'  ƾ=RBDr K?/٫>dVUDhjj2[05?M9D~e(;u6hߨO&٫.B^:X~r=`' _pcA)&o@LI1R`cڅ/_.Xb%5vTȾxL NA)๞q4H ]WDQ>s2L|,wBPb>,=cRICINH%^`[KG'bvSY1MիθRQ-5Iqjm#j1Gr7_7Ou}dgOW#%v#Vh]BFk&^y%^/^.}}ow!^b"U!I nTo "w v@bZ8\ ~])c$E0Eu:=^2_.S:/#_rՙHY4ݭEE<ϧQwBz,߇b}?rcR>}J,4wg,Ni@ߤ?}EY?&Ti"H[c>?dzaT}Bͺ`^vX3}f /ǚ[۬(3øʶ[du5Ѽ\e~d̡oLC%X>5ZuU|@}YL7b9S0Jo]JSa5Mߢ~ksV!«S7#~}Є7sxӠx)رz;rl_vIoS w:.@]rOqL{- t&usB8~y7_C^߸{rx';R?&]J>ӗ|`;5+ϰVf`ݯ5i1ج绳0 j^c97vg̪V72$VwuDWe2~-_ߡ}PUZ*.n}/ܘï _K1\.0GLV(pWUlAXx/3xĤ1ܪe hɒjf[v}X5P ڿ/b|[Ӆ,Ȥށ[ 0 Hڠܪ  b 3hV{,X{t)I[vo ۽%6}h{q@8fԏq}хM%Xa6|dt "W+r6"Ӡ+2biJ;EA,7cb%= ?s,XXXb.b=9D1 f*c%EiÏ)}0vҊ8Vhl}AĢ ~*ҦJV}+A JB-W*E* TXɅѕU$TR%V߆zUT$ ħj%V QFոQoTPW# l)jS# K'_K2\h(u4|$aM5-t4:6^Ozd f!A5B@ZnT-U%(Ue@:U;P""߀#1$W]7֓T@ҵuJԭVou[6bZu2;wl47 ˀa`dD v |Wut#}9|3(DWWq5|Si94NvLq*y"rn5jB &@d7J7 \ -$J(]w߶NKt ' u)1 X!xYLo{M _nC=j៞YE Y %YJ YrA/Y Աkx0| VvUTthF%WdZomVGZ+2>jG:U}O+/Z_;]^yfTQm)0@}}TlǕ&ƧY5nrAϗo {HHÝ^ "9sko,'1#R5™87PI8]*Lutf*/;&SKLEZLUFЬ2:TYfbUMD$G$!Q.ZKERE,J0bŖedRj&Kv6bpn'Cnxv)JϩTLŃO(ffωA7"ZԫUJb>ψ]sh<M!z@D3K?jWTUfPpjP {8NwN%Wo\ P6z^;hwO'vu <(PGW=+;j$^U`;{E %==PCz $ @BB23;s PQ+VT@슊(@**B 6"v,ߜL gLw{} 乲RM@D4e5,Lvab/Z^Sw \UwI2AJ0wn Tm6%_mfqPDdc#`$Q!eM* zs6G5@?m ygd9b\Wot#H^=ұ@p<.0@䡃S7:F<&~2xuc{OK1EƏ cjyX-Lm*o/AzxC+͜fN3ѬYf p~C HXQqTG-u>*d`ڃn0[bmc{]pZO:4^~iX~,Nu`,y5tILV]]] t}U '/*|Wy9;yj ˖ul+[A~<`S+󬗭D]JYne}es}zǘlg^a0Sgy~]=/y|+];Oߴl~=fv= @TS`ρi{wra|UE|:.U`p N`\M xB!l ?ύs6@ٙ/Tq5o]X@_n%y*6f}!]ዪ|w'<EX?*pW o&w6Awman>0a|7&BsD/3?vc[airUJ`֍g}X9،6_ ^lwGo_"HZߍ(Z ZHR*=ݚ :;;{ 'zz#Pd 숳A\@. HL_@B8d {@GFNEZ%}Iυ6wsF/`_ w}!Nڤ8IV;,t>hfm_–m$&GikKy|}DީOxG_>J2kG+o/35{! }v6Va=c t]kudz[ge=cC̺UM?fbwYIj&sqSvתּSF[4q#ޣO;ѡ pKɵaNJb&mM5SڡXƗܜZWd[Ԓ%g8MɊjGάT]g33Gcջ 05CTpiSu68Q -U,9.L0WWX;; Qrc{pc{pc{pc{pc{pc{:s<->+ә BB*딫 ;o0{rYNKq2Z/8/x/_ (: ,X r cbk2RN(Fy|1/-?cvl:ٴXx d 6:FԶrCtl=F˒( X,Ę`T({СfrT:S+;S-XwqLcQ4HFFb ?C(V݊e0d q@q8!C)Rh%4ʳ :ᎌQ=] \|}ntحHCڞp/'B n7BL^md\gjWkiZuúү\n`v668pQwA]wz~ woML!2s~ņ8z|УňQrXؘӰFJ>_yb,TASNA`(**q,OB ?uAgn\ /\:8* F!LuM>. 蛝 ?RVW>']JAUVDJ:X tU&t8D,:宜rB- ošv߻E?R$>K 6uK}Яvx㫯iڋZSWMb&=k*DT4#<0#nM,dMS+3qa{`YG3ڪo;ɘbi$ךҚ:[S=,lCu ggEV\k0GXkiw7~5 v6 fJص]֗cD&{jUkbO޿hKZW۪.ϴm{m^ :Q4g7DrXIn?ah{r @ށk_h7_?AhNoxM[t$ͥOdoU!CiwʪVT˞=~)v]dWΰC@WawSzk}DCxCD z<) j_LKJx7S))!̀nIL6C}K[iuY^ <ߙNH׶-,*~7钁t@d&#+ kr$/?2Rue 0䛌v: Ź*rr%j q 9h U)z[?:NqJ]a,EKjpņX DNcGӧd~83A?P?[?5CGcb3l2(xe2wt 9Qn7ݢ\x8I%ѭA.Y?>k)onvzyW <>em _dmZXēplŵBqqb"AG8aJ`~Y|leP:l礽+MX>vYa}CfL,8 ǭ']WVE˞،Bs9≂ҒC ĹX9Vg3>r q+ֱS@<u6!RM@H2?!C&I`$$!eL($D!?8ꁃ& R ݐF)(Y""X)A4XIUWo0 t\@֓FgHHt1Iq8 i&jZ`Zi%83r M*^A BYO+|LIoWqՉbY>ˏXTg1^ZOR[*. tGHe8ƋxӪnӚs2+VzNrK^S^y5=f~{:?Î6y3m>ƸĖ/]˭9bU k]bY\m9>Z`la 978(.wY<Nxۣ*]oK.[rn.J+yxDqwjQ#7;!MSAۘmqv.mm'~ш+Dg~#D_QټfXT74W˙s䒖KNBCpS~![_|C:Ja=l{N"e|$ղ =^MM 7'7NxE|!\GQJP(UL 1Yw`V}!6aq?# @%sY;LnriEs PtN^zA`C/ IVL yOgh@މ-D4e170;`oqVAOۣ =6x8<Ӫː8:iafq,}-:9C8)Cv-6nj=7]nGC6vMM85+\. -G;q aYZBEMɠ߱2n;zaҪ_!ztbh|<xUtxgJ *IBtq35F o n< ~3[Xl\,SBl@$a 3,h$;G#1'Z%X˞7梏vr-3Z^0[$ADbJy7?]A{EA66#AZQiAi@Q₡5-C}qYV7_媵{ڑ+4Ī9jA hkꯇDS=z6V)֯X(t!eHHLmKPk`k!q:Z;A/'jr\y/b(xfl&{%%f߰r]Of6F u\TC,1Xce(!c0i``V`nwvGu[zgm3l`N&r ۨ kvW5e`wl)hDcJ-2CDc&bY.!%%P[: .54D;MEjabaƩ#v">Co#l =Ec]dn>Clɔ]1RYe/En12`*:0q=Q_ b7!NT; [J]_")){L1 c$@K8[DHfk: eR9h: dR2NXHXHKӓ~$:%EL MP9h*ԴNŴzz|> vqUTjn9ĉ ]W-r\$! +LhD6LRM!u{b[fyj՟tp]sne45/:P'-ȭ[CSǭ6E!B>(kwq-]3js1*ش`s(حNE6@šu2jw* Y{NP(@QE(aF$j)ٟUӝz~EHIU%$Ԓ\"IuR_+ك,]h@@Vn5r}:KHIbDd_mO&myn&,r{}=.U*Rhw08=z*z &|'&`!į|0B$s4ο:tNZ0yofͦNW>ؕv}\\jkv8\|$ v_DF4+d54?ӣ5ӿ/ךks} F(S'=IJyv4K3G#,Sg~(c77E3n5ם;=U2Bzn&=+w^.Cf9tE.g\Ό w&>Kq'b+ q9JI D88V (ؾM# Ri4an՛GxpjRG+#id:G vURM7::m,Ԭ'l4CDdEy S&A }/|1&ErGU+, pY5eʒB%(<qBXj_9reؾG@ kFg#`x:">a200)`<,?>GT ;HF"Ja$#ag#xȐHG 4U8v:|&§EZWtVRMn7!x숳P|gsl=#3T=9q1ZVΠ Oh&l|=Ǎ!00*i%<% VS٩6:\_MZ*"35j5u=|/PBK }RS9j#{ώ1=04xΞHE$.qK1~qoWŰ+b^!X]zT?IX/wLQ*Ȃ5DJĬĺh_a_:O]KGˇ?aRɆ]ˆUzzi*!r3d'yôUubvuvh>*/Pr5v_NMq< _E"gq5*Ϙ2d숼%"l,+`BÂ&l)y^T[JڇUMǟb-nZ~R[m#I6kꢟXFQu9Q*(I%Ł~"h})4jJ.p)` Nq)4P߆m=qwhYN]5Zn=q5:S`6 pVmub'wH}ܺF${8-ɋ$ÞGuR `b'mbvVF`ȏymTug2_H|"E!_QJt:QBl3zO<"&!^'eI?&R=zD-U$GI7ПHP䚿iSStBySS`FI- 5c'QuF@I$I$i2+7tMgp}>P#QHjkrV'Z .0 UQ!HMY&\fJSR_>54|mc0.޹/tw] Wwn}Mp}آ@٤mj~m`3uN Ԧtցbl%M}2凊+pbUGM!P͏nIϘcC/{jQRNTNɖ[ nGJ% &͚$GID ֲ.NGQ_`{ziE/ jYbas\lW~ w 5`i0% F;$8Y[>kuF&6/1Ph_2oWw+/^; ^[Cuo$Y;M5v>姶-áO"(}7,t8%@ ZgC"]f- )X#C:=l 謦k#}w {٤) !nlg4Fgw8 QrJlj&PU?s¯myƸ&nh/,%%aϡzM6#11ppĀB!ݡ(((hDvl$BTи0SZcUwGR /E@-ݴJ]k]xWE4oZXЊb6.ȏsl[EE1b,޾τMdvb* a}PxDqX/~ok;^?۴|'3}ʹhɰfO7u[b/K$L"™kϵ+WQl`M0._ä;XU'/2ۙ͹Τ=۞do"fB1IlIL7 :^]f+2CR(f P hd'v}Xl6b*Kn,6R=f B䞮Z2S{'G8ɸP3X֖GnH@ H֫STh(%vV4ʝFFFs`DI*oDpwswXAo{j=!G}3ǯ3Ux!Fƫk'UB=,03`1C'pp:J# :F `Tt i,T9c:U@>`rC>-k萏,|d#6f#ȂIcg x*h憑07D& Bա@nnP#>!ve*c>U().w2m[`VWHd94*: ,Gzvx~%nfVҎ[;fcN13p瘌#͝(ώ֞ٻ,x$8wUwvSN|gƒx" f8za.zٰLwp9abf'Qï;>S]`O^`Ĩܐxl42N dݶ<ôhlC(J\'n׽4Jdh{սf%#q lLgքrݤ?xb!Ikڜ7ijlF ]kp/oot@`jOxz-&KIjl?]-St^hu0b\_ӦQEhBʷ9C2斗V:Hχ]>ԷWm6b^xVҷnH`+VYL44tn_uUdGtvՈ^}B2D-P,xW!V+:R!N\"rF娄$cJ$cJ58]wNqRgvn+Ot[z:׈O6}Yzrcˑ[WXuؑ6`tܳ?]m12\fP%ncpl<ñ9>մ9MM! SdB)׋iL,DD][Q*9 d h6Bؼ a.&TMP!6B:5?C G8 eљFܜ > Va|Ð{: gdщa e ʌrL"BhE%ʌQ(SDo  g1o't>ץ+>–q*t!Q\_x/yycą$ =U~CMBbB+_A|=E %!zjf,N)sH,>Mt mܫ{xS|.l{׺?JN"*CEX{#µV+]ZO23hh6&Z-}ky_#?QVw:Q74u˔Jrz.EHCńK+wWW2`b,/˴ JV# _K hP;r!km$ֈHIYAJZCÇfmݞnϠx4R4v!]1 iCE ˱ntHpܰ,V3X3|1|NDiK TM LEP*壣POđiPVePƇR4>xC)}[2^CؽFgg/>f],I4p":+CsPiڛQAh,QCSж>4.y.3>huZDz"ϕ4FZZhs* .*4.\C՞kisz: 4^YH i\蹉=hs34:%C\;Ɠcb2kbrǘvUĩ|9]h oX7!GRjuSv]> VLlKD?|ҎU^c ,>w)"}f+h6$c}O3ya0d\2{ZY:O%D=QOh_K%;_ySċ36L|~/^'6yhƱP|jy}X^dy  P&QarCe,t" as(6|;=:ì{KNv&ߣDu1{v#(~`?" OEݛR}#cDX(C4ƮPcOgzݟGc=:>8)fUZ۬حeiGGT|M]H>_o}Ȓ#Gx<5mx?hxn_h}7'sa.6No]ne=aav4EbAbEHpr!NS-Z}4p2%4ۖv5͕=r#N5_._N")b:zAV8$'Ӂtd:P1rn2d!&'dd2p28 LNFӘLArrrQmJp ijZbAC8a0x<AEQʱ ǎBaQfy$ԦqTmQry@- 42ΤS%$ʒ2I%4Jiր4k@5 f HXr9րk@5 (+cIi6l8Hq$^Nt#JcIWx5Hrkx-mR ;ÅOڟF+RX!^'f5 Ǚ?iz[}6K%~m|3_-BKVodMG{\^x'O]gU\u{y䷦v ^݇kKUUiUKrdNdIWX$)ҭ7":q =6Pn2E7)l@Rh:kX7OQbOd"XE*Z)t ]\t"pn.Hԥ\~󃓍b3U gp^<"? 11}nE6׮^zEQ [wZ=XOlwD36W6مn=>YX&">1A "I%l/Mg1ۘ6 B=kӂHʻI_X5I$zJemy='Fg֞s{}}cw=vԴVv{=SKzKt*1ĞlsȖ^jM;܍XW(5?B^XW)ʫW[`AHylǧwфS`IyTT l)@Й%n ZJsq@8 S]*ԬL 5.] dv)@v)Rp&˛y "!y_}Ah}j4,S#`j(ji$2 ppVL$Ւ4^Irp'hV2^+<2)iIFTGS;d,Ri(F>+%lzTMhm64ltlfC͆f+?9FY$e6 JQ;A.,eCr )G#ՆΥq6ڨ6DSU)ѕq,WNg(j9]LlZ!6_R]"HuE A+TWR]"HuEtk<`]L`nN1`^-1~xoGco0y|4Xfl41^YXޓ=q=n}a d-,_w;Wdih't=߫nEnY-Vdu[W[F&tHU0;LB2m"nPCBm 55웎ӑsj:)N etGLw]rmk wP݁=!ux| ݱ*5ICU}*7A`0'LʛݕlY`7,KKeI$/} x"&urنKj54J<· W.R+Pe3H.1?a~^Nc^-Zz9rz*N^x9rh 6^m-}YrFᣁ[si.c)v!c4J?S!]I0|]E|:ig6}gh k ׅnfS1[Hb] ߐT}k%eX!_OL7qՓ 4uE\˚{"*=]b\m~絭*K~z2^e],+XLjT/лeXƂYsً~QA\z bWlz_}}?u j߮x?}bu:RD%9N+YiΪ_4u^n|[~SϼW&Mzݟ~pǮw:W.*~Š S):.kf<\Y>k޷[ͬ/f#Os{U=0wVqQ9kDCw69sŕ;TS 8:}x{`,9wqs9@b?rAH5I)u ):2tp86Y:2ul9s`U407@3`Й碥jY 0Xb .e:;FVKb B{@${t:i=ZĻߍx(r_ r_.[AB%?*rv6Bav##jj>vDvDNJ֜Z7fU)TU)YS[H叶kbsJ|>ɰDs(X`AD- ؒsPO2+ sʺW0Q@( L& . Ada20@L L&dLX 3gҙL2<:J|>ধZgԒHnzVqZ/{̧L<Xv7^++H8>mپ]Zȿ2XOӌF _j;ӻr}W﷽k[- }5sڳ٩BϹm1OQ-Hxvwrǁ Yr:*96MLTUvH"KGA,i:RovNؽ; Nw Ne9iVVqmߤg!G\dj%R ྶqy4>2#1auȧ}#eBLG>|Ш71ƶtd!t6Fl!SjtA&\\\h3%7׾HΖxWWUS !Z4\i>\)>UoO.N??+:,,~n~C7ƻJnWcn Q{(:N5@LFi#U :&ʶ.ZQ}lwP%~{w{{Ntj?J#(M!ab+?KB* RhWNs;=OX:i 'aR{ ,E[EvxoNXS;uN'6n,E5XN^ g:i`[r8uB>ªz [gKo)xh6,p{_}DQLnNM±?kP^WmfJKT9O%i Eѝmn|wVE?SJ3%Ϊ SHDpS*')JPR򠐅rfl( RiF s(t̅!;WJv}sifCQ>D+ha',.z!t |~U w+Ok;ӷk_2IUݴ;#94+Mt牑DE17_𧸠}xE(}EXkfcY}<FI;ld>H}}Vh#vb#fb&ߗ;cq7њM$)`.߱DR|D/-~b:[YwlʡY@mwb#M=IpAZ8,dZ%$$8|n{㛤:nhXMtm<#X^1úljIcWcvo`I{v~?÷8OK6iZkQJa!W&7_jv#ʹؤh"o ;)6|}'Y=5):xXo,6cqh>OO?եB>*Y+&3|Ok-K4K֎:b\be{eǶ!"~䏰3hg!F{LLk0cY`b+[߱W̲2Mcێ#jqaa/'>M̹?+=z?}VIwt sﳺ# .%+rnrn>KM.OqxMuKɑ.&TpReY{50 pܝU##x ,b=abT"|*KWI.J4qP40(=yd0)C'P .l< fQp9e '=2hi&CH#!c 7AD YuA'Lq "KZ2!)t `<t\y#ʃ#N<8=l$7΢Q;Y?N ~sQtV:2(^2! e*CP4T14(C th B th R/h-fÄu5L|ut\O| t,cF:1s=hdf:[B"Rx+znRt\깃KiIR]4YF]4nynϽ4YN㽞4.q>WzVx}w-FPSAkj.ս5W2L63 LFݖ4G>Ԍ/fxij + bo41pˀY pف-`3;o1&*G91J璄(,j5K :-y=+.Lj.W3WW K׏Dt":c"$DH!9DJ"ediOz)TJaoHeӘ1\Ά%;B@lؐ$jni8QmwWBgi>X>βQ#zW6< ,g#(E4f&Y(ѡSw uvrsjgE.]@.]\n z-[Vg,5|n66{?_N&4La'_y*ls}2߷Eעɧ-.oSdOV?~4ldv8Bc-;Wi'<>p.Bn6'W;_De|u|MѐТUݱ!ܯ!1rG߶?)EA 7ʡʚ6}Te OEFKlgz7XD2uS4nlϝ0б3{{B}0.R<&l$9X~jITsզ2Vy"a}NcZMAz;*Ck9<tP_66kJ.SL>]?hR~b&A_Eێ;zOjlv Qhc>}d4Bs֌Mozzx{Ou>X{O >;+:E^+}CJ2ʣDqI~.YYKיY֕;4Մfŗwث<4QTߓBH!%%HBJ; 6DDAP@ETTT+l`DAP~fB{왛ٙ{s=m0=$w‡@? e$aa6AB|0ή_fgZVήTHQ3LJ I Q`zb.a2R0TMa?0Ew[As6Hu2DA.\*X?65e/@G>CdC.Ǖ/("gk.2eb+"pQ9/+"i"\Qb8S# ױtZd؞ch *F U1bZNXbT ỌRQ'j,. (@j y|R`0n?n ~9c``?F `ă/H<=yAl~a#WVzpɾ/I=y}!s*xoBR-*c G*wϊW6U zTˆJy Y?Bذ~&W_ #5V23Gx@>bxFax. h-ϓ#ۛPh`3% kQ96 "Hu[bGv>wv9RDxtaJTF3q R%αCWmN]_ 7`vA0l0dz0d{0f+Ot0y:v,9,>av;$ƀuJ,_b.x$aha&3͍jڲif6b#!wz-\ݟ|(.>[۠_]f*|O nj"O MzGc,$e>'-wَueMѓvmh6;f{Wy;v #+`j+5N-B.Y|go׸Ƹ׹=rCoh۵)=aXtbL sz& 2:8ٰb 1H` $0p$j WGgV.ֵqtvvԊ!9>!w|=q5if7bى5y]Θsjm$M`k_|H6=lmQn͙,۴FF[fen061,[ٗzY}ر'h]so57y{ߨya.3v~'iZw!\_帊+ >>ݨ*(9߻3nj̡ƫ ^iI.{*'z{_55w+HV]Jo ԉ;\v؁c@m(P=̮V'usD5-DTi*lIZ}Jܙԙ%#T+=I7 =l320Dr'Ґ/ YKӰtHy: QP=  wJ`Q8Q wH Ĝ]:!3tzt<`E"XV+y^Duy/{!zau>h/X'SEԓRU#h /6⛁^eSbcЇ QbR*DV# $l K-I<jxVID/A\FiDJ4Шs r0 68Ӊ0\ a\mjrM9乽9D)rn-gcz%B*|g|>B4-ʽF{ݹ'$éHo6ku`a@vV7nr(LGM.bI@Vȵ6JdI^6d<^WT:OW_"WFQ&>]#̛)3%_Emmooׯpj0Z~0h^*׍Uyڕ2~™eeE1\~_Wۉpo(\%'9KqxztOB -NlX$p1Gb.`]ų1x֯  v ିn׫{ -]*vl$HaA2vA_;/[9供p,ZEz*0 *l º/ؕ7J BH݂̆`2<7K4BgBɄ %h&Q$CI &՚yXh.\&pM&Mkȅ &K.t\uBɅݱu)ԁ( ˀ(;e`;w v# (m^|mqMm:QWF}0*GSʟo;þa_؏,J~cݬOVeM<\kԺ)n[,5ڳ{ waZyuE]]2/,L|QcM̽Fwەl[^b-(^/Íx"cZQV>gi_?>a l [H lRz;Qr6ͥBn(o<"u>585Fomz1H4ZqH٘d|ϒVF>go\xۼݛo_ IҴy'ŗ/7.K* -\')>wOC[+7T9cv2ܭ<1T7W|[tn',wXn`Ex+6 as:[OxغNa`Y׶b׵T?E*Χ)uR]"Sd/ % z7{"'P'ҮXXtn VT%a MD;a= NД:ASMz %\B{eGm^"%/:x痯&ҟ1n"0nX) 7WB*MV9QUϩ˦3NS^L:* kA Vg )s_F t|m66]~4(VoT|AVLATLATLAԚAz /']CyvD/n 3FEr:ES:ES:ES:E:],o$X҉9wVc*x9<(!G:Qk5ע4I{F}F>u'p۷Է7B]&#G3[od {CZx77֊{ .j>N9#N.es PmD|aT$ԧz0IxCD &0Zr!d#K#K#Qb585Zq }kwmy;F4UߩRSH'KM[(fsyظٰQFb66n3YO3-e.}ދ=5nlV ,C٬wݳ>}io_yׄʊʖ~{{yr.ѽYo.-xl+*;7oTVtׄ.W.7oѵ?yGc٥~N/?DLd8kդXIBIQG9sTLy#Ca/Pg+Ζmo2CWp~ngFWgkg }v`p 2G}CrXSK\0?;)/NUowr󻐛tPA}D]SΚ!yGXZ',f]c}i}k}m}f^nVnRoi%_ Wu5ei^Z毡/\op uO}WPRVrX#Õj~RTߨg3W>[hkd21Ci1z>U_@gG=}5r[_Г@֏l[b]"Z|f ZƲ<6^c=ʢsaV'IgɎ?e?~~ڃmF+qBt(GZ:>&czWJz\zKOit=6PiY蝍&:nwJ[$=OM t$HMt֋Kt|\F%i;mD݌3^+m^f5:nvq]t,Nt,fM:nޢD7K{=;DJIJDߣw{HHttGDkcq:~ }DǏ K=AONJI'/xR'x^_7>'ҷtD'~"}O~/H'?J?I:Eg_"FW4ߤ߉&^#Iq=:-C)IaQ+vF G6 k@G5cDX$#1 vc/Qa1DXz/",aMOǦi šmNtKc<}֒a kMUXÒ!ڔDMkGmX{:m֑hRu"Fѿah6 u\oP#b)a,"#cF ܮuC f C?ſ :v9)[Ӊ^G;xmg(tX-/Ş#FDm턅X_ƇMJ55g #9;?A<\s<\X2Qt_kiZs :[>J3j6{T̀Ϸ{[?b\q: DrrkmI;drviZ2Y$9vw %JCӎ! :]!={_:^Ǚ ޡ6=݃hOdE,ڢk9@{]'uNݖ]'wӺN(}ejc\k5־-Nk-h_2ڷW;:ЕzWpX({c?U왠ifclɺEIO_5r.*p|.3%N]:_؊331` qi p/ސhs6 {9n43Wcdsa<j)9 0 .xd> ĀLȵ+=1eQn('{{y,y7ZvprwMZvx\VV_;Ji48t~Rgh40;00޸>+1Oc>`yᔝͭSpFS)RxݧFWgj.q Xr40@ 0 88T<|b{w$qԋ؋ufQxhkdj?anmZ-Ê2qe֍֓KsjJ/Ud388]?uxpcC b,;̣qxͶ[㬯^v]52~4{;+"^y;wf5QhkIW\c;jݴNZVBLuf1MrصfMddfbo/6L~;M-{kdy8]s^[+;I__X%Y-eMYZjg g|&㬮O;ɳB݁2s!+zCWX~I:neXUĊD9JRG1e$,o9amy&=x̘bXŋo~S{~\"Q>Bg>dsFZÝ8BHg`\ 4T-BBqso iེSc0w78l" {($G(MFP&;!M0raN}K@ٝlz#at^3XXNv1YvQ|d㶋bC Bڙh;vi.&18p "U"< cV%lv(iӸ7ZLgO։qtg@Kx1l1 V^Lhs)..ŰETqg= g$z\fb gX,T^zDyްZҢIsNr=Q^ލ+_7DsVY8g`9+EY8gZY7GR[^/FVi 7zSDyӥDo]*Nt(϶Ǩu'QwQ.+rPB<1{0p&Ήg챐"!xijz[+i uZ%ZR[#8_+-9^]+5M~6O kauf[bh࿘Ccqֈ4m+7_WR/,)wͭu??zϪ!ˊ05R#a;jA,VZMdk~޿Z,:~ĿVOK=?1~6a;Bg44SCĸʿпۍuI|v>+FmklJ0@]* Y.S@=^uaiOfdnh`DqF\7}1.iv `dTI#A drONP;y7@wv^|>>@!$ 9c?"DZ/m!"F-OhQ"c/KD`"ܤ\/KPT{=zr*t7#OV> r&DdWLkID'ekeܟ"[` $P J7#2W,2oRۥQ(b||ǔpw{ZuZk1kJO᝾}hu?֟SSS'3V{]&62t2i)g]Ymƌ` ,Zn,&zayK,3Y< u:A mdꌠtOkV.Gt'].u ' _7ea)[Kjk`rġ7YYY5ʱvP?֮n& /L2_ĆoppWhh[0Zڊ[; r lr;3^g 7ԅ;;UP1δz9B[䷅&V;o/gڃa-t9upṇ"BiϤ$mek lr{`z']xpnnj9%p>$wՅxGSЕ׭ַx׎靭6XEN3PɽhW\%l.e f+$)wXGO`>:&',wwnn76F=*7-DEDOФRd F\% :SUp:pzȲ] 7-7#9xtE( ;x ^0hcLp>FkЅ|?Ji4HYHN t~ê޵YZ#9Z3=FQvҁTiҚ$?*%~_iDޓ_UP_uZΧ &[Pm- Quu&[3 ArtNS ]r[]8y"x3A] $#gٯ̓Ii#8# GJJl!|33ً{L="kjwf"DHq/D#j.]19б@L8g[LoHߙ9:EgVbXqs:y>1VcV:>[Э;tV?Ӗ'v9oѽH f6U1]>ʵ3]u3Cs.\sw .к{]2Sh'l<~/_;64-_7_~9n]'FA;7 U04븵rY]{V_M- !8]0`7G8ln$hv\ٮ0ܰ;Dvh %G j&@$ HILHxht^bt*\5 *ѻmU_p 9wHQ?L\ϟ/d[\ B}X;˿A:Q^ }?< GaAuȆh9DZ cNAXA[<.xRpM\О֖`Wn^' y3JΤEG$ۭVR|A};}O1Ju-a'LP/uyF\Hb?;ì`Yk*ƝN}~̷̽r2TZI];۩kSt'*c|\m6yXL}[ ^>|ϮZmz)ĺ=;cn3_I6tv}T/-6+G#(Uv GM-uNda]lMеF[V[`|h40<^#x؈0c}dv{V5ZimZ[\Ol^vטv_/ҟk~>W;ts&4-tP>>Dϕ\ȻLqQeO[Q)ɩrwg tx\6zl1V.t m=A x #DA4*G 0 4!_f[lV!DP4;y0y*V"Hqp8D\U{DTcVD<#nxaǶM<$P(/URvG^ao#<8X` C}6uA1D&Ob386 8f:sǕYS(Uį,:ξ~aagQ&]MY5DyT4DOCT4DO48N48N4jͧ=mmq眀 y/ 39$G)^jnuf3 2Ȣ !T:O@_N'%E{q@lS#+ݡ?/;)FGQHO{.4g=v?X;uemb/XYoZK `e;cEY%/ZVzxGWVݚC#>J:i*{m`$iomN}Y +WCb ws; ]imF5BYxH;㋞VH,rZsKB6u6O$O{& N2 nMD LhfYXd%eX'|A-4v썔v!NL4@$)ߝ)ӽ杕p((P+?_LO[plґJD4h)KX\u<:C ĽSU)b˥/\&7_rUJCW͡hi|+&Z4AS|C96ftw/[ :7vt^w[ڞ[1YZs08/Nt!W^\iADr GhSJCKC;hěٴv.c`pdIwwݶҴnZYHZ{C>w^^vCoTB\s{F/O$j^7+h黌㶀rm!ijQJ0:舓jD_E_}ч3qU]1tպ9, 'مְg5eo`LU{-ӠG5,Dr@FxTNvNX˻oqky_D=}E>~-η:F |ɍN?qrI1b>#0sBgYCre66|W|Sư VZVŊ5qbo崨tt ?v?{>EKl k>65#gumUizi"j8m$ q;Cn,^Uل9.Rixk0و%2Of/vwIMly#f>B"xЕ{wK)ELC ~^s=m5Ff3Xm\ax}[VKo1F NJ oBK+SYvr =&N3~3,\Xqq0:ҶFRH߁hPȷFaaAtJ摍x .,O9DPĴǵ0< H }H3)G`?(8q3,#ZJ-od_UM-XaeXaaXx$KOWZxx, cI8KH=o<#:Qc;0N/@G'H$gp)OsE˼t?qȪEU;TZհ:M/ªxj]RIgWUW]Wu.v9}3J:zW·NR=9zPLӺָ?X[Xk>-n~ٗ,*fZ[mZq[n`3XZm]e`|g$Yf$0=VLa5KS҇蝌3F'X[?Y&}{oOx CO' p[Y'/gԇI5"5Y򭕼l3q!uˀB6#\AUvYۍ~poYpuAgF8Z/Ar,7]f9?r8f#G0sa\X.,eRWKϦYBO­iը3(w.ݮX ▻v .܎W,Mg-v1ܶH^R(^`ba4I֜ܚ:dռzg,vB͋PE6/BY"E/BY"!<(]d!|>[lg#|t+}a<|iѥttrj/ oV>F);DVёDJj fKKCBP.j=D%!05#D%(3_5_Ilj WR)O3;Ձ3vqN 8=q2Z jhєe5^0/7.zCc̥m-z[h-t-W%kIW] ryO#i\i,hL ;mGۯOk)y 6x eF_vwYyû<|xҝn|C];@|Ʊ^xE~Æi' Z"ݬb 6X+T/ d{Nv07g:*M򡉁8>. ) *4l,ǝHWH(=_Fpމ=)4@B9vsI]vҰj;C3wjNlݵ |/,b=DJ+Y;1谝+=m0q /Ftz0"ß1&%j'ĒDBG`{ClG #P$v옣n %j¦-c-E@4$&!q\|DN=V͎U{ީGU/T=UJ:xy<:r콣sf\ߠAǪU}j.;2`k_Rժ*+CI#<2fIͶ5KsC!h稂*U%xtgM+XT‹Ԯ4j,^s:T֡@:ё(&&&&&X7UvvvphW;x;hoMZ}!9Ԯ#rl+/.F6r΁@4s 9dkNFj^ ' {}!}!}!}!}ڗ^@kFn $Ad"VK;K8G q)$l618I"ݭghk5S&QmAEH;c_NvH2>E>b)Cs>-rYa60o0Ϙa9{xH_as2vhӵ/|@6ΤWC -R}? ~7hoڒ>owF:S*6-ΑBs)$qEU&Õlem𵯳K(C!tboMM}n>>XF8lDr0TC0CP9G"d>B 0ws!p1Ypc ĦSlf&[ ١l" z$,>B}wcy|G)G]]վ|w ORQbԧkwcUfy1Nh=1c=ܨZ^fVFЂANlv,Xi[Or(ƒd616cm#f*02-z}hn67HY"d6I4Vn֘e6.7Ӎ{mFy9͇cfK~07̧A3v7 +Z^/n,rdFI;&Llz~cV 4N)XX`>B@TfQj}νF16W\ku6]?'G|:T (\P#w< Âx]%{@i*%SE͑ԚϧmGtI/< 7;a1W@7sX&3,r}CF^m={dB&9rPd Rmp ":4}ʵ g~Wj%<λ?JsYMNfH0 6rɡL&ij/bj~@OտѺ.^Sk=ީT>fj]Cz &{YMOFj92b^^nЪ {V  qPZy`aqX.`:ji3i R$i.R'L*kJm MR+N"i<)Lxj<`5> i4jtCNC Qt:0*!(aUۇ.4C::DjaX"0Vn(%vrj9v re9?,a9`~]@Ch!t q]ɏPyI]JˑC/!80=0Csc4)W`e0B3t r΄+)jz\KWD(w )Ժ?\dhnx竤Ȏ 7;#kUR`DjWN/r6 rvJHĶg 6dr-r{{;R'wL@5BGsݡMNgUԾ] AW|F=od붶Zfk+\s:f;aӔGfr2W[ߔ9#h<9_veM$zZfL*=Qv.пYοYŠ].߻䥾sXmi}3N?6[paN.yDW97փx]:ix$4,GSkV?gG hO0Ŧݝ ҝ ҝ ҝ ҝ ҩƐfY΢zL4TlgLnbAB:Ch'lg?+FC+{W  @ 0ԪS49Cgb{plG\:q2t{d|} 2/'u~9ٕt_W; amU*?8ߴѥC<:ZX6a$Ua&j֛$!b_~tD3O3_,9%L#B{u4mz_2h=Z G228LWn5UdIC(Xim[] 9rwls=Q6 < tl&YTpԥN&z2nQӃ8e )g+>B|Rxkk>כﺾt}jn~ܣ?pKogg:LJ/4yT媊<%uf]:Fv7tloca#maxpC8 name07post72L#_< ըsըsOVOV@  H H;jPfEd " OO O  ;UN;F; ; :; ;;#;#; = ;N ;N; ? r7O jO jQ O  O N;N D ; A B;; P V; F 3; ; ; ;; Q ; ; ; ; r V; r V; O V V S S R O#; @#;#; ;g: z z; z +bO z;N; ^;; z; z7;bObW TbRbO ;; = ;B ; = Z;:jGjEjD^E^D;F:j?N;;; ;;^G ; ;#; ;x;x:j;N;;:\:^? ::9 B; P P P P F ; ; ; ;__ ; r r r r ; V V V V z z z z + + + +__; ; = ; ? ; ; ; ; ;; ; ; ; ; ; B ; ; ; ; ? ; ; ; ; ; ; ;; ; ; ; ;D ;;; ;; ;E ;; C ; ; ; ; ; ;; ; ; ; ; ; ; ; ;;f; Cf; C ; ; ; =; = ; ; ; ; ; ; ; ;;F;`@ ~   " & 0 3 : !"!""""""" "+"4"E"H"a"e"    " & 0 2 9 !"!""""""" "+"4"E"H"`"d"OMI>5߶JްޥޥދތO:Zffm  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`avkuqlzpwr~ntcsdijghbfm{e|&&&&Jtd~*lLp&X"H.LtR  L @ p * B |  @ , v  Jt"Nvtr X N0"HJ<vNx@h$|,,~< ` !R!!"H"# #f##$H$t$$%%h%&,&&':''(D())~)*l*+X+,B,,--J-z-.*.l.//8//0H00181x1122<2j2233T33344V4445L556 6p67&778Z8899:9j99::B:v::;8;;<~<=.==>>^>>>??v??@dAANA~AAB,BNBBCHC`C; O!#!"&5463!2~C\AA]]ACA\; ' {?ZZ? ?ZZ; O "&54632"&462]\]@A]<Ċċ@]]@A]]AOċ;   "&54632#"&5462v\]]A@]]A@]]^ A\]@@^]AO@]\AA]^@; A! '.7#"&463!#"&463!>!>32#!32#!.7!wB?FPA]]A&$'.4676$7:*:::eeϏ2 R2U`ee4/-%TL96QDcrCSSCqGM M'P8[021 "?[[?r(b (D!u.t!?[[?,.& %28j˓WW ; O /AU>.7"32>."$&6$32"32>."$&6$32 "t!#"t!#Qww77wwxy99yxؼ``(0ccxy99yxwv77vwcc0ě{<_ 6@|66@{6 ,<<<d=VVV=<<d<VVW; O!T32$7">7>54.462&/! '&5476$7&546$326PuJ ==nxKK(O{@OKx\]$5;|$w*AOOAepHSqkj3}zhZ) r2peLrZ7nZ.9DrƄ?ZZ?6y%$6varqa/l"&۝fx?`; v "&54632v\]]A@] A\]@@^]A;G+2#". '&76>32#"K@]\Azʱ,5GG5,z@]\A71-DD-1~]A@]t .-- . u]A@]u±죱u;G+"&4632>76'&.#"&4632 A]]A+{~'-DD-'~{+A]]Azʱ,5FF5,G]^H  H]^uҠFt= #%6&' '.7%.64632%[_CH&55&&55&IB^~ZeGFev2|%&55&%|2w>YY>; %"&5!"&463!462!2#!%ee A]]Aee@]]@ >XX>J^^>XX>]]5 >'.7uz;;-Fy:;-d6)q66(q6;  "&5463!2#A]]AC@]]@]A@]\];z"&462Ċċ_Ċ? K '.7> m8 ""78"C" ?u4'u4 A' O"   $  $$! yynnzzj?K 5d \ Ҍ..xDD֋~hO O632"&5.7/DB\]\,^, 1Y@?ZZ? .V.O O()"&547>54.$#".676$!2 !20CZ&%Gnثj2R 2F(fS1A]^X@9+*,\XW) d)wаu\]^Q OF"&463!2$>4.$#"&'&676$!2  # $'.67>32$>4.$#FaaF߫(nnثn4() 2F)n"!H;@((jɭ#ttݥ]\WXY(12)xΰn~u󎺕3BJ"  #"%KdݦdO O!632!2#!"&5!"&547Y(-1JF^@^^@_ckB[*51YAg^^>XX>JZA=, m O44.$#!"&5463!2#!!2  # $'.67>32$62tݥ_A]]AC@]]@Z#n"!H;@((jȭ##ݦdZ?%?Z]\~􎺕3BJ"  #"%Kd O0B6$!2  #"$'&'&5&5476$3 '&$#"4.$# 32$6ڼ!q/b2+3ZFbkA2 R2jӍO4Rsi#"O2T혮~nn#"콴n۫)d )Wtp*&ݦd횃MdO O!2'.7!"&46CC["78 "@]] OY@*%6 {6 ,\]  O,<32$>54.$ &5$    $54./l,J.ll ;YPڶPT<SO ̚{M(32$654'! $'.463 $7&$#"6 bWVÝ"!H;@((jĪ*lCRR?LxS]L99 ɭupsv3BJ"  #"%Kx1yk٭W`q@`%L;"&462"&462ĊċĊċŊċċ4 >.7"&462uzv.G{v-Ċċ;-8{;O;-8z;ċD .676 ',(#7C9}&9Q8!!!8kq(>"#<';  "&5463!2#"&463!2#A]]AC@]]@A]]AC@]]@]@A]]\R^^]]A &'&67 .7> g--78!!!8R9'}9 hs '<#X">(;  O2:#"&54>,32$7>4&'&$#".676$! !""&462]A@]/P == P`j/Z/QAOOA7<Ċċ @^]AvX'u1j1uf-^-aa-@I8Ҋċ;j 3v32$74.#"32>54 '&$#" 32#",'&576!2 #"&'!"$.'&7>$3 >329kr2hGxk9&CC+4usiP0dkB)I%gC``ChG8H=}1\ꄎA?NN?A$ YpkG,*By'l'I%6.'!. |X<4.$#!~y˲+ղ5ZA]]Ar1ՔŽGG+#ݦdCdn~uZ? ?Zw^9ab9 O16!"$'&5476$3 '&$#"32$/Z//bFZZFbkA2 R2jӍO4RR4O2TL-^-nڝn۫)d )Wsuusᡫ; O$!2$4 .$#!  #!"&5463!2 v{O+ WA]]Arp';H PVbsvZ? ?Zv; O463!2#!!2#!!2#!"&5;]AC@]]@ZFeeF@]]@A] ?Z]\\]C]@A]Z?; O463!2#!!2#!"&5;]AC@]]@ZFeeF\] ?Z]\\]?ZZ? O:"&463!2!"$'&5476$3 '&$#"32$7FccFA\6/bFZZFbkA2 R2jӍO4RR4O2T}]\Z?BK2nڝn۫)d )WsuusᡇX; O462"&5!"&54632!~]\\]\]]A@] >ZZ??ZZ?_?ZZ? ?ZZ>|;v O 462"&5;]\\] ?ZZ??ZZ?Q O"32$>5462 # $'.67>jɭ#t\]n"!H;@((Kdx?ZZ?󎺕3BJ"  #"%; O463262 &' #"&5;]A@]6....?! 7<{! ]@A] ?Z]A..,,(x7x"!7y%A]Z?; O462!2#!"&5;]\@]]@A] ?ZZ?]@A]Z?; r O$>32"&5'&'#"&54632 AO4B[\]Q77T]@A]\B4N ,:Z??Z^@-8;,HA]Z? ?Z:,; O%46324632#"&'#"&;[C,G^@A\[B,G]@A] @Y,!t ;A]Z?@Y+! A]Z O"   $  $$! yynnzzj?K 5d \ Ҍ..xDD֋~h; O# #!"&5463!2 !2$>4.$#! s\]]Ar1ՔŽGG+ #w?ZZ? ?Zw_9ab9 O0  3 7&>  $$ &/yyn)n)z?@'44' \ Ҍ2}L2)R.xDDhhv2%'4; O*!2 &'!"&546!2$>4.$#!r1zM! 7<{!<\]]ՔŽGG+ Owб$7x" 6?ZZ? ?Z9ab9  OD32  # $'.67>32$>4.$# $'.4676$! '&$#"1M#nŸ$"H;@((jȭ#ttݥCSSCE2 R2jչYM::;`~􎸐3DM$  #"%Kdݦd٭WW٫)d )W`%LO O"&463!2#!"&5@]]@CA]]A dd \]]A@]?YY? | j O&4622$7>5462#"$'&5]\bcCBcb]\t̆t ?ZZ?Vй.77.V?ZZ?:p6AA6pV N&676 >.'VB:;t  }lW=@U ;] "0 bEeL"+,!S ; O">2 >"&' "&'&> WzW  o??Fb WzW WzW b .V^Q  $22$K,1 [3$22$K$22$ ]-J -)KS K6 > &' '.7 &6<{!"78"b!!77""78"`! >&@'u45r'?'u4OP5qR K>"&5&>#66#ee#l# 6#"}44?ZZ?5{F6O O)"&547!"&463!2!2/B[@]]@CB\M,A]]Y?+$ -\]Z?)%]^;G463!2#!!2#!"&;]Ar@]\A+@]\AA]?[]A@]]A@][@ K 6&'&67"D!!77"! ?'5r' D5r;G!"&463!2#!"&463,A]]Ar@]]@A]]A~ K]^[?s?[]^; z N.7632&' q1 +/HG/+ 11++ $n)%%')n$#Q#; "&463!2#A]]AC@]]@_]]]]: z. N &'&6761+G+11++ #)m$"')n?56!2>32#"&'! '&32$74.#"%""j V:A]]A/McFՀr9%??pAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOP; O2$#"32$46326!2   #"$'#"&=<5ӀՁF_B{go]A@]:X ggvJ/A]sk:Zf/j)? A]]Aiss2)*1Z? </6# '&76!2'&$#"32$J6|$%6McFՀr9%??pAE?A]]A ?Z5'\Aq..ei@*/fZ:ieCOP? 4!4.#"6# '&76!2#!32$=( FՀr6|$%6MZP0dh`O O/"&463!4>$32.#"!2#!#"&5@]]@h :&A=>`Tk~ۊN @^^@jJIdb]];r˕m7)G.8A>_l2^^4>XX>O?E32$74.#"32>5! '&76!2>32#"$'.>=9r{>cFՀr9%??WZ|хJ9 ”cp[$l; O(%#"&54.#"#"&546326!2]A@]Fڄk[+]@A]]A@]F8>YX>0f[;'?OQ&`>XZ? A]]AiU O 4632"&5"&462;]A@]\]ċĊ>ZZ>>YY> ߊċO O&4632#"'.7>32>5"&462;]A@]؝;&@<@_Uip~HĊĊ>ZZ>c *G.8@Bi@ ċ; O463262 &' #"&5;]A@]}....$66$ ]@A] A]]A..,},_4{#$6A]Z? O"32>&"#"$'&54624PiU_@,=FHBko^]V'L@8*B( bRT A]]A(; r;%"&54.#""&54.#"#"&546326326$32 r\]:f[\j=bc=j\[f:]@A]]A4S6jk3Jɗ>YY=7kU55Uk7`>XX>7kU55Uk7`>XY>o>Z@/o}ln{;'%#"&54.#"#"&546326!2]A@]Fڄk[+]@A]]A:V H8>YX>0f[;'?OQ&`>XY>o>ZM8U   !2$65  xiW'0'bV) @@;O1$#"32$46326!2   #"$'"&5<5ӀՁF_B{go]A:V <X ggt\]sk:Zf/j)??ZM8ss/'@]]@3 O?532$74.#""&5! '&76!2>32=9r{>cFՀr9%??']\aTk]uV*]@A]>ZM8*G.8A'?OQ&`>XY>cB".4>32'&$#"32#"$'.>32>4.f¨}HH}f7""~8Pz0''0:آZZI6H6T{ևJJ#BhĭhB#dT"78"2Wl8aa8l&"#"$'&5!"&463!4632!2#!: QiU_@,=FHBz}@]]@dIJj @^^@b&J@8*B( aPR]]A]]A^^/()463232$74632#"&'#"$'&5]A@]V06\Ec]A@]\A/MzҎko>ZX>($&KA*b=YZ>A >Y5'+1aQTW &6 >.'Wz!/0!zQ[?BWLj ED iL] ** T  >2 >"&' "&'&6WxWT]T(WxXXXWxWM".."{)* $M.Y"//"{"//"KbD{R6 > &' '.7 &66$BB$66$p#532>5!"$'&5]@A]U06\Fc]@A]vI6H6T{ֈJئko>ZY=($&KA*b>XZ>9 ǧo\$l$8^Aj@cWaQTO)"&547!"&463!2!2vvB[@]]@B\cA]^W?-&y]]W?,(]^;FL32>&"#"$.54.#"&54632>546,32.#"@OxQFW@2,=FIBcNp@]]@ŝJ>:&A>>aTk|ՆK_S[J>|g@ }g@]A@]<]j032>547.54.#".'&>32 32@pȅNc;&@=2@WFQxъOK|kTa> +$>(E@>Js@]]@g}>Ftўu= *G./< @g|>YT;0j]<A85& V0j]<]@A]B z O!.7>32>7>#"$'.'c}r&L"W'!#~r%LW'! 2"8o2|{9WY82"8o2|{9WY; P OL32$76!"$'&'!"&463!&547!"&463!6,3 '&$#"!2#!!2#C5hk/Z/1g+#@]]@1%@]]@D=}=2 R2j ϊPRDbbDK/DbbDõf-^-gYq]]v\]H)d )W]\ؓo]]=O O@"&463!4>$32.#"!2#!#"'.7>32>5FaaF4d:&A>>aTkz҄J@]]@ ç;&@<@_UivχNb]];r˕m7)G.8A>_l2]]c *G.8@Bh?n; z"&5462"&462"&462ޞޞĊċiĊċ_baċĊċĊ:V O 3GWk>.7"32>54.".>32"2>54. $&6$ "32>."$&6$32 "r ""r "Puv77vuvw9&Gr^{<<{+aaqG&8ww9&Gr*~տaa++aa^rG&9wvuu88uuտaa+{<_ 6@|66@{6 ,<<<ԏW&WTWV&Wԏ<<ԏWVVV&Wԏ<<d<VVWG&&7> &'Gz;;-e68%MJA@@)l5C9c !E ' &'&676!-;;{F-:;z J6q)6k8n)6D & '.7>gz;;-z;;- 6)q6i6)q6E  &'&676&'&676W!7F-:;z-;;{!6GG J6q4*6k8n)66q)6i6r*6D  '.7>'.7>\GG6!{;;-Rz;;-7! 6*r6i6)q66)q6i6*4q6;v &6 v: 8"&5463!2#!"&5%>32"&5'&'"&54632A\]@DbbDaaO4B[]^S77Saa_F6S ]@A]]\=XX=T,:X>>X^@+;;+A]X>>X:,A?# &676.7d-;;{G]YP{^5l)c?A)!0S/;O 4632"&5"&462]@A]]\ĊċA]]A?@]]@ يċ;v O 4632#"&54632"&5;]A@]]@A]]A@]\]A]]AA]^@ A]]A@]]@; vj O"&462"&462ĊċĊĊ vċĊċ; ~,6>6#"'&47632'&$#"326 !   h2^1mu_-66-_֥Sn5 +,5/aY9..9Y^KJ}r%F-^-du"bb!cV)22 )$M|7ڄ7|WN!!x;Z +".54>2632#"'3274.#"}ffs0@A]]A5/x";To *F);"Zon00^@@]%%Cp%dpC@G&&7> &'&7> '&'"$z;;-e78%LJRGG6!/-EA]]AFA]TN!!x; z  6  5yyFx>2= nnn<<<; $"&463!462!2#!!2#!"&463!A]]Aee@]]@ @]]@A]]A^^>XX>]][]@A]^];> '!"&547>7.#".676$32!29C[&x \,2R 2hC`}HA6ipA]^W>6* N FN$) d)Vc,VvZM;+]^:> 7"&546;264&#".676$32#"$'.>3264&#A]]A񔳳\,2R 2hC`}HjXj~f/Z/1_ ]A@]}~N$) d)Vc,Xw[mBvӓUxa-^-/Sę; z/ N .7>q1 ++11+G+ $n)"$m)'#;"&462ĊċĊ;+E##"&547>32#"&'&67>3267B\e(p>)^4'4$VD/ LV<6ThPqk\IE4' :Y 2"&5.76B\^],^,0 A.-BB-/X/#:Z" "2>54.  qN!@@!N`JTJ |!To??oTtvt?% &676.7 &676'&767d-;;{%"]YP.!7GGG(i`DK{^5l)c@@)!0S/^5l )c?AA04J : y O#>!>'.7632"&5.763232+"&5!"&547q׺#:8 "#78 "0IF`ba,^, 0DB\TA]]AT]`F`,F6 |66 {6 52\BA\\A/X/ 2\B^];UU;{[B@,: U O J>'.7632#"&5.7!"&547>74.#".676$32!2 #t!#$78 "0HF_aDCa,^, T8Ga( ,OOa.5V4mSzo@6hq@]] 6@|66 {6 52\B@]\A/X/Y@:* P G@)N$) d)VcIsO=]@A]9 O+a!>.763232+"&5!"&547"&46;264&#".676$32#"$'.>3264&# Ը#:8!"#t!#0DB[U@]\AU\`F^,3@^]A`-2R 2iE~to\ajͰf/Z/2cÓF6 |66@{692\B]A@];UU;{[B@,H^]}~M%) d)VcItpDQyxa-^-/S֧;O 19462 #"32$76! '&476!2$>"&462~^]џ`P == Pj/Z/AOOA 7ċĊ~@^]AvX'u1j1ue-^-aa-@I8UċP)! >6.'!.&>&' |X<6.'!.>.7 |X<6.'!.'.762&' |X<6&'!."&4632!"&4632 |Y<3267?Gb3~FZZFbkA2 R2jӍO4RR4O2Tj/Z/yB ,d8)7&\I2#Q\ADfn۫)d )Wߧsrssߡc+Z,scIE4'2; *463!2#!!2#!!2#!"&5&>&';]AC@]]@ZFeeF@]]@A]/ j// j/ ?Z]\\]C]@A]Z?b1V 11V 1; *463!2#!!2#!!2#!"&5>.7;]AC@]]@ZFeeF@]]@A]/j /!/j / ?Z]\\]C]@A]Z?11 V11 V1; 1463!2#!!2#!!2#!"&5'.762&';]AC@]]@ZFeeF@]]@A]/51 +44+ 15/ ?Z]\\]C]@A]Z? j1 ++1661++ 1p; (1%463!2#!!2#!!2#!"&"&4632 "&4632;]AC@]]@ZFeeF@]]@A]kjkԖjk ?Z]\\]C]@A]Z ͋ĊċĊ_S &>&'462"&5+b++ b+]\\]1V 11V 1?ZZ??ZZ?_S >.7462"&5?+b +G+b+]\\]1 V11 V1?ZZ??ZZ?/ 462"&5.7632&';]\\]+b +/HG/+b+ ?ZZ??ZZ? j1 V1661V 1p 462"&5"&462"&462;]\\],ĊċĊĊ ?ZZ??ZZ? ĊċĊ; =%46324632#"&'#"&.76$ >7> $'.';[C,G^@A\[B,G]@A] r%M0S&!% r%MS&! @Y,!t ;A]Z?@Y+! A]Z 9%>~9Ë@ee?9%>~9Ë@ee ".   $  $$! &>&'yynnzzj?K 5d[- h-- h- \ Ҍ..xDD֋~h%1V 11V 1 ".   $  $$! >.7yynnzzj?K 5d/-h -,-h - \ Ҍ..xDD֋~h1 V11 V1 "3   $  $$! .762&'yynnzzj?K 5dm-h -33- h- \ Ҍ..xDD֋~h -1 V1661V 1p "*2   $  $$! "&462"&462yynnzzj?K 5dВГГГ \ Ҍ..xDD֋~h QĊċĊ; %.7 &676 > &' p1+2+11++,+11+3+12++*/YX/*"="*//* ">" j&24622$7>5462#"$'&5&>&']\bcCBcb]\t̆t/ j// j/ ?ZZ?Vй.77.V?ZZ?:p6AA6p e1V 11V 1 j&24622$7>5462#"$'&5>.7]\bcCBcb]\t̆t/j /!/j / ?ZZ?Vй.77.V?ZZ?:p6AA6p 41 V11 V1 j&:4622$7>5462#"$'&5'.7632&']\bcCBcb]\t̆t.60+4LM4+ 15/ ?ZZ?Vй.77.V?ZZ?:p6AA6p m1,*~0661++ 1p j&/84622$7>5462#"$'&5"&4632"&4632]\bcCBcb]\xчtdԖjkԖjk ?ZZ?Vй.77.V?ZZ?;q7@A6p ĊċĊ? O5B6!2>32#"&'! '&32$74.#"&'&>%""j V:A]]A/McFՀr9%??G+ 16// l/pAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOP 1++11V 1? O5B6!2>32#"&'! '&32$74.#".7>%""j V:A]]A/McFՀr9%??_/l //61 +pAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOPP1V11 ++1? N5H6!2>32#"&'! '&32$74.#"'.7632&'%""j V:A]]A/McFՀr9%??k/61 +3PQ3+b+pAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOPP1++1551V1q? O5=H6!2>32#"&'! '&32$74.#""&462"&4632%""j V:A]]A/McFՀr9%??ڙڙmmdpAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOPuċĊċcb+=O7&$ 547>$32'&$#"32$7632#"&'&67>3267+"&545K<>'8D8Pr9%??%9r{Q6H6u yA)h9+:'`K5#VJe*kʂ.qt͖WdT"~p"1XjfDDfj\3"f{"KdreHF4'2[B? O 4A!4.#"6# '&76!2#!32$&'&>=( FՀr6|$%6MZP0dh`1++11V 1? O 4A!4.#"6# '&76!2#!32$.7>=( FՀr6|$%6MZP0dh`1V11 ++1? N 4G!4.#"6# '&76!2#!32$'.7632&'=( FՀr6|$%6MZP0dh`1++1551V1q? O 3;F!4.#"6# '&76!2#!32$"&462"&4632=( FՀr6H6MZP0dh`ۊċĊċcb_S O &'&676462"&5,+b+E* 01+8]]]] !1V13*+ 1>ZZ>>YY>_S O .7>4632"&5s+b++b +]A@]\] Q1V11 V1>ZZ>>YY>0 N 4632"&5'.762&';]A@]\]-01 +//+ b+>ZZ>>YY>0*+1551V1q O 4632"&5"&462"&462;]A@]\],ĊċĊĊ>ZZ>>YY> ߊċĊċ; O'I%#"&54.#"#"&546326!2.7>32>7>#"$'.']A@]Fڄk[+]@A]]A:V H8c}r&L"W(!#~r%LW( >YX>0f[;'?OQ&`>XY>o>ZM8U)9&>~9ċ@dd?9&>~9Ë@ee  O  !2$65  &'&>xiW'0'1/ j/!/ j/bV) @@1V 11V 1  O  !2$65  .7>xiW'0'R.j //j /bV) @@1V11 V1  N ' !2$65  '.7632&'xiW'0'b.51+3NM3+ 15.bV) @@1++1551++1q  O & !2$65  "&4632!"&462xiW'0'{kjk!kԖbV) @@6ċĊċĊ;  "&463!2#"&4632"&4632A]]AC@]]@^kjkjkjk^^]]ċĊ;ċĊ O)7463232$74632#"&'#"$'&5&'&676]A@]V06\Ec]A@]\A/MzҎko+ 171 + 181>ZX>($&KA*b=YZ>A >Y5'+1aQT1++11++ 1 O)7463232$74632#"&'#"$'&5'.7>]A@]V06\Ec]A@]\A/MzҎko171 +181 +>ZX>($&KA*b=YZ>A >Y5'+1aQT1++11 ++1 N);463232$74632#"&'#"$'&5.7632&']A@]V06\Ec]A@]\A/MzҎko+b +5SR5+ b+>ZX>($&KA*b=YZ>A >Y5'+1aQT1V1551V1q O)5@463232$74632#"&'#"$'&5"&54632!"&4632]A@]V06\Ec]A@]\A/MzҎko eep=ppe>ZX>($&KA*b=YZ>A >Y5'+1aQTcbbaċcb= O! >6.'!.|X<F:,  /A@.'E0"2'v'3"0F; O $24.$#!!2$6 #!"&5463!2 !2$>4.$#!~y˲+ղ5ZA]]Ar1ՔŽGG+#ݦdCdn~uZ? ?Zw^9ab9? K6 > &' '.7 &67""78 "b!!77""78 "a" ?'@'u45r'?'u4OP4u; O! !"&547>62B\X<ZZ??ZZ?_?ZZ? ?ZZ>|;v O 462"&5;]\\] ?ZZ??ZZ?; r O".   $  $$! "&463!2#Uzznnyyjd5 K?EbbEEbbE \ Ҍ..xDu*gh"]\\]; O463262 &' #"&5;]A@]6....?! 7<{! ]@A] ?Z]A..,,(x7x"!7y%A]Z?; r O$>32"&5'&'#"&54632 AO4B[\]Q77T]@A]\B4N ,:Z??Z^@-8;,HA]Z? ?Z:,; O%46324632#"&'#"&;[C,G^@A\[B,G]@A] @Y,!t ;A]Z?@Y+! A]Z; r O"   $  $$! Uzznnyyjd5 K? \ Ҍ..xDu*ghB O>2&' &7XxY} | "/.!LeE bDeK; O%!"&5463!2"&~\]]ACA\\] |?YZ? ?ZZ??ZY; O# #!"&5463!2 !2$>4.$#! s\]]Ar1ՔŽGG+ #w?ZZ? ?Zw_9ab9; O)"&547 &5463!2#!!2 C[c[CC@]]@7@]]Y@*!&.@Y]\#U&]@A]; O"&5463!2#!"&5A]]AC@]]@ dd ]@A]]\?YY? |? K>"&5&>#l#ee#l# 6F{54?ZZ?5{F6; r OF!"&463!&4, !2#!"&=&67>54 .#" #A]]AjVa~aVkA\]@jHf ,1q٤dIhdq--gH^]Y[%vvsK]@A]Y?Z2T=:rQVyvت=Q+g?Y; O %"&5463!2#"&463!2#"&463!2#A]]AC@]]@A]]AC@]]@FaaFFaaF ]@A]]\^]]@A]]\\]; r O646267>5462"&5$'&$54632cb݅cyG]\ֳbcѳյ]A@]Gyc A]]A83';^A]Z?¢FL?ZZ?RNFC>?Z]A;'3; O)"&547!"&5463!2!2 B\A]]ACB[L-@]]Y?*% -]@A]Z?*$]@A]; 832>7&$#"> &' # '&76!2 8 nzžn8%@@(U^T(/ TieDf8;*[6}hXt!]G}Aq..qAs;O O ? #"$'"&5546$32"&46;2$654&$ 32$>4.$#ݫit\]@I憢HaaH`Bz(uuب/'@]]@4֪3ᅅͪpxagW~W刎)@cܥc;O-2#"$&'.7.#"&4632>b@^]A"zv/TA]]A!z;;/k ^]b;.6z;^^^^;/v9!F Ak; O,4.54676$32'&$#"3 ! $  lG4e7""~8Qj|3 .. 3:|'di6i H\@}kM"78".\w; i&j :w\<lP;G.54>32'&$#";2+"32$76#"$'&5476gky7""~8P5,,5:GbbG6= mGYyJc6H6oQ`pMրtɌd0dT"78"1Xl8aa8l]]P P ',NTB$l$aj\KP;O /=2 "&5&'&547>466$54.#"j블b4SޢeeXl=K+24 /T@%?e@kJ(VԑA\\A$-(q//))~.XQDu,)X ŒI%DO/2>54&' &676 >  .547dts]:#":^Z,:;z87z;:,vsK[[Js4[P  P[ 8x*;/;*x8!Lpp􄧔;O(#"&54.#"#"&546326!2]A@]Fڄk[+]@A]]A:V Hڣ]@]]@ F1g];'?OQ&`>XY>o>ZM85jo;v 4632"&5;]A@]\]>ZZ>>YY>;463262 &' #"&5;]A@]}....$66$ ]@A]>Z]AQQQ,},_4{#$6A]Y>E H6&' '.7 &6;z.;;zz;;/q/ E!)6j!)h)!l5Qx5l;O,%#"$'"&5463232$74632#"&zҎj\]]A@]V06\Fc]@A]]A/M\+1OA\@]]@ ?ZX>($&KA*b>XZ>A >Y5C"4'&>2 #"&'&6>! .>E=1 #C}Ϊ;[W|pb'[)H. 9*pwx;,oWz\$G;     i6i'0'blP @@; "&463!2#!"&5!"&5A]]AC@]]@aeeab^^]]4>XX>4>XX>;  !! !   &ii'0'6;@@;O/  #"$'"&5<54>32 $#"32$gt\]]X ӀՁF_B{gs/'@]]@3 ođj5s(k:Zf/j)?; # )2(  a'@]]i6ib@@]]lP;*32>&"#"$'&5!"&463!2#!: QiU_@,=FHBz}@]]@@^^@b&J@8*B( aPR]]^^/(;,4'&> #"$'&5463232>  -V_Q #C}Ϊko]A@]V06YoȜ[^V6Y&?9pwxaQT|>ZX>($&Kq); rR!"$'#". 547>3267>546232>54'&> L[ZtΡ^A-XX>2!AL `bY'D)9(lt];O OV&546$32'&$#";2+"32#"&4632>4.# $'.54676WB7""~8Qy=33=-yHaaHy4 == Pף\\HggHՀFFՀANO@l?Ů8܁dT"78"2Xb(/-'^W~WYL0j0t7mʕm7\]>_ldl_>_pq_;O O846267>5462"&5&'.54632ee\OS0^]^keeԗkÝ^]A@]0SO` A]]A8YYM@^Z>`r".A\\A-"r`|>Z]AGMYY;O O<!232#"&4632>4.# '&547!"&546fB\1%o%@@%9rآ]]HggHՀFFՀ=Kʝ(A]] O\BC/*EEgl7mʕm7\]>_ldl_>Dr1r]@A];L I0! !"&547&'&>>!2#!.76z^/C[ik,n,QI"78 " @]\A Mfa>  A Y@*%x2~P2Zr6 |6T[~Z9G T8f; O<&,#"32$764632 #",,3 6=4,#" FssvAy `EJ5gqߪ!;EybndݧdՌM]pfٷ7,WW󎰖7;r  "&4632"&462"&462zkjkĊċċĊŊċĊĊċĊ;#%&547>!&>&7!&G z. .z G&w'fnf'v] "8+4u8T8u4+8v$V TT ; +%&547>!2#!&G z/ @]]@9h'w] "8+4v7T]]T C O 632'"&5.6(&)$:*:}:PeeP:|:) Txp)>?ZZ? %)px; +"&463!&676&7A]]A 0=> G&w'h^^7v+8v$V TC O #"'.>4626 be$)($d:):|:ee:}:*Txp( %?ZZ?=(px; +8.76$32267>#"$'.""&463!2#"&463!2#X'|j&c>Wk7|3&j&c¡k7|ҲA]]AC@]]@A]]AC@]]@5L5|@itG5L5|@jt^^]] ^]]@A];\ V."&5463!>32#!!2#!'.?#"&463!A]]AH-./-7@]]@l@]]@w-./-6A]]Ai]@A]Z.-(s)]\]])((s)^^v;  $!"&463!2#"&463!2#"&463!2#A]]AC@]]@A]]AC@]]@A]]AC@]]@^]]@A]^^]]^^]]= ?.76$32267>#"$'.".76$32267>#"$'."X&j&c>Wk7|3&j&c¡k7|3&j&c>Wk7|3&j&c¡k7|5L5|@itG5L5|@jt75L5|@itG5L5|@jt;-^32$7.#"'32$67>54&'.$ #",'  #"$'&76$32 >7>32 8j/&`Vj8%@@ "&/j8%??%80S8jj8S=KK=S&nF7eA)}n%S=KKeiZ($PE.ieD`OZieCPODei̛q؋qq//qhЇ1'fp>q=O /2>54>$32.#"#"'.7>vχN:3&A>>aTkz҄Jç;&@<@_Ui@g~>W*G.8A<^j1Wa *G.8@; #!"&463!.676 l"+[BA]]A,("7C9}>&9D+@W^]ek$nx; )"&5467 .>!2 B\,"Q9&>}9C,-7@]]W@+D\ xn$|bm9]@A]; O !!2.'&546zeCB[kV<@Ul\a;Z?/;>. ?Z; L-#!"&463!&>!>!2#!.'znA]]Ag ,:F>5 66 5>F:, h@]]@1W=ATO^^m'F0#5(;(4"0G']].<=-u; !"&463!462!2#A]]Aee@]]@^]>XX>3]@A]; 832>7&$#"> &' # '&76!2 8 nzžn8%@@(U^T(/ TieDf8;*[6}hXt!]G}Aq..qAs;N  .'!"&463!2>3!2#L F[ZFA]]AA_ S ^@@]]@ .?A2^^O8 5K]A@]; I/ 3 $&# ! >! ''.7eO '("78 "/"78"y!m/dH+] SFU6 |6=I6 {6; v "&54632v\]]A@] A\]@@^]A;   "&54632#"&5462v\]]A@]]A@]]^ A\]@@^]AO@]\AA]^@b9O)  D 1$6  )  A RV   ( "bR 45Copyright (c) 2017, Cristhian Gomez, (gomezcristhian7@gmail.com), with Reserved Font Name Tecnico.Copyright (c) 2017, Cristhian Gomez, (gomezcristhian7@gmail.com), with Reserved Font Name Tecnico.TecnicoTecnicoGruesoGruesoFontForge 2.0 : Tecnico Grueso : 3-8-2017FontForge 2.0 : Tecnico Grueso : 3-8-2017Tecnico GruesoTecnico GruesoVersion 1.3 Version 1.3 TecnicoGruesoTecnicoGruesoCopyright (c) 2017, Cristhian Gomez, (gomezcristhian7@gmail.com), with Reserved Font Name Tecnico. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Copyright (c) 2017, Cristhian Gomez, (gomezcristhian7@gmail.com), with Reserved Font Name Tecnico. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL;  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abdefghjikloqprsutvwxzy{|~      !"#$%&'()*+,-./0123456789:;<=>?@AEurouni00B2uni00B3uni00B9AlphaBetaChiEpsilonPhiGammaEtaIotaThetaKappaMuNuOmicronLambdaPiRhoSigmaTauUpsilonXiPsiZetaalphabetachideltaepsilonphigammaetaiotakappalambdanuomicronthetarhosigmatauupsilonomegaxipsizetaangle therefore arrowboth arrowleftarrowup arrowright arrowdown congruent equivalencegradient universal perpendicular proportionalemptysetminutesecond =Օ}oըsvedo-2025.5.3/vedo/fonts/Quikhand.npz000066400000000000000000002732141474667405700173250ustar00rootroot00000000000000PK!QcvnLfont.npynLv̽w|i$@ !@PBN6B"" ""**WZP"hDE/?D,׋Z#rP!ߡxÝNt66==KTv)_r|Gp]Qg@;ߟV)Aa_\5^u2GN9#_PxP TM<sC]#|+?c? W❴QaI VO)Wh<9N_tU*v:A9%v'l}fc+K-qLf_`DZ1pia'7zD!\M`Ǎ'lIqHObC&33s'ͯGiVu{V0Ҽ:OԈ3,g6nVc+k\~r#R46xm~d5z/ߍ{Ɨ;#Z83B)kp5ႈF:##D 1D^}iX'6?OP/`KEP~ B0C2a81xpQ#rQhri ޶'X186p881xqMܱo9p4p8`Dy'N[t`[|$|$xi4YIUTV%T/I~'y_R$Y L%M2%gE [PQ2)M6P_\S4АfK].^72CڀހrO/Gi |(5kgˤ{8cTgl3'Zg_w &]!0Nu~MmTp8xr8sϱZokVխ䦚Rer2Ri6Ƨ{7?(6cy҈1A(fՙFOWɉj2\^3 b|'U gY߯/buz[s!@/C3hk{, wDc5RTr,YF~,OVC<ȧCRI}X路ol ESU}(ϑWj/QI+!Z{A_nfZgmp|/+PamIixEE")tJXL"~ȞiOB)l!E#4M [!Y3B,xJe#]p+ ,Y98M.nJ%AJB*OI#!ؕDv{,r$9!DTOU}s)$'E䬸h $`=6X޻-X ڦ8^li q6Ե}C 1zFx+6~F$rVnJ ~EI"DTy!Ɛ/'AxMEP. B? B?)Z7dpc(dcO'7֏?,8`oJaԝ8BFI0  KɂYR(\AJمkH\g/FiLdmW +VYx|6^7pH\y߄Rx#Y+RJ2=GipT;ͬkCu'`MVo >5cd|^}l:+flyR':ytc1/X Gk;b&Sf=Q׮z,ӔNUÂx$)?)&XW6 v"^_U-JX2_,~潬eEY̗Cf92z6<>*ح,b~w54/)voN5`=g k߬en'٣BBMYag-͜lN5fl:_xcVqD\>fBn}o^[ݷoKcZ7ePDyq(pO–Bx)EKXabsނ]{=4+\FހA]Fe%(5߹ %p5YK.Xjg)V(9.QwMkb4e 눸ӂa}'O'/`||+G)G0 8;3tΚkZc~V~ʪVَ=Ǻ݊e{}'mt 78 xxEbVb/eb19(wuaBW" m q,c,B)d A4p$`ԉ“nRy2hHO 2{;UgEs#Y->gh53ƴ~ujށ15@i`\0TP?n~i1am2t[S#f~dJ=\W3n_|}~2NYM):OxGE@٩ǪA>k.MpQ DܤPE,TBn\d-kъ^s,%~'4%noWRjsmp.ouu֋!:J5b"L5}# ;XvSZsђA∶,syNaĐ/2N>LO(,܋84\/ijz=P_{b̽]`=G:{&5&@,{q#ReC(0Y1`}",F@O"R 0qJΆ*8UgS3o}tuEQk;/B_AM~]G^R S_TV󵿫Lb_Z.X66)/V6Iw2VʵZ&k&U)!R g`ѡP'uvbvuVOb3+Dzvoeyw*ݣ {k Vf9_l9fAu686S6:yܨjF "uK&jFh3M[R()ݞ nCdc2(8ŵps)(8 +&&פpYLIJ BNHtf Yq݈v <p1^$3 7ph\1s{NA=p%,/]*pvM4th[jUMACRU \x= Oux2GZNIJ_`'X=[?Փ^r |z ߋ8ܥ;Kb''.S-v'E"flxrIoG< ?\V^QD JOB[믩An厚ߣvC5l_Y?X_Yز ~%VОo`/oCηv}l{۝ֶny}&5 Rn~gǹ-Xb*<PjWJ ńL˴nݒ4{jX bwvv585EQPS ˆ&oɜ(h۞m$(¨#dށr,"55ukх2}Qw'V!݉dw-tR̹=R) /{Gҷ;vECHhǗvEΈ"q`1[Bhv,­HO.sB*'AS":j;vNCI(zzɡ 1!׏ЃsU'7HW➓U( GoJphmѪ=Ѯ]+peaЛˡ1*rE(CU:+·_P'ePqAxhJKW8WkJsWs0:{Tfqjګ ~0za=`ş1 ^j =GĐmÀFq880Aijԥj`WO蛌JRhl6@SO)I/j}Eo|i|"bpWY{$)YMۿ79fsF9]ᅠ.tVW䗃g_l3='|WtAc/miKU^Σ\b#5*M e;='QQJ%Na%fg$%yx2byym˪^jxhIJ7Fze_0I9s(zc}}zQcweOc+̿Ve;w1iE &"-==iߵ+j~]dSl/1~S[ۑF#f+E^],Fv"E2ܦ췧IQ͜B锢Ejc[br+J#b"o7LeMCr g`=< ֍J)Wp(RDWlp89:6w:GES<&:pw,EV+w?*ow|*FAUʕ$TS*僁F~yy>u%H4{W4_0Y9(D}bajuqݬSSze]p||<'Y| odq`W9<.>13G`'=Y;2jo0*Tͫ u2G*_+龡yR&zk0*-0M}vZmڟn'#8]fqk=9vZ%#EX^ԯzwnk%X1) [O3̹c]/VVl6g/ `Ou }nKR^ЎY``z̞ng񴩉uz*FqZYKp߬_-FZ类Vʾ0lir@q586wu~_Bz;ώǸ3&()ˆP{$kqD9.ԙ?9"I=\'mTQQoBE2" S#ek<0bu(`a&T!xb'0Ƒ= Ӊx X>+?P)"yIu8VzL!Z&Dơyp쉔^J&:P=JVU#`7C=a{ 2GJS8(QXQD 6Άp~:ٔ~iX~90@?`/`8U !p,DGWi6D$9"Π5Vo+ݍl#I#)T;hG}l-2ʶV[vVhN4=.tOڲ=!4,zXw.48\d*a8Ю(p4hI.q ")ĸIL奩.KgyDLG"%XK^K$K }q]ISlM!?~I!VBb-"OΗ1Ȏ niYuĺӊ vd23ȝ 9hο $j7*i+"5[vG9va'ډfOfOv}z);oI([Qh;RPf:)F:!&%G1L;v/iaYF&tqgu1PHH*T$ а43J5AS 0s!9..zQ/Pcɡ1p8ͱk)\),XU]j"Ɨ.y R{^(L7ywJ%9G&@(|y(U14e J"#Ph(£9V !]4$3Z.mt$҆-dgwH` ai.bϺk ^eP0O;!x~ցgSNSz.,5ohC䏙0ҞQTS<Ā.7^1$c$/aXZYה-vи x`cbsf{~ ҆pϟnɨ7;x?0W)Wf7:wK/VW!{o$7uݽ?g|#ߘh̢^ӡCCkŝ&ڧuVlV\oO?CA5]C~SUohDhr|gve7ϳ,?a2[γ̷2Ia$aoG™Mʸ8şŶ~1xxxڼLXVybg|9jzʔgYY,/]Ȗ}JiM(vY,}SW:5`h~ .6W㋰W~׫凔}؞Ѧu˹ʗ%֚'Yk3_fc#\3`4Xa(U}jW\(Qg,2ۍǍqmmeqqʱh-N}|8fۧ}c}=G׭r~Aq י_[e|:enuCуa{Soiz ܮK]ڐ`=]cW#|nt5ND7 5O #f# 0B/ L)TR@bVzO 3"!Sw1^:taXF31ΝKL$H1`.MSeT\1f0Dm*IlCxNPoK,_%GNSlAa8 l+2qЊie(Ł\(WG(ߤ DĔTW=>6h؟k<غdM }uqu p0zӢ! x ClN[Ālql[  x "fTؒ;(إY q_?_SX Tb9NrZ-}rS9b-e_އ-r 9ֺDbgn{v{yi~vBv7^0Oډf[,k5eKYvꝅv`TQggٽ?V'NT|amfwثv1ώW0|O|3ޟCIE^b̃f},i{kp ziK4˨˚ 0)-sSK}JzLņINgǽ`dA6nt1ͣ3e'] '!XSĉƔFqX1o%AәLסL9yT\FXH.5;QG#iJi~1#оF`_s跜2:eh#FXbP8CakWTD8J}NS+ idD F6J31^8E+U[04/ͷh9>Hx#`2pdJܭ'GXG̪'SQJ w(Wrp'?Zԍ'M?Y, 4"s^ȉZDLo p,[ߩdQÞ 8P 4PL(ĠJ#Ajɠ]M;ƥ^M0.Z 㯰|6_Z]l7#l~mg7hMzga>Oc,O,?6G-29m<Uﭿݳ?Gܪ6庤ׂx혖ϲm|`O}ecTkRNwX~J˸՘/Ozߩ N\={⿲ՅBg}`^~Nm'cBv/o|- >VƲWF}4o21F/,xf)#OZ7Bg8j6uWT\VͺF2ezbqiF0f ͪ;BG`Z/4;mhG=p(x=Q.Ѷ`c> j ܒ}%v'M42jeUPޚ`VbA:rN+(jYMUƕA[J7s,Hc2*hNzhp%KL4<ԖLʥiD.Le;J?Um.Am07*Y%뇽DL8jv`a|fx@uj~oUDo ,W7Ú%zoŖXz}Ūߪ~::yl]u(}{?j^j_su ܛ8^g ~{D0k޳7"veZbjXoX@Rֵnz nGE("b$Ң]Klv^\ÿCik mG3d#%-gy|2iiq.%d6ha N_1+ji({~us"YTb`/f*S\dYb&) 2ih +B(h4p8:XԫmAVϷ@U,d ,WoB>PZ-ljMBv{ުaPUc笾7v^:$y=Ž$߯{zY,Y@>eQ;jZ$ŊyCf#rv`fPYE/<~(ʊtN+2l>o fclqbSzTgn;|q1M5yFy-qVJtBj7uG|B>ow 'C?oُٺإQ0uV]a'd, fwƲe,'BMl&ҷr.Pj$`RHM۩Y"R"S[w"hgRm[NjV=ijI>lE!^(U@l$RjC `pDA[1$u•PK@ڍ)#ߎd};beHI9 ,| CݘL99R i4޵0]h^W)-K۝&Ѫbv4M4%{<'*J)W=hTJ+ǥ(u'Q] 7Q,4<‹ix.i9v /]_ޖp>mA}\[4Ak` @ #A4 v U qW.Fi | cW\!p ~K;20Q#-)QGyiO6r_`543UVuú`ev{$ ׶54{X!]kni,YH~1_PrYOVQg;nߚCV6l V7M]2y6%jW'3kc<&e+LX5ߚfm6c`7Ǜ1B(|XSiޯav 6{{]bg_?cN ~+}5fisvJhOBD;nF&|ZA?=M}W@}^{@;v\f^ep)TͶof͓CL;~ff}L/;ak9X,0Nw'oRb|'5/ ƭRs5bjX6"xQDGZ\Fѣ)sr[(@Mh FmN<~`5erFO@dHPCGtEp$r ~xL|Y ꌥ#t:]5|rDMYµXD"r-koΦe܊ h+9bRTJc)8 8x\bZm - Ym X`ś $f;/,DZZKh5m=C3qVz+Qω4J\],~6Rb:i=pP,EUAZy&`P9IDϤg[{03P8΋(T$]\p6pPx%`Z6JZ\z J5iMҁi遴@i@&h4/ Io)x>rG >!x\ ;-6PXOXe x{_շZY[pm1Cl OohV7_(٩k?#S2XYխ ?RjFmjca>1ùrX4 0"m1nfn^0C+tZ"[V#`i8c3F =2(K6e_B+|ew&M㦹,0\>oZ}\WC<÷ѬKgj iQ}BΖʧ[5R*Zы" c:μQlƚ&`7{m`u;/g؍I9g/DXeFp×svh45-YzFc=j2/VUR#ھ^b?c/4ZٻGqM?|?[N2CNh]mtٙU b:G c 0byLUݠa<5Mm*45Q ;TƛF'_yj\sJ2i?|T>C'{4B-@&{̜D4C !" *AQzVDDXϼ@~ssyߙx6*?ex/Um^EdZm2v$w17Q;l_GS--ʼ2טbˌ?xu/ 禼)_{eUBqUW}+ONzc(\iݲ(sŞ}KBei6D{pJ6>fg{3UqYkv_ŭ"K?9/Ǐw}ysmw\.7rSЊ&{=RA@ "QUS~vƷd^/XY7xD5=pɧq^kxԈ4QK0;oO*%`x,)n(*/x 4kͳ`Hc꬚* jnpW|?{Apy$T(j!:Z졃?v  4%%)>^ YƐ&ZWڷ*:\/ڦ!HҾ$b "!@ 9/R1Hm (N7l[`:$PkskZs#hk$+o"pg]n`j EGŊO DSiz{&IX/В,5T{x uI@u䁷$r: HJcPN`'PMjNy٘'^MD%P IÑ 'IH|f zH$<18y K(ň jVPl8L %fdPM4+C/%g&uwgggg;1';hYqz_e7.=Hw=󼂫aY xB-K跆͑;R,^/-to8Z`~;Rmpt**֡]Gуӌ*#A#0&ys *_-];ZA- ;6 "5OEs91>V6F+x2t hsIc. sAw =vFz} :ҭ'0V0ZP)Mv{"yn9= 9tuѲ U\DZ.͠A!݌4t3uu2HGJ{ĨPQOxf˟³DͨfT43lv%^~f?gckױ[E@?ϩ*73tȹA@Sgx;V_΁ށٕ5W&KЂ,Gڱ],u?9{vbUm| :Fw˹VAǽa_W-玕i_xӓן;J+~3wOL0 uywhX1}d7uGjtYlqĻ`u{{R#%PmMݐdڇO&g$N5)rRz6|W嫫rY6D{1RִK)(mX[}1r6!#y4;yCvSsT˾͞3*_>'VȮ -j>?]ݭbf#?u_ G7zD~?"4Kq~8lQڳ{]j$iiiV&}EKtc&<5 [y&Q-%GhdjYoV&LݸW&(?> |ԃB=(6iYp0QOH~/4'soX~ȅbHlvgy`C4B^IҚi\XE,ݕ%g!P-bt" tB =_4 Dei!i.w4r 6 4$gO4 : c8$a8юaa4x7T2p$q$$:RHor)Ň  Z$() t k$g2YR9Ȫt6'0HH{QҚgbpWy=~%oEL34^zX@jsh f -30 1^H9:/Ercr$.#~# Ў3j.2;CZYJ: AZ{"u$Eҵ}1/-.9mVׯFY+A@#MEA p3d\r zKt9/b6͐jYz>ތ֑̽|о"Oq^@c[ e,&y0Jچ j;ރ]x ɉ;qd/m9t$Ճpo8={t+;@!}w#2HNv@nz<:W;^%(?1t Yehb+UIBB\W溊nf*YSHE$/7l+?c!埲^1W&gİVI1@ J2/X+mzN9*d'WB (7+;o,5"\ ubh%jl_ weٱl˶1ZoV橿${6_wx&f<'mwf&_wU'fEi_3[͛c+5݊wڤIiz}\7}>y(Zp*Pbn]!vdJͧjll_L+jZf%8Oj3Q_f#}vSo PUNURL>իDy''']}$w1(f6 L;a߀ 6[kf+u>{THk!wIΫ=yh_:4,:Q[]!;dޕK\/2+O5J\ vE5wdC/9߂eEżv$e͝ yBm1C~pYVez#ǿ=Ï. 5P_!+JlBlQj9R I2*<^j)R$e"/ Z %F2TL]sǜ&^jSR9nF 1MhḘp7h12 )|oC 5$SH9$)T?IJ=ق~C3 * <ߗCh3@A՟nKzٓ ԇlCAGgg"7* hEMZRt$`_a\ʝL=xZn3ǡzwDGhHͥTR~pA{ϵAB;<@ ]f.<^*sZ3OՑ#9@`Ig@=\@р4}\Fit.z]pPͨmFG/ tJ|9Tj0[pwU[ЮogЧa'Z&p635;h4i:Y4c x'riy;lGi@sn'av 9Z6} ׮En-oBANZPߍeդ#hUNAh?< Z*c2kZ5 &Jk(^pe{ sǻCD&?W%R܎([a:y>lVA+v¨eje^ tϗY ϰGF.O;3-קo2'nU gM dAS-ȁȍ޹}u|oei)w\)3zʩ~'ϸ*Z5t.Ci_\KE ]k=l wAz'ҝb!ξsEjHOG08(4GiQ0, 3;O_%1KK>W *!C%_yNRВeH(P H -W> ?&δ+ؙ"U!&d1Jƒ$SvۊB18&2aAE됲I"ĪkHKhaMhzت%om릟dɘ<^j1zE nB{ CQh'+g|^>ǝԺQK&鍒MQ3#Vj䶦;ʼnQB@izs ɷEGPv<;ڈ!=Cy)3ȹ@>&igPKouuη7QN'9=-MZ$ت$:GѓC `$x">qBXnfҷҗ_f//w%F)'^Q?IKxgfbxO5^Y[VVd8V^S.G_s(gsÎݸh1Eg!sD=b+kf1Yߣ-w1a^dUv6/5[  J7όw;;&7&6Ubuf ,r/Xҁv1)SbE>_4{NJn]h?kg[]R&'}JJXKcBm,b"?:PE~&;ƼWj_K&0-1.J=O{7w[TV0W Ƙ'wԄ ?f8#S' ʩR{;])nb'jn@ SZ%ZuVa쏳,g^NDB6|Qt_ ߻w.6=`?E۠|7`tr(FuWSa.w2&l(5j5Z骫2X(UfX62-2T5:^nEq׺;eV5ˏ$ߙۭWw~{ ɺkEöA;- NÏ{zܟ ?;D _ * ۋ[QEPHk7Z̷6ŁԶh $ )Ij SiМ~m^싢ž>/#,v]u$~Vkc$n$hgDЏ?)YRӸǢ]&P|J`AV/hiA$:}(vgh% #TPಠPxXЊ]O-Z_y/& :c$dRI<>?C;Y\miH !b cɐ 9#PU)$aLè'$ t3vʡZ(D/MfzS ݇jj!ad$i>I2 =EKZeR7)M 5Up\ԋc@%D5GJԻ YAgA"t58 -G֢AH / @x_Dn),"= GiUP7]ߟ-Z aIN݊qބ\^M͆t1J\oG֣/IH/@!- Zo4䪁]:^[v`V!mG 2J܎LԲkC4ytzYO|v.]I ']Ina:|H,ݯe^<:dq;~yrL)5wɨe>gDUB{p˓uF_K5[#՞`߷EiS|/6]$$-OFQ^?]J-O߾C >l%m9c?Ua{m,O~J/_ycYcduU]]SdE1O+Lϳevmk7=IeVy^\0 =a|{sL7߾=Z(0'xVwz{G=zÏ^>a(Kf%KZ)YpK;W:dYyZ\+.5Vst"VŇՌ&Z*w'd*О=&d'-t`G򨠞ƋYNW+6 V ^_$}+}Uo [udYM[}WD=U1gTO9rxK, V3aqw5J;>0?ƺo8pY%3qjnud j|[[tG!&s[cAd .8Q'Dz =Q''ͅWɐB=Gq, /HSxHż2-KtB J"S Ғ{'QB1*v^y*GB-)~Dҙh^/~吶I"$"/i6&4}dpRz\ LQOBRI(sJ`h)z&$BO$Xa.Azn6yPv@T<'ףx=@a"\E!b:ɲv WG ԇvh,hKrM:1d (d(LJCP(1Z␛1= YC I@iÐK$ݵ$@{,}@PN&rAU)/HNU2j mU|[ٚt3=Y)>Ⲽ4ϼyߧ@x;4i6̾cU0[Vo3L~ 'FD/w|3G9',rXX~[ʍ}*ho?3lN8Qy)Aysi,MVXxUuu:cQʩk# ;5ц;=Sa}>7\fj|b 3S:o;jʣ|%QB+dʩkp;5vNcx.1c ?кgtN83q\QSYcg X| f?syjd]6oas˾F?\z}(s{=` |r릵 {2SŵyOdqW<׳_EwQ-"nT{~NJ? M6EcurD+S44Qb?b/*?Pxm^}8i7>iw j*" 0')5n uH^T5SU*j-e#?Po\vֻ+\-{Cp3gKb% ePηܥ6*Ҍ-Ty%O5Qe|K [e[a+`+<|0ߪZѰT8줷y(A1@C{B&5q쵨ڴTe}Qcr__(MMöF:piZASW cȟVWIbR?eYoGGI+,4WiM4Gbs͕qcouA#-_qR֖<̙%ٖۖ҄x-Vȍ`AkgHMYxw,á-gqp~9ăe$- Gcжh]m[ij#0bګx%_z}-puU&ejrtYStg~kJ:HH\ys15˧(S/!% <iw(%9mA+ !c9d54oz,h}%lC˳F^hvNU;pt;N=N'۩A#6$(,+HAI+ {VJ3ڨz GoGiw`K+ bo^:"'7S5U_H"eXsQQEMs;AT3FqS;zҖ>~?|*USPSijoLڷ\j`.j澁z*1V1UTYYFC7_Ev g;&n{QIj z1VR]j#[J/ycWgXqu*=x3>Rrެag{=ޙ{֑a`}{'eH<"h ֨z C CBa}5 6 jj0LmǗ*ԁK Uhw6#)@jV%UڭSd؟E b,xj?R` Mt;PdKAMݰ iyi7Gov-2OcrK; ^]iR 18V7E34Tqa"d8)us\= t$dPA`#A5Fnv\"$L dH'l"An.yૢͽj029xBhgE=f! T30Uu0`8c=Zi>%@>t)d_'-hIi\qj431j2I-gUK s1NA7! ٓ5&я/>k _VA{&F'54@.8fLzlL^ ,l۲wqwpl1}K.9 v *线Ւ%wnvbN+gɹo711u0zw6>ޘj=r>[j0&,<>WCmĔW&zO-QQr$KV^j/4iյ*[Z|_?1ϩ7RUj5^Rך.5g˜2k<ݥ g÷d"ݒ·$UOٓS.VaPǍBp!ҳ*DRPpP!R}sF8I(PTTÝ|{Κ>{ц&6ABK`U(0X;R'( at&.Hz\E4"FėvEZ5*?EqMqtD7HOhGgZ((!AӛPwҪ,uxR;Iih#iIaG*.~#p$90SG>#f/x#}Q <d#k:{dzdl}S[}-۲cwߛ([)e#oEq=)-̏x^cﳓ3V /1pbrzV4&ȚL-D Gٷzіd$f$^OTf]N(J/>[83||(7|E^ Ѳ^;Nxػ|?$~%QK>~]z)|c1?---lJ}>f'[oٳy.| tˣgh"!m;=Ϳ l5~OgyZnd{qBX[v՗eܖ63c5R=2tw[_Vd`O``ݠV!e_z^/O=|%-=lyŽ}f&{oxp7ϼ̣eۗշNuZ֕ud:o&-#eoL ZísG>~Gȱui8WپeE9e`(_73d]4{9x>7 V@?~PߪsjHŹM +b1y.)O.;Ğùbuye#z[-U_ N9O U}Frv||ݍePūJCl ˬM)89 V鵚S9mN m!Ǵ[,?~ z qǏ,KZwh-JEN1i=<#iR;=u:-PUN1@DZWIsEyˑn)߲ < ZxjBѵ!NO( a FhNjfߝMP//2rȽM%qV=F/ɭ\r|H)dڧmv(5 ~ųwm/>_thH_sMvz信]$݅j=zG((9tG~=уa=#: v.).sq`v0r0\Ƒk8Nv=3@;mqŒ ry4Ucԧ[c5]M~C9QQhD;QbE9Ixa @80ىHkPz| e=[q,u'o!W2[H܂;Ad_Q 8O"W4 ȭ}Oz$ޑ5ȝ5ȝBkPߐ;Tmzo>>O؃0r y3АW1vMȴ1iiڲùaiCmbo2/DOqPm҉9yhAl Km >Oa01z5|AE0a]4hНv'vMVHa!G4vFѠZM;1q3z,B$-{C-CG˵LUCna܇ 75Ib[㺆 i (7hpPOTr*gAshigж,0rm@ƥ0E)\ x*f6Z,p FJ{?TtB}ߞVMC+]4XHDr;뵷vm9 @n*aD܁t'B^JZ]8M: @D;e4O/t6 e4V?їɾ0Xm*'g,3yZFW|%d@Ηݏݍn>ϖ/ɠns:GYqKr7 ʧe# #ꊿl&Ipp*K{daQU|ͧQ1 ;M=duuAwJݩ|%yY!Cn>6=ʷcb8hWEH#Fw \k[{t]_x]#ԃY>{]qg3,EWo W*>YUՄĠ E\D{79 ] Ʃ2W  6 jo٭Z {C&Aiy9Lv\5@Ũzu-J#&WI&=HfeQXlggZVe&\~Zkk +.bgG,6%1ns04ORlӃ5c/;>Ɏx2g.Im~cܟ6֗c6mIgw|f*nvvTϩ|sQ_o.ɑ{Jʹwiq^ə~YZGo0!:miSAIv_$قvEÎBQ[R.O#c@A PXUW2S %K7P,?Ivm (dDug C!jnCgu]*8 ΀h աUBXDWTĵTE{N!_ePB+=+z#Z-D@%pv,E^δ.uLEcОĘhoxq|C{rE<9! pvABNjC^ׅ k#cH>5vf,̐ <LGjIk>J|@Zoh-KHgr%Y$a"{3rˑ kIN BpA\-c/ն3!kot  Ou@B~ U1$Y$Fovad 9|U$kBORہԦjw;Y-CzA9FЫͬv: m܋*5=} w7E>/EX&~-Ov~z"d8q~gAiאSZER9^iU'f# MڽֲԎD! ztdԵd4bU.r{Ķ되XYn'usr:ZGs-x%3VYyʈ4@U5NFLJ%V}fn[ V7{Y1(A{$hwcEzi{sG1}:f_chC^ hxuA&d'oM|N%CRR{%tCX){J*ށ߱8oTʪ̢n_7VrUjCsϊE)SSqTv^tv'140ܸ6_,c}]#~K%],s|#okm/n+Y'xO L:E\c{KuR ߹OKޭlQO+^&O#9R _"le)j8я&O1歂ֈw!Fuhq/5noƗjdGL>?ɚjjTkW #Q0/5dH[|Yi},xY2-CN|ʑcyU! ˖*JJlW$ݚd[`&$@Ij=p8@!ȅK`낞ZSpִ֔ûƠՊݐ\}# }\ ҿFJtԬ9zZ |%GZ 'rm<;(=) jU }^B&-HPQ$I<ѱʆFfn:in]dZA5b8>d% A߻!W>Cn2ifbx6-ۤE \3 n"M sp ƙaX~GP^~A)mj8w]Cm+՞JJ@@SQN;jxT@WE :#HKAH>ɠa&5lR2&O4-F)IM)6WSZgiZڀjEMyhJCyC]Q䖁.m4 {FIY#7(o{^ Q{UΟ*亱fGsy˾eكV3+>X-.E33Z3N\bcXqy1>eeyOu|vöYn]`}ţuw|Q i}^jk=oY6~uCB;-^ 55*Hw8+J8߭>g} 8ʗf3XvAҦvuYsu(/[Vtϻ ܛvcrwΣ5&zނeRD˖dґJ{dl,>}`X?i3my9]‡nO~'|.o"J`/6geR7J&Ce_aY$'⬗{acfm'aӄurlvLB='JIps 6=PRڼ' {7έ7%}qL Xr#Fuj- Qh%T? euő٥%x (KI$1wYn:{W:Z)+1]$(iWvՊ9]H*Bq.c -W7WmAhr^mMfûP^ڦZZI/B;ڠVdc(bQy)-Cϧe -j< G|!-ـɀٴ(bP<,Y8͵iW(cUzWkC}ÅD,pQN@ S@G A]:B;Z=DRo#pPmUGAw"֝ȕw^V+}Zf]]E/ʷ(]s$5 6cSi"e,FӔRIHWZu֖y2gFpdpJ:{K?O$O+K֨v4ZYLI&%f0,XE s,EtbX!`ڦvYx>i0?0E{Eg1AUFEYvKn;/f\2y+6R("?|?AlF1"{! Ieh@# 2 Mʓzqb[*5zhuWaSڛnFk iO!1sfG ٚ(DFhEy4)A^o@FpE\]ƠM͗뵁F3c4&̖ ƤI> 'P׆ZAèmVSVc BX}AR} L  ڡ`z`:Pu0sѫq80 1- Zu-CmQ2ЙHpnO H&˩ ډV@P:b3:^ C /R~@ތ[%l:`ab=(s'-o;#GQb`t{QB#gAA9ɨurA`G 2~\ Хhz Bx T,ĝQ :vLC;vB: DQ~sccg"7WAyX%]G@?%A vf _-~ܱԒ 0m7Ebf>A?Vro|/wJ3ϙM)!ne5VXYi3d~*=bxS<' $Zul7ؓ(Y{h1SJvi~UѢ9䠈V+p9߳~v[=yi,~ucYsgY*$Zd'kK[=@e˖N<0:p+P'c ?AMQWT`HUqm+i7{+@9 eܗ'n S[ʫ5{ޮfq|` 5^Op_9bʝ*w %v/=9SڪzNhof}f’؅%縒3H ,杝XaȂ#A, "(YED@QDQPDD@DL\z}9zo9U3]U]uRwu96w03xNx-y^N-b. AxE6C_ w<_ƾxk Z0)`5d*"30Rc[4 Ms2r hRod0b5r!E{&;٭ 2[ŷ '4R#X`ł촣a,{JbL^ǰyG\ lx#|eL$͓XuD-P%ڻ.dc[{״/$7c 0 I2wP$OA\eқBP6q(8rXU( `^{l% p.gڞr@"sq.j+i{.KsoIO;s9#\AK[wy-oZ4Bt@j7뚒8xVd%c(=32=$vf;cb<1A?Ԉ$[z1F놾7I[TJbmQA"`)6b ű.fX?\~ba 2P(:9h.lzx M@J8t-FԖ뀤5b, >adv6}¥g>~>~E—0zO'q쩟37NluRΒ o7N);O}EsÕKrY=HVob5zjܜ kŭAy;Ήٟm—fw;-- D˻;Ҳ,SiTp:D֏&EvFg1V$-^!meuvǸC|F6y #fٱ].J ?Y}?D iUlz_o9mׯc`XWRIqM8%[]NVO[ѕoz`Ѯ*o5ܘ@O*vZEԚe"Әf=pmԈuH:c,mXl T1v}ueeC ʆX]`Ն.6hWL`!2kqu;~9Wnؿxn_-:{~_?k >+LΗ'v mN[OXv8-kY/k++CH Y1' Adf}$Q;kobWU*#ժ?/UִEMy@=`@=y 1h]^TlS^yT+VIiqAjտ>YPz92Uv7zQ~6#a5p}kZ4dVR6"qHVz9P[C55 $n;MIҔ9ǔ"ԑ*{|#b4^D7I,쮍+lO~%i `+:ÝCb!)$gvyg*Ѫ݁迲;#G ƗF ZVqG^ YVA_ՍGnj6&=<>JE퓂Sf.,^GMSG#ViU9eͷz[/YE+Q<۪r(#*mzG?E5?SȈώux[| 9$vFZ>R?}D9n=h= @rKa#ʀ)az=-z` s(oTpXk<_DۅCY߇)Bm9G{v^<h6kIQݏZ܅"pC[yl1MDb p`Ar(6 kBaԴ47`) @GqDKq1}oeʖlђ7r uxr!ڦc)BN}}BJҦ @ʘHn '0o,yN@H5"}fC+/"WK@uH<[$ѥƗT#bM.|YJD# :Y ujZ8{j|re(v~m?E>(Vcx/g-c" D돆7 Ïl&#SO?k8K6Y$ߋWye_|V+{NXi| Doq]?4|!y 6d>3_ wACZ%G~/(6av$Z\2k/g|W̔dq_# d ~/Gr4 0h>nm3w#<4ڸ1>‘+?/?7TIr4s>rfFLeޙ5-#7V} Ǖ^w)~ݥ=~§/z8v}+M@o[n"|p(O3gdF-{ܲWuS s>DZF" {mXRأR`5{'^)uo2o$# Ge& A6q ~UUNf8tڂHey<"a@"LAH(#0Ъh8`w68tfdg5j9S9}Se_+.wUtPCPVߢѣ"kE)xޢp4Г<Gp/A5Hd6;Ɲ)yCl m'wd V'oWA| B_JA_|?w/P[d567:_M1Pqب~sWn /hzu@i+Fw#O'n3{5xxֵZuVe?Im}3䩙a%EΠHX0-|uF3j[v6}ǹs?p~F bfg:j8κFi%$OI6g g{Er8G=BEG,qf;i+p ;\jr iC\IyZnE,[w<9)Թ`]y>qF[jNG[-6p/;{Ia$.7n;݊~r™i=\3-|~~>cqrz/s}=NeqY]'Ne޸:luZ2kEGpբe?s=xzFYe}drWx O@P}Mމ;EqW\޳87N5[ÜNMgL͉:՜g8q5-KT7߭§8s19~}%WO ՜LGNvp ReS}2/\A9|h'H%H,ګK*/[Kڻ 9^pt/J2{ȕn%N/U KUx)!HĠ< F.s%V?]k (luNJPy+8xN`չl\~#KܘRQE}=U +r =Rc{{^A~\o)ȽN$CZGFф;)?7d6I YOQxQ=7H{ @+A i9jhwus38ÿ,d5V?}'NGIF_fe:_AHv{mۗ+B͕z?^#3<Cݭ.a2.q%#h.Vw+~S uӪeD%WY&CNoKùKj)~̾`=~2n5[Oѓ: !$KÓ" ڇs!u Jc~"òd{+]I}Feq:k,+C``5mn ׇ ,9ƴ`Jf5vI}Y[/n6絵iyI%+e{]*Rs\-C~PW>#u*d ~j42O¡p@K>~1#nwvO:  +琳'׉wItt+Es_Qn|pヤSWnOƹ=h>4=砒 ˌ4̱ յSCp4{9<<'jWg28KqgYwI賹/5#댶/ky40d/%V=@i߈N5: Ve!;#X} ƆlS?%al{KYt{^qIȮT^8&vrQCL\hT H𥝖-JRQ.BY)|G7?a j>"RR/ta&M)C!ξԊ~JwrsvC:{w@YM ԞdM$EyyrRA,}+@>) -ȧq-Y 9-Bsv,$sF\ H' n`Vg>)H6'z"lKa$ARMf6 Hj0f[89#p,QA9#@ƪE%*5(6WP~d2(kLGn{1sd986] ̮_m$8l!ǴZAiy1G"[Ve"z -E ~Ѿ9ż]yda^#*/dq1 2^ jKcX@)/f K$֜ KrQr[*nDXZ@խ%yfPFf)Lc^ωg|E>!PH};.k'IQݙN[;k5J~'Fo=piU?;haG451s3`ŬI eB:Mjp1Lh 6x#5Kٛ?UΑJ2BBgP#">tp yx)A ߱ޱ.X?[gpl5F^ZlW:oa-Y=i{>{RA=f RXǬD!ɸfۀ Ipq5xj,[-'co+)h&/;1,\|3xAG Z~vBUz#iac]Y9TpO>(|RP*/V5i 6Mc6so.0 Ewqy oo'A>3hwB=V ֑_GGWvc|x!Mrm҈7G?XEKC7Wyg-VOirA)q.s"_V #wOjY5QIR{GE8o;?<͌ OsGt=Nd":d^n1?*czs q7Qߥ~\m14s)jVڂ֡'zPWy!/C,.Iy4N<5 rYʎRu=>M0tb޴:rZvLцhz)610Oۇ~/x)^snw ŝܦn;e6VsjEKE)H"zZF?s1Ŭn&՜Xf]/8,ʺu}zZy8k`?G{e2*-a#@Ƨ_xbxV{d Nsգ:Rl N;փg`Ϣ䷗?ztOD~7ZKy- B&8GE&/rpq8vʱ7~\%8K pwjq\)RΖ`[*"U6YiK!CH6nnBPLԈk@lzY5HNֆIZ&b 3@a w){'KùYȓ ЕWN߆y0~=!h_Za䀔5UԿi쿜FyT#Upi0ËX#QRr&DW:\6jiHr-RnXr.2fc YGΛsc: چ㌢qFj4(J`/{b $t25ec;M`剀pñHLvҔy̌LZ,@? g5w קqT46cɄp.@Kc<ơC+i8o* 8#Ntki-ӱ~@&fl$bfْD"R=12uO_:Cn:귓dHI,n#D,[txy~An6o6HW6ZDHU^YLQ 6NRj>n=3GuvFznG{I+ᄋR[UJtKKJ[R8S_k|v3zqnYeWq\Ez^bGu1Gd~@2fEi m[97Ma0Ğ[Zo@.2Ѫaȼ8{ \]`EU/(~k춛?5V-=m'l'dg5 xU(K[RKZ*eQdЎOf>E3wqb%=jwcLQf1R*m5ܪ&6)3l-,St{Ey]lV~6Mz'`s,7k,3tPVt3_Ϳhn6>f+1X-U&FizZU){ZcQff0Ms5!nH5N%|~  G%$>s2V$+cel]ɳ1|/GQGԔt~ZC^UP2Lɮf>Q ʛ[eIR i ~͡jH_#_KG:9WP.qCcC0MI爱b^NNɷaD!.jx"L-dGT!#G#FE0ONM3[XMJv I!kΫvyH&Zpg=kB~Q%9m'Kx.b.h59̟y6Z#}E¯f͞~X$cVo#_~5&XXO%',y 'BG7n-Hd%6(i {C-v†4٬#ā@T7}z 02OGS߳8e:Gw 8QM'JvMIa<\ v ĒyLDIB)v &mY/D;d8١!>A))7a&lCzḺ13 8eFm y$ 6wXaOdž6䵘z՗B{XdXIq!Di89mۗݲ?RP wXu6p2qPs4I`M8]{Iǡ6 p&8fXҙ0[,`-J#8+Yı=饾3֊p,9#LzGk;b-c,Ґ*V|mT]AR5/E=|p~9i@ᝃbVֲ xb=zj؀V&ބyxC6-FyQ`F&Vl ػر>8nhDbc>o?):]vŵ|DIQXUekk(omvzEKr1'j yE_h+ϨEkVP,u}jwMP`#]]!=jP(T¢$P2KlTΨ!%?%zEmKVR>5KIU)3_q mxyROp#~Aّj,ЛѪGirh>di|.$D[/?) =?:%fn5 5k EFj`-FN7MM>Vm9g*U!a&tU<듇[%o ͉Ji8enU`.o{.y?)SU搓sx@8[g<ˡ,&rD42C"4+qqSl#˓TO!-Dk3#MF J-9MQn -q#TvcDz8heKn(p28C;q s'h;5+ɢX2֪=Е -LNlԗ%A~֥-+dӤ,]y̹"!.h> @-קb$ɦJ,byM } EY7g  '1Gkpb\L;Wp^"4΢Xtr\d1=7^kipjdfd232Ni:<8.2\yC4^c&Kb6AzHc@o0-3~7z}q)( & 3f4s3YZYb6;2UlME4V-y{sZVki8ڂeOFmvI;y/?ve9]n2F-E2w~Eq&ɑS{pڭNF3б}7藴λfm&kxs:ds^hװ+[!|N~!o'j9H7 @?D&FZy;GӍD|YgE(vnZ >Bex΋7]auS,]O 5h Fq[pٺ(5+r(` hqܑތC۔ǦEa,cdY 7>T#,8"Mc󊌄jڟ@i]jF ^5xI`S&vx.()]EIsbBŰT &cq8qEm}{2 w~q el^czs 8z02.uK!(DXUC/%TBWcoo3U9:9kk0.JQ քC5a$ۄM|ILo{h*i{7O3қ|> u芶o@~6оM 8/w:Ai,{y`&EJ*;sLu3o;RdRXP|G >gF6o} ꦰ𜂚I'Dm `sbgcزmDiʘ0C'{;ey`\5Uz$tù1@cZ HM|L{^,o{BNr7ŕq-rˇhSbLg\4 em,JAd"GNgn@ P>;hw)mJȊpRb dX>( ru֔bx[9!\YYO孊<.IlQʚvhyo2 9jnp8XM*V} ?o=vg|4u7V-[b)14uA%H# o;1P&f!NM8 eKkzkR4 )𲽃L=F2u)PG?mG@v ]8|DIAir0B% V[^7$7ꌘ@ُsW\::c/"psFiu8qOND :e zsG Ô) WOD)io)Fs(:'2KZn/hl=/ EFlyٟ'.ɷ&KZJ#VYbPtmDS>q=]K?4ex6׷/'RnNIS5p[#[V#K]nm]́8GoH{.L{;>Qsmn#د_q9_8Ξʩlsk[nhhr$My`vw99};ڥs9:`zwp[ޭn<:FCхwSvq=== z0ycI|G':VyѵvsRLr ,nb_trP:g`[~jV;s>5)w3>82;S^v[ߪV {gEQ Sp?zGU߹yo ((b<3rIk OllUoz'sW/?/V ako1 :逴s-,0GNS^PYyB0/aQkʢ_#u; 2ϖ{#Пg1H *EoqYuͼJ6[g?mqYyُ6=r ofdL749=y@D{3P/;%ku7p?F1Na|b|d`.G+Ŗr2ˠFт!3RbL OGt(i1wGxfɴƻcp?y--SqZe-5z~ށƵb!J p4J/]~]w8msd鰘shyhad,B-e[E _qy;#K ưv&;j}W+j=IcMȘ" Ih74w |?888$NS>fLjrgR͡qZy:S PӔ3gRɘݡ]>җyO y9#PC1Lm$*7fz]S F)Ƀbд#a+ai +bzL֩Nw0 GgqH0b!m->K-4e^6Dh/5'*i\=l&1Y(֗"G}ZݧR -8m<-geGSyO=vvNF]pZۭ^ZkPS!_d|(lAL~ Ey\k=!`4$;Aʇ+N|xrys=Ɖ>鷦_0󢹓jg#O呋i5!)j`YqѬ#L*nh΢X? <#\$Fz?PAdmER8bSՙt ?l'ssE)b0'H&gVb`b^j︧+΄?/N(aB_eZwuG1rTD3-G*wMRZO^(Bʅg? 0]k}ֳ"(~U)3]γ2kc*'}pݫ'18X#;U3BɳOM?g{/g,4 J6x*s#ziCWyUV`K̽>_3/0x&oV}o[W.h:LPf ʾ`EDV5pޢz=3W_2g_# (@\K\Җ p' 'RUL96@ygzċ'>+Eư^>NwV+!j.GKP_ +Lxp0өI{{B1G^#<ϗl ,(f !3Vnj^g 0+O:XX6pJx hl=(|?y^ "}-/]x) p0 m2pq('spѹ)\s9!g,(FFIbw|Ff.>%^N[ V#_"FXӭEjk!`YN E"A6+V8kv/#OIW˧qI~]D|Zx(>Yg.ΝK~SjȆG=-︾*cOX"㔹WM )tC!%7@V"3?jl͵ϔqڞss+J2h&E!q9}lu*2gc5I_?)xQŬU}>rv[OEEŢWeuWqKBs n^6#fkNSG뗖]+̓D 1^mN(N)->ڣ,~Ҟby*J8_{|4#>|Y<8*~L^n2L,:5d;F%bV&^TUO$CΪ{s\]ok҉@e/O2N1YJScʡNHuH CQs:b߉gR\򸟞,z&-B"%ȉ2nJ$Vŏ^Lɞ]rF M ) +r蓊:8H[! CLL-W, xd$G[d8,F0'B}Z{6's8H,:`cG]{6B=PGN*Gp)|6"#E VY?%!S>"/[QL*~XehiZTYkJjLN_FkfZj n#TP7k}*\R}'fZIOym0^΢:mѨU0̽.xs\;}}Ľ}9wr;et;nCIٻm' sT坈P m(c5;]dyYg,\)#᳐YW꣝|Ze(ݭfTH!UӲ29RE&f b'PU[A9ϳ9.>_~}5:3b|[ b3bRF2T`$4UQ9^Sg"s$*ÆXYaֽU9dB_ <,_гm(Ch9xܼ[[#޽rj>E|)Cn~lXאf ^Y'K6 )Ԃm9 EZ8\mU⬎#`:jXFÀL;>;qfq(ğuy}Ϻ7i\ uDQRiTh?k4G0VEΆFnxCyC(dN9#nK58W7mEciӴ:w}Hv5kZCbX&a!.",+01 lZ2o͛;#sFYg E[v7ahgb^53>N_3Mݥտ5VK ۘފ3ypw:K@6g40xBw|YT>FJ)#TȩK(wEq$tJۡLcnK2X5OMkhZ^ѧFg_ եZP,zb5ԺO:cNy 7sم }bGdU8w38H4FKDa+ι玝ib+NgTN?>=R9D7:{,!ԩ v|tIN U9 R^Kbzs|_ rtnY^qq!)3,OĿNb3s;+E/liF|UX SueӨA2&Kx%R 5_ БX^l3*U~v-r끌Z^|O\^ ;y' LjLtD \uIV?Skꐢ^$k!l' 0zڙqPa͡(עxC!*"@Z82Nvp9Ezjshx~FDY5[0g[]2#`ٯAِ աe#ņr=:jl+LIkUe3"j|/|,9[phGkOUfy}f|y <Gxm hGv=(K )^`{1%Lr()ÝZbҭ8r'D6^3Ż+XuC)vᨂ X ܀VNCBj0OןLOSxW *O&385lnD &QN$U)&h'N| b@:jkl-5-'oQo[c+c_x ͝]rS4;eUdX,4ȪH D2J)h/бȮ4%MIHI  HJAJT0洔=\I).TS9+^LE_q)^nuuOlhsh#N97 y,Q-GmhEn{1{WnVlV#뀌.j46ƛ5O!,3tǪP̱zKIWYa"sHAdawI,k:'^stI^y )֫+2?3;YNPJ(Gh;ofh?e&jEWFSGԺk5 ȈJ-;(!kj>G|9q3gw"%&S N= ݓ?>Șoocڝ!d8Kv*cuݐs){~jH9n`'^[01CyR}?ԣO|jhqǸrx'R^S'SV#8"_]}Q?]tџO'ϔ;[2L\]yUr< n+hO:{VcԊ`2Z4l^ȳM8M"e%Vd$7>k2PXάЖw*h1&ΕȯR) xh9#(lK#_CO_ w7gx7%wSX< m,Z Yٓ{ EQ.dRaRf (SyK.ǽ,B9 U!c\> GdI/*;Jr9xo(㟆PRVT O,sÒKchx |ҮN>`Y(`yq6yӍW&)b2USDϜ빃C+%Rj҇y@exZ`3{L͝L ^ݯy)jl4z%}v)ΠO( JTmJRUG-T*ko{=YG]MZkMJYLc=`SvN[iLԷn1ѭ2,Su "wl YrNt׺Pʭ~StX?Z#WusN̫-ZwHs}UsFmhl6{SRbITS&job%^$=%ǞNhdI[ћyvr I΍$+ˆ%|'1JNb5gՒ-+gsN)JL^I@OTS-><T[%H^s1*ũi*rN^w[`%Uc\AކqWU]6t؝PVh ?ϋFU8]>tLp>)Hi ,"qh&`]6 mم-&J(Ub+]cEcYVYQޟbP[K6OI~\jn.5/a3B=jeմ.Sv&:-A?m6Xn&ٕZ%&k-EOA_w\sC 6*觭<kLj,ql.)/|Z-M2>yieIDGgͶf> X'kvNL2=7/9F&F}:{WX+CbV5+*z#'1oeL9\>,$<>c/_u'"PS֧_^rN{g/>xM7ɷ/5bc"N0C3WtZo+jj5s9qN=c&ٺA҆BowlA0ǧ惑#QzXLjp(:/5X?|x`ڪ܀8"Kwkۯ}-uJ~& S栿@]^(Jn!Ng|9J~= }N{Ǵy ##8 V,5`Yndt{3zhoE/ TʯZ$8]d]B٪N{^DqZ>:|mM*[ki^B:5yN)> Vy~O?MϪQ8/-R}0/OX:+jW)T6a(ki((ӘsHYو5b'o.8^%Mbճj@|jx*oǜkOvĿ2Js9ƒX}> =Ms<ŀP&6ǿP[H1'*6I Ƌ0Aq"(z |e`5&ۚtkoF\˙עBy: ؠXuhhq3sfǣިMgqQ 0ߩLdeem)$ܒyQ==5E8y 63p+:ڋu6/nDdP}ST(W>3tuo_ߐ! $)$"b Bp{Ͻg{s5+*jhUjy*E ESUE#UQmA}ZU}>}]{sg}^{z)NR8>&M juD6(c pRu@@4T;!UǡhH4ކ(;<hBK GC팺9x\Ō>=! #Tt>Ny]鼞ů"_շlXy-K!/s` "˒B6̍SqꎕC}%,ynA/1Ua*b~ F=ώ]lVsh=]=] Y\`,s5_L!a3;;,\ޒzݸwNJ6Ksy0o0ϾperOެRܬ/th$8XQ"Vbc^[FWz#qCH,λy18VΒgX#qNk8)m3U]݉2K,,~ w5"E])J8XS2HZ >T{1P* 9_EM(0ID "_!,@۾00t 0xH{=i!Ff(9-&Xx0%J8@mх08pkA^C-`Cv6E@6>Y2]z{ 7LĪPr`a] 7PTh4 FIp/삜=- KO^[! w#ʱ(5&ےg)"&>s~+m+"T7+EUװ[%w(>soQo/i\߫gwdG߰Ӕsߴ*go9wW_lBDs}bcT1a:S_;] [~Xx ?)O*ϺI>fN1=p﵇u֚qY+SH=#qkmtg?jݡihRskC)mdQ^RZwKwoQrqp6aJ Y?`}9|t"2QI5ÔnQ]ڍeb]]KUca> y0!|3'2s]7uuFS*qby#Uݯw)rcq,N,~d¿qrb~Mqq$%Hٸ!mWȳF-/]O:aM1?7^W.? kK}xM/n,ZSZʧxӕ4u TP}!ūTF8#؈0&F&kk=|c1QU[uZm^?d lr)X&?L4^2໠@ZzC ey%zGR/J9%̲syc~qXO//V)7zӌWJo_Q_wiM_}qZHo?wd4z՝}w}3E?MՀ9kmt tx&}R ^)h7 Xq(œp-Qdh/H!14C[1}tc#@Qqi3ڏ`h؏&?RԂ<2\RH{Dt0J\U<;Q$L 0zT%Yp?PDiSiB. zwb]@I ͫGk~TҙH: F ( [7Fbػ[~9@=p 8cᚦ YEWZ0G4E*X)ýA>ۂ0wPKwD @qã&9G@ۅpׇ l1 ի3WzzY 5?X] vFXqɓO/mpkJ3ڎǟ?=l[`md|V wpfaV W!k4X!1WV5BWRED4Z֤%+cW|ƿc1Y5$_./Z>ўe2k IiւGrH@evV sOR] ;:Ztȃ\@:pH_2@и5ӡ|nBM&.$>A7)sȽLH̠1ppޓ?F'N%ەiH$LFd& (s=GBn,БtaCO׺ 6opz7X}/h\y>be ܕ:Dʥo wz=]E:Ϯ;mycIr\E.f1JGi_T<5ϳ\b/2S*rwˢzΛrVsr82SIJA:O,Xl] b6-S)yɮZN}Ըvqm2C5N+rRpjwH3L}Mjt4wPْ~a~_tF?G=uL=LP_VMz:&$DsL{G[L/ ;Ho4:ij cl!3PY/({&%"Yds͇;m0zDj:˽,v_[h"zuGXJFh&LC,f0Pb8)0LE]Qjc hCr&J>-?fM'6dhn&=$ دћ@d;'FN >A'kF| !ۈ@ LF"D[ۃlb.e=ҁP7 i&N C )gݣxlSXP)8zI-9,maP^{VMgjUM9͒Yw/KG\+|^.oގe-* zU#kdhZWPZ,?Lp6LC([Eu--'.Sc-vONrFEn P "Wd9ekpEf.@ql:i^ BxiN16ړ4kOs% K j niA ]\"3 )8zrXGw@PdLݡ0JȥN%Y.ؕ#Pdfෞ̏8=$]-?zmZnғ /E^[4L vDM<Cií3zH A<+jV韞<{Y箳yv]r>'HsQ [j>T5:|@Tv!_Y5V,I#SFwedSۃi=mo#|RM=!XzB z7\:n]3D5`)͆pSpu\nBǕ)a~=ȇ:%)h?R*$遞uzeC gNvn52++gRx8jԹMjPZC5hTf:8TJ]eFmj6YTmjJ!V#&әP0, &w2EJ rip5z!#hI`іyY1p/1}3'1La4ùLF٤ʡPXډ:YQΣ"^xM_mm S^kkXn%K__{bc3۵^ʕ$>PiTz-`#XR>ʚB.w{OYķt̹ՙz>J Y[Ro*w{D36O'SQ2sJ4AzN0×A=ibzO##i1[횋?Z~hYCڔpDl0)‹*ٷV>ʒ\Ow!ʊ2aUcA@c+hejCIĐ>vL^jzQL>E!Ptԕ¢2=L#G[q@r4x$.GyTMLTpc.͠4d2@ U&0BjiYPbO8˄@h3'K@qiZ +4~-Z1B`\k;1H:tHGuMt2(Z!E"\uo" {PjT]FAvZ28b͢^W AQQ=L\rCE@@N!H*3My_Nᰟ]B~W˨_-Xay#[o=sv[륭<_;xP&) .D/1,D Q_lAzOoRz8"{=8+P}M2uUCd8k >%®qlr.>8X/0I eFhR#6_K,|~K1ו|Ti"R;EeV_w::4XQ2`_ly/^e"` AF,b.<&_GKFp0G,}jd~_&J \䮲́5)>{ngxCeILe7¥0/XmU*fz{ٱFa<Fo);^nM*jJP◵;Y)!'fskg~3z?#cb=Z.smW 6aˁ!>d4ջzK,e묢O؟x< _ ׷k{1 ӀL}oy$@S#@KZ04-<-CCM l̄rK}+lZ%r/D}GaqeB I߁^]! Z-rip/4K@Iu>Nhߚ +t%޴֜}5\, σO:"B1ЦmL{{qN2A[ׂՂU%#*%Bݒw+@i '$PᴴFy)O{YdN.liB㡄~O=8twB *YMZ6( =aØO@Mz@nyf%@ItxWU}<*@GC:gt2dt:id< r(M#,$648E;;aЂ5=/f8Md8 k7=ez ,=_Rcٞ.WV5e>VS#_8RwZxGG1Qtۊ7fK,\x/$,L̕ql&,oR7Z-zݛ|6?wB?ӒtXonNf &)1bmkBBteXO2XgMз1ܻEEa"[YIZS%7Y#ZY +'Cf(PP E 4``1(EZE"B1κDv!֮@hE/,c32^-ߙuo+ѻBmpNLS\@P4g@ NH1"!#3 'Iqh!`a Y$١>>0WJp9ҡ@q7 lm6 4IO$v@#@\Nry8mL ѰIQל==[)mľVIy՟!m/Ѯ竿*A.l>1OVƊ;aE`G{NXW\雑e.ɵ=Br?YloTuOxTrQz)Ov݇sω.5o(R$oXf Wdn9qIЎ׽)ͣP\ !%dr2]ZE)2L {OLVCɰs]-WXkm2Զ5\;Qڬw@64#D-rsJ~ PZ`m\!6H7,P|!!b 3I]쯪z՗/+}≋E.]q~O[Bu{+\Ń ݳK:,rf>}oؽVG]rEbgE(YD- &6њ*-i6ƭAo vGn(N1e;610Pb{|N#RjAC?rPEskYQRDR zd]"j̀zrɃ-Kk20(hwV,$mZNfP82@J6Ol ;vzQx)1Ц$& GҊvG[sbfp\ W5( D4Cx}hrkD{}?bEt$ &%=y3P@m P(jCtݖag2('$=`HMw y L(_ESEFAч|#P(+1X-v k o.Pj ~r<]'&_ÔD咜$XZ:;eY[X N)s#nQRak{^AӽF>溢tq* ]AnK;{}DY*BdQRk5x N]gt>uc3ؕc6juk=wE{z8V"1r &>~@RT]:7rX<rJ{u`״=Z4+~?4{r=$sM"!\A-Js58`FvΚȅw$?D90W[-^.θ:=1ncߋxcMc1)M 7z]=Xpus8/xpp7z5-X=Ldp:Q9fu8& ֏0hYU0h *qsČ?lnFB}5(\ՙ9\S T/dhrK$ Hm˒WO!i%#HHđ .^W5siw8OWOѐ i!HVP&!yN{ ~GC)Kn 3$ڑr?vо,p~G N*BaACPcVoVi=n9q <dkOh&z?al\"8GBci j$#$8N# 7 <$M͞%;άFW*MV!'Q@%8h!F@5c )d4(u:|&A@GHMFڼ'h|Ȕ~LL/S>m34>FVWd%&S+"ƕʥ0VCm9G }PSIvXW>eZwvK^.hf5`kؗ,xfu̥jkC&`яsj1WE%~O]eߋ.}8(pgJ{, w{x^znGi!÷2?duv,]{Y.xsubϹ=aμ)5Y_N^稽>+9y DZ[}fM0$_2" !tږCt_D2w\DjPVa\-^nD+V8:0ZQܭ |p#̹Úm +VV` ^*6JLH/ phK)9s9acvt*`BrSHCp&Ĺ:?- ւ"4ѽ/]^>$H^ܗ%RecluZT6beQ_+V9_S9Wr*K|=ko܏޹co:ջio*|7@|@c^ o||#+k`l){? |NU}^ˣlC ek4Ҁ eWՎAeGIfeV3Vy y8pA-{Be|ՅpaOc QMMkj>cq'*ר 46Y!C.M|sTQN#}/ s4hgmШbqiBti؊gc|œO&192C)4qE[B*Tڌ1hl&1$2T 4`,yaz+a/zϾݧ֚a/`_xAzqF8Dg&Ulkr# \y~P?lRCI]h>¶b"fxzLf[ًl1[;Lh#*g{{Gݷa=y'{_3k+Tr0;bUR?,5LpMR֢2tKBZ® (.)rEVS%\5i*@A[وL #-Ț4&&_Ԥ.Y&잨zF;j//^92y+;6 6  .x>?#"NCn1˔ʎ ΟOt>[m=ſxʦ8Bw{a{uܐc&jlWR'QScηgd֗"4C+E~A掐ky*|D~_ܕˇ 7A8h(:`w+cq?"MKQ'(ggggg'ó͸oy“zWշ'VM1"J3<=ɞ_ }e fM-IĐzM}JZO׬n5{5{ ٳk ?Y2 +HG bdI01ɢW +βjP$(6o7[M=@?#6֥SwFX>iCk7JƨBJ sD3H0S*9wCMZF<."іb5ᴙ#к##b5Qnݠ(c7,Vi('ͬZlBFh8Xd8!1njlQ2-7cmH-_z $CMVxú= u Wd}:rU -jCʏ0jMeH:وZ}aN.` D)~wq؅t!EG:]N8Fq:t0##T餕O'H9o#2>#z7FtQcFMxaDZ#6\unݴbu2HVF)ԙb.xk3Voی c}ROq1N{D !gQξr.`vkM)?^ Ti%^RkD1o_~>?-!v]߄tjqXh3NAC8ژn=Wz~ X'_>:>!BoǪ3y%>[@Z85^ƫ*WJLDo}>[]x6$"YB-sԊc-dUx֔ç5k"xs:^:YubKYaL2#P#h Gv} 71;'x_ >0]VBF_#`  |(/z߱}mֆтO+즶Qhe`*Ŋg*ra!u,즩F#5~7NS_n&iCmaq[]6ĬjIF!~u0){}av[ {7S\&o ! } |-!QPr Хv: v)r7PDX8B^p- Frh 6yKt P`o~5klk"^Ðn!Em&P mlDѶ-Ŷ-mn'jDt'Zbȵq@_wrmo{mн@C(>x !BnPmR-!𶦹\`1ĤYL*\3\UYnTX~z^}_Un !\ ̯zF.*7ڼT^'Mw{u.t=Ǻw+_f;@r>-IJx q:g'`=נ,syRZr&q·l0K+x4J:,=uQ(7Ν?/e{JR^ϳAZrhqid+`,OYO2W]!אhh"ib+BqAވ6=e8Z4sWY(:rȁH;u];v=vе{[7ФU)iy8jڭN)a &+@{z=kPHqLGjm>Mk]ԄfXr}ߔ{_ddy`MSjo5dd'K&RɧۂUQIm݁tȃi8|21YG0}lno6A}SP|FQ VVj ipNY`t'΀?rOE h3( M ?iA7!)JG)@u82%pl4HS  *=qj kͷy3iP6x;?jC5)ߒterMe<]q5uQ^5G ,Ʊx*1k$~ a"* 7,?4X&VIO[Qf|d6J/ Uw:ϛC:ЗZϕGϕPNŸ4- kKdW}jn ބO2Wm#p&|*Y 3N MZӊX aN3Bک= }Fo{wZm$Q6ڀmkmR|D>#SV+hko3ɳsҳsOaߠ(x|gG8o1F[qMYC`X5˞VJ_>ed?pqUr~( 22_zYtYPsK9:q yYNӾP>_rP€2oWߓ}=:̤iF'D?"Vᢶ8Cx1oŗ0 'peRoˬ!E>Xߥ#[^umvKͺOwxxegz<OchOG|9B}SySkٯ MUXOC>׳St{nVE5v]_دr,[vm~ݠD#|=}cq[k}T;T^ZJSѕ#z enܓ? VJ\^"7"3DT?e}ԎpVi/!]੦ecܘ L`8c|F"Qz0H+SwW|jum68%\&9}9lk #a:f:%-1Ms  Ahlޥ6Iݔ7mތ;L`ZZ$BLho9Ԭ.KKMk lBr$$dDMEG0 P{Nn]h/#VՏG5-Wα,s&^r6%a,BZd֓ =j`O9T&n&#ƛ1l@( '+$![e/yǍbyܡIM'6O|2t_EYִ`F,@:BG+9$!+g`xtfE@7E,"9ˌ rf|%v%!%ͱU{x4ϒY=< ׁE}V}4 Jl^AA 7y = e &1bp6jIB݃X_\i,q oʷ_9Z> |we/aw$wuȪF[JwIoNM5ɀ41ᙼcc}bKm1η-[u@uhթ $-|Q[ǐaz$w2gsN|ʜf9z(9Mȉ42;J}ҧ[T|k?Ӻ, jUEcŢ>W|Z47wn}Vܹme2[&Ɖm-1]ΣNPr-c'lKR(TĽ@LP^5IGҎji1vҚYuN;k=TG~QQXM(f$& `ˍ;<!h'umXly/BQ$@]D r_"yxXj$5Fq "z됮^]m#m&ڍd ړ3pn m8܇} r%b9/۽hF~wF^mW Pw_fd@sO%Jk )N'9Qw/ u,- w' w8 }Ud~Vs0-h3J'6ŲW֒ȗhXK0vQ{ғi)Y~=<6aQ'z69ݦusbe6`~ Ƿ,}iG/{{)ݷp@?:/ ,(偍ZGL@nH}F&ߑz[un^gm ۬uH26~;pO 4y"o 1Si]h2#==<.NەvZEm;kzޔ }f_ j:YțB]| = }jקBX<@|תe{V MGp5|`?)Y(11Nrщ`¢C\e+Ƶ4œ)5nx6>*1sڨygT֟W ?cgFP}V=hCU[ܽ q * O4IXc/*9* 2yףюehDV A!Ŭ`ASD6h 4=Bw~D;:n= z3wrKܒ%wq.VJ12sKWgeqRdl:[p,T%2|5ʟ{vڷXQb#SGSI7p̽AYg>{s;o M.Z/,Wj3JDҖh%Z"cò/SUs^ʻ8߄ g ,[ cj6tfQzG Z_R/ʪ^vqe塥||G}qK)]Tz˨/.8bEE%z/}A,YʬgwΚP-'͝0ø~@)*!rC}:"ԧh4Gkz4GգyKHQzGW%yWMY/j>֛޺.$?Py7_Ϯ_9 Q_IޛT[} ~ڢ*$?T&~Hr9!ՉW# =mqx]߶gGOujvjw3!i*>3^Zۨ!&jn j7>=s@)We ZV/Ţ~XJf=V4wwn!KQ[zT we/;=YzS)eYvfa~Oaw[v.q>mIMV!e_#=IoKE,7〉Fo^@|@6 =kUYcW 4,h<񸗝W0u\XdQ{A$V9:yFT4c&Zs|׬eӴ"P[ (JN-XCCjZBV+G֩m%Kv:kUV ͅWRGnYj&1OyIIU(QlRgD~Df~|K"S#G36_k1 g}uS}:' V HH01imKTn5Z`k ' 0,{P u,(3#h%.zs 5}Ggg Q.7ƈmDː@j2`Aexc>}۱Uf,jǨr+χ6bA6Y @ؗIBesPdqXE@DeU6PPPE@TD&((WQ}50{ޗ99=]U Ad6\JK^M-M-Cm+V7W0I7 Zct,<~GXQ@ZL?dy⽏܅HIw'rUo(/( k-]D3 J}'$wץ0Miԟ?†^!p,r $?3Px58PǪB& FPgn;-2?2:p`uS8p??p`r7+z lv"M]h?E1δO ;pl*U*%UGnlPdԆ_%aHK*z`Z^qNG3tq0JGstTҦ6rm0lZfOְٌٌ !lγt"ثL#I4'jcU9~H.d+!!9qEe\D[ԩ*-?V^|)O~،=Nx=y% QuqR8M(Z0Qu9:NQE1T]Alg }}9D>@&JXd%IAtG rT ]QO 4cS=ج/קU3p,~ýU<߫֗95NqT}UU ]"jCPTcqipvDa\(p HM HQA1[41Hd R2{ ~%DC6>cNBNSuhEV@GUN&2uzUNR/uj_,\z9lHOʗ[M2ƀO4qK$0a):CQ,%:P1A7qVABf)Å? -֦I-  Z&$Cb"Fs-ɸ2U(:`Ԡb- -q7.so~sDb MI龙!U[C<.X3[پRy  :񆽀7[|Kd6fվVsaR=ki3 JpIZeJårχ|nyT騇3ng (QqxV~}1hn|GW~| ;D9wb9wW}Vbx? HuId4r3'KЙ"@bOkU2 Rp'8 0wc ܋yN}cE?dA{{S}|~//ui8:iv3q)C^ I-uRw,Lם ߛu;r[7+F>CV6uc>0`?#QΏ?A8$Gƥ N <9b'gÊXAz$=^Iv8&ߐ" uq]ֽ{qh/-tlw/J.x{ױX),r=tNi$;AΊ~RT 'A~Px #Np 'x\*IIgJyt ɠ''9Av±$±#WDR 'Y$l&fГ+ƛ ?A߉?4Gu |[ .?xz]?y+;|-<.8|*WC=nZ*L:jjQg.|bO, \@g:7GQM^O@] Z"8y\D&; ҎOmzQ?1?/ :|tl+!IR4GRyA/-)zJ@%W)~dXT3>U!$V㙄{:|M>&"᚟=%<19kDg#uߴߴpd8Gzo'x0f?gg>Iz^[#k[B^5{B몝?v?SpWniY5wϦ6Q?W"fn +qGq`ZL)F'σiL'(yk %AWpp$uelAd DVWge^zec`dFyFypyϞ~bjXVtm%ꋑv;M`f*aVT fϐ͟B)j _-?Cl Y-Ɵ"2Ϩ0k%qjO&RRd3,T ٩QuҚHj 2LFx.s=,;K-J99K&edYJF24$+ ֟Z-@;hT')% wya0a 4⸛V >d_6Ll(F3#Gow'βz{ac}rIЇeP01nSC+'&^tUdt]aNX!jxXwNG lhfTa]_"Fvlta'4gLX7[0um*Qގ"( ; ꮕa{ N1܀: a8_x,tAH>-r®+F{;=!p;.3Q w8$M>|O)kG3 u݁9dx$b1"a"$BL@J ̚( jDmqIqɂq"|-rhD#zʋ?b΍RH~M9AN-FKFjN';]^s{>ve{,AkKYwG~dVw|OKwFou[%oTpXןklG%209\_?5&çiE\+NNfiXYP5D"yP2T#K>"iy =+N]=ѹlIG'?YU-^VaÂOz'<{;&ƦK]a~~yE$Ya0; ħ].< VNCV'Xy ~}81#.H @ b"Ԩ+!(uc M> g NA'1xLȅ͆f3s੹tǓpg6wc>b<>=(]J5~3qA>ANc෣K?sx[) |&8VBCze pb= *Dy~˽$B4q5s<vބk!]O>~D,Sp,_ P ۇ5fCهB64A4-z~W ], MP8v6a+Qؐ؉a6m6FYONB􍸣vhY5:vB+~ ҐGї0c4 rqϸb x  $ZŸBDaѓZ@j)^%ch[V˻Vi¯2!> _e4-Y`t1Jwԃ&pBO1JOsjיsDAz\' 3Ê )ӷ# - BxY4W{G}"XͿty>?ȟJVXPfH" .ObQ^D6a7~ 3Ɵ濺{YC:Vh`cL hV1cg0c}SF;TAG9xg.:A^J( KqYP+&ͺ. CۅA]"; m!RUMen~h#Zmn"aq֐)6nƒp; !BYM31t_Dh\[JtБ/=_ڏџȗE҅8tu3X90v)#/#j| 8ȯ1hke~e7F7wRV}>40%H`j`\z<}3-e|TH t_oF"m/׷iFLom__'F4+Ʊ'mڷ-Uk,0S$`UHl)pW*k[ #*D5NU4@fqlX y0FÍ@>e Y%$ 5= 5| ^i 9݇PJ)GWOǒNdJ>J;ݱمX~6`5[IyLQz?dm6k%:QzaϒtN9;❃Qm)9R-v?jC`qY=ApOFjj%63$$NAJ9S=&:x31dcØZ}ʃ>>h8m^gީC}z&ry33k?CoZA#-1> ^c=/@:  Hk0$DZq& yN,ZHy: }m:MGT6QVC::2oMf^wނ+ -6`di9vyc9ޅ6n89@~{z\+s!Eb*CSEW ?pá0D!38qW|! p+r!-CFa.n"h.8Va., ps5s6q4s vqNȳ/U8Z/`O4MfJIGҔUO(R*_J]龞G􈷞<[d j]҈~ r Y ɢaUPS+EʛIC1mQ PgqoԂo{Tyt5܎PUC搋hTxDyt4 h8]gS85VGFeeBֈty¶ºL:!lB( X!劐tB(2(v1ZGGK܌ϑ%"tpEPIYR3Yp<c t >EᒋmB,vBʣtEh Hl;و[ و[v x%6LU@|r]^%jtcjcja/y[E~0w"+vE*!v@X%{]Xw-^_7̶e"[]dJeT'8\Mn4;7.9T?.pߚX^;x֦,_2񍈑S+N?iKV 1fJ:e.K:^L \5\=>l@~lq|(on4XhX{.VjH|lB0TBKMD$]3nngHM3x 'g6!9.қ6q V82*qcX{Qg=\ܪctVö6#$v^`DӇ>EZ!<=d[^Wo_ѮhmmW&~þaÕz: W%89mqߪUeO,՗S/V1Z}%ȧɒS5 3uTx 1sQȍ2Sr4"\HhbEGܤOq)(0TmjbdHQI49Y̗,f)֯N $I;EOaOU"%> Th|ao/E^ǼΉJ4`טy{Q2/`Q[Eas| 3^"+aaw9^Xk"2fM?;r ڭX5ր+pހ! Ȕ6#j!D_9.01O++PTUw yu|YDA"EQotm8 " Tk*3+oHxa"xc"dw9]_:t:ۺҜu;ˋ{ܑm3iV+A\2$6jzZlV>TRt6Iu _j8q-b9M`W<~;Gې4Z&sdHD2Kk5Y9 MUcA2HyAVFB Y&5D&$ap5Bf'tX҄Q%*UFլd-UwKPhʹ`Rt#߱]l/ޥ}Yy-ɂRR[=ٝ޺3,pNB*;w%}=u>`tw̸cEOFܱHp,ڝ:s:AQ@up^U2~q,L0!d$'Y7!̀5+>== Cs az>}*=bq >h]{9ݱ +B*T/ʇBER/k~wǭHCa H Q 1E#<!bTȑolh}?G98yKg{p4OmsLS0Db nq9{yF))p4$<1C%>,L 2f*0d'٬..7P׷ c/ln[5:lͦ=1>BG7嫤L}ٳPțLK;v(Avi䚔')4y2C2# oQ( I3V%E6cG Qc˳g{' O4-=b<}9#P|R8Pi~ٸ0? cz@[Km12{|+cefcl&viTS3lᶵZ;*2'T tvP-eh5װJ--Dlz6MskXv=˞g5i[U뫥r*S.IF"2Wݩ&?hz,* SU2_IWa/ flnI4ugl.nUtW*}s8}HtQBkj;VD +58P]MTe;hqFF,b.]$bq&H4EcEIMxmxPaz6°lR>d =) mw;P/0`wܝqvoct@ ig1-V>r1!ۻ:v)ҿ?VG^)h"I}?mHv=mf{,Gob ,W,zTXv[UemG 0{+`dx@| {%WT5Zճ*zc9Oe%)v3mˇ+Y(Sq+麵GVzwd1+91*PK!QcvnLfont.npyPK6@vvedo-2025.5.3/vedo/fonts/Quikhand.ttf000066400000000000000000002327401474667405700173120ustar00rootroot00000000000000DSIG5GDEF GSUBf(OS/2?M`cmap(7 bcvt ,+`Hfpgm6+ gasp+Xglyf',head<]!6hhea!$hmtx*" loca12%maxpx F' nameJH'post*+8 prepт5@ Dlatn    afrczc2pc~c2sccligdligdnomfinafrachisthligliganaltnumronumordnpcapsinfsmcpsubssupsZ, }|~ 1Qa33fPJHL @D$  \@J@ ~1~    " & : D !!"""""""""+"H"e 1~    & 9 D !!"""""""""+"H"d53/߻޺ޞރDBw  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`apcdhvnjtiqfukzbml{̷woxd$8 @ 1' &+3!%!!67632#&5454&#"7632#"/&54d8,5;\p.@?H #B:&@9 8 8 =f26_P1cPPh/&_a3LK9B: < > G v%T@Q   @fYYB! $+#3#"56"#&=4]$5P2 #CCv!22;1MA,0@5.-,+*)( $#"   @?/>KPX@&fddiQB@+fddiMQEY#*+#"'7'#7632"#'57&'"'75'7'57.%/A;>/  ]]: #/ ; .H0$]^j Fv:i: S "$;; y_h@^] YhPOb`NK# FEDC87 52 @fXUeTQJaI  G*(% H) ?>K"PX@uhhh^^d  f  d  d  dfX   WZWB@vhhhf^d  f  d  d  dfX   WZWBY@-dc_^\ZWVSRMLBA@?>=;94310.-,+'&"! #$+32253322#73273372#''#'#"#57'7'#"#'#635'75''7737'75#5#'5732537275W *D.40 :3 ?   * *] 4   TD# #*]> r3I )Hs"**)"|y%%K]K%&8%8 +Dpp%K8p8]%%K%]K%8^(KCN(QTY^br@SRQPO  X ZW H~}|{wvutponmlgfedFE@j D <:98#543,&%$ @VK IqGk? ;"?T>+*)('=K PX@d^    f  df  d  fiXWX  ZABKPX@ef    f  df  d  fiXWX  ZAB@gf    f  df  d  ffgXWX  ZBYY@1sscc__UUsszxcrcrih_b_ba`^]\[UYUYCB>=#+332?'7337"#'&=##"57'75"'737'7'7&'476'57'57'35#3735'57'57'7327'57&'p  %Q 0@J P1P  0/01 0 @K A@P3!a ? /  &;"VgS>S*)M>()*=aS)RS*= Pj>{*=?**S=SS>dD)5=WS*==Sg))Sg?>|RRhR>*_ !O!0BL@1& 3 FA4, @?5+ 7 @ $*?KPX@[fff  d  d  f  d  d  YQA Q  B@Xfff  d  d  f  d  d  Y UQBY@LKJIHGDC<:21.-#"!!+2#'#&=7'256#$="5'3'7'22#"675743$5'"""(6IZl *  oPzCE((7{ +xitW sĈ (5( z#%:)\W;(=)$  @  ( ?KPX@c  f^\fdd  d  di  WY OA ABKPX@d  f^dfdd  d  di  WY OA ABK+PX@e  ffdfdd  d  di  WY OA ABK2PX@c  ffdfdd  d  di Y  WY AB@m  ffdfdd  d  d  ddg YM  WQEYYYY@IHFEDC<:750/,*&%$"+3374;363"+&#'#'#'#"536;674'"6565"#"} D;n#! (6C4CU3"/3L/i8-#v퇙2fwDCe6nooX*YB-AJ 틑 B,/.J}f/Kw@  @KPX@fMOCKPX@fQB@fMOCYY +32#'575"'75'7'56+K F:  : "\-p-@3,+*)('&$#"  @!?=K!PX@%^fiRAB@&ffiRABY@ --+""#'75"'7"'7'57&575''5?S#Lh*Rb) @ ) p ^NN?.n0~?/ }9rF*T@  @K.PX@fAQB@fTBY+2##47'57'743W@ i=E]hNJq'#>p|;P@6NMLKDCBA  ; 8743 210$/* ' @>K PX@e \f  d  d  f  ^ d  f  \iK ZWQEKPX@f \f  d  d  f  ^ d  f  diK ZWQE@ehf  d  d  f  ^ d  f  diK ZWQEYY@JIHG@?><:965.-++367"373'#"/#"#'5##57'575#575"56;5"'57'54723'57'54G3B%##4EE)6"k  + o"VNM$!3V #(X ; J.Q "%%   (v. A.%Afy 7 o  .%S S  %4tp<@A<;:8765. -,+*)&%$#"! @4?K PX@;fd\dddMQE@<fdddddMQEY@210/('" +32;7733''#'#'"'75'7'#4'575'4%'5qbz b%00J< I0 1 % UU I%77) R  E7 D77Dn | 1 )E# "@@hh_ +#6?'276a7"& OB+7#&5434Db)P^[cP3'3i= @K)PX@fAB@hhBY'+"#&'54%>-5CDi Q 'J-WD&Jl@7+  E54321  8"=  @< ?>K PX@kfdd  f  d  dd  d  d  d  f d Y RBK PX@efdd  f dd  d  d  d  f d Y RBKPX@kfdd  f  d  dd  d  d  d  f d Y RBKPX@efdd  f dd  d  d  d  f d Y RBKPX@kfdd  f  d  dd  d  d  d  f d Y RBKPX@efdd  f dd  d  d  d  f d Y RB@kfdd  f  d  dd  d  d  d  f d Y RBYYYYYY@'''J'JHGDCB@:9760/'#+2"##5## 3'56+5'#"#232725'"'&q8*++)FVCv4 %,% > # ?;N 'ED& N/^N>@? .O*H;}:IHXZp8tf9l?}@z=<;:98765 43/.-,+*'%$! @fddQAB10)(#" ??+2###57&'5"57'75'7"5'7'7'7'75'54';N'';S'';;'''l-J=,x;[;L<KW0-.,LY;[;.-JZ-iY9g@d0.*)741&  !@/ ?+>h h hhhhB32 +#377373733#'5&=66=&#'5#5'5#&=6%",6 ,-X 8m 86(PX&T C!"! CS0YGMs''&'L&9&' -o]a':&&M''9oEc@@< 52 : 0 *& / @6 9 8 ) ?=K'PX@X f  d d  f d dfd  Y QAOB@V f  d d  f d dfd W  YOBY@>=<;43-+('$+ #32#'#5'#&'532737654'#''#"'65#'5'#5"54q ]82 \ 8+aD9B{9 n|E+"?*S")S8~cj{#nxԍA)#)ejX4fF#F6z?#XXuwR@LRQ&%$#"!  N KJML7 IHGF?> @ @'52-?K PX@Cf  f\ fW W YA  BK PX@If  f  d\ fW W YA  BKPX@Cf  f\ fW W YA  BKPX@If  f  d\ fW W YA  B@Cf  f\ fW W YA  BYYYY@POEDBA=<;:984310/.*(% +32372'7'63273'##'#''#3##&53'57''5'525QG 0!11!A! (!!01!1vaRA11 !!!R!A99w-J79WHw-V,H++)4 ?+WʭH :WV<^J@DIHGFEDBA>=<43210 5 -*@C / "?>'=K PX@:f   f  ddQAAQBK$PX@8f   f  ddWAQB@:f   f  dddWQBYY@:876" +732#'##''37#5#'#&=73$'''#+4'57''57'5776^V(0~]00k?o0N0?N?_? !P ~NPm^Q U  QB@;"@1@ 1q 0 Dq @1b"1K&1@@!A` Mz$6@.5%"  &!.@6 /?=K'PX@8fddfdYAB@8fddfdYQBY@  +323547472!&5"5'##376="/K8"%LBF+89X`(d*qr**89zzh?9W4#4+ȭE4lJF4rLR~WE&i4@.1 (% @.#)"?KPX@7  f\fdd P  AB@5  f\fdd   YBY@440/-,+*'&!  +2 #'#7'563'257/#''##'"'547d+ +KGut, 0I:t -+z5:i;;L;I$JxWv&-w,9B@04- 0(' :% =<#  @=K0PX@N   f   d  dfd YQA Q AQB@L   f   d  dfd Y  YQAQBY@?>9721/.*)! +22"337#""5'#&#&567/7'#%"354'#"3$54~0u- Nn_~7f ?o2k?0>/~/vg~!Pn wOvOy@/_//~X/ :@5>n_,d8o/:k@h6310,+'&%$#"!  @7 ?=fQAAB54//)(+73'#'5#'57'5'5#&5'%6$75#'=k]..[̘.2+zLwuo3ixS/._? 0W$n/NN*NO! PKKo 1@.  @YMOC%+3#"'52#/4Nu;kDNVY'uAG8D(--4icn @ @>h_+7#&54#M \%JoWU^L<5#@n-O*@'>  =h_+73777''&54A &4 @ 44+"+<79RB0@4  /$!+(@,?>K PX@: \\fdf Z PD@8 hhfdf Z PDY@.-*)&%#" 00 +73777''&54377373#''#'#'68 "- 8 ,-"YYe Cp8e7 O !"88  #   $2-/ $   GGf'@$ @> =h_+'''52?54'4#&5hW%&pp%kJKރ83"?xfD),"`m-p )e@b  '$#@?WQAQAOB&%"!  +723#'5475'7&#5'#'54 9:: 9VWZ*h6*V.7C"vp;b]=  ^.S^MO>.8x}$GkH$D=8IU@C/.-,RQPOJF1#"  95 A@=;: @(?>< =K-PX@Q^f  d  d  f   f iY  W W  B@Y^f  d  d  f   f  d gYM  WOCY@TSNMLKCB?>87."+73 2#&'##&575'%473275#5#'"673''#'4#&63637'57'#~Ơw9  3u,8Xa|Wcy=?H- ;GۂL'N8o+[AOw,B-G1#kY+,,---Xa}_-X,,X_KnzWAmth@pedc_ji\ ~kY  rquxvywt?>|{ponmba^][ZXWVULKEDCBA@9854210/,+)(#"  hh+323277337#'##3"#&'4#9"/7"'&''#'###/57'576363'73'52567#57'676##7767"/5/$7 8# )? $R 0 ;: 3  1*8[  =H%6 6/@+ .4- D! ,  )? $'& Z?&&~4 3 4& t B& E4'AY1+ &oq32 M @ 1g*1 YA&; ,X $ V ToF|@   ~}|{zwvu SRQK qpYXWT"! j^]\&% h( edb-*)c? @mi _?@>=<;98754321 =h^ddddfd  d  d  d  f @x f  ddd  f gW  WMQEyxtslkgfa`[ZVUONMLGFEDCB+72##377322'7#5'5&'75'7?23%276=/#7'#2#''57#'75˲'7&53'575"575'7'57'57'53'57'54776''672734?'5#'#'  3 3   a D < 8 N,= 4fd43!{)q < 3 )[   3    HH R R4d_ 34 F @c @ I? Y| &3= /q%< / ' "8+> "7 &3&2>ua  e # X & LK % J 04G\  ' %2&&>X & 1 > } Z B&(3 = 1D[ (g[@B[ZWTO M) L/ H @>:?9=K+PX@]f  f  f d  d \  f  \  YAAQ ABK.PX@_f  f  f d  d \  f  \ d  YAQ AB@\hh  f  f d  d \  f  \ d  YQ ABYY@YXSRQPJIGFECBA@?=;7654'&%$+3'#354776?373?"5#'#"'#5#+4#75"7'47527256?379/A 8T  "8MT](/?1 V#:J( % / O*8% Q; p6 /, 8.g&8b a+*FH +|87P,xU49k{~.[K77**ajFoFp88bhH@hgfedc`][ isrqponmYXW utUT yP}ONM ~!!"A$'/ 6 = :9 @alV#!D"-2. ?KPX@f$fddfddf%!!f  f\"\""df  d  dd \  d  dYMX!W Z  Z#A  BKPX@f$fddfddf%!!f  f\"\""df  d  dd  d  d  dYMX!W Z  Z#A  BK"PX@f$fddfddf%!!f  fd"\""df  d  dd  d  d  dYMX!W Z  Z#A  B@f$fddfddf%!!f  fd""d""df  d  dd  d  d  dYMX!W Z  Z#A  BYYY@K{zxwkjbb_^RQLKJIHGFECB@?<;875410,+&+37372737"#''##'#'##5#'#'4#'473'535'2734#5#575'73&'75'75&'6743'56'53#234%47434743&#''353535 ))Gf M-   ) 3  )  33)Q 3 *</   )   3  R3=({(R[ i &%  q ?A2q% &V M= >X $$=V & &WZ"%&2K%&%? 2%&h-X K  % 2 2%  % Xd 95<252 2 K&&j Q#H@"  &'(;6* 0 DA@>=<.+  OIVUJ~YXWyxwvutsrqpnmlkji] @!   )9 :51/ 2 GTKHc ?KPX@}fddd\d fff  W  M  W  WYYABK PX@} hfddd\d fff  W  M  W  WYYB@~ hfddddd fff  W  M  W  WYYBYY@){zgfedba[ZSRQPMLFECB8743-,%$  +32777'##'##'#'##'543636%27377637377'#'#'5'#&'#'##4767273"'5''"'&575&'757'7'7'57'7'6 11k'DDa DD 'C *$  1 X 1 ~; ,   11X''#5' :~NX A; ' Q) (7 'C7Rm)PQ _PmQ) )lD ) ( D(D(H^)C')_  )^7(  O+l)DC( 7 79yek@kdcb %$ ]\[ZY/ X1.,+ W;97 TSRQA@? POLJIHGF @e_^ 0- ? >K=KPX@j^ddfd  f  d  d  f  d  dKY AB@k^ddfd  f  d  d  d  d  d  dKYBY@a`VUNMED42*('&#"+773375373#''5#'##'##232777732/2''#'77'7'3'5'7'57'7'#7'7'i*!5j 5+.R uU+ J   N ? !IK8(7M<= *   55 6  y:  C4j B)) ()  P -$ -= \'C 5BB  4) 6 B [6 (i')*bt@hso   :9 > @ AHEI/. J  hS$"dbM!c^P@? T#?Q=K PX@ff  d ^  f  df\dfY  WOA O A Q ARBKPX@ff  df  f  df\dfY  WOA O A Q ARBK%PX@ff  df  f  df\dfY  Y  WOA Q ARB@ff  df  f  df\dfWY  Y  W Q ARBYYY@%qpnmgfa`VUONGFDC<;876521*)+3'5#57&5####337563476347675#&543725732#'3&'75#"'5&5#5&=2563474g&  &7R/ %//,:7.$_7"B%F0J8T//. +%3 8b &#G2Kw(A&2Kb+] D($(:`^P)_() m5T'> -g6 &+ )'DRy)D9 RQ;:95 \WVUT @F= <S X?KPX@cfd\  d  d  f  d  d  d  \QARA  BKPX@cfd\  d  d  f  d  d  d  \QARA  BKPX@dfdd  d  d  f  d  d  d  \QARA  BKPX@dfdd  d  d  f  d  d  d  \QARA  BK.PX@dfdd  d  d  f  d  d  d  \QARA  B@efdd  d  d  f  d  d  d  dQARA  BYYYYY@cba_^][YPOMLHG"!+3#774775'7'273223#+5'7'757'5'#'#'#2'#"5'##"'375'7'575'7'5'7'57'57'57'575'75XBO ! N "YO !9N  !! "    ,$Z.  , 8e-"D R "  "8  % "  " G7B6 (** 65Q_7(^))2(7 DDRQ zˈR7Q *6l  Gذ _)C  7 7 ( D _z()D 6 7  )zDTbK PX@a_  W V UTSRQPONMLKJIH.-,%$#"! G4/+(&D A @ '?>B@ =K PX@c_  W V UTSRQPONMLKJIH.,%$#"! G4/+(&D A @ -'?>B@ =KPX@a_  W V UTSRQPONMLKJIH.-,%$#"! G4/+(&D A @ '?>B@ =KPX@c_  W V UTSRQPONMLKJIH.,%$#"! G4/+(&D A @ -'?>B@ =@a_  W V UTSRQPONMLKJIH.-,%$#"! G4/+(&D A @ '?>B@ =YYYYK PX@Ufd  d  d  ddd f L  ZA  BK PX@Vfd  d  d  ddd f W  ZA  BKPX@Ufd  d  d  ddd f L  ZA  BKPX@Vfd  d  d  ddd f W  ZA  BKPX@Ufd  d  d  ddd f L  ZA  BK-PX@Fhhh h h  hhh f L  Z  B@Ihhh h h  hhh f g X R  FYYYYYY@a`[ZYX?>=<;9+'73773''###7737773#'##""#'/6?'7'5'75'57'57'75##&547368 //.   [ @ BB%S607k *K@i  && q^ %T( `((FE ~ 7C  7D (T:^ kj,CR E  m(R _R)_6_) eu{@m kjhgf cba`\" # %$zy+*)('& |ZYW10/. ~}SRQ=;:98765 PONC@?> ELI @l DF?t  >KPX@a h h f  d d d d d d  d  f]  W  B@W h h h h  hhhhhh h  f]  M O CY@&vvvvrqpoed^]VUKJHGBA43-,! +7772#'5#''3##'#57#/75'7'673'47'?347'57'3'75/575&5##&'4327'7'75'63'4 'I4 &( >R%  @& '  ' (j& ](?M% ' +<(4 y u 3 %5 e*S!WiMN[ A :} ( e     3t V k`I ` *7+ ?  A *2 + K i - ! T5 V t^ 5a 3 @u K ? 4aG:JJ` 8?4  ߫* ^U2Y@'$# )0/ ~}4215: \{bac W vutgfedPrOL? kplGDBA @(.3?>onC =K0PX@ffddf  fd  f  dddd  d  ddd  d  dYYA  B@ffddf  fd  f  dddd  d  ddd  d  d gYYBY@1zyxw_][ZVUTSRQNMJIFE<;98'+#37653'736774?32#'"#55''##2'#754#4'53'"5##4'K#"'5&'?/3'5'7'7'65355w&(   X1  1 D 5@ '''  ;=$+H#'  ;D  N$* # ; #[<     Y'Z8 9w*/'(/3r 3% + T;I6 )[#) 8T*rfa8)?@6?< CGd')rG8GTTdF(IdD/@IB ?   !#+.-,*:7 @> ?;65=K$PX@@  fdffddYABK)PX@?  fdffddgYB@A h  hhffddgMQEYY@ A@(" +2#22?32?7#"''+'5#'&57'3'54^L+    !Y! (W+.  X .A @!W dvO ''i4O 5 B'BH"# K(' E':(' ]tvO 4Me\@ cba`510f 8 ji\[?>=<;+ ) m qpWVU zyxwutsRQPONHGEDC%$ I! @d @* X r ?>K PX@|  f^  f  f  d  d  d  d  d d  YAQAOAAABKPX@}  ff  f  f  d  d  d  d  d d  YAQAOAAABKPX@f  ff  f  f  d  d  d  d  d d  YQAOAAABKPX@~f  ff  f  f  d  d  d  d  d dX  YQAAABKPX@f  ff  f  f  d  d  d  d  d d dX  YQAAB@~f  ff  f  f  d  d  d  d  d d dWX  YABYYYYY@-~}|{onlkhg_^ZYTSMLKJ:97632/.-,(')+67'5732&7'5'3'5735"57'#"#'##'7575"575'5#7'7#"###&##''#53'75'57&'7'637'36%%" T +   $ 0!3S:  ;$C7   $ $ \ H $ $ $ % $ ; 0?    +) HGF/ I [O Q,URWV @i e *?KPX@xff  f  d \  ffY  YWWWW AABKPX@{ff  f  d  d  ff  YWWWWQA AAB@yff  f  d  d  ffY  YWWWW AABYY@6pp{zyxwvutpspsrqoogfYXTSKJED=<987654)'&%$#"!+37'435'5?2"'##4+&'774'75&#####3#5'#& 5'575'7'57"=75&=6#53#3#7 M 7 :  # /( E / '+" X 7 ,!  #4 + !!" !!dlK n)S  *K  S6+m'28E886}) a(Kn)  + *naD8~ +?H-~()*)*S)n* C8nGO@lTRQPJ E{ x`A@cvutd?>qpon!jihf:'%$# - @NS  W z= ?41=K PX@  fd  d  df  d^ffd  dY  YZ  YAAQBKPX@  fd  d  df  dfffd  dY  YZ  YAAQBKPX@ ^  dd  d  df  dfffd  dY  YZ  YAQB@h ^  dd  d  df  dfffd  dY  YZ  YQBYYY@4}|srmlba_^][YXVULKIHGFDC980.  OO+3234;33237#2'#&/"5&/7'7'737434353474''#2#""#7$537'575"57'67&'75"'&5#&5: 8.# /  : # #!. & !1> >( Z.\$, #..?3QE- P"Oh gQkL/ # !## R &)Q FQ(z# 1 _5Q(j $-#IJ  3)_ 7l m(,k_5 s0) ( )Dm)f2k  )8Q1m#W $;KSz@dSRQPOwUTLHGvurp]\[ZYFEDCBA gha;9876!  32 0/+'&%$ @K^mji<:?K2PX@uff^\fd   f  d  d  dWYY Y A  B@wff^\fd   f  d  d  d  dWYY Y  BY@#zylkfecb`_>=54-,*(#"! +372###'#5##'#"#'###"5#&'7&'7'#75'7'7'7"547'7'7'7'5474?57'#367377'73547474?57&'#,4 1m4 H ) @ 4 D     5^s J s   X  ) ^th / K e eX%& -EY 2 Lr 3 X& +"+& Z@YrOH &?2r 3 I3  Hdff323  -+ &3 016U O<N}a}@[!W!TjRQKJI ONnMporFtswvE~zBA@?32  &%$#"@Pux?>KPX@f  f  ddfdfddddddd  f  d f  ffY  W  Y#!!QAQ"AQARB@f  f  ddfdfddddddd  f  d f  ff#!!MWY  W  YQ"ARBY@Nbbbb|{mlihgfdc`^]\YXVUDC>=;987640/.-,+*)(' aa$+37373##"#2"'"'"'"'#'#"5#+&'"'575'#7577''575'?437347436;4#3"3?5&5##57'47336?'567335'&'5#4RJ* 3 ZP  (-*U? *5+& ^- CUjM#< *!3T U5 _U:_K* )X I 9-HH4 ? 74 3>2+?}*E$p F}SoSa|b  }-$G** '(N 8KOB'b'5E#e d4 p5="w K PX@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>K PX@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>KPX@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>KPX@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>YYYYK PX@$"#"$#f  f  ddf  ^\  ^  f  dfdi! X  Y  ZWAA""OA%##OAQAOAQBK PX@$"#"$#f  f  ff  ^\  f  f  dfdfi! X  Y  ZWAA""OA%##OA AQAOAQBKPX@$"#"$#f  f  ff  ^\  f  f  dfdi! X  Y  ZWAA""OA%##OA AQAOAQBKPX@$"#"$#f  f  ff  ^\  f  f  dfdfi! X  Y  ZWAA""OA%##OA AQAOAQBKPX@$"#"$#f  f  ddf  ^\  f  f  dfdi! X  Y  ZWAA""OA%##OAQAOAQBKPX@h$"#"$#f  f  ddf  ^\  f  f  dfdi! X  Y  ZWA""OA%##OAQAOAQBK PX@h$"#"$#f  f  ddf  ^\  f  f  dfdi! X  Y  ZWWA""OA%##OAQAQBK2PX@h$"#"$#f  f  ddf  ^\  f  f  dfdi%##Y! X  Y  ZWWA""OAQAQB@h^$"#"$#f  f  ddf  ^\  f  f  dfdi%##Y! X  Y  ZWW""OAQAQBYYYYYYYY@E~}zyvutscbZYWVQPLKJIFEA@?>:987640/-,('&%$#$&+27337322"#'5###233732737##/&/#&#'&'5##/#'6?'575#57&/7'?/57&572733#343475347435'57'5#"##  )G>* 43 (-\3g G3 G ) 3)p4H"507)I  .J     )p3S SG (>* z  #B$& & &3(A' '@z[] A & $"e26@#W{)&Ϝ& 3RQ(=(23 ?@[2b,UF B., U;,;7J :K PX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>K PX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>KPX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>KPX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>KPX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>KPX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>YYYYYYK PX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfd\d^NZ WV$$AA PBK PX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fdfdfd\d^NZ WV$$AA PBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfd\d^NZ WV$$AA PBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fdfdfd\d^NZ W$$AA PARBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfd\d^NZ W$$AA PARBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfddd^NZ W$$AA PARBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfddd^NZ WV$$AA PBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfddd^^NZ WV$$A PBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fdfdfddd^^NZ WV$$A PB@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfddd^^NZ WV$$A PBYYYYYYYYY@CzyxwvutspofedcbaZYUTRQONLKED?>=<876520.-,+*)%+3"'''#7#7#75'#3733733534;737377333#'#"'637'752?#'#2474?'35'#&/##''''"'&'57'56347'57373354347 68()

KPX@1ffYYQ ABK+PX@/ffYY WB@7ffi MYY OCYY@//% +37+##'7'7537'574'"/472348t"?"Eg# 9?&WbX-8e<(CSyoePyxg)[\(12.@:7<  |zyxDCBA@?>543210/ HGFE.- wMLKJ)('&%$ rqd`QPO"!   efSR \[ZUT on @=vI# V ?>m =hhhhf  d  ddd  d f   Y  Butkjigba^]XW+3#223733'75'57'57'5673'7'75'757737#&57'4#&5'##""'&57&#75'75/6='7'67'6 ! !  "' JJ; # F , 8   [ B0   $ ".8 !9 " ! I0rZD 06   & E'mCz6() *) R')+)+  ,v E6 b2) T) 6]6q' B6) X s7?%D MU .0(`BDY  '@y(6[61sX@KXW; UTSR8  NMLI65 4 3 @ V ?*)('&%$#"! =KPX@h  f  f  d  dd  f  d  fdddg YOBKPX@e  f  d  dd  f  d  fdddg Y AOB@h  f  f  d  dd  f  d  fdddg YOBYY@POKJFE@?>=:9210/.-,+ +3##"#"''75'7"'3'3'3'77 7#'67323465635'572?5'57'5(& l :" ' * ,  \C   ( O_P\%+65 Sx'CH]". 's( \['h& 'i M ( i ( 4BOu(;(,A\ 4A  A   @RNML Jxqp onH kjVG ZYiED321fe^7 a :9) @=A'=K PX@ hhfdddd^dffd \  \d  d  dd  dNW ARA ABK PX@ hhfdddd^dffd \  \d  d  dd  dWY AQA ABKPX@ hhfdddd^dffd \  \d  d  dd  dNW ARA ABKPX@ hhfdddd^dffd \  dd  d  dd  dNW ARA ABKPX@ hhfdddd^dffd  d  dd  d  dd  dWY AQA ABKPX@ hhfdddd^dffd  d  dd  d  dd  dNW ARA ABKPX@ hhfdddd^dffd  d  dd  d  dd  d  dNW ARABKPX@ hhfdddd  f^dffd  d  dd  d  dd  d  dNWRABK+PX@ hhfdddd  ffdffd  d  dd  d  dd  d  dNWRAB@ hhfdddd  ffdffd  d  dd  d  dd  d  dNWYBYYYYYYYYY@A~}{zwutsmlhgcb`_\[XWUTPOCB?>650/.-,+%$ +###"2#'7'7"'####'37&'7&75'57323#237'57357'63'57'54343223757'6763'5673535 - &, - !C# 2!-!Mp N %,-! N! Zc . .  !p,  7   7 C !p, 4<;#+367256732#'##'75&'4#4#4/4#4'4'"#''7'474?435#53&5"'&'7'6sD .:' )Dh )r)}I\U P > = 0*I4*S4 A ) >_4S hg ]9-< 3W-{-> l="MKkd3(2u`9\*=@z>D&I"\ZCFRd-/.yW˶>aU{,\L=7z$@~}|tsrqponmkjWVUTSRQPONMLKJFEDC$  eYXB dZA@$  *) ]0/.-=: @  & ;<?x> =h h h h  f  d \ffdg  M  Y R F@ {zvuihgfba`_IH876432,+('#"! +%567?7?'#?'?'?65'57'#####+'#'&75'7'7'67267252?'7253'5657'57'7'7#473''&/%4 a6]! 2 $' "  %LN  M K& : 3  /~ && ZJ,&B5%  M '    $ < Y#$X  = 4 &Q3 "+VHs+#H96qHs:I* ::IGtX>+s+sH 5L ,,WS;!`Gs:d+H* W :Vid ? " FK"- Jdhlp@P^[Z EC% pom10/* n<9853 @cL( '64 ?>K$PX@f\dffdff^   f  dd  d  dKZWW W A  BK%PX@f\dffdff^   f  dd  d  d iKZWW W  BK-PX@fddffdff^   f  dd  d  d iKZWW W  B@fddffdfff   f  dd  d  d iKZWW W  BYYY@7iieeililkjehehgfba`_]\YXWVUSQPONKJA@>=;:-,$""+"#5##'###6;73277653'''5#'#&5#47474?5#&'#2#"'##'57373734353'75 )?;0 " #) t)V.))+'= 3= 3R[> b-f \33f3)h'5' G3Qp)3HJ`SUڵ*8)[R* |)))) 7 8#L DF77/Me+1YN7))7D(# )`@KOC+!!d<7 @ h_&+#%.54632E)!)#7((#h]aO@{ZgdcbiXVm ponQPON6yxrML54 K  B @h s  *HE) DA C ?K PX@fddddddddfdf  f  f  df  dY  YA A Q AQBKPX@fddddddddfdf  f  f  df  dYA Q A A Q AQBKPX@ffddddddfdf  f  f  df  dYAA Q A A Q AQBKPX@fddddddddfdf  f  f  df  dY  YA A Q AQB@fddddddddfdf  f  f  df  d ^Y  YA Q AQBYYYY@9^^~}wtlkfe^a^a`_SRJIGF@>3210/.-+('&%+37##33373'###4#'5#&'"5"'"57'#"''575#4#'57'7'7'2547474747635'#'#;2767672?'7#35G$5P     83,%$ -$# ? $9(, 1#..5 $S>--  wZ D0SU  h@ Gz4W k V `  , 5 J6?X ]# 6  *0PJ+!65 Y ,28 5 NS!` G ,L /?JB+v 1$/A@):3 54@;?,+'&%$!>K0PX@+ff\OARB@,ffdOARBY@ ?>=<7621'+?3##"'/654'?/4?7372675#'"֞G  %< 5  ) ?G,%,#" mr / .COP'=AȽF%xB> HK8-A0Q8"*5mMQ@T'*"ON G1/.- FE3 BA @ @)40?>=<;8=KPX@@hhhhhh h  h   f O AB@>hhhhhh h  h   f  WBY@QPDC?> +/""#5#273437''''#'57#'&#'7'5?>3;^3VI%/? < (  )g ( B 2-% 2 (2 2MY m y@G08[@[& @A'4&%4[ 'U-( X '@$:$   % @  0 BZ@@?>  T  87Z3E&IGF/.#"! + @ ?>fd  f  ddg  YWA A Q BWUKJBA=<;:+33##&'575"'7'57"5'#4/?25763'5?2357'234767654/7#"k   %( . C#: 2  ^k5 +"pC t] ( j< n J<-<<ۜ-Ai---<0 x;<-xP<NKe^r_)'iYiPZX&4b@_0/',+( #@fWQAQB31.-*)&&+#&'577/#+&'&54274375'#"/'+OW ;(T G B c'$4<:(4\FMXZ'2--w+LKPX@rffd  d  d  d  d  d  d  dfgWAAOBKPX@tffd  d  d  d  d  d  d  dfgAAOAQBKPX@rffd  d  d  d  d  d  d  dfgWAAOB@pffd  d  d  d  d  d  d  dfgZWABYYY@"|{zyxwutihgfbaXWPOMLA@?>98+#&5'""73?73'#'##'#4'75'5'575"'7"'75'75'3'75''#'5473657'57'7'5672734334pIGC)]l]K0 ( < K  Z`=;876432.-,+#"OO+33672374747"""#"3''#""&'3'53'57'6-j!:y$K<.Z<e#j2q(f-O9+^V"VwD4f3gU' 6S335wDx2zDEEgP0Q@POLKJ G!  E'&%$CB-, 0 A@?>=<;:98543 @FD?KPX@\fd^f  d  d\  ^ fY  Z O  BK PX@]fd^f  d  dd  ^ fY  Z O  BK.PX@^fd^f  d  dd   f fY  Z O  B@cfd^f  d  dd   f fY K  Z O  CYYY@NMIH7621/.+*!+23#+4/3'3#22"#3#'57'7'57'57'7'7'73'7'63'54e < _ W_   + 55 5?    Vfa'H'H <2)  3 2( (=Q 2 )2)o3 3[ 7dq"@q  lkjigfd baut^%$# |{zyx\[+*)('&}X, UT.- QPON6543210 K:9IA@ ED @h/ ;<?K PX@fdd\dddd  d  d  d \  d^   fWYQA R  BK$PX@fddddddd  d  d  d \  d^   fWYQA R  BK0PX@fddddddd  d  d  d  d  d^   fWYQA R  B@fddddddd  d  d  d  d  d^   fWY  VQBYYY@-rrrr~wvnm`_ZYWVSRMLHFCB?=87.+24/77327347'#"#2#'#"##"'4'43'7'7'35'435'27'67435'65?5'575'5"'&'"#236767'7'75'7"5' WnI HG J=7 % %  %%  % 4 6$ /%h2%%  % 9 11% =% jۈ+ 2  %   D\=    n<G< o^G7Z) T ?? _S S* 44 s C i *_I 4s*5 5 ? s~5*h T *J4 * iI4  ** I}@}}  zy #vurqponm'jiK gSRQ a`WFE _ ]\X,Z=853@khTU V[Y?KPX@}fdff  d  d  f d  d d d d gX  YAQB@{fdff  d  d  f d  d d d d gX Y  YBY@#|{xwtsfedcPONLJIHGCBA@:9!+233672327222#'#'&'4'#&'75"'"57#"'#'75&57'5434#5'7'7&57'7'7'#75'3'7'3MG$ !!     @O^( %G@ 56">+V CtU452 BI J    V !!* J q+  5 J * JwJ6h @U J*K +?!!65 k J * 6u .< @U 6 5 _ u j`(f:@;:987654 10/.-,+* ('& @2?KPX@1ffdAQAQBK'PX@1hffdQAQB@/hffdWQBYY@ !+22#3673###"57&'7'57'575'7'575'PJV  (( B'F%(^PA ([/Z-_[L-.CZz[=.Te-A<7@&.-/0p1" ! 3B  onmZ5Y6 sUT8:}|{dc uePJ vK @',2CA 4 @V79~khz Q ?KPX@ffd  f d  d  df  d  d  d  dY  XWYAAQA O AB@fffd  f d  d  df  d  d  d  dY  XWYAQA O ABY@@xwrqjiba`_^]\[XWSRONMLIHED<;3+7'5'73'54356723'7'75652?4;2347657'573##&#'57"7'7"57'#""#&=35&'75 ##&'75'7'57&'3'7"'7'7"'257355ND  1 X  $ '    I"     D'X _A 1'& .  +1~  Db ; ` '   #   *D I=G  %n=%U %U% 1^N $ 2$1cnU%>VDR5b $! = > % %$Jbn$1   =86 aI 2aI1 % $$ % (glp@u\[ZYV]c`P f2 LJI;-,+  =<@?># & @ON K    ' A EB ?W>KPX@fd^  f  d d d d  d  d d  d  YQA A ARAPBKPX@fdf  f  d d d d  d  d d  d  YQA A ARAPBK PX@fdf  f  d d d d  d  d d  d d  YQA ARAPB@fdf  f  d d d d  d  d d  d d  YTQA ARBYYY@'ponmkjhgedba_^UTRQGFDC:97543+2337'2?3'#'"'75'3'3'73&+#'#'#4'7'7&'7'5#5437373#367273#j    W |W  0 C .)L' r&    _   A0'0 9/ 4    EJ$ g?>&L?(] YP!K !i2W' 22 %- & 3e d&%&2>1% O& !L&W 0 2%X 22}& 8BFquy}@zBA@ qpGj= <MQPN;feT:9YXWVU6 \[  #   @I>LOgbSZ 3$"! + ?KPX@ffddfdddd!f  d  d  d  d  d  fW W  YOAOAA  BKPX@ffddfdddd!f  d  d  d  d  d  fWY W  YOAA  B@ffddfdddd!f  d  d  d  d  d  fWY W  Y WA  BYY@E~~vvrrCC~~}|{zvyvyxwrurutsomlkihdc^]CFCFED8754210/-,*)"+3737337###'5"5#3#&'"5#5'3'63'57'7'7735'276?5"57'7"5'"5#"'353535#35A5@*h  J   V J@J+ J5! J7 % @ +` K ?6 % 5  *J?~-5!!  !OTT U   8 $$ # 00:$ cE"')  $$ "T=#T 00$ $ ^$ # <$ $(Z$`$ R0 xb $/=<43  E0/.-,+$#@"?K$PX@:h  f   dfWQAQ!B@8h  f   dfYWQ!BY@;;;P;PONMLHF(&! " +337273#+&57'57'4?'57'7'543767&#'"~DVwV3 ""@,E#;""7C#D*#4"=D>gv!L _K 0D  010:I<1HU%$ z(0 I&G=0 =U $N1 $$$Py Ia@S`^   .-KJIHGF"! $ ) A@?>:9@45/ # D%( SN?K$PX@]  fddd  f  d  d  d  fgA P A  BK%PX@[  fddd  f  d  d  d  fg XA  B@R h  hhhh  f  d  d  d  fg X  BYY@aa\[XWUTRQPO/+3656723'57635'57337#'75'53'5'7'#'##'#&5#67347474S/K7)D/2E`U){   (8  7{PR mA  ]D 30]ERIK60@!ifB?,/=AR"R BB1CABcBSB tB1B1!7l<41!BdX@UWVU QNML" KJ IH. FED:98754321 ; @T ?KPX@_ff\dddd  d  d   YQA A  BKPX@aff\dddd  d  dQA Q  A A  BKPX@_ff\dddd  d  d   YQA A  BK%PX@`ffddddd  d  d   YQA A  B@cffddddd  d  d f   YQA  BYYYY@&SRPOCBA@?>=<0/-,)('&$#!  XX+32747"56?532#&'"5####'##4#'75&5'75'7'7"'7#57'56)Q   [W =   ":4-H   2   2=     d#/ #$ /A)o#k A# 2 ^ R##^:#R   #G ## h// R/;#i  #FH9@251 -&$@ ,?7>=K)PX@-fddUAOB@/fdddUOBY@ -+2'34'&#"'&547365&#&'&'7'2?'#?473V ""MVUp*#%>eM<")$  ^ <+p  1Z.% I1&~`%J7& o[NK=cl5G%$| 9 X@WVURMIHGFEDCB!  >" = 0 854' @N/ ?:9 =hfdd  f  d  d  f dMWW Y  BXXTSPOLKA@7621.-,+%#+36373373&#"#'2673373"'#''&'7&3'57'57'7/#'&56757'60 :>9;C9T2 !!;O? F* *}>/ K %P /7.A!  <. D 8I--&o!? - | 6 8c"#L z "v"T 3F2 X!,-V@aV UTDCBA@?>=:  RHG8  ONM  (  /  @   5?6 =KPX@O f  d  d  f  d  d d  YYA  BK%PX@Q f  d  d  f  d  d d ^  YY  B@W f  d  d  f  d  d d ^ g M  YQEYY@QPLKFE<;4320-,+*'&%$#"+2'#4#'57&5##2#'###'&'722375'52567'/   ( ( O Z(   < c ((U#   ; d 1X4 -W Et: t]"F  "/"  /q $#A -.t s##.Q] l 9". C@= /,+BA@=(   ;     @?K PX@Y f  f d  d  d  dd  d  f Q A QB@W f  f d  d  d  dd  d  f  W QBY@CC?>876543%+'####""'"'53'573732354747375'6HH )) 2  3   < -  3 &T/.\4 9F  %+4= S % _ Uc 0S%4Sm0 1< 0S;J % g%@`M L a`;: PO98 ]\[ZYXUTIHGF543 W +('&%$  @< #? >KPX@c  f  d \  f  d d  f d d Z AAA QBKPX@e  f  d \  f  d d  f d d d Z AA QBKPX@`  h h  h \  f  d d  f d d d ZA QB@b  h h  h \  f  d d  f d d d d Z QBYYY@edcb_^SQKJDB@?+"'#'7&#"##'"3&''75K'7'5472;67'7'63732'75'5735'527354 V WB   6+V (. (  !?.> +3  KR%N 6 &+  &b  * +   *+ +Vj  !D g+*L6  j 6 Wi u , 6+ (6 Jv   k A@MH@=LK  + /65432 > =;9#  @<:?K"PX@H  f d d  d  d di  YAQBK2PX@F  f d d  d  d di  YYB@Mh  f d d  d  d diM  YQEYY@GFED@?10-,)(%$"!6 +23676;2'##'7"'&'"/##''57'#46735"'&'7'4SB"_PV k " W @5 i'p&)"_ 6 K*A6  t 92q aB:+K5AL HT V8 6+6! J!M@! L  l!! *B ,"/N\i@GF A@ MLK?>=<+* RQPO:987. WVU'   0 3  cba` @N; $ ?\[CB> h  hh h  hh h  f  d  f \ d  K  YKQE]]]i]ihged_^YXTSIH6421+#37#"#4/76365'#7##"#"7'575'75'7'72#3'"35#l#3WW4Wg" JE.""s"4(!"3y5""3D"ZQ"8>.%YM. k\.]6E+6M+O.a...k...\\.z>.\<...\dhk@kXQkUS CB)(% /, 63 @`]da\YOMJNTPA: <9 ?; =KPX@fdffddddd   f f  WAAQAQA P A  BKPX@fdffddddd   f  WAAQAQA A P A  BKPX@fdffddddd   f f  WAAQAQA P A  BKPX@fddffddddd   f f  WAQAQA P A  BK PX@fddffddddd   f f  W  XAQAQA  BK'PX@fddffddddd   f fY  W  XAQA  B@fddffddddd   f f iY  W  XAQBYYYYYY@-eejiehehgfcb_^[ZWVLKIH?=875421.-+*"+27322#'#'7735337373#'#'#'#'5'#"=7'6767635#'''''63737733535\%<:KQO[#J%3-`%%Y%%%Q`C-{c-3,%,% %%B\ k"$;I:jG  $G  $" // " $ # :G$ivY# $ #$F: t+#<@9fdYYMQE!%!%+>546;#";#"&'4&'fllZ=\yRRz\=ZllfCJ2C: SS :C2JB^K)@OB+3#)5+#<@9fdYYMQE!%!%++532674675.5.+532fllZ=\zSSy\=Zllf~B,J2C:SS:C2J,C^,n0@- @> =MYQE!%!#+#"&#"5>32326?v9<;3qI@v7@74qnH3a8TI4c8L0C@@@  ff YWOB/.4&1 +&+"!!!27!7654'&'#53&546;2#&HXdZT5h#;1g1":K:Ce]<?Kք2MB B8=YMQE><(&.#+3276767654'&'&'&#"'7676327'#"'&''7&'&5476^)::)( ();:(' EvPv,7,-)*9-vPu uPv-8*+*+9-vPv  0(()::)( '(:;.vQv vQu.8*+*+8.uQv   vQu.9**,+7T@K PX@A  f M   Y Y  ZYRBK PX@B  f Y  Y Y  ZYRBK PX@<  f  Y Y  ZYRBKPX@A  f M   Y Y  ZYRBKPX@<  f  Y Y  ZYRBKPX@A  f M   Y Y  ZYRBKPX@B  f Y  Y Y  ZYRBKPX@A  f M   Y Y  ZYRBKPX@<  f  Y Y  ZYRB@A  f M   Y Y  ZYRBYYYYYYYYY@!~|yxpnjhec_]RLJHED97!$A$#$!$$+%'4&'%"&5463!'!"&5463!&'&#"&54632;2#"&#"3267>54&'&'&54632;2632!2#!!2#!#"&#"#"&54676767># y 3+A` D9!! )  / 84F & ?TC .e C[ J   9b   D+"F    f   9o  ' rH   D^K*@WOB+3#3#s`LT]@Z@ @I=fd  d  dY QBQPMJHG52/.+('&TT% +67654'#&'&'&#"67654%.54767'.547676;2#&'&'#"5+"&=3!8)I[;CN^qHH{iYCg({iYR B3KFON^oe/4l.7e|B3KDA%Ae =BYI{?@e}@hYA@hYO!Q3/YICoo'8>Mnpf!Q3-v]'@MQE((("+7632#"/&54%7632#"/&54G E E L {G E E L  H I K V H J L W d&/Zb@_  f  f d Y  Y  YQB10WVTRGEBA@?><970Z1Z.," +2#"$'&5476$3267>54&'.#"".54>323273#&'&+2653Hhfqqjijjoohf_ffabaahh]`&J'*H,4OHKV)! u[H^|5qheiimoih ghq`a`fe_b^`gg҈~~ ^~rZ^y1(pFd.QK)@& @KOC+3#3#VV/%%//%%W#@ @iKOC+!#!WHbd&9Qi@ "@KPX@;fd  Y W  Q A R  B@9fd  Y  Y W R  BY@';:hf\ZGE:Q;Q310.+)('&$! %+;>7654'.#;!53254/"';!53254+5!2#"$'&5476$3267>54&'.#"!= 0ARd2"-EK**$5+%%+d@=32#_#)!)E_#((])@&fWB+####.5463RTײFU8{F@MQE("+7632#"/&54R P P  X TV Xe h^Z@ @K PX@^YRB@fYRBY$"%!+32654'&#"73672#"'hUCB91(>0?% V`ufmP4+--hQILY e)@& @KOC+7#553#553sVV%  %%  %sU' &+'7'77ccbcjcbccW,;@8@YWMQE'% +5!7632#"/&547632#"/&54WGR P P  X R P P  X TV Xe TV Xe &@#@hhPB#!!+%;!53254+5673Hd.F.do0'0߭22M,Eq7#@@h_+3#'v:7c5B4@ .4 *)&$# @ ? >f  fddddY MOC32(" +72?32?7#"''+'/7"575#&'7327' Ky "J$'K O " ;!vq>@"!; !!  = hN}:7#E @hMQE""+332673#"&3tmmr3{zEIDCJvo]@ @MQE,#+7>32#"&/.546E GG  K HL  L W  O7 >K+PX@YQB@YMQEY$$$"+32654&#"4632#"&:**:;));LfJLggLJf*::*(;;(KfgJKggq^%@" @hQB%%+!3267#"&5467GO6.(;$mAFXye>s7/8!?DG7L7l(f3@0hiMYQE2""2++"'&#"#>3;267(aN2?B0'+ 6bP.C@0$,fgf)3ji(.7& !@h_   #+>323>32ِ+(+(7,&(&,&(&8@KOC+5!8xx@KOC+5!xx!^=7@4  @fKQE +#"'75'67'73256+! F:  : "\x17@4  @fMOC +32#'575"'75'7'"56+1 F:  : "\o47@4  @fMOC +32#'575"'75'7'56+4 F:  : "\1-M@J%$#  -,+*)(@fKQE' +#"'75'67'732#"'75'67'732o56+56+ F:  : "\. F:  : "\6-M@J-,+*)(%$#  @fMOC' +32#'575"'75'7'%32#'575"'75'7'G56+;56+2 F:  : "\2 F:  : "\_ -M@J-,+*)(%$#  @fMOC' +32#'575"'75'7'%32#'575"'75'7'$56+;56+ F:  : "\2 F:  : "\G2-@*%#@SQB$'$)&+&'&5463267632#"'&'#67#"&54632.9H<9K7. `Qe1<7- hU^fj&lf `Re1;7, iUaQe1;7, iU^.9H<9K7. e4e -9H<9K8.F[@XJ<.Z,*@K PX@YU QBKPX@ U QAQB@YU QBYY@ US))$*$))$# +%67632#"'&'#"&54767#"&54632&'67#"&54632&'&5463267632#"'&'^Uh -7<1eQ` .7K9<75&# ,&+327>7654'.'&#"#'7;27654%.547%#"'&';!53254+5!323!6732#.#""'&#"#"&'#)C9; DvUB88 }"5G17;9F\;;eVI8)2cd[!fa`gg`j\Y[42 2*D6*{H@Mz[Sf~:/|chj f3,nW\t*#$SQ&,,45Sf|4xUyIe]r@22`2<>sq|cBTIlWG:>Q"+,(*)T(1Y+&23x3 LtBJwfrFJ0oit<< -,  ˬhk<7654'.'&+#".54>32&'5 _G@@FsaGA? DtqppqtlmgTձ2)&z95rIL*+z82rTA 71&+ ! !j!f0^#&+";!53254+5!#";!53254#ffa`gg`affa`ggh332222x`x&+ !273!527 !#&#!#{;1gg>,i,>g1;$n25 [92W&+5!WG&+373#JUؖHg#<B`:+O 80&&+&'&#"327>7327>76=.'&#"67>32#"&'&'#".54>32;.& 1W3. /W; RE6 >oC:%'Cx0 "zCCzDDzCCz" ^44`33`44^g E2.,0R  CT`90 P=66 ++^' &+#"&#"5>32326#"&#"5>32326?v9<;3qI@v7@74qI?v9<;3qI@v7@74qH3a8TI4c8H3a8TI4c8W &+ 5 5!qHG2S(W &+5 5!WHqGScgЌ.| _< ? ϖ+B$Dd4]N~![f-PFp4Y%3-E&<-M&-T8Knl-lRu-nD" ~B9I42G(=~e9 9uP@^(  IU'B^sLzdWd<<]heFwNNNNNN`sTW####dd)OqT8---GFwweV0L0M90xWB^WW19^^^^^hfv f ` 2 v 4jFD4p !#>%:'*`+-.13F5j68>EFbGHMOhPSSSSSS2SRV6VWXY:[.]^`Bbd2efik4lmpo0opr rtuvyzzznzzz{{}~~~DDDDddĂPPPPPPPPPPPPPPPPPPPPPPPPPPPPnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn҂҂҂҂҂҂҂҂҃$ f܅2N҆^ˆ:^z܊TR>Xʌ\ҍLZl :; B;B B[ t  ?  v W I 2W W 2   ~ i Quikhand (contact@jotaylor.me). 2011. All Rights ReservedRegularQuikhand 1.1:Version 1.10Version 1.10 May 12, 2014Quikhand1.1Joanne TaylorThis font was created using FontCreator 5.6 from High-Logic.comFreewareQuikhand (contact@jotaylor.me). 2011. All Rights ReservedRegularQuikhand 1.1:Version 1.10Version 1.10 May 12, 2014Quikhand1.1Joanne TaylorThis font was created using FontCreator 5.6 from High-Logic.comFreeware'!#!tMO#?k}dO$D}mD$D, `f-, d P&ZE[X!#!X PPX!@Y 8PX!8YY Ead(PX!E 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B*! C +0%QX`PaRYX#Y! @SX+!@Y#PXeY-,#B#B#BCCQXC+C`BeY-,C E EcEb`D-,C E +#%` E#a d PX!0PX @YY#PXeY%#aDD-,EaD-,` CJPX #BY CJRX #BY- , b c#a C` ` #B#- ,KTXDY$ e#x- ,KQXKSXDY!Y$e#x- , CUX CaB +YC%BC`B %B %B# %PXC%B #a*!#a #a*!C%B%a*!Y CG CG`b EcEb`#DC>C`B- ,ETX #B `a BB` +k+"Y-, +-, +-, +-, +-, +-, +-, +-, +-, +-, +-,+ETX #B `a BB` +k+"Y-,+-,+-,+-,+-,+-,+-,+- ,+-!,+-", +-#, `` C#`C%%QX# <`#e!!Y-$,#+#*-%, G EcEb`#a8# UX G EcEb`#a8!Y-&,ETX%*0"Y-',+ETX%*0"Y-(, 5`-),EcEb+EcEb+D>#8(*-*, < G EcEb`Ca8-+,.<-,, < G EcEb`CaCc8--,% . G#B%IG#G#a Xb!Y#B,*-.,%%G#G#aE+e.# <8-/,%% .G#G#a #BE+ `PX @QX  &YBB# C #G#G#a#F`Cb` + a C`d#CadPXCaC`Y%ba# &#Fa8# CF% CG#G#a` Cb`# +#C`+%a%b&a %`d#%`dPX!#!Y# &#Fa8Y-0, & .G#G#a#<8-1, #B F#G+#a8-2,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%aEc# Xb!YcEb`#.# <8#!Y-3, C .G#G#a ` `fb# <8-4,# .F%FRX , G#B.**-?,+*-@,-*-A,E# . F#a8$+-B, #BA+-C,:+-D,:+-E,:+-F,:+-G,;+-H,;+-I,;+-J,;+-K,7+-L,7+-M,7+-N,7+-O,9+-P,9+-Q,9+-R,9+-S,<+-T,<+-U,<+-V,<+-W,8+-X,8+-Y,8+-Z,8+-[,0+.$+-\,0+4+-],0+5+-^,0+6+-_,1+.$+-`,1+4+-a,1+5+-b,1+6+-c,2+.$+-d,2+4+-e,2+5+-f,2+6+-g,3+.$+-h,3+4+-i,3+5+-j,3+6+-k,+e$Px0-KRXYc #D #pE KQKSZX4(Y`f UX%aEc#b#D++!+Y( ERD+D$QX@XD&QXXDYYYYDvedo-2025.5.3/vedo/fonts/SmartCouric.npz000066400000000000000000002634721474667405700200210ustar00rootroot00000000000000PK!mYϴfvfont.npyvf̽ XUe@A@PPQp`gD {ZFq}D4sNKlpHM&,˲Q23,2+nl 6wo{<9Z{ǵ{ǵUy4v$-6ࡳzQ+vsja::{egH& [g͝9{Af͜;a*x0Sgi ad6˰kV~ 4z 4̮ 3C$M7۬Y}Zi}Ǐ`F5yٶÌR^uRޭ]ܪ}AܪUf:sN1fl[__j0Yti6NKz =KeD'夈MEzg|'G!$/ߞRc1nԷB}XO;=R}~RʨIfjyyhޕfh${}bWnQ6+z5 CӗvUhC=?:kmed =JҭvdTjN< CT' PG f)4&".iMc@ Ʈ 0ha6,;bw.Xtr,tfܮ@v.ePQ{b&X$N2sv$TsSrkU5gN20zkFer^J)H.YLv䯵=TUqE=kjLڛ 4K~vECC+geA'w^t> AgH[gI:&8*5A_X;O';\*2$&>?x_i6Xi1{m$TS<l>(anajG+F}qqȸۉ-lz:PtqTC6ˌƒ &TȩW6ҍl<[cXw}J]пW{Zg \1*A\{"<ٽ>&#|/! +"? em^B8*Y7 0n-طbŸ1Pvf+p)X``]ݐ}#6%eOD=4(j*ɈA{ҡ4 Ѩ/fH@EP,  T h (jA@pe;P?(󀶃4|pt4jP]$JCHe4Bb" 3hY {GKri Xcq@JぎDB U(MZ)U$UZKrJId T T*\KҡdPI@ i2ZS 8E eБPNաwZRhIL(9P -W pt8F$͂r0PQ*C}*a pz#T _%K+2)aZg=Zۤ>krZU{]H{~c_\{"XG}UjA3`ZlP2ǔtY!4?uA8"Y\sŮLҕt!U6RBT Pv!;zWև:cY'>1t?O<^/Wؓ7!|./c!y{gM| }aә}ˇ{a xhr#' UEz3^1f;^cxO4:Y~Gd6\Odu?fXJ4~GI-Wt7i TecO=)^kT{g;Ou=(q+IG| G;os:c7ѝ8?tJb wz#;O:s=;gIjGCU"{R$Zރ.?~7N/0 a?J{'t/P9`B5'zEd@If@"r3%ΕFT4iבm2@>G7iqUqtOW(}5~цg1{jXkS 5jL4m) H 4a#>'kFA92OgAfg`)᳟~ކfЏ)- `$=I9/ح(I 6=$ԭԒ*uU)U4y|RVjUʴ-+X߭w&S$;~ox@}ZyZIS &Wgךٮ:T[$%rjO"Kq-4,&ԻJC2T7st uCy-DMn"(Yyn| }vZ[ɟɡ'G6=,1["_w"B`nh0T>J؍0z^ˎpDꏼƸadlc ~xd|MɂTuc*Ly@ﵹZYY4 Cq#<p7dmQDpB~|эN@2pgBOpGk+M<:KlI`n5˽4JG+kBL?46W6 a 22PQ5266 1aCb#&"t Q"@èew8ơ0BD8&@m4Q*QTNJ"5OZ _s3JV{z@օv6QRW+U]ۨ|.P;}L7/>d^oVϫִdS>3}cF?ZTZ|6lwX3D'蹧֛z+{߽˜n?[5p]6qaљWG.js[^i 6LJK 5hH*>i#u[(m ;"r[a -q̀n膑DCIh$#* 4hX(=*1j1@J!(&A \ Vw @Mx˺  T4 R HEY*"v*0~*ܡ?S%sUyժ׋^\eul~,0. ϶ڳP{M-kZ1)&/K2y'.j^Զs@I]j)cߴՀ\fsI>l.5lDTinͭ`dd ,[let+i!w];xoq}%SPۑy5y~LO>m61 & rꢹ+}3~jrŸX>#q'ҴPvV=v(i^/i7hAꃽ['lFÖg{p.4Rc>W֝l>;_N)5m v/ xGS4``]7loz¼#kվ.X ^wFƏCf];]݅]`x7;" 1= 1b4D^1h]1}툆pD ;979i8C2 ;a6ҁ 6̎qdtC1-#,s"䙈$@ 4tK1e+*=fyg}=yw8-zJ^ћpOt;I >5Н|wr؟O$66l 14;XM3 vb3ɝtC gtWPjt-E휧S<]i>#"FtγsV.xezK vRwy3ȋ^:cYbxa|x/>Ri(hD_~|G#[lm0_61qW*nѢ^DLe 3[{n5I6H6`-(Ec^` |M5_6IHoT#%xS4H_0f} ]o~0L ?3` pT_i>稲]ySTO|dy{k󚟪fW6|dduƉuJFo5o{xw*3wo"V3ZcrW6e6b6_BZqW:&@!eU*d>0,5۝lRqV懕G5EgCtF3kvu]ՏVgq_5qr'7%y짔)CF61M37-mxdԶP[{OlJx6kZѴsq?OY,_Fk[B?؛S;G}3i}s՚3:`v@}ԂQ0!g bgk0i7h?j~m 4@D~#@ aH9Xk>U{Ƀ|AfY{PWGЃf4Dz_E"A'YZvX(4I\ wi}1ZoUp'4E?Gusd"a,{VoI8c9P_Ep,ƿ%b}_|V"v+LeX:)hfDaOP pObGu5Ey@Ķssn5Q|+ƅ $ 'Æh:\Y'?t5:c㤃:Gኮh w^^^t濬^Q[뛾yָlX Kal_1;x} mmQ ݁Ȇ+0.Q`[q8E"w qڝ³ΨtFE hg@Ex* qơ8/ġjq:@sгUJvd01ogbwtIspgXx?=f,dbqpv1G\b 0wŘqSȻ)Ì2 e.Cp;\2Z&?5?m*-]rrRXsz\zP>+krQ>G6*JwEA AC*"Fӭ9$Y}vk7 #xI9P7(%n|]#w\8ͥ=>X/{rF(Mf&և3z'Rz=9Mѧ2?ЇkZQMRF1ꍯuJTr"jT xd`oy5 3Qn+W@=@жil=k +0.bcw U;WzMNs'p|==m!8#¼bF=@{bc -59kMAC r8yBXs<Y\uh[.Td4۩ }Ƚ[Gh^tn$}YQ4-#1s9F{ჰ<hN-//<"k@ {I\ݿѷ]ܿ(.F)SN6z9nAhgDiPsDD?FkF% r=}̤4 ~ث,g CX|0{m`q/|E:,v- J'V H ve|-`,}B]pb2<_Et )t ,]5u΅w+·\{* ',wp39֛(ȏC>{v5O2((rWxwDrbdC Í]Q [x-D \gvL` Os7:978TôuF}ޢtPZk>kЃ8 \(-d,2ڨ0ա' /jm"6je ߧ+(4! QajɄvnw[AKYIDHDСyn_RJ=qv_OD=Qq鉨= ."Ǣ/lµN@ @)@*\BSN(5~vJ' o _C/c_ h Pv@<rC[ϳ;1)zR(KSrD}}>'h?e\(wvPvO\?h1Y2JNMҞպkȻd=E7[K6Nbml!oA4rl8RMӷ/4*rĞh$Ct`#7J |cqkZP?DT2$wa|Yt629A.;Ww}.rt-p|~w>F8yq/Ud=~'?{٣_jvjEe:J_]& lڝH7h0m0A!Bz{=ߝ~Oa$z^ijX[~ @ߡ{#3*vZ{PbµKG<ɖtonp~9٪鿩.::UuS$m:R9LpЃnQ]/:tmpՍu^(9sݍƉ?7q,ڙ9N91TZvwt=YC}KDAI}%I"7qZIt:̃VCnڍt:"ci?B7,Вi{#nm ٸХ p3w𡼗˃l whŏ]_zQ6]>;Jd3f(.;FC"!)g[(77ǾfPKV:D`p%HL:F3(=ERf1bwrIwo*lɶ mˠO}Qg i # Tn_u(߫߫~/'qMi!2b+KmXkD@ob{(6ƻFЕF{wL.x㠍="|PEO|1ĩY2L8m\-lq#ȾlͥbsivsmlNDbrZ[ǰ~ Hld?ݩ.՟Qڐܥs>7r-[ާ>#}/X#WmROoa7B9[;l/c.(ٺ:(df wzTf.s緩wﳛ&2Ov׹U_pWMjmiD†kϩx={ekl> P< w/ېlއwtq}d?yylޖ=_|2F(&Y01F38qn;35[](uvO~Qߝ 5]_T}>%9fK}_:O %v\>٤ű7Fd^rXu:cVG}ޅRObGJZKZ+hzr#f=gجQZ[) =o-n`-e|Vmm۹% 9ݰ ;|}Y)vRym$ڡ[Zf@-]SpJCM$],>hS\ \Q+ Z.zrQA9;Ȗ#lS׾rOsw43Wuq1U\J\ja0*B AI&P]%~HY[[P?X'HOj-71t &! eq }rٰg& 8AQl@')!XEhO]F~KZY%oI4@[i*]C֫jv,h˹SƉ CIukc vʍ^`V -_gY=fYe96x?6 EK,]f>צ+\0BD%9!v]̂A+銠-+ +@\C*ٰ?.A?liey@dC/xs|52ęNX*% ?N@; s:0b*p 85dn\52@e08Ϭup (9.ͽm-}6 >& 4f4Dq~3ʱ6d-< s[3*_osm&o ~|~/yͻ|.%v]lǾә4sd/zak^ ntCh,AyWn@]== %; 9$ " c)i륡U!T!D!TmA7#φ˓>*<˰0` d V۽/~),;"y)y/r{v9$̲y9_ϱ]99˿+:MF}h[=n#I06]x*vX5O W> ZJkVQ 'v\Ey5lN6ujeN-|`7+WGni\#,G'7;=ρPl6т9;svv.Yf۽{WS P;hu6-(]ZAF껵׵.|}=~Dѽ{=[ XNHV'tktN.]m܏@Ky.}ȷKM06#]KӍ!@E=w'k\ݏ~umte]aar3(#$Wا`^>ba̶_]=ۥx {Eɭ,,yIPk>VfO{;N;bO;M!gwY ͋QWi8Yqv@<k7s,f%yU?K$P^o"/sd ,|rnP6d5&;nWǾbx+9|2|,lNAxAfh]bػt O'iZ$*#'uFD[_Hw:TZ_K@_@;EFgm"Yߪõ? [C!#pFh"ߑͧ@$3<&:n=,"lmє2{gJKHl('TR;9DARˉAԠf(lGU~W[hJpP{&+[o =P1>l@ MGCiQZQ>>I8]I8rk0tpNœI9>I`Z t*r2z`S1p: kil{y^A: ^ڜ܈|xfW`$u~:S__X7+cq&uu3l*kk9 F֏i#i6G#LRGVCn`6hwv};Y0[LϑhRFul_cSh F-)'׀!t~qkt5Tݗngl+ei[c1SNWf*srW syFq`Fdf3W7i"u쒯qutU]n?]r2L=ʾd| ߇KP% ?)ρZh l#Z-WWeC۩D4Z n\M? e?w^jL9OZqd39E glN.r:Lqqظӯy̍g}3׷ >α:YNN!g?W+WrF)C;#\׹w/5>\sCeɈ7]y$?lC-?σfo3ANw{s[RUIzyHpG[W)?*W+%RtZ2TD)t1&UUy\VJ mDQ %M=`4K'Ӈi-y)Kx;<:+ް)>ozlA*2vMEckiB"K1iV?@G13 v u7 AԿX_ /żXĢ8Eq bQĢ8E!5a 7/3v WD:sl?:Fhg`j8ze ZThY"7ƻ"XO@.q7]yCσZP]wX^OK1^G)~4(@I CA٘~h4gIf#g/?M!-cpzP`~/h 9s_s؃{Fpy[ '/ݴZai7ևKCZ;R_qU|uK=\9pe:jyڇ>Hkه2˞=%[ u0ۓ'p`#ٵpY*ʗM4bkaz>/<4zàJu>V8 ^~Ɵ\eoo(9|D>c飣\S1^em5 `w|S Wg]S|+Y>EZ^M/ OF2MCP=_b/]T_]5v7v8ŠTS|b21+=vhCGኚQhIGs" [ $~ ./p\?'A/ *W]&T..廂[/\-aDXɊ}p8V{he+$g㼈lԩ8<MzCJ1]JL B;ּ8`;n%(U W.h{ FڛmrnqѶUn'PFUJXP*XbyhwZoŞpwhsO]?e=kA'WLޝy ,2xc;6:Cy g$(>/"ynٷ4zL%"u|M\W+OtWi}49,Cn@/=ü;M֐F=V=v/[jY; 28 2#QuS(J|g)wOcg9Þ$X_rؽ=} Ҙi7n1eJ3ޗbw;rt{\&A,ExsKQIJ9bќ5FяaT,xiԋU8q1y]')֙Ŀ~F8ǡ'lgӯ*ҝ<#~\eeyW,#Ol&` #;ﯖ`lv3  Ҽpo2 |b|oy` g1ty 0w2iMf>jjͺLKmҖD=}4g?azie8@>nj]a!_ _60L:gL͓/\Ո#Z4hc0 <ʜq:/T<8iCM75g{j*uȕT5T{\K bG'_v 6 6۴!<|gO? Y %fyI{Cam WN6>|J/ZKB>hܥ$~PUOOa18EJIS@MF2IF IF IF$ɨAU~ͩ-l~vrO6&u 3{,@(@ TAFbl@h&fRILM$6~@ $O$vuۖU;ٽ{ϲJ[Uj6 F-! l_#Xntz(˃d1@.=z~Kh tfc!x6Al/8;u<|% JN>?0k=_߁ w fؚTjlaT\Mݫ]Pk[5SZ%l"ǔ(Ϯf}X믝Rzm-SGYxo*{8T{7h`wvtYV)e|cՖ;Z<f~eB[ŸO jeG@1 H@dѸrnKߥZA{)oL45L(M]2ʟ3;:sA 0;ּc杓\Jsm4\6_Zd"Z-/k]+OZr;dN `PVs%5(b200a׉ڙ 2QB˰/taww*Wb'~Xaj Agt.,#(|:f '釴3ˇ=#/0샍Al AjA!> >cH[} ov{]9ěyb apO{0}({_UE;Rwk!5ɬ3 el3pT.K`(?MoBA '{N>>nbH[~!m-Lnۨh A A89^5Z(};#p $cE|h/S{֯"DB`^>A uG=P*#PZ㪗yrGړњ{:}y T6WCZGedh8p8N)$a>z 8!ep;83mBks18كSқ>Dqz'@U3l@)[ygu! 1f{`X+"?6y;q8GVT&GvVvv!mZbi$O zW-Q]+3ǝT(G_k׹a=_?VBIR>#.JMWoR|R^*X}I+z:I'?˫\s$֟E0 aX*_2?K} t~7?ˌzC,x֞htp;|s)̭'>yN [,ۼ^#Zwwv'9&@1cW ɵ_.h)); ; a6i;A;\z =*Wkp=$۩:"=U-%'-?i/˜Oi \N2Q#h_z5|ɕ+]Ѡu236(:+lp{ͳ;Yy3'`y'XDY8eu@}@$T_~ZUhW_>*"*bUmn0v[:US:U3g]W6?AO0K0Kp%..V#%ӝAA9Cp\Jf t n(G|EEYNgt ͢-[hOCs^Ԗ㶠af44 kq}Qnm}_qCݛGQlm Y!;=DHHȞz*Ȉ(UUQP7DPAQ^T.ޮygΩ+b8Z㿙Bnݲ}FlgI}fs93$itAZ8K; `t ,jQj(%*R,˳8L>IZI"YA"$.AN;BObIt\{L5U%&;@ؑdy ]sUTRdfbdHh@~YF2Jy/|X452Js8jeRtoy953M_5UKJ`L-WjO1P|gg0L""& jL)n4HA\?5Z2n iO3Xπnf[XCǨŷY7[oY-{::w"m+m Iɸ)n(QU*k4)oTCnB'K}v+ (J7i4J V@ duotŎ* +R^'}K{Ϧ22 &0 ˧H9 KzHۇtu{=ķBDx- xk7lsm)=M$ Do.r:kJm/QZ=ֈ1WO7K5swWUgMYk`6eifg5z?[[]Qu/ړwhRsV޿ `S=9ۘ⿋όr)(Sӑa} P&DfwLIn^A 0l 0TuZg{)r64А[avKKAq}sHs; dBusQWd|<<b.\Q4!2dP} BJR4naH͉J< T?ЕΥVj%JJrԖ\ ɮRa9^v%!aʀS _42h|e&Cכ dxvH3HÓ5B|FʠA+W2DjggE= 0ڠ~F`_a}snw0/Rs>GJui RiTyWx˿55ͱ#ަO)7~@w{o"~I0_x~2VE|*TivqpA8-zujϮ0wohIZueAH-mI=)w ^G$2&/l[m}n2?S"*m+eWld1>őeru{*ZVR6^Ko'0X~aeZuDM Svl.̾b{n[QY<"g[ 6="{Կюihk~L&X0}z+vC9?-V5ROB&!ɴ-dS'?HW52E*–%BJM'c' B8h<&r<$Rij{ $i"YRך.886f,sF:Iy&Չ jqt4RJ tLCé-m1-a0\pkU)_bVQK/ctX!)@y!k0CnP3d$ε8IULg YuYeuuKi*#.ѳZʿ!חr x,eo{.%}rcEwVzzcZꓛSHO1.BR'Hhےvr8>˾!-UJ̔ +x#MnB[x:5Eh#5T w΁)΄Du(m`=hrs16"Cx< x 6IJbȓI0a%AK( 6.I |rUD QB')I+ A.}W8o <ȭqJ؅QP;GAI썔%B%[AIjLoǘޡT ީHCB4K,ƭ\۬>joz;2ҷo=5}kl-?ۈgM5 lߑXoUo+`m !{O+EXOҵ`4=I'ڃ1\օBVĔ}YSF*cmy#Q!>-yM|C1NVĔ} :n>'(7Á7wm}wa4&ǻ݃72󑔙 |Oڠaa$M`$Ƀj6>Œ<Ӟo#KQ+Ads7?}}HN*|'޲7QDo}kk6qI{>hGX~v=A<귤=V-}a ƚEkUgM:n5n5lF;=r렱 c'YNڲ߬J.zE|1lÂuc1oc~C DJopXX JB#΁-D?Da ' ͟ȋrb21 x3@4Vr$"Lp+ٕ=&g|xad";iOkv62kڳ+ek(jr}ީuJxWB2\5FcXv'Vnv}8ZڟZև  ?sv+H!zE|şѼ1-g,9՘rgk[R#W̪<ųޒ~F@Jm <ץrVɲ|)6덅Mf~Bk.*-}7UL{Pw>u׭ oս[7s}ߡ5}k?WЃ}o8VQA>ZvRmOt{Osʱ嗗Ry0wgVw`́&XޒN%Ot>Kb FYɞbCyw(R_ţĂlbv-yr%-~:ϻkMӸ䟟3Wt혱ϻ5=_Į^TscTUV5OaJTaFL 8JDJ+H) 8mXK?:C[@44BwI6Fҡ`>ojK'Z{7TCoCU>3Slh0T3ڢvS>x'q"PQZ8:Z)1818HZ䥭Fg?AԶFmUȩ-рtDHd #rB-mL9H2AQҋr`,AzQҋr^OmN ć̤A WU9Q0C#pDɕ %%,< p\u1B$z/w_xEw_.'ZF[ 羈z˩q1mWS+!/j5Qk!FjFDQ먕>bG\L tG_AYʃ` ^v++Fhbu9ޔnɯ'k.3=[8CoX͵*!`)^¿q-.bxcY6^b7#:{mhm'Þ',a56HLy(?O"ʧc˭&Nl|z1Cf^1TjYbH;ϱ"A՚m; /֙%̫c"뤵[wXY5~b?lL^ҹMƬf|[6 /gmؗ@vYb1뵚_{o {|ݽ9r?gнm=ӟӆjyxcu/x%`Z6:@;Lհi2JF:^ l4|ѧXR¾PtF>4 rhL-r: + FQ P>|F#B{G Z6focbR tT Mi BVa h$k!NaEp2W O^ AS4'#tZbq\Ge)hT0,Ptu0| _σ<䧷πgSV͒~:m%ßtbN߼Zuԩ7ڹtyZeĩX~u>ΧvmG䩄_| vV =f*9yOzB)*s L2h#bhI,ok`kjjOhOЙERAoB-R ֝Ncz}xSE^CLo&H~ E'ͩƇf#IL/Ԗ rS}!ZO_I-~-Q]멟oUF7sѸ\>MLrtqd]VB$ Sߚiu%T.g+l{@,1z_\Ja≯YA[/E5hg,׊k=G۵lz+{_}_s"6 zAI.~zIJ)vG?KV=4%5RNl8i\DGkwtMbo5M:s>_UzOxt!oo)c'--7Ͽ2zwi{?C;I=fKYVm#֔[IsY×XPCz1.~9-lY\mWx}n]e5-I}T%1g06 [$X16؝X6ʉ.ҭ d'ѫ>@(H{=Y,p].^gŌ#E"O7Mw~5M^Z_ÉY`[4}bk( \3*LK1gOv9vpqv@نHn ֨8-EְS8IDYBe#de  <80_M0 r"2<=Qc-F.E"~|ns۷T 8>hSGYSȇtHWG+$m&{N|d=!@uW[C֛bw4ģd$_of73&.f6]oݻ7;d2S4w*a~Αw<>{_}wFze$ly?`~tOjH~Ɛ(7Ed"O,jDăTdFa|0wYs J8Cvpǘ5p @s" \iSU|B5|"CC 2l <8lj @tW0$ ?"NH1 `NHx FBLد~IBoj0BHx#R;ąBdj .B  !8Bp(P1Ŵ ){O O5$ay0:&TIQ@폠b^eb$;ؚ{LJLP'^oϚo{ivWq=)2b[7f.l gS#C7&ȭP/*H]([6EOx]>cb䣑ajqCl,&<=1r&ĸf`z-ԓ(g`KgI_fE}v=yq=ëDĈ ,V$'،-?IFyA{^l?c^{ERʛh Dfun"-/о զGc-q1Jdf|s +ą;?'vgF1+LޕF8cmy0ʜ%lܭ#N#NqaE9+KEO 3B"'t DY2>BCz$2{2s8m% 9(?"AFc(X8!X-#Wx8Gb"   ~f+CӫW\]ޡ2p?_iG`z~ ~ۗKrH{=jGX=4o4A6ٛ1sXk7B&y}MIy}-uNGep}#n$gF3&Nj(:c(ĸƜ-n*\kIRҰrw:RlR`Os$xcqS뉳ZtzѝzdQ Id=4W݊pzb8:+~UMIMhveDJ+$"iy'$wtIJ őUNMD';Ifco?ވVշV ǣs|\F2DB5N;~]giU M Qxiٟ:Ix$'2&u vE8s mݩl M_#ΔG` v,lviV'#7TbɹV:ʔ4q)A/8Td1S3uqjD:ș:^ԅ#uzS}$mۢB&)mS8G.jG찻-Pu9T{ԾTtt2ΖF'&gP'!ggOg$҉ԈwS* &L!i"AS+EL0&(+~ {%FKp!҂erU[-W[NCTh~ҷN+S/ҏi봃!zzueXmQKX-_\7&5ڭjd~Y{mmV:^7ns}qM5mkjV=^KC!YwlqSHN5$SW~:<(*C5V#Y8 re pN&F[Gu܇yzģgGխ ܚ;Dn囩I }=HwuJh!D  |GI sTNwSnj. *+Ɵ%1֍0ժV6ԙxvyK1(%ShzTp&oVd!nܘ QP цuMIK3dm3F,D#kgKX!̲ه,wE@fg"6A S[oZmd]m-γJ\20_17[Sit}}1mor5ڱ&=>q}^[‹, U!\ЙŁC&08S?T34u g*\J0rbLKIyqȠ/ :UCĽa̽a 8<E ^!_K#ZGtzDrȗ!Mn;^M=q"]d8-3=63`FcaF,xEѼfT铌l-EL 3v7%ܡ˝.w Q?jtQ}+4F[o;2PF6=Y[b I*R::pmMN*Y`529)[J[/8mѭ5TPqaȡV=`tտn=TT+ʲ!0U~spJ]"ݪ?b&cKrܣ5p!n4B\G#u4bFTÈ8:%p{q B[иh漈QE+*چ"$ځA*AC bJ'%1K%U%졭W?#GEGsJPEQ; qSI5 Kggj(|CTQT:!XKSʀXL {"Vf)ڹ)ƅX@Ll=hw3v5ꕥ啕fVOײ5zwL?_d "=?y^y~)enc~C U N;9+J~߸~~wXFgOīpS4Gr F,K _eG^AQWtntj7wtԝ^R28N`j7a;XRv``SͤjE)L0L0L0L0LX2O Fpd<,Oj-EAT]aܡZGz4=;`"`F,6XI5ZUN#N=GfU`U2QUK^ ZRѕJZ,RdFR"&(E6A8H$Hfse`e`e`5 >ɾ%`OV5*&Tӊ >'vd!=*O qB.$kU'yY'?c2>A~WGQG'V-"F'{9v;{F?b^}]!'}Eɿ7ȣ3Rq|oJ7Eޏ=;=y^Z;Of6/dأ/пѶi7hLkJۢ}$736]*h`I`u;~B?_SDE{}FbҞt|aɬ),]cMa]yXgw:wONU'F&i$wlo mO^O쀙h5T?W9dτ-<㼷y#Tnvљ?ki`&be=h4FmZ2CکʹnYľzZGu[{$7r[[u$<$Ea??ɽ 'Ki{_~`diõ|y=Z2˾^Ar.Ow!s7X w Ir$VAoE&j1a"~;ƚ8-|+U<3b5 'ֶ7l %&:nK#˵ }"p j[C)nkV\:dJ[g0ΐߤ7R~E ȾZI :,,,,,,LF} 1pQ$------QPq_`s`wِ!eCˆt 9;\H2<2!)N0Ԉ]Rŋ$f$+C@J%*ϒ!BD yWMX$ f̮7]o`s&WMq2]5$jHtՐ!UCDW ]5ljIۇ Ffyo96;1(˓X5_[Fg݁ZKUޑW@\/2*^|/ymo7۽CV7;ZϬX;ɺG{Yхs=zsJ}1=hX[llE}jb7`]`墝'F"ޜn!n71^?S {>X<ʎ$Ie{ODsq1\lea$/;Rؘо }пJɝokc}U*T5OyKfG]f#Ymgww?.F렛;:QS$ IW3qXS3~ bHWJ0S^!X;ġ92W*w!Pc:gПPwiTNMuʀ ^a M̆I IYGX:t ct g9,,'ԓņ d v(.TVсQ^/Na)1bH! 0"TiϛBP3Dr! C0jPd>EP<VS.B 5av}(&Ϳ߷W A;}+ {}rܗK,~RU6SO}ry kkG۝ |+*G׋v+{˺GYRQ]OMf'X 'sԬ3ְ2ͧ/]!d3^O[Fg>s{ lyf.%4jL{dV/;&f틫?_ 6Z7;ڛqc4>qGy 1g+\+%$gK[-CP.TM(RApgGU\V4sI̮W"Tb;$w22C4 sy *f@+u_YGE;R'I)B22-c~dI22/L8R3fȿ N׊8eiIk GFjk!""Ib;*B*TΤ,웫|zwkeJJyp檗9]L,zߪK}WgoRR7֍YkL%k_sH y;n$v5z1̘kbL4!6l(?W ϭTI9 'Qo++SIm9TˡCa+k--`)GϠ_ʉfӃc%hbMk<6C,#! Dm lW` bUI|?d-{[/ FUsq&?=Ŗstf?GB{4;__M njȕHkl_9VC"&kMA]A{bj&VC{0IȖgZ4I=xVb]*ɱP%FI)ŚZ(ᬑHONޔ;x5Jb̧\G?{2p4%%}|f{S|('Dǯd*_ߤHh_R_rsՇ֮y뵿iQhuUG'=pБ G 5׺E޷yZڔlc2dc+97+lɹg_2N9F[#Ƥ3U|hGJZۇkӯOI:C֏tJ9b).0q8)X"WFzoP1v UNt$>XP4yO.TuF!C>bt* ur<9 d9 lQCGr" S[m<_ʣ0M:Gyf 39%{*bΣ/w $c-qH__5UgX9G OjG?ɕ'`!I$&ф&,񅫀/\ |a)GB*Dp!\pB*U9rITLiFrAp: 7#f,l\(lHI=dQ# ~Bekzgh8)óL d8vͪ[ri՚)fesKfU\Z ]v 㬎 {z_Od?MJڜcʸiշ/p"d̏AϰDniPԕ&S7$KV!' 2Pd4@iP AJ:NJ0 3 e !NXT$ d@ډC.S$B7ū%oTQ NbjR&!G2'':ةq8 u8 `EE9EVx5`7dJgFdT4JWkT# _JfA yHhiHhZU!a&mI٫BOPd*V!= RΦ-k@ #snpB7XQ"P%:KƹX1Ce^®f'lzPco@.:z7؛E(K/ObyjxӅuo:ed=YYpB瘿pF2Pl ߄i/,Yf)S yb/7_J h1)䯏jr]&i&[%,O-,d0DH} IB2D&dNP*w,܉- LkdA˂L.KG1a$ 3H13z JuƄע(Y8T)߹ݛۜLOA*W P1ǦV )^z֯LXɼ̳J"b Ej"9%C".1ήAP%p*MC}J {-Ia0`~0L? a""L2 LrIPq I^dWr5t.AW*/|i%z2s>IF޲L4߶,uCO`/qheJ8k* cv%>17[sH &?B9h8(BjGHDtn|Ͽ" W*Hi@]|o41H=CO|\j<'p8KmHqBzC|2"=r;Rzᨉt5 7N "41bH 9۳n:䀽䀽䀽P/}Qj}aHIɇ%*&>Q0k#duaFMnZfz57KڠK ͫ"6 GjQF #[|kuXFO;K/dWl;sOW_"y{klc=zY;}7h|bMbBe֝/c|@ΓIі$vBR4|+"WĊ\|/[Ʋ$l372me<5{ޥ{KI |/Dŏy0mLof,1>2Om&["cу3(>eD~>+xւab6mtaX'cص,Ƭ2wVttɻsŚKT4 ?{oVFk^;l߼=K0vfhW xo_e{<7y6{0&0֕P;)nlMg1>RڵTE4YPu:* %uRR:en0MeBM(R}"|$ɂ1IѮ`]:iv Į!v Th0yԶ t+ȨV8%5zq8P"!0v >H8/ nq>& ق!U8PYI_~@ESkȲWU\P[SyևlYPОպ`"kTγ4K#&/7zA`C@l6kj_ŦeTM!5?Ara'~'<ǚ*mBTjeTS[LaQm{Q^Q7eM,.Oϼ=7}}%++E> 4oI n=&اp4%d>!HYn5Cdn|+ )^ ϞypY{#.MhG uM>4}j3K9(~Lm'9R@i*5Be;4 ED0v#Ʀ890pm'PKWXZ*4Ke至iiZYRHU>Q1P7n*hH' -ܶ0:Y4pᷥHֻd LTa|rz:O; (cqLtB '~Rjآ~ͥF]hh;ϳCiy糲g ͧo`_OGxX-C;dXM0זnS*V ׼Mp(2*f?Mlݫh< i;goV|³,(NzW&y~œ5cEDXz2 VT(bٹd6y'gH0+ҿצ+'"}Y-ٵ^3_EUɮWDgz\G 3 O2ޯ v*.2r\CgfF.9?du<|*j_F> O*Jiv.WѬ:xM1 DB&4}gl9-pxIX"8[F¨ NK^-$C$WVqeHu!.Xw-F#o[k#7a]`O;VFB[Fk Kt4$ f(^;26v 66o"+O||Hv$Sdyl=Em5-i80o}5PzĤKoTҟO;9 +kyEL8W3ˏM;JQ"ꋎO&[ȯ 2366ѯtt؝Gb G|а_=[s;>hcÏ#DBj]b(- [b+[ru$r_ہ^LQIeM:j#bpq>1WF7wH=N_% ѨE㴉 2zSGO JM*j{5a? nXޫJ2M@:ߏf/ 5h@ "W S>tmk[6胍b]T,' JY `DT>Uu$Mb###S14SJ*6腵b|JuF}ubT BlBTgTO204p_ Ml 0C:ySR'r,[F{ޟt<*jLؙ}ņ: ƅܰZV< h𢡊("ʉe"EUʮ5Ѥrg"/}35UiRY}n絃z8ՇW4c,"ZҌ t?{ !C{ˣ\&Sq.wvHOOd!l?p46|I"Qں a_@j%!|^ NHН]ٰwx ܛ¯Wxv>Cϖ&:dz/Rے-iU[ZAOA U,Xq!Hd:Ta<ưxtx,my_K%ev΢=A:GJ9w#l0jв=>sHH9K6dl@atLSh;ڌ~g'^f=y> 7c~-9L1hA[R@Ϛte^YE]4]Cl~?q3By]tFaRaYDߩZ8ؾKVTwS ngTB("n2ĵ[ek/RQ۵UsO%"SG%nq1V_d˞vnCކ6tlBڞyDn'$moӇa&/I &kv1Nxt޷W쫙s&_K5s{&(|[2|,`|$8Ⴛ"?Ot8?" ^]b `|k~w[~sbHu[ `3Fg {*uŞ_.DH専KbPAAAAAAƋAj (k # Y%B{Kd-U_^6v7i˚5/yHHec\c pN2Ͼ" A}kؽrF&ѽI>RA{;پ.vU6KxYWdEK: _>O&' uOjҭ{w*9BcS%uNwrJGFZC1a=X +T# $\.zj|dY8LpdvYXruc?osвRam˽M17D; B3Y͚kЭZTBU<瓿 D »0B{=I49Z02IڤaTNMT 0Tl>QC&s/ۡ".:m`#nZ ɵ1R10 T5IʁkC-W+CT|ުJ9nj=*2Vbce\DERLi!#0B֋e@e`_Z"ȣ1:v FhؑX%GŽŨر;FV$@,d4)TdA)X}6xD,>'3!@8|8QlXWX[bZ<8yjXQX;}=}'Ea|wE?eIB"&('|#?^T=<_qr ޏ'rևKVKi'$}βx 0_٬ ^ Y95cX(H?&If10CI]0>0s/͇RQ4J9-vjDeAttZ^>G1f+l 53t]a^QQ7ͦK#It)=G7Mͮ[ȳd f8wNQKN-M,5ٵٿ&xoo]GlȈg:煹f7v D71DT'b+z`+ڽ1v2\v'[H+|;{+=Q2d>ێd7=ۍ^܍lw+f6|Nj4 RWۑ^&蚒J]\[\cKޠs.g>^cy>?ww^SQӐ-u;~MdAXpoI&t nj]uڰmXClI*rI*NE>y{v7*Ҡl]m;bխ;L?o|eDn +eDcKkcTQˆj+,r4 A,bkPQ-*bUL@X[c% @`T: 4L~=4-+2DD<ՏAL Tf%! Tⱁxl`Z@ė=&s#.w\scBwlPh&|,xON 1&2زbPV:3a&<-TO/qЅ@ /*Wؾ0`2 2J2]p} &I|%.1t [Q!깃;JL <KK?/cKm|xhs%DЩ4>Jl)`i xtnjh6];z/t} 3b_Okpɯ`@ɗΗ<v bބOc7l;2 77;2혶][xhi1k`$[φ|s1sw^{e̙` sō=+/yc/Gn#J G8~thdqi<*(qxm={stlұuGr?|] Yj~j3vK] rVr`W} {n*z8<\:ѝDҷϙOunf/y-yQM^M,awd' Iue~u相v 7Ad#H|ʟwW} ]kt|إXn ÄU] jᶶ[)G"FT';t,9Pgw߄,QEؤ+GIm?['{DI';hvue#G*:#%H$4hDD 2$HtNl(Kvam]]{ _h=}=e (GzY=]-ݦr5b 2"u Zz|!PŸ́79nsܤUdcPYnPXmF? %( Q^}<#50z QLD 2FIQc"Dyb"ʋ(+&b"8Raw!vV1H;.}1fKP:|YuˀFG af,,d䜂s},do_M70ʌ`c_^z6Q%iqGy<&Vse-B?Uw <*;īC+Ή"Eċx_PoMoW Suw݂V;MW6t3ԥ%qmµA+KCP RBOv@;at0ɓ`cKchvuc\~(}0 p<>^= g} W.{.2|V,{֥O8Њ} (3^78|2ԚީD{ž{Hѩd9y^i<+$⬒殷\.wf꾅wؑibKȴT!7׵ǃ5qY^u诌v%dDBuTUe1e=XĢ`#Ul@\YsIbSSա" PJBDJB+ $'Iq%H&bT #ޕzW]Iw%ޕ:WIG&ĚJR1\ƄØ, ڗh'V"k[e[aae iIX5 뉻UO"h۵,ʦ-k'YtxU7IA[qԲ8jY,ZG-αnG;II#V=eyPA;݃vu-n33:  `3p;H}ke>taɪ.3K2 k ,J_ U@r TVX _X 9{Xtc@786 tc ͎{nq^a}nulzہ>xvC@ta;΃oBr|ķ%v R]|n%!XBw8Ȁc̖F7"LҏknaXkOe,E F󌹄LE,%h!Rޕ7!d R2!eBp `A ` T}"O@o}0)G2(W %:|XcNP8)*# P~J&֤Åm.!.%.!.%.'XO77n\{sF[]ֽm@híG}6qkb{S OV[2cg1l;=syŒ'ao%38r OB:ьq7~X_ MW֖/ 5^㹛'p8p [*Br22˽۝pGGx'4S=TT66b٧k? ncnK%&<0ar;^I[a5#w"T ?+5ǰjTQuRGlF-JցbW{칂zOW G{#Uy"keDL&!A4%$`xd 6m<{gY𘺅-|Br|,16V[먵5ۚI,ܛ=K餄"\֗H$I<|UdSuŪo `Uo)'jcEeYюaV'u%ɺD?geQwU5 x_c#%A}x56ޒV )%ҪTY #cvEMoij#Y?K05L\ɄQ_UȾ/P=}+`F8Wjc`\6R`%d¾ 3}&wت'#2q'#2q'#F+8eބX#q-gPEF1fNS'j$=8 =w0cc 8+%Sa4 : ρ̅TrkVՕn(ꇵJ^υc,RtwIW)WP.$ߢN(, <Hwc\SΚa$?=$[Ze.m6J* eQ*SɈ4g"B[o &]1A\JJ"u ԓ$RO%={癁}U1SEeRbAC0~$#`AQrwocY9>UCn}~_i^iS@҉L$)^$1U^S8EzJGv ^BsugpyMD}RU_3GZ̢U 1Pʃ}{t*Wjɥ;KO‘5n >kv>y.^/Cf0yR'O*j9bo *=!ȅ(7_=(1%0\vbVSUGm'4{}st5WE}єo \}lVպXljF!uܪʒp*!2 lǢ ח}G4;*#?kp.Ʋ;} ~kg-oɥZ`n y֟ڐ~m0h5\ N6sc ;voHb?y?йt}'0?4cH/zƿ"$^`7^`=@փH |f/^#QT#+]Ke>5?/&"]pU)>;Z^#Bn.x~ς%//Y{af8Ѭ E3VZ?-:jVJwCu+"Q4…UV@ek! P%xٳ c; ]XkrKw΃86I2 8' jFtƪs~C ieh`4a`o GFuV@4d;EGo4ezQGo4jzQFoѵ.,m&>㻂3LۉllQiD9L|8'gZ_}T?jRe 9mi"Y3q1E68~CYBGXeX]"l%9^: vÞW,к׳)0?;-iZT7;=M' @߁=OOџ'><^M)7cEZdp1F8~DL~'R< >^[1k,E'c6dHR^WPވ`/[Ż∘GH}rֆ4-BS:'6~7Og;yC* i16YF#CgWhXc,dpUwJvqn}(֏Pi!b)!*i0PvZ تUN2PUЦH*C jGZ *Q@D  4Pc .GŠS#%b 1b!{WU$Œ|_;v |g|?x^OGE1g{:t0Ay̐Z鸜5Te#.duąQ.J`w`ȩ\Ӱ[cbڃ&됛@ &.WYXM0 %U:oh!Z*l)CbT ?ٮ_|x׾oM5U8Fak3X::=Mӫ|*]{3[Ӻf)h[t<¸7׼n5<8kIߓwߝ~wSyO=yZ ;g[{$I(ޓPaeĦo-񿶴ݷ|𾵶߷oo};SԥuiM2Ke2c>ݼ_I^!?齌cz:MߤR'dAPnAސ!-H*MzC &Ka &FPQҜEttmE;r&u|ȩZn9OM8Yt˓Nw9}@WɧÎ~j]p+˗\ѯY>|qKוo.|mkOSSO~ZQ^Qd'͓'cOP]QwxR|A]x]:9mfdggig?hV(UDb|a=T##cĂX9 5AY/#+Uv0 `pF2Eg0r% ׄPiˆ8\B3 3 (TPB:I5:8q(NPC2NEv ^4늬Ϊt[CݒU{*V]yFE{\O֝F 9Ex0YwtyT΂Z_;*ݤ;-!NMxI,D(lQ߻k~zY `-"d-gHR(|?eY XꗟXq5AU׶@"q7y(y(~8*< S(Jl2/6M", [w^{~/sԵb@hЋz|:['qܠw<Ɂ"-DhnV8k TzJ,eUR_HrTSƂU|+\7e0jc\zo-wP76Y*}=;][,atyX\diF!k ]8S 3PKK_V⬌/@&/lo뚾Coּ]Yb=ؾ}ot<Ɵȧ;>>-abR ;0 &#¬h0IնyfE|.VЃPstge|ٟTDTEDzqUS+8׫3_?_VJuƪdU7NŗatY5+FIG$F,(d)am9eVawމ/eE_m{opKKŗW \:14gYg2meY@[ u ^5 [;lkcЗ%r7k?k/jr0CVsz!a~77LRdw}DYk{i#RN?W^_ EGEʻ| |D<-y?-q'oi"DuoxW/vCΪVgaQYo8Z?mg ݯiփY XjGJofإo-\Ȝ'158i^1-QXiϕ7(Os0>Ppv­C:郮YGffmN4}exKo7Z>]1jh_a^-4j< WCD]H3ܶ5(=k>KUkƣQ▖mm{˕UΚ1 {6aR:+cG`i_}.6 5Ae"]ŷ| bUseH |Jh.. ֳS,e~Eof)?tN->4|wys`\g 2gl¼#ݏ=J-\[{r?N#Fmmޫ_?֧mZ=q-DߤjZ'֘ gSFϲ=7Yg*6lrb)nU/1JqQC/Vwƅ?ӳFݯqKZ1;b6PJ`5cX;+tJA|JA?5_e(_e,Z8UYm RD!~+²ŘXB%]Xх%]X-:60JA?9X{T`a 3`Ո5,hYc)?kLƉ舿Y&`hx7Ɠ1Sqla4kMgeշiu"F;|ӑoa櫾39KM8fw#s_vǺ/^^(kȱakXtIZ}߮?:.9X5ծh+րK X8l;UKSJ/{d5ћMݮZ΍g@FF ҌS77/̋杦]%Fw6[ˁ_r>s1ha4^q,2QC9> Z!l+vaap~*]f"ID Yk,`F]@O"R,l:|*{`օbX5Yl$PŒY 1H4z' CA fÙt`&sӢE>3W?)~, blD|.|[^-c9;%A"ϳ| *_ 8$ÿD,w/mA'ڂARFl?N t/0:^q8+%Z@ ! dSU:i_K2{2$5m6`AE[m-[l67Z^U>vx.C-Òe3\zU233p6=Q}Bafa,D,,,*wP\\E]3u\\zť\^>IfnlعF1㹈۹๘e@eF:O&E^JBB,D,Lς4`oŜĺb.$e,?s0|*s1|!֋uh t PY~7,OrҭtϽOq7F50 1w{o:wa="Gֱ:`7:6affoFǽqc>62}+oہnxFob{ͷR[a9B ?6ݝJڽ0l&Sɻ $BSO7ÿc^Ȗ[Z#d!'F3|Xb|ռFh|Iw!Z = ̡}%w.4.Z u5<`dϳ|ޓWl7դ3-ed5}f$|a10C`Iҿ&j=KbCk`QҋN5szZ}auMr9~v4ԦkI{^PѣJlئF`Ѡ]q|y<,*4.i_[jX~*^TZ݌;fUUtm<=T?/5#%E\i%G{=RRc]'ۊ<2;E6K  X;1LU|.P~"9ZYk%rTg5"Pba"P/B`oUb q{Qb q|kmD!z79m6+"[6.qRY-:R{|qI+J,yRAz!R0_tVWm,"ﳇyMx~ǡx]EMr+gYx{[x7x:-v]aG2KxvgꖼU%kΫ[g9˭5$3uLAAZV,~kAuiMHc8pW6e"VP3_V,,mf3-~[;F}m>^^d#;օP5hOx=M_ɞuBف\aǞ&mHUd}~7oo0 -.=3-jm=̓{ s^}<|{ ޳#|c%rSȱ? KO,C߉S1Vջ4VjhK.\3,ECsK^R砗:9L CG}be5a(֤>SC*P9z; '9~dڐl"A;Rl!aֳ$}1=Ym~ gcT= 7Sͻjʣڏѱ4؞Ginb٫yOG4GJ{h5Oz~ɛ6G2EՅGho xݓY#FGHxLqdr2%PHX$E<#TtO9!?S#*G:> AT8Qq8QQbBO4U=zb9"O^է:Oc ;r΋e:awqXiV9~VopEn̍s܆qhU8iCSzFMT؎/AׁE{a4.SBdc8I1vQ[#30jLJkzoSO`E{S'Bv|Ʒ$ >ouQ+ opYX_W;H x쁣زeʆieL~\Vw%9^ o7_D8D.[>Dx pn|^YdsvtTg2XBKA9ZeV>I&VVI&V+0 7_[?/I4 y#z^ڦB[1%HRpc$#!4+\^qRPk|͂Lm*8˰^k2Q+\Y}Mk`r4^;v$"HDڑ#iG%ގBx; v(QqGaT(3 8]Bߗ_QB_FM!M u'A5,p8jdMgyZ{jk3pzkO\,88{QFIzvx!x2"ɧA(D'd5ȃgi*ה[b "Kdo1g/سF.1*Uf5E $F14-c&1#y+U~rzt=`:*qH/2&ˌA,MgmXc68ZϪFFb {,Iv4|ގvԭoQ]뢝G묒=ڽzouOud>nD̫qAy=Mpߪ]C 2bX`fX=0H"a$7X=}5 "SVI Unk617'"%bD93>_hZb{D.+Kms"WU⇢_}U2/jOD%h"b4q R`:aztr?}?!lC;| BjGlwowBzd~mS㼜?N#Mx^C; }#EO+6}!:!Ľh.ڈxׇeI2 s2 ֌m`^:;Ncm#4~Cډw0g鋵_ݛcahXDX5 m4D4NC0 4 q5 4D4Ca,D}6$fVZa6j٨fVZa6ehss2@; x@cj{436wFfŝ2l= ؏: ~dX:`(5chwxXٯi6P:F4Mêi3 b9}vL4M.Mie4 D/nfh99@G~PMy4vSw}v}6fce1n6/gcl6@hYñF;k8m7plx!د W݉Z) jJiX3& k)Ȩ cᡖ4 hVQlѥbqmql[8sQlz'% m'~"a N/YK%yW@zE+u,x*ME8[ +.|o =\Osœ5S2wg]P&1R⬫0Ϛ'0tbo-S\ƿ8(l4eV$sH Gpd#C_`[S4ҩF:v/(`ha]:F7l/l.L--0Qd/ot]ػGS<;Iq8TC,@2NFƹ\`Q`0f,Hp(.asd!mµZfi:k7*i̛D2yO}*NY [n,%gAy `6$mK,n/R΂N ׹sx8̆8qǍþe"b`3vs+;f Y:g&/KhK$f)gOԵ[ W(mȞOAJ2iEgl5u  ?'wj%tO ?Wj_D/CWMo.CB;- ڎk8#`gh3蜙K4ܡKN)/(\ #5~ݟ/B?Uџӆie{վWT JRnq/8a()(SYkZn^|Q6s9NɸAi.wsFK;N^Z&fMrF^77#*k#Xrv жXW+;l[Mm ͝5* .ul5l2vA~t; Bs41Dd΀+4=W=[uTUQH P7<nE1ti/S\7u+0j8:K:7;QgT[jjuHԙHZȮ~cw2~ּ?6f|czd=KL1k3'zl?Z[PZZ^GBko{M㜏L}Sz\.*,eJo[>H#hj L2%ـɈQL$_/ɨ U?޲~~yCx?ā'Lzd`M2&X IF`2|^}%c5{+0V@e9@NԸU<|g|ǂ+wZY2+{3|2gkgͳgѽtZ)Va}sFяnbB3OxoZK1寳l2Aq̧|?I|&KټlUګcnҚ*JG'uc;B0x0f#c>?cd])l罉ȧ zK,qޥ8CrkZSX8# nw:rt~iN zņPEN$Z,` `3cw8M[E&Sc ?BmT=Rģ}r"E6f$̨I2]1MPE} @h$Ƣy:DnE\]^傽e瘎Ղm|zsz\o:v ٞH?]-}Wq -BozJ}eKv 5vML`M&&X ,%rQ-} e/@x®t{d.* x* Daӑ:"'9U@29E\G&r(m[x‰w+.L'CG^lg-z$!Y+vPMj Rj4443,抩| TQjպAb,70l7.[v~uV7TLz],vTgo_ c^Y_=Tn\'|abcș3l-e,%>+,>!^Y>}֘M b>FiOSQQĩwe;Tq'mPx݇#JdnTj{z^q;D Wy_Ӊk[DH,<; Za_Q6D6h{!Bd^HCVY5茚X - V]4vTFaª/ ^V}Qܢ'igGb ԌjF~X)P3+H^"Ƌ-u^$:aہAR^"K.}ۗŠ/M! VJznu}oPA bO`bOzʺ0.EHYOf== )GLdbd6")p2$X&bݗ`"VX&b`"Vؓӿ2 urIChBq"X1؇GHIñ)IƊ^!3QW=4YS^މ؈qA7!5kGԽ>]]l*P!ޡMz>^ŮfN"UACN}:^G(b 3 CM0ae2r0XtT15o {G99@α@q@ΛK'KE6^L= AǎAS";Gwu;~C]p".OJ/sD#u7fOg7yyHdur`y`w`CaYbtPSXHM'OA:rEi3N|VN0%Sb@}-J_hg6utӽ/@_t~zz-h7ƙWC߱csda Εp9"##ţ%[?iu%  ƅ@Bخ] QM,\S阇hr Qԥ*EA$" { rXD:|'lM)YdCD.js>tGЗr^3BSGךLN?k8byy^UP7|'aAʷyTo9߽~a,Ϟ5˯g uo"#RjL9+:COV]yV׿vm5 ;'h2v-[N2$f -6YJJ֕99Ǝ5KZ~LS{nRN9gK? GUZ+k̡?ae)^TaXυ1bBNnmh3>c[7m#-}ǃwZˬ[ɖfZ Po40 g}Z+xs:}. R n+i-<;lǷm7fue5efl4bk5t,XЎ!UMVoQ\,bE r 7@Dr#Y񵑬bhYߔ Q#̢R4⵨smz"Pǥ[Y%9"° b!3L6۶A7ܝ>Yma$"/' KAXa)$BH !Al N@o.lwtGNwwGNZ' 8: esHCQۈ, 6۠;l 6۠;l 6HAR"aF6$x:&).9[c]+ְZvH ٚ`?$~H!C VM U_Wk(7L#-0;'&~/' @`yP"+{~Jw>jI{r>])8w=b:_0TK{K(x9^^r+¾(jgmX"Z"W Z-zWW#+.@ec˒ 8ƲUn(Ɩ"9Fj5R+6Hj5{6Q X%51;ZwEfvCETuhBMDԶ9ѫTM*#KZBⵄ¦PfNtm.UTeh0еDWuto|rū`Q-Z]7Qa-U Zl3hhs03RrGC#Q/GNDA[H;r '})@)%)@xbopk. o><^*^*^aet{E45Kx+SA ĂA:1]t  Ģz5Pe?K9/{z'l*Ə;1|<;v|t#6ex2kۓq{0cQ]}aZ]%MLR׸u3JD z6אbsgYz#.Y''v .OWyyvhK{?.ޣ A$ˣŕ\JJ.e-`ъO)b7E`p4pk85+plM:ֺ^}Xm<&TfhGR zhKJJ%8V"{(1$E6Qv(v.[UGPwD͞h腝^=WOvZ3edYeJ>%Yz)0?,fhbHv MG1j}7?9vͮt}=tw{ ιC*SO(ST\%Yң CgednH>4%Qu*⯦i h&Ujޣ>CR023 d}mvfͦLcSFq0Iv5' 9R0~ _s d; Xovȴ!F"bx\)cVXva-?Eb,ڰg|@՟5 ,d ,^|:NVkkVz:mYY*f\Mt[3>V3i~9|L2˘'7 B+ޡϣH`ss7빇fޕ{PZ{R#=u8%W3sCU|qWnc(2Al+kk:=kv1b}iǔ9jQ_W3@o̍N#գ/ԣT k%ּ;{v=PT4a G5ckkaÅuepDGDJ̱wrV `e:S]+Xw e@"ѣ҉AvI',fkH,Vbѵ}dŽ:cP,+arb+0Ēk0;%]D@Dv&t$J)5L;z fVHI$b1 Q=ʍQT֚%,!|ۻMG 3Lt`3F ^_Xk}a}eDݏFC0IH+`7R*' Lrb9DB>kHiiP)Y?Ɗ|Zy{zҽD-3ZG1Y-WmigV{|Õ!zo0{8‹);JsNuI{P18ct0Y:£m#$ =?7B6&j |Ǭ*>j&id40 ^j gޛ{)TgkNe^v;骪ic.mjRQʫjQDWd^[ү*׮gԎ!qLӞ S*pGǸs<ihvY]iu_-g֑uiڱ_<{ي4=f|k>>`!oEgWމ7k3؏mk=b,L>bWeY]V7_0zgkC elFH1j(m^TohYjRNSOUءLkVĜ9st˩N99k+UtPL+^gIzJZ^v[E4n8W؃v_(]S SSIé$k5$Y"&Tׄ]a6+Hrj5A&]Bg5 <\\dvVkO7!nfXK7CfXO7va3Yϯ3p5Έ(&kl^AKH0$_vɗ̣s@FW(qr qG?7c%J`Y{"ɨS?FO?gS;#;Fw*\:G|b- i=q"c=`.z"ZwI;+ҝ\T_I@6&1<c|r21'Ǩ989Zg۫ fjuzڱ~*^/c[ɦ?fﰷȾ9[b9;orU՝cH41:\瘿0L+f흉(; ^iN9 shdsbYnnYfY nnsA[[[۬ۈ> 71cr''pLL3BrL_ch__><ªc-}/JZlMX$FBEG9eT1PǂPGKg]W9W0D{pX]y=\™X,e 0葙${b"d)dɥ. 0Y:d}`&'x&D9|ri>uu:n[ZwYXV7+JZìIZ@k}+sc-XtVK+EVWF5o`z2',fv(0 S'_M>>UI*r_._ +yY3>\5y`[Vjh1,`1SWWWYb*:Vïw\kX亓Et,rE"t,B&|k\q>zŮt,rm6ҽ"tȵ]"tok [zE豇hd3!09ɟ%PH@+sϯߎx%fiU V55֯V9:i:{%^׍^>p+<'ΗeB9]v ]$7:^߿ ^5Ssqvq[QLx$ggg%g{%bk!V ߵ] ߵUi*BV AGQf!DM`߻uѽ$Mq&,xw#Mt@\:nn>Lr|ĵVף$|$s$8ɝ'H]tzn{踇OHK1%H+s:qz\æqu(`1syFGT7Riq^VW3Xn35)6LvɌc~m4)h0w9U5wYGh1s99W5EN%~E}=g5A9NJ'Y*O/=,8~ SI5y#$sQcn>|>$)|>jͧ$Et>u$OhGcXLMA0Ļ[Hno~1zDmtDv:n"^Ng>FI;I>AOMI LS4 Pwqr: ^ $_/^ݏe>o33o#ƣ"OM}p1ƛߵxҢ,ړ7{&;=֍:f6wg=9?#-noEX#<;Eww4ZU}X}]=O= I]#wc[_/[=ޮ}JvP릟ܑ\̎4um6_5gF^1כSLL1= fzHյ[ߩ xc lΚ5m6e]d!i2:[['Vml|=8.ѻyZW:*\uПЖOhՁ82s\}CV'!d/|r_M&F6UzzLVUeFtx:rgRJeeצs;>l9zx\63k8}ץ4[ gVͼ#+2;7?5VfSS׼18I5IݪS2S} <==س3;78lӷ~ˬFA`wg Y݂g<*9R/*`]A j> V>@NQF34uE<UYĵ"ͬ%V纈kkm#2IE,ۘ`[Zs۫}E]d\:ЅCk{_bO] ޲sbNi'ĞOBE!ȶH/"E6Cc@D ٖ:- lKlKlK ٖ9ȶ#rqn9\99\9`$)x3Fc`M'vvtF{f{0g{b7gHڬȼ Gf8j|ZĜ"Cm2IN8`N?V~p~4jIr6}"FlGRX)REX)R`:od]~<ے`ۖMo'Nǖě?Q{-H v{x")VCC8M/ v $>N1v~_wDe=|Unv9sKce&ֆm4w?z?k_kFf$Mg-Y[ֳ!YOV=O(!W# $ܧ~ϓ1v%xwIUq%>Gꍆao_µXmҿk eb(VV^k<`f3x3`6-]YOt&3{Otf鐷nvǷOKvϞ3 k-uɾgUk;us76~'˝ur'CߞgƟ>w*|'x9L717^++YlwʓϜЌv}!sckвM}rx%wg[Uُ99TͶcF*?}Z??tߜZqwҩ _I 5j;JJ?.Uz`'$(sqv dWh9k *SR*4/pM\ T/JR ʜ2VtW̏m,Jn )rZamdX-2*2Nfuch֍*cXde[-5YP ;LDĺ'V=e%^T:vl2?֕)H>WK#;w6 jijv4Z:8M#?-iX+ƣ@<ֈxŃsx𜨤ILKEfZ*b:#5`*X-YjX R,@߱$Z0LM 0c]I::c=e*W91tptM:&)YMxyMDeҧk%)+ J{R^`TV*x+U@2ʤ0dIOxS<)~kʬo\Nσ/fw[{5|Goxe\z.d<>3d@Wqb<+H*ieSwUrB-s2RA^ $xQ2źf;9X*'31T}B=-BeujQ"r+HZYHBN]RYRm׫BhTuቬG\ T[z 5b5TB]TO"" B6G*.4XCՅ**@|, ,Ds`?T͉x/Iu?u?D#0]Mk"s(e'*w+N{:]GE<_1u/&5|ܥPi,pҙ@| aGagagŮx w" oBO;![%5W+-GJQGXG(e)TƝFey#:u8D3ҿKNh/!ݻntב:m9T5M`MǁsY"ʚd2p¾O$)")o Awۃ@vNP񏤊D7nJoeJR[QAHH+ i=3BOhsԜaNR6ѳZX#Kj1-/HQ;\+"o kܽ8FW8u}?)TT~&wb{}5;Ӷ2}IH]s~z璴WDf:Q)q^i,c/*ǔL '<_&VSSjvXkSyMV$cәq܈UX{+ĻUss*|g5r>nr9VUc>Zj=H{:n>XgEdl>fYL m*GYncaϰ}l [͞e1xhlxsy5sjjyffl5}[G{kCy׼yfyy=k<_o!>.@;c{'IXz{.mjTVAPa ߗ2D3s;Pć' *MxM2Z24.o߈3+!4N8U+8! /Zl%mL(`y8A;3L.2脠hA$ZWG[&t.&xWs/hEJ4VKI6G(퀧Q$ۡQlgFFQE|ph%±u1։&FhhFG[QIޗHR/MMG@D a"0H$L&½D a"[@2eI8xB`"2rcǦQ8FXqA2pn *{/@jZ\"fQpukG!0qG5 QpxaUW^p{UW^p{UW^p{U$158@W0E7'S5AN%)%S$ЫWf}Bvgg&6gϘߓ7jξ!g{dݐx0YBɞ3JeZ XbժlC~_MS_??Tdc~G|56U֞u$p;ۜʒQsla1jsuZZL~XO1O?X[9mWy϶Xm)l̶v/h/o۽ͦncq(c5;󤹐mg_,ޞ^f+OfVIm_T57ߡkUz@{:Y"I]/]ov K(Yw+Yv;gzÊ?d2seQebU vG4XNr-ʒ<$B9D9z^Q"=M, QU[k*` ryC`$x^V6@h:"bt :07iz MHrNm L!{ 78M|#@a)G8z0FlyجZnx]*Ũ]+G}@-ySs1UHߎUdɂH+)l4`}ʳv5G~QZcb)2BܣTOiFi>C,fVc/1{,F_t"}2-2mMPyѬj+T{kIj5Ey~ȮϪfhWgN~gv,Pn${^r;Ӈ@W RE@EҤL=TbizU>^QCdH /6/;lgUæwx4lh`y4SեG#G#tH2"ӈ&IR87Gو F4VXDï G!:_RpZBGB&"!vwK!N+J'Ǔ`'OO؉tL$ Hr ,~@DXa'O+? 6~l$&!( Gv $l_'a; IN&v,ӱ$ o6 6&F4ăC6zĶu Áǒ)GH9Gى|GQ>P,JTp cL hApczxBЫ ,*6}PA"*TDs"~A#AY1rxGDX 60CvpZ>rrc〜79N k8``*`@PDPKNLaӃ4W";GuûyPN̗11Rx$rp9#翉> JgRH> _],-Ft@ֱh9h9@ 4 q@вЉ9%bJs^{oC'8xTz-h|D+zou4wwi]~rDqʑ2nJ_X`@Bq!иh\۵k!B̓'7ueXSue1!@|&x~+K|g['=+) uxZYj:nYjKseWkW< 3sK6q=>a\0?q ,e͉K`yWI=;9vr(0ZZE hH q$#HODH$FbdDr$JF"v݆װ #NmifhB_I:mmhV،YnhK BB]&Pl H{v^_YV~7 ) l%_풸C\P;3sW` fΙV]PZ393 ,oo"xuc~*YM Gk$Y| _ۈ)EO92J3<,* &{:{*CV=Iw~}>cu?YA˴#k._nfN2kS-lMH%EwP2N=5aPg*{5zTxҸ՘a~dLey)ޙ/Ob~lى7<`l#ͶO&LnPIKKM8RSim'ڃӻ\sh@ֆ/ 1>r>XvwʫV?k6I;iťL+jo#lM_"۴ CO3.H:> ~؍aeD)DB$dTT3" #GU>*[\uZR"ˡ:0BXm%dyф؀d=q^5jAf slh$ElWC44 !Tf2#B=ӫ;avngW#K`E7$Rډ͂*J⹂\=ՃF1$EC 'HH bdd"+XV; \Y-?|$E$W#+tB%ٵvaeѻhXk'EF䡄Rմ+xiG~i?m?21OF]ara񳞬>:JVPQ+kJ ߧLTBN &a{9גW;>V䷲hX殟mwQ6(=1kieCMBʴ ֥UgGV!YWE\cXcL-";ŷ};a .lgmVQz]5" *7)Ɉkv22@DHrM\76 v$zɌW,,(' 'tVaXKmh46666r6$1i폘[MG貇@lĮf˖^WXZXbU 2Xt`Ӂul;;8dqN%z7I'&q!mµZfi:k7*@ӄlTɳxKVܵcWTaǞ\g8u㘻 {щcBB 8$ı]}ܤTH}Z Ϭ6o{Mc~#Xy cўΟb\;(Gbbs: 58İ%?*/y%MaA ӶƲaY0`YĊԎ @/?k`rWKYz4p jwz=x^:T +zYZBZ@۩f)5Mwm<+/59ۇFs3+ˎO{͏-&*ǞF}H3g[?_;X(H;bνUsv9P7zR[PSa`BY}{YWV>cY)؊ PV*`U`*X PU`pp!I;g|& g"ތI$oƎ⦲B"GDLFtdNdDLFtdiNdNƾdNd쿊ɈY,E 뺀F\ ] &6oTs7}mǻNxO1Sʙ\6qܸӞ1|g|'z1j^rXil`8aaYu>'./#}_/~uZOPM1 XbL76+cJWլFƽA>o2e1Zk<rku5ҭff62M׿|^k8/΋'~]'\#g/./F #F~5漣oI>(0Z[ tF#:aOt:B^0:N˩!8(ۂU.$I;a3y&$ߥ?kDK߽IʸQN] .]Uy|B׫ٺ޻nn:]Ê-_\>hsG@CQ"v##P `Oqg$&B$/RZ5uS ;1-`ZiPSb]k, o6h2fWo}f 5S2g3YqYmUxEc[Fi ˻18b7-lvFV{d4hg=2;li"'8b|`|!uI/|jpxd a[Cj8ab[&`&jK]]+u팀z&DVT1laNaY36Ǘ4'me3s KYGX+)P5՚A,ʚ3,'"35)ZnNL_흾,cQ[_dL4׆d}{${wW}\lf_*^|ՕʗDVT}-ɠcVg{}>w&[c=_#~ Hw|&u7ߍߍsjv+r%4?eo:WY63(S^zX/z+x2ߥ䷼;\{ӻ]*O]s>ܻ;SߪgU*[e?W3~pmw>q'=4Sl)Kpe "bw CP`,tTF1٨UN@XC5:tn:udUQk|A Ќ{&r!4zMD ,3E[].&{3YF32]б+IgIvCxU,1v(e%/vH$ fc< ' L/W5I31@@0B ).CQLv(c ŖPP^JB-os8_-b'plyqhd/޽{"ʋ*/.^]H fIk"H\Xi Gͮ[f;-pô.vˆARrI$g!~:: wp̆f60$# `%%Z Yg8cs^! y9/@0|k ]5tAk/;brkq݋h=Hn@t\ﺟ]޵;Bq!:nq=L-GŵI6ӸFGInsm'1];H>Irq;]O|ܵ^ŵ.ד$w|=$r=Mrb,r9Җk=\/#ϓ|/5i,{F/::D%Qa$^qut|5=&ɗU'uo%n3ĹcYlH0!!!n?$! Blgͼ"ꀠ)" @QQQQ@ V9R{i9\5_Ҩ)2>00/5Χp?@a7ɊYQ`1H)tK3-㇌"bߥ3٥O :N?zu {*t}h~pYpXc0%1=KDh˖^v_Rÿ_ocL`)W [s:Xq7;&WE3'@j{msY B|=+ h!g1?1?i'qz? ,#7#ڧ/~SgGd*T8XZܪ؁ V}%zV؅’1.Y)زu`RG 0e?۫g{L[`:LԉIqODyDd2-2rߪJ/%?=0'fʀ] l.0'(W % .X̙?c0SER.}Ur^6Wr_!zK<ɅWc^dOD[O%J(Q '}?Z\U{:hAƙSZT_GK~]f>2M`L61m*Z} HՀ17Ij933 [u Op'\ .nĸt 4tLA`*9m kHd 5h@c i:Ա4-22ܹ䪹s7_LܦMDX/РUjvxl-y@'o̡tykWLt_~l}?jyXfZ:е{U[#F:iOzQ۟hOʾ}c2moG$?Ģ "N"nOnK$ne&&!a]08 jlRIFb6#yJG (ģ^js%c>(r9cU܎3NuLj`=kkt-Ml+\2+`y t`4fZ(]u=.@O>2KH'_%KzOD-xDѠZQjabBHVIiA-^p#]7JuƳF^7qBZ, sVC}5T]np75.eIMd8& y 7.9d4ej:m"M6{k7{b^`@&̲m3M_vy4W$IK}l6ǖ}E3X6k#ڝRmԢ`X4VkK#&juy v6c`x>FV6fY n1Pm;Omy۵wmIط d`n,d`"K{~ q'=X$# LuV'Vi8o;l/#8sN`g`d0Fžݾ{ݐL*̉u65(VJrQ6`<ı?щc8f̷᤟= d=^?9s <) (q, q, YAN4(9Zc_ Ӭg;7!Cg[ekPK!mYϴfvfont.npyPK6fvedo-2025.5.3/vedo/fonts/SmartCouric.ttf000066400000000000000000002775541474667405700200150ustar00rootroot00000000000000pOS/2tyXx`VDMX`gzcmapQ cvt r$fpgmS1sgasp\glyf4#thead\6hhea; 4$hmtx2ZlocaD(v"^($$< X<,Kq>Fo99"2  s_L 92<n0 .<2uCPxHXF 2<HxXF PPxHFXXFP P Hx xMF X2   vvvvPPPPPPPbbbbPsPPPPPFFFXXXPPPzzzFFFFFF<<MCMMMxxxuuuHHHHHH22(99d dR ('     !"#$ %!&"'#($)$*%+&,'-(.)/*0+1+2,3-4.5/60718293:3;4<5=6>7?8@9A:B:C;D<E=F>G?H@IAJAKBLCMDNEOFPGQHRHSITJUKVLWMXNYOZO[P\Q]R^S_T`UaVbVcWdXeYfZg[h\i]j^k^l_m`naobpcqdresetfugvhwixjykzl{l|m}n~opqrsstuvwxyzz{|}~& yzx  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~dT@ #jksy~7H~7    " & 0 : D t !""""+"H"`"e $kltz9L7    & 0 9 D t !""""+"H"`"d1[K?FH4 (PTRZ`nz|yzxSTUVy`aqbjgt}zf_nidu~xl\mev]w*)+,./-015246387:9<;@>=?fgABC ED F G I HLJKMONPRQVUT \YW[XZ"^%a'c(dS$`!]#_&b^crdT@ #jksy~7H~7    " & 0 : D t !""""+"H"`"e $kltz9L7    & 0 9 D t !""""+"H"`"d1[K?FH4 (PTRZ`nz|yzxSTUVy`aqbjgt}zf_nidu~xl\mev]w*)+,./-015246387:9<;@>=?fgABC ED F G I HLJKMONPRQVUT \YW[XZ"^%a'c(dS$`!]#_&b^cr,KPXYD_^-, EiD`-,*!-, F%FRX#Y Id F had%F hadRX#eY/ SXi TX!@Yi TX!@eYY:-, F%FRX#Y F jad%F jadRX#Y/-,K &PXQXD@DY!! EPXD!YY-, EiD` E}iD`-,*-,K &SX@Y &SX#!#Y &SX#!#Y &SX#!#Y &SX#!@#Y &SX%EPX#!#!%E#!#!Y!YD- ,KSXED!!Y-+++L@5&+' +" +S@5&+^M5&+M@5&+" ++ E}iD ss*xR'Rw  R\f`2++IC+V+A]Af`v````````` ]A``qA%`5`q`и/2и/)и7и>иSA*V:VqAiVyVVVVVVVVV ]A VVq]EX;/;>YS+A]S S9й#S)и)/;R]й7B;R9FйMA\]Af]01#"&=.'#"&=4632.'.54>35463254632#"'.'>54&'.'5h.%>-1_Z!%%!@g*!**!!*pY6e-"8)6_L!%%!5X#!**!!*" fEkk.'A%]g+&:!'7I0BlN-## 7*8###KV &4D,CgF$##3 -###=E `TA$+ D=!(  2';OYh(+ 2+<+F+Af v ]A  qA% 5 qA*:qAiy ]A qA]Af(v((((((((( ]A((qA%(5(qA*F:FqAF]A FFFFFF]A FFqAiFyFF]AR]AW]EX/>YEX#/# >YK+-+A]7A)797qAh7x777777777 ]A77q#AAgAwAAAAAAAAA ]AAAqA&A6AqAK]AR]AW]014>32#".4>32#".32>54.#"32>54.#"6'&72+Kc99cK++Kc99cK+D+Kc99cK++Kc99cK+>'44''44'D'44''44'0/100/109cK++Kc99cK++Kc9cK++Kc99cK++Kc4''44''474''44''4 -22--22-mJVW//!+A]WA ]*Af*v********* ]A**qA%*5*q.!9RAfRvRRRRRRRRR ]ARRqA%R5RqEX/>YEXF/F >YEX/ >Y4:+A ]Ah]%A)%9%qAh%x%%%%%%%%% ]A%%q.9F?K01%#".54>7.54>32#"&=.#"67>;2+32+"&'%267>[Q~W-3H,,7/W|MZB!**!#]9+B-+(%( ""]+mT""r(x?g+E<0BHP5[yC5\OF3~OCtV2;-'##Z/>#6Y-Xm&&Y012#"&'&3/7#$7/2>2)fd0S+Afv ]AqA%5q01.54>76TUUT)JtGGtJ)s2 ٢2 1 1拋嶊1 1hf0S +A* : qAi y ]A  q01&'.7>54.'&67>)JsHHsJ)TUUs 1 1勋渋1 1 2ء'EX/>YA]01&/'.?%.7>&632%6h&AA&&)!;&$,//,$&;!)$$@58--y*00*y--85@"3/й/й014632!2#!#"&5!"&5463"&&9""&&""9""&&""9&&s& //01#".76;2 #h + (%" +012#!"&5463""""&&&&<?/A] Af ]EX/ >YAg]01%4>32#"..=##=..=##=.#=..=##=..= 7 /EX/>Y01>32#".7s%! V%"   '(/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A qEX/>YEX/ >YAgw ]AqA&6q#A)#9#qAh#x######### ]A##q014>32#".732>54.#">wppx>>x b/A] EX / >YEX/ >Y A]A] 01%&'&67%632#!"&54639' m ,""^""Z%%* #&&&&&5+# +2*+A]A* : qAi y ]A  qEX/>YEX/ >YA)9qAhx ]AqAh]A]).Ag.]013"&547>54&#"#"&=47>32!54632#",?)tp=g+!**!H]Wf76M0!**!"&%-JDB&\nn##'4YEX=/= >Y Ag w ]A  qA& 6 qA]-A)9qAhx ]Aq-#Ah#]A*]59017.7>32654&+"&546;2654&#"#"&=467>32#". 0@PuI""7suumtQ!**! E]Wd6SFYg7ib2eaZh/## 0:xcii&&`\Ua'C##m *./VzKZz$%iQa6!.'&)p/)й/EX / >YEX / >YйA'])01%5!"&547>3232+32#!"&5463!"" 2'/(""""R""V&!+#&&&&&&X7/0/A*:qAiy ]A qA]A#]'+/EX/>YEX5/5 >Y Ag w ]A  qA& 6 q+&(+9017.7>32>54.#"#"&7>3!2#!>32#"& 0?N>bD$"?Z9Hj1"*#*"". 0k<[d5;naba/## -7%E_;7]C%%" ##&&;kWXm>A :;/YEX&/& >YAgw ]AqA&6qA]5A)9qAhx ]Aq90132>54.#">32#".'.54>76t$B^:9]B$#A];8]C&6͎R 5VSh;;k]5eZL&'!HqЃp5Y@$ YEX/ >Y Ah ]01%'.7!#"&=463!2U 4#" &!**!""'##&& ';O/ ///9#9(Af(v((((((((( ]A((qA%(5(q2<Af<v<<<<<<<<< ]A<<qA%<5<q FA*F:FqAiFyFFFFFFFFF ]A FFq7/EX/>YEX/ >YA7]7A7A9#7A9-Ag-w--------- ]A--qA&-6-qKA)K9KqAhKxKKKKKKKKK ]AKKq014>32#".54>7.32>54.#"32>54.#"8bPOb8-<#,K7>mXXm>6K,#<-y$B[77[B$$B[77[B$!!9O..O9!!9O..O9!oEyY33YyE*K?29JX3Na66aN3XJ92?K/O9 9O//O88O'B22B'+D00D:;/YEX5/5 >Y+&A)9qAhx ]Aq5Agw ]AqA&6q9014.#"32>>7#".54>32&'&6X$B^:9]B$#A];7^C&ʊ͎Q5VSh;;k]5eZK&'!HqЃ35Y@$ YEX/ >YAg]#Ah#]01%4>32#".4>32#"..=##=..=##=..=##=..=##=.#=..=##=..=#=..=##=..=s#> +Ai]//EX/ >YAh]014>32#".#".76;2.=##=..=##=.7 #h + #=..=##=..= (%}v"'.54676 , , `-#!}  }!#-:"R ++012#!"&54632#!"&5463""""""""R&&&&p&&&&vO .7>&'&67x` , , GB-#!  !#--A2.// /&+A]  A* : qAi y ]A  qA.].8Af8]EX/>YEX=/= >Y#A)#9#qAh#x######### ]A##q*Ah*]=3Ag3]0147>32#"&/&6?>54&#"#"&54>32#".L\SZ0)PwM # # E9R6c^=k/!**!%23%%32%&).-.RtECePB,1:&I\Y##3%%32%%22g6Td// /./ 6A6]@U.`P///#/A]й1;A;]PEX#`014>32#"&'#".54>3276232>54.#"32676#".%32>54&#"2\߄tH)Ih?B\.28"%@0(:FR-0=$M(-&<)7f[hI3b]H3$ 5SxF%'D3)#?5#iQxXh9B?1#:S6-b_VA'7-? AL'GbYEX/ >YEX#/# >Y#*и-и,.101%2#!"&546;#"&5463!232#!"&546;'!!#""""8K""o(1 a=""""RS&&&&&&#&&&&&vPF (10+ ,+0A*,:,qAi,y,,,,,,,,, ]A ,,q, 9A] $ܹи0'&/EX/>YEX/ >YA&]&)&)9 (и001#"&5463!2#!"&546;!2654#!2654&+ z""Z[/F?jq3b\""z}vssv&&.UwHNt$"pO}X/&&jag!`X[_vH5w6/7/6и/7ܹи(Af(v((((((((( ]A((qA%(5(q3и3/EX / >YEX/>YEX/ >Y #A)#9#qAh#x######### ]A##q #9Ah]-Ag-w--------- ]A--qA&-6-qA3]01%#".54>3254632#"&54.#"32676&_svIKra1!**!!**!!EjHQa63]QdH0mBAX㋋XA::####1ZD(AzllyA98%#3Pt'͸)/&+&) A ]и  A* : qAi y ]A  qEX/>YEX/ >Y&и'01#"&5463!2#!"&546;!2>54.+p""vŠLLv)""pPYf88fY&&R܋ܙQ&&;sppt;mPL; =/ /;// ;&A]%и=0(&/EX/>YEX3/3 >YAh]иA&&]&A]&!A!!]3'3,Ag,]':и;01#"&5463!2#"&=!354632#"&=#!54632#!"&546;f""j"!**!!**!!**!+!**!"""f&&&##[####[h##&&&PV6͸6//8/ A6]6&и%&/EX/>YEX./. >YAh]ии&A]&!A!].'5и601#"&5463!2#"&=!354632#"&=#32#!"&546;"""!**!!**!!**!""""&&&##y[####[|&&&&bBVC//)/A] C)/9A9]B/EX/>YEX%/%>YEX/ >YA]Bи4A)494qAh4x444444444 ]A44q!49Ah,]>Ag>w>>>>>>>>> ]A>>qA&>6>q01"&5463!2+#".54>3254632#"&54.#"32675"""" $StvŠLOra0!**!!**!%FhCSd85`SUB&&&&100X㋋X<61####-L7AzllyAP|CָC/"/C?иC3и"2и"&3/EX/>YEX/>YEXYEX*/* >YA3]3!и*1"и<C401#"&5463!2+!#"&5463!2+32#!"&546;!32#!"&546;H"":""\\"":""HH""""\\""""H&&&&s&&&&m&&&&h&&&&k/ /!/! EX/>YEX/ >Yи01!"&5463!2#!!2#!"&5463!""""""B""&&&&m&&&&s%_// $EX/>YEX/ >Y%и!01"&5463!2+#"&'&546323265""""w=!**!Tt&&&&2TC ##KvwPS++ Ai]9H!H9CиOEX/>YEX/>YEX3/3 >YEXK/K >Yик39иии к!393,DиEиRиS01#"&5463!2+#"&5463!2+6;2+"&'.'.#"32#!"&546;p""b""\D""D""9YDv/,$!+""R-X'" #H/)N""X""p&&&&[&&&&k,<%Z\W!!'&&>M(WUN#%&&&&PL$c$/&/$&EX/>YEX/ >Yи$01#"&5463!2+!4632#!"&546;1""*""!**!"""&&&&mI##s&&&??//A]A ]A ]A]&?0EX/>YEX/>YEX/ >YEX7/7 >Y 9A ]ии%и&к'9A']A+]/9A/]0и1и>и?01#"&546;26;2+32#!"&546; #"&' 32#!"&546;1""/ 0""26""""o ,##, o""""6&&!a!&&m&&&&3##:&&&&F33// 3$EX/>YEX/>YEX,/, >YEX/ >YA ] и,3$01#"&546;2#"&5463!2+#"&'32#!"&546;M"")u""D""9$'(""""C&&&&&& !&&&&Xt'(/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A qEX/>YEX/ >YAgw ]AqA&6q#A)#9#qAh#x######### ]A##q014>32#".732>54.#"XLvvŠLLvvŠL5`SS`55`SS`5QXX㋋XXlyAAyllzAAzPX#,#/./ A#]# ',/EX/>YEX/ >Y#и+и,01#"&5463!2+32#!"&546;2654&+1""#el88le""""l&&7dUTb6&&&&prXtNuO/P/Oи/Afv ]AqA%5qP#ܹ A* : qAi y ]A  q,#9AK]EX/>Y4@+,E+(+A)9qAhx ]Aq(9(+и+/E/AK]0132>54.#".54>32#"&'>3232676#".#"&'.75`SS`55`SS`5LzU.LvvŠLLv .O##>;7%N-+>f0#CGK+-rB+ jhr<YEX$/$ >YEX;/; >YE3+3E9$A(]4и5иBиCиDиN01#"&5463!2;2+"&'.'.+32#!"&546;32>54&# z""`e4'Hg?,-'$2""F+U0&&(7@J.>""n""z>dF&}&&1X}K:bL7 $BCB(0&&=N!FE?!, &&&&p0L5ah)QI/!/0*+AI]IA*:qAiy ]A qA!]!<Af<v<<<<<<<<< ]A<<qA%<5<qQ!<9EX&/&>YEX-/->YEX/ >YEXN/N >Y Ag ]NAgw ]AqA&6q&9A)999qAh9x999999999 ]A99q)&99-4Ah4]AD]AI]QN901%#"&5463232>54&'.'.54>3254632#"'.#"#"&'4!**!!*+)BcB"C8.pwv3%>-:gU[9!**!!*&1npw,%(kv{8-N9!7kgd?+##,#*t|5J,BN.>R5N}W.E9=###]]hT+74KeCM\3HGzR)*/+/)/*A]+A])EX / >YEX"/" >Y и")01!#"&5463!2#"&5!32#!"&546;!**!"Z"!**!""""##y&&##5m&&&&F5+)+4 )%EX!/!>YEX/>YEX/// >Y ии/Agw ]AqA&6qии(и)01"&5463!2+32>5#"&5463!2+#".5""D""p!CeDDeC!p""D"">:labl:&&&&NmEEmN~&&&&nkf22fk 'Ѹ(/)/(и/ Af ] 9)к9Ai]9A ]A&]EX/>YEX/>YEX#/# >Y ик#9A]иии01"&5463!2+ #"&5463!2+#"&'I""v""25d""N""M 4++3 &&&&t&&&&##7Ѹ8/9/8и/ Af ] 99#иAi]#9EX/>YEX/>YEX+/+ >YEX3/3 >Y ик+9+9ии&и'к/+901"&5463!2+>32#"&5463!2+#"&' #"&'5""X""d" !"h|""D""6+&&5 7&&)&&&&L!&&&&%#E#$2CC/#/AC]CйA#]#!й#2C4EX/>YEX/>YEX*/* >YEX;/; >Yик*9ии и!и*#1и2к3*94и5иBиC01 #"&5463!2+#"&5463!2+ 32#!"&546;32#!"&546; E""X""Y<""0""AZ:""""mS"""">k&&&&<&&&&N&&&&m&&&&<2//2/ A ]2#2#9A]EX/>YEX/>YEX*/* >Yик*9ии и!и*#1и201 #"&5463!2+#"&5463!2+32#!"&546;F""N""]A""0""D""""/&&&&g&&&&&&&&#&'/(/ܹ'ܸи/#и#/A#]EX/>YEX / >Y Ag]Ah]01%4632#!"&5467!#"&5463!2!**!"" !**!"" i ##&& ##=&&PJwf ? +EX/>YEX/>Y012#!"&5463!2#!'""b""""&&&!&&&g 7/EX/>Y01#"&'&>32 !%V "%  fw C +EX/>YEX/>Y01!"&5463!2#!"&5463!""""b""G&&&&&&EX / >Y01'.7>32&'f : 4  4 :    O  w EX/>Y01"&5463!2#  w---- A`'%.67>'    m #% 4CD/E/1ܹ 19A ]Dи/A]A&]5и=Af=v========= ]A==qA%=5=q8/EX./. >YEX/ >YEX/ >Y .9889. A) 9 qAh x ]A  qA&]@Ag@w@@@@@@@@@ ]A@@qA&@6@q01%2+".'#".54>3254&#"&'&67>323.#"3267G""@8-!OoK~\3AoRQG]qQ?0 '^ei3BEN6[B%e[kJ&& 0!EQ'KlFTvI"Ua[+- 1+ rO'?-IQYL%M (<X)$+3+Af)])) и)и/ и/A*3:3qAi3y333333333 ]A 33qEX/>YEX/ >YEX/ >YEX / >Y 99 '.8A)898qAh8x888888888 ]A88q01#"&546;2>32#"&'+"&546;32>54.#"f""""""R.RqBDjH&&HjDBqR.&&&1MXB}qq}BYQP&&&FP|W-2Y{JI|Y2-W}5t6/7/0ܹ6 и / Af v ]A  qA% 5 q0и/(EX%/% >YEX,/, >YEX/ >Y%A)9qAhx ]AqAgw ]AqA&6q(%9,3Ah3]014.#"32676#".54>3254632#"&$GhEI{X2.UxI\H.Qsn~DFl[3!**!!**!O-L72Z{II{Z287 #:YEX/ >YEX/ >Y #9A]#.801%2+"&=#".54>32#"&5463!24.#"32>T""">d]sBBs]d<""!".RqBDjH&&HjDBqR.&&&PQY?vllv?QK&&&-JtO*.SrDDrS.*OtC#* ,/+/, 'и (/EX/ >YEX/ >YA]Agw ]AqA&6q$A)$9$qAh$x$$$$$$$$$ ]A$$q'0132676#".54>32#"!.0eE + !'_kr:nt=G~iou@"k}c.( 3  C}qmEEzd"x}oq{`%6λ*+и.и*3EX/>YEX&/& >Y+иA)9qAhx ]Aq&-и.и/0154>32'.#"!2#!!2#!"&546;#"&5463/ZTG< &;vYEX1/1 >YEX?/?>Y*A)9qAhx ]Aq ?Agw ]AqA&6q?*9-?*919014.#"32>32>=#".54>32546;2+#"&'.7>l.RqBDjH&&HjDBqR.EICcA """R7jbWO )JtO*.SrDDrS.*Ot#AZ7KQ?vllv?YQP&&&Za4 ,&&M ?(0;+ +0;и/0 и4 49$EX/>YEX/ >YEX/ >YEX7/7 >Y 9#и$и*A)*9*qAh*x********* ]A**q$0и1и>и?01#"&546;2>3232#!"&546;4.#"32#!"&546;\"""AdEnM)R""""\(=)@tX4\""""R&&&ag.TyK&&&&+G38dR&&&&IS) + A] и "EX/ >YEX/ >Y&+ иA]A&]01#"&5463!2!2#!"&5463!#"&=46323""T"A""""9&99&&99&&&&0&&&&####aS$2ӻ%++%A]%EX/ >YEX / >Y/(+A ]A] Agw ]AqA&6qA(]A/]012#".'.7>32>5!"&5463%#"&=4632H"%O|W+]\X%/BF2D)Y""=&99&&99&&jVY.)-$$+87S7E&&####? ^ + A]EX/>YEX/ >Y и01!"&5463!2!2#!"&5463!)""h"A""""9&&&&&&&VmJ/1//J;F;91&1&9A]A*]A?]EX/ >YEX / >YEXR/R >YEX/ >YEX-/- >YEXB/B >Y99  A) 9 qAh x ]A  q&и'и 5и';и<иIиJи5KиK/LиL/01>32>3232+"&54&#"32+"&54&#"32#!"&546;#"&546;2,xE!;2% -tE+K8!>""",3$?/9""",3$?/4""""RR"""a\-D.\Y BeE&&&PCG2Z}L&&&PCG2Z}L&&&&&&&M?ɻ0;+ +0 и /$0?4EX/ >YEX/ >YEX/ >YEX7/7 >Y 9#и$и*и$0и1и>и?01#"&546;2>3232#!"&546;4.#"32#!"&546;f"""BgEnM)R""""\(=)@tX4\""""R&&&xgk.TyK&&&&+G38dR&&&&xT'(/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A qEX/ >YEX/ >YAgw ]AqA&6q#A)#9#qAh#x######### ]A##q014>32#".732>54.#"xKjjKKjjK1X|KK|X11X|KK|X1jHHjjHHjI{Z22Z{II{Z22Z{wM,@(+7+ и /-и и /!A*7:7qAi7y777777777 ]A 77q/EX/ >YEX/ >YEX$/$>Y $9A]$+и,и2<01#"&546;2>32#"&'32#!"&546;32>54.#"R""">d]sBBs]d<""""p.RqBDjH&&HjDBqR.&&&PQY?vllv?QKG&&&&JtO*.SrDDrS.*Otw,@7+(+,-ии,и/-и/,,!Af7v777777777 ]A77qA%757q/EX / >YEX/ >YEX$/$>Y$ 9$ 9$+и,и 2<01%#".54>32546;2+32#!"&546;4.#"32>l"""Rp"""".RqBDjH&&HjDBqR.KQ?vllv?YQP&&&&&&&JtO*.SrDDrS.*OtW2~#.+##2EX/ >YEX/ >YEX*/* >Y *9и*#1и201#"&546;2>32'&#"!2#!"&546;o"""%_lt9ND+27-]WK9 Q""|""&&&ClL)(2%$!;Sdr=&&&&RJ/= +/)+A ======]A==qA=]Af=v==]A%=5=q=и/A ] и/AJ]JA*:qAiy ]A qR =9EX%/% >YEX,/, >YEX/ >YEXO/O >Y Ag ]OAgw ]AqA&6q%:A):9:qAh:x::::::::: ]A::q(%:9,3Ah3]AJ]RO901%#"&=463232654&'.'.54>3254632#"'.#"#"&'I!**!!*%xx.',t6"8)6_Ld9!**!!*"AUf:am+&*p|~6%>-3c]m=+###aWUE$+  &4D,CgF$;3-###+:"D?!(  '7I0CnO+<=Hx7/6/+ иEX/ >YEX2/2 >YEX/ >YEX/ >Y 9%и+и,01%2+"&=#".5#"&546;232>5#"&546;29"""BgEnM)R"""(=)@tX4"""&&&ygk.TyK&&&+G38dR&&&02'(/)/(и/ Af ] 9)к9A]Ai]9A ]A#]A&]EX/ >YEX/ >YEX#/# >Y ик#9A]иии01"&5463!2+ #"&5463!2+#"&'q""b""W"":""?6224&&&&t&&&&" !7,8/9/8и/ A ]Af ] 9A]9#иAi]A]#9A]A.]/#9A0]EX/ >YEX/ >YEX+/+ >YEX3/3 >Y ик+9A]A]+9ии&и'к/+9A/]01"&5463!2+>32#"&5463!2+#"&' #"&'5""&""{$!"$e"""" '&+1 3+&& &&&&)F&&&&$"N##FC/$/A]A ]A$]$"A"]A]A/]$35A9]EX / >YEX/ >YEX+/+ >YEXY ииии!и"и$и%и2и3и5и6017 #"&5463!2+7#"&5463!2+ 32#!"&546; 32#!"&5463EG""X""L7""0""AA3""""`O""""U7&&&&&&&&&&&&&&&&%&/'/ܹ&ܸи/A]"и"/A%]EX/ >YEX / >Y Ag]Ah]01%54632#!"&547!#"&=463!2!**!""c9!**!""##&&##&&^w 1 + 9и &и.EX#/#>YEX/>Y+9 Ag w ]A  qA& 6 q#)A))9)qAh)x))))))))) ]A))q0132#"&=4&#"&546326=4632#"IJ3Q8""ho""oh""8Q3J,\C_<&&mo&&pm&&<_C\a6 /+EX/>YEX / >Y014632#"&5!**!!**!####>w - + 9ии $и*EX / >YEX!/!>Y+9 A)9qAhx ]Aq!'Ag'w''''''''' ]A''qA&'6'q01.=4&#"&5463232#"#"&546326=46IJdp""ho""oh""pdJ,\s&&mp&&omտ&&s\3!+ 01&'.7>3232676#".#"'@x:6ged2*T,'Ax96ged2*T +8+  +8+ v(HX(%+<X++Af%v%%%%%%%%% ]A%%qA%%5%q<PEX / >YEX/>YMA+7S+  A) 9 qAh x ]A  q 9Ah]S*01.54>3254632#"&54.#"326766#"&'.7>32654&".5/fs=Kra1!**!!**!!EjHQa63]QdH0Sc4M3>]?C4 'g325LE  cԀXA::####1ZD(AzllyA98%#3:>^.>#*F3(# * (X(%+<X++Af%v%%%%%%%%% ]A%%qA%%5%q<PEX / >YEX/ >YMA+7S+  A) 9 qAh x ]A  q 9Ah]S*01.54>3254632#"&54.#"326766#"&'.7>32654&".5\i8Fl[3!**!!**!$GhEI{X2.UxI\H.Gd4M3>]?C4 'g325LE  R~^hIA<<####-L72Z{II{Z287 #95A].>#*F3(# * "ø /и/ܸA]A0qAqA]A]и/EX/ >YEX/ >YEX / >Yии01"&546;5463232+#"&5a""&&""&&&&""&&D""&'-(/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A qEX/>Y+#A)#9#qAh#x######### ]A##q014>32#".732>54.#",Lf::fL,,Lf::fL,'55''55':fL,,Lf::fL,,Lf:5''55''5 9Dڻ:++4+A]"и)и,Af:v::::::::: ]A::qA%:5:q?/EX&/&>Y07+0"и"/0*и*/,709014&'>76#"&=.54>75463254632#"&mjH9.D_!%%!`l;Y/'+Agw ]AqA&6q99BAhB]9IA)I9IqAhIxIIIIIIIII ]AIIq/Sи'Z01%>3232676#".#"&'.7>'#"&546;.54>32#"&=.#"!2#!(E";63!I-+>d-!?BH).mB( @S- ""_ 1Y}M^B!**!$c<+D/$6""  3 ."  2:c\\3&&=AE'EwW280'##Z0@%#??B%&&CVQ +C;+$+2+++G+A*:qAiy ]A qAf$v$$$$$$$$$ ]A$$qA%$5$qA*G:GqAiGyGGGGGGGGG ]A GGqAfQvQQQQQQQQQ ]AQQqA%Q5Qq/7+Ah] 7?012654&'%.5467&54>3!2#"&=#"#!"&=4632>54&'%.'uHEC?NYGC#GhEZ"!**!HEC?&NY$3!#GhE"!**!40440&9^756U&0yWCc1074Y?$&##756U&0yW"940165X?$&##G/*:'/*:#^On_ //014>32#".^)H`77`H))H`77`H)W7`H))H`77`H))H`a]"Y+ + /EX/>YEX/>Y!и"01#"&5.54>3!2+#"&5#!**!Wh:=o\""D!**!##T0X}NQY.&&##y(%@I5<+ &+5Ai&] & 9 &и/ ,EX/>YEX8/8 >YEX/ >Y 9Agw ]AqA&6q/A)/9/qAh/x///////// ]A//q?и?/@и@/014>32#"&54632654.#"&5467>54&#"+"&546;2`W^_0_Ok|;k[3 #}$C_:""deso4Q7"""Rc76]H_*)}Zb4"+%"ys>`A"!$$  rX]l"?X7&&&$'DM+E(+1J+ +Afv ]AqA%5qA*:qAiy ]A q4 9E=A*J:JqAiJyJJJJJJJJJ ]A JJqEX/>YEX/ >YFA++E+Agw ]AqA&6q#A)#9#qAh#x######### ]A##q4AF9014>32#".732>54.#"746;2&/##"&532654&#$UԀՙUUԙUzBxffxBBxffxB"7Z?"LEk0Y##|jDB>?R````kKKkkJJ"!;Q1Kgt.##9318$+?S&@,+'+6J+Afv ]AqA%5qAf@v@@@@@@@@@ ]A@@qA%@5@qA*J:JqAiJyJJJJJJJJJ ]A JJqEX1/1>YEX/ >YEX;/; >Y"+ A) 9 qAh x ]A  q;EAgEwEEEEEEEEE ]AEEqA&E6Eq1OA)O9OqAhOxOOOOOOOOO ]AOOq012'.#"32676#".54>4>32#".732>54.#"u-]* %$B&&B11B&&B$% *]-DsT//TsUԀՙUUԙUzBxffxBBxffxB( 7R66R7 (/XQQX/````kKKkkJJ<*%< =/)и)/;A;;;]A ;; ;0;@;P;qA`;]YEX/>YEX,/,>Y 9 9 9&3и401#"&/#"&7>32>32#"&'"&5463!2+#"&5m] '( ^## ## ##""~""##0### + #D##|""""##| `>&'&67E    S %#  .('v(/)/(и/ Af ])ܹAi]EX/>YEX/>YAh]#014>32#".%4>32#". "--""--""--""--"-""--""--""--""-@"L17!+ +и ии!*01!"&5463!7>32+!2#!'.?#"&5463ɜ""}* S""|""=|* S""&& *&&&& *&&r@D,5<++'+Af5]<59' и /и/.и/и.Aи/к1<59D<59/EX*/* >YEX8/8 >YA/++Ah]ии**#Ag#]1и2и?и@иBиC01#"&5463!2#"&=!32+!54632#!"&5#32#!"&546;#c"""!**!""!**!"B"HX""""2&&&##&&c##&&2&&&&vXt%1;YEX/ >Y)9-Ag-w--------- ]A--qA&-6-q497A)797qAh7x777777777 ]A77q014>327>#"&''.?.%4&'32>%&#"XLvR<%- 0BGLvS<$, /BF~&#*d9S`5 HVpS`5QX+(5,EQ݇X*)3+CQ܇\;;Aylw&'&67""""W +  + &&&& *&% ## %&* <T+=H+&+H=9Af] 99H=9Ai]&9+&9=LA4LA9/"/EXD/D >Y5;+ +5и икD9ии)и*и +и2иD=KиLи;M01'#"&546;'#"&5463!2+#"&5463!2+32+!2#!32#!"&546;5!"&5463l""{F""N""]A""0""Dz""l'""""""""&&&&&&g&&&&&&&&&&&&&&,++01!!!!,ttU_Ua)y+EX/>Y&+Agw ]AqA&6q01#"&'.7>32654>32'.#"3^UK= !?tYEX/ >Y< +<и/ <94A)494qAh4x444444444 ]A44q49)A)9qAhx ]Aq012+"&'#".54>3254&#"&'&67>323'.#"326710P N5n<'@/H=N9Z ,/3:8S7@\9 3Y+#A)#9#qAh#x######### ]A##q014>32#".732>54.#":eQQe::eQQe:"?X66X?""?X66X?"EQc88cQQc77cQ5X?$$?X54X@$$@XKAMTE +B+R+B9B%к:B9AfEvEEEEEEEEE ]AEEqA%E5EqQиQ/EX7/7 >YEX=/= >YEX/ >YEX/ >YR+ Ag w ]A  qA& 6 q 9R%и7+A)+9+qAh+x+++++++++ ]A++q:7+9Bи Hи+N01#!32676#"&'#".54>354.#"&'&67>32>32"32>5"!."q,;!0P*58HO{*0Q;`D%Czh 3(.U.2@GQl (qGOpF"<3*I6/?/>и/?ܹ&A*&:&qAi&y&&&&&&&&& ]A &&q2Af2v222222222 ]A22qA%252qEX/ >YEX/ >Y-Ag-w--------- ]A--qA&-6-q9A)999qAh9x999999999 ]A99q014>3276#"&'&'.?.%4&'32>%.#"xKjX>K-I,0KjX>K,I,/>(`9K|X1`(`8K|X1jH2-H.FYEX/ >Y#Ag#w######### ]A##qA&#6#q*Ag*]=3Ah3]01%#".54>?>32326754632#".54>32L\SZ0)PwM # # E9R6c^=k/!**!%32%%23%}).-.RtECePA ,1;%I\Y##32%%23%%3 K +Af ]EX/>YEX/ >YAh]01"7632##".54>32%-160-Y*8 8**8 8*20y25 8**8 8**8>6M +/+01"&5463!2#"&5"","!**!&&&v##F%7EX/>Y, ++иA)9qAhx ]Aq0017>32'.#"32+#"&'.7>3267#"&5463&5l2 *0V0KV ""C5l2 *0V0KV B""L')*Za&&e')*Za&&3!C;0<++ 0A+01&'.7>3232676#".#"&'.7>3232676#".#"'@x:6ged2*T,'Ax96ged2*T,'@x:6ged2*T,'Ax96ged2*T +8+  +8+ P +8+  +8+ +&7>&'&7>&' 4    4  4    4 $F   FF   +%'.7&>76'.7&>76z 4    4  4    4         >r-8.+-3+!+!и/и/-#и!(и(/Af.v......... ]A..qA%.5.q/EX / >Y%++  Ag]Ah]"3и"401%54632#!".54>3!2#"&=!32+!**!" tIIt"!**!""1[NN[1##&Q܋ܙR&##&&cms>=tF/;B0 +6+@+69(69Af0v000000000 ]A00qA%050q?и?/EX%/% >YEX+/+ >YEX/ >YEX/ >Y@+ Ag w ]A  qA& 6 q 9%9A)999qAh9x999999999 ]A99q(%99 3и9<01#!32676#"&'#".54>32>3232654&#"%"!."q,;!0P*58HNy)%sONuN''NuNPr%)yNOpF"hKOOKKOOKsEP ,@"ZzJ%)355DFDFA|ss|AGEFF@tfwgv" +012#!"&5463""""&&&&x"'5D +Af ]и #++(.+014>32#".4>32#".2#!"&5463 ++!!++  ++!!++ """"+!!++  +k+!!++  +&&&&o]Z 7&'&476 ! ! $ 1 $ &7>&' 4    4 $F   %'.7&>76B 4    4     9%D9+#.+иD и#2'4и9@EX/>YEX/ >YEX/ >YEX*/* >YEXYA)9qAhx ]Aq*#1и2и3и4и25и6иCиD01#"&546;54>32'.#"!232#!"&546;!32#!"&546;""/ZTG< &;v&++&и> и *и*/&.и3:EX / >YEX/ >YEX6/6 >Y+и и !&и-и /и0и=и>01#"&546;5463!232#!"&546;!"32+32#!"&546;""c"y""""qje""t""v""&&{&&&&&sgr&&&&&&"12/и/ܸA]A0qAqA]A] ии!!и%и!)и0EX/>Y-+ии и!и"и(01"&546;5#"&546;5463232+32+#"&=a""""&&""""&&&&&&""&&&&""(& //01#"&76;2?4"$e + +% (%& ////01#"&76;2#"&76;2r4"$e + 4"$e + +% (%?+% (%2<3G[oyH +*R+4+\>+f+A*>:>qAi>y>>>>>>>>> ]A >>q>\9>\9Af*v********* ]A**qA%*5*qAf4v444444444 ]A44qA%454qAfHvHHHHHHHHH ]AHHqA%H5HqA*f:fqAifyfffffffff ]A ffqEX%/%>YEX/ >YEX/ >YC+M/+C9 и9Ag9w999999999 ]A99qA&969q99%WA)W9WqAhWxWWWWWWWWW ]AWWq9aиCk01%4>32>32#"&'#".4>32#".32>54.#"32>54.#"32>54.#"6'&7v+Kc9Bk$#lB9cK++Kc9Bl#$kB9cK++Kc99cK++Kc99cK+'44''44''44''44''44''44'0/100/109cK+9009+Kc99cK+8008+Kc9cK++Kc99cK++Kc4''44''44''44''474''44''4 -22--22-IU + EX/ >YEX/ >Y и01#"&5463!2!2#!"&5463!3""T"A""""9&&&0&&&& ` /01&'&47%632'%O !   $$  >!+01232676#".#"&'&67>%DB@"F# 32#".'&>32fg#   ?`NN`?   #7D  4T; ;T4  D77Q +Af ]+014>32#".&44&&44&4&&44&&4s)_' (/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A q/#+A)9qAhx ]Aq014>32#".732>54.#"s'BZ33ZB''BZ33ZB'x".."".."3ZB''BZ33ZB''BZ3.""..""._(f#$/%/$и/%ܹA*:qAiy ]A q ++01%36#"&'.7>32654&".54M3>]?C4 'g325LE .>#*F3(# * LGg+#+# и01#".54?>32#".54?>32  $   $ *            (,h+Afv ]AqA%5q+01%32676#"&54>75K/+":#R/^j4I-/PF>%&! gX*PMJ$  h/01"'%&47>%6f!   $ $9L6 ++#+и!и 2и 6/EX./. >Y.9 ик.9."5и601&'&6?#"&5463!2+76!4632#!"&546;1*բ""*""*!**!"""\ )&&&& )bI##s&&&? -u +иEX/>YEX%/% >Y%9 %9%,и-01&'&6?!"&5463!276!2#!"&5463!)*""h"*A""""9-w )&&&[r )&&&&)v&3r&R #l&:h&W a6 ?+иEX/>YEX / >Y014632#"&54632#"&5!**!!**!!**!!**! ####S####2t#90+)+0и0 A*):)qAi)y))))))))) ]A ))q408и/9/EX/ >Y+ "$и .и/и0и7и$901#"&546;#"&5463!2#!"&546;!2>54.+32+""p""vŠLLv)""pPYf88fY"" &&s&&R܋ܙQ&&;sppt;&&h@H4HUI/J/I"и"/Jܺ"9"9*"9"5Af5v555555555 ]A55qA%555q?A*?:?qAi?y????????? ]A ??qEX/ >Y'D+*D'9:Ag:w::::::::: ]A::qA&:6:q01.'.7676#".54>32.'&'&6732>54.#"=  ";;n4 % BkL)H~ff~HH~fDv4(i? % :-SuGGuS--SuGGuS-j ,!A@%Y ##' <YEX$/$ >Y-+ии$+и,и501#"&5463!2+32+32#!"&546;2654.+I"" ""ZZ..ZZ""""hor7U;&&&&|3XxFEwW2&&&&cZ*F4wM ,@J(+7+ и! !9-A*7:7qAi7y777777777 ]A 77qEX/>YEX/ >YEX$/$>Y2+ $9$+и,и<A)<9<qAh<x<<<<<<<<< ]A<<q01#"&546;2>32#"&'32#!"&546;32>54.#"R"""=a]sBBs]d<""""p.RqBDjH&&HjDBqR.&&&=JO?vllv?QKG&&&&JtO*.SrDDrS.*Ot0;/ +  + 01'&7%632#!"&546;922'99=[ T"""" 63&+-+ +A*-:-qAi-y--------- ]A --qEX / >Y"+ Ah]" 0A)090qAh0x000000000 ]A00q01#"&=47>32!54632#!"&5467>54&#"&%Y+/'+ '/95A)595qAh5x555555555 ]A55q<Ah<]01>32#"&'.7>32654.+"&546;2654&#"#"&=4L !1r9Zb0D)4'QYYM*I &%#"#?X4?YbL:^B$" + A=#. #%7B<;?n(vc5k5l+5q(!vc5k5l" w5q!r"+5q w5q<HWE0*+*7EX&/&>YEX-/->YEX / >Y+!+&<A)<9<qAh<x<<<<<<<<< ]A<<q)&<9-4Ah4]!?иFиJиQкR &9 UAgUwUUUUUUUUU ]AUUqA&U6Uq01%6#".'#"&546;&67#"&546;>3254632#"&54.#"!2#!!2#!3260_kWnKa""PQ""dNmSW0!**!!**!!AaAh"""":""j\%#3BA7f\&&)_&&&Ze6A99####1ZD(~s&&*Z*&&v9 ////01632+"&7632+"&75"$e + v5"$e + +% B(%+% B(% -//EX/>YEX/>Y01#"&76;2#"&76;2r4"$e + 4"$e + +% (%?+% (% //01632+"&75"$e + +% B(%( /EX/>Y01#"&76;2?4"$e + +% (%2a12/3/A]2и/$Af$]($9)9.Ai.]*.9EX/ >YEX / >YEX / >YA ] Agw ]AqA&6qии'и(к) 9*и+012+&'&67>7#"&5463!2+ #"&5463["">g0\jR'EaPM2?""b"" Y""&&bV)(,&He&&&&2&& +012#!"&5463""v""&&&&uN1w.+A])*/EX$/$ >YA*]*и*и$A]014632!2#!32676#".5#"&5463!**!""e)D2FB/&W\]+W|O%""L,##&&7S78+$$-).YVy&&C ?<+ +!+Ai ] 9Ai!]% 9'и7,EX/>YEX / >YEX/ >YEX/// >Y ии$и%и(и)и6и7и8012#"&5463!2+ 32#!"&546;32#!"&546;#"&5463\"}G""N"";P:""""R?""""o"" &P&&&&w&&&&*&&&&&&P|';YEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#".$11$$11$o$11$$11$"$11$$11$o1$$11$$11$$11$$11$$11$$1C(&Ej (&AjxT(&NjHx(&SjXt6&/jF6&5j 6&!j2a(&j<6&9j`&AC`&EHx`&SxT`&NXtn&/Fn&5n&) n&!PL6&%jPLn&%6&)jI(&jI`&`&AiI`&ixT`&NiHx`&Sin&)iFn&5iXtn&/iXtn&/@Fn&5@n&)@PLn&%@  n&!iPLn&%i n&!@C`&EiC`&E@>I`&@`&A@>Hx`&S@ xT`&N@&A &!&AxT&NM&MF&. &!Xt&/" +012#!"&5463""""&&&& 6 ' &'.7 &67>f++++++++2a`&iV +012#!"&5463""""&&&& +Af ]+014>32#"..=##=..=##=.F#=..=##=..=EEX/>YEX/ >Yиик901>3232#!"&546;!  2((1 ZQ""""Px##&&&&vn +01#"&7>;2> #> # \&! '! (FJ= +?+&8+Af] 9A*8:8qAi8y888888888 ]A 88qAi?];?9C?9F 9G 9H?9/EX/ >YEX"/" >YEX;/; >Y)5+HD+ ииииBиCиIиJ01%2#!"&546;#"&5463!232+32676#"&5467#"&546;'!!#""""8K""o(1 a="">YM+":#R/^jYK""RS&&&&&&#&&&S{7%&! gXMB&&vvHn'i#vHv&#vHn'(#vH_'#Ptl&$Pt&$PL\&%PLl&%PL_'%PL'%P(LTB++7I+0(+$и&A*I:IqAiIyIIIIIIIII ]A IIqL09P/EX3/3 >YEXL/L >Y:F+%+Ah]ии%!L'(и3,Ag,](SиT01#"&5463!2#"&=!354632#"&=#!54632+32676#"&5467!"&546;f""j"!**!!**!!**!+!**!"YM+":#R/^jYK8""f&&&##[####[h##&S{7%&! gXMB&&b\&' bn''b&' b_' 'UY+*+и *&/*3и+4и&8и?иCиDиEиFиJи Qи UиVиWиXиY/"/EX/ >YEX/ >YEX+/+ >YEX;/; >YEXM/M >YVD+ ииии)и*и2и3и;4BиCиFиGиTиUи3WиX01#"&546;5#"&5463!2+!5#"&5463!2+32+32#!"&546;!32#!"&546;5!z""zH"":""\\"":""Hz""zH""""\\""""H&&&&&&&&&&&&t&&&&h&&&& llP|n&(\&)_&)&)(8ֻ4+-+Afv ]AqA%5qи/049/EX/ >YEX0/0 >Y*+ии0и7и801!"&5463!2#!!2#!32676#"&5467!"&5463!""""""YM+":#R/^jYK""&&&&m&&S{7%&! gXMB&&')sn'*P&+ PLn'i6,P&,G33PL&,PL&,Fn'i.Fl&.F&.Xt\&/Xtu&/Xt&/Pn'i2Pl&2P&2)n&3i()s(?$+Ws+3-+L+Af?v????????? ]A??qA%?5?q$?9$ и /A*:qAiy ]A q,sW9WkEX)/)>YEX0/0>YEX/ >YEX/ >YEXQ/Q >Yh\+Rn+QAgw ]AqA&6qQ9 Ag ])<A)<9<qAh<x<<<<<<<<< ]A<<q,)<907Ah7]01&'#"&5463232>54&'.'.54>3254632#"'.#"6#"&'.7>32654&".5%`!**!!*+)BcB"C8.pwv3%>-:gU[9!**!!*&1npw,%(kv{8-N9!2`]4M3>]?C4 'g325LE  lN##,#*t|5J,BN.>R5N}W.E9=###]]hT+74KeCI{\7\.>#*F3(# * )n'3)&3zR;ջ +$/++$3ии$ии/(8и8/ /EX+/+ >Y"+и  Ah]иии+$2и3и"401!#"&5463!2#"&5!32+32#!"&546;#"&5463!**!"Z"!**!""""""""J##y&&##5/&&&&&&:&&zRl&4zR&4F\&5Fu&5F'5F(N,+2D+)+M )%Af2v222222222 ]A22qA%252qGD29/!/EXG/G >Y5A+ ииGAgw ]AqA&6qии(и)01"&5463!2+32>5#"&5463!2+32676#"&5467#".5""D""p!CeDDeC!p""D"">f^3I-+":#R/^jKAbl:&&&&NmEEmN~&&&&n-.ND>%&! gXG=2fkF&5F'5n&7in&76&7jn&7@ <n&9 <n&9@#n&:i#_':N&A&A(JYS*+ +G3+A*:qAiy ]A q3G9" 92 93KAfSvSSSSSSSSS ]ASSqA%S5SqEXD/D >YEX/ >YEX%/% >Y +/N+%VAgVwVVVVVVVVV ]AVVqA&V6Vq%V9"%D92N/9D6A)696qAh6x666666666 ]A66q01%2+32676#"&5467.'#".54>3254&#"&'&67>323.#"3267G""YM+":#R/^jgU+OoK~\3AoRQG]qQ?0 '^ei3BEN6[B%e[kJ&&S{7%&! gXSG5(EQ'KlFTvI"Ua[+- 1+ rO'?-IQYL`&Cir&C `& CQ&C N (<I3+' +' и /)и и /)Af3v333333333 ]A33qA%353qEX#/#>YEXE/E>YEX/ >YEX/ >Y.+ #9#8иE?Ah?]01%2+"&=#".54>32#"&5463!24.#"32>#"&76;2"""-aQg::gQ[-"" "$C_;9W;;W9;_C$*R" &&&FGY?vllv?KB&&&-JtO*.SrDDrS.*Ot#j  :NCE*+ + ;ии и и!и!/;"и"/2и;3AfEvEEEEEEEEE ]AEEqA%E5EqEX/>YEX/ >YEX%/% >Y+/@+и"%92%93иJ015#"&5463!232+32+"&=#".54>325!"&54634.#"32>l""!"m""mR""">d]sBBs]d<""/.RqBDjH&&HjDBqR.RF&&&&&&&&PQY?vllv?QK&&cJtO*.SrDDrS.*OtCN&ECr&E CQ&EC&E(C>EF/G/F1и1/Gܹ&A*&:&qAi&y&&&&&&&&& ]A &&qи/)и)/&,и,/&6и6/&?и?/BиB/EX6/6 >YEX)/) >YEX,/, >Y#+B+,Agw ]AqA&6q6?A)?9?qAh?x????????? ]A??q013267632676#"&5467#".54>32#"!.0eE + ! '(-=&+":#R/^jSG'Q*nt=G~iou@"k}c.( 3%*G>8%&! gXK@C}qmEEzd"x}oq{aN&Ga`&Ga&GaQ&G Qb N+*+ Iии Eи/*и/ и:и.# 9и>EX/>YEX/ >YEX&/& >YEXA/A >Y+и&9&-и.и4A)494qAh4x444444444 ]A44q.:и;иHиIиJ015#"&546;2!2#!>3232#!"&546;4.#"32#!"&546;#"&5463\"""""AdEnM)R""""\(=)@tX4\""""R""f2&&&v&&ag.TyK&&&&+G38dR&&&&V&&M'rHIN&I&(IS4B +)+ Afv ]AqA%5q, 9 5и ;EX/ >YEX/ >YEX,/, >Y&+?8+,  и3и401#"&5463!2!2#!32676#"&5467!"&5463!#"&=46323""T"A""YM+":#R/^jYK""9&99&&99&&&&0&&S{7%&! gXMB&&####I&a0`&nhC &?'irK &KGL33? &K[ &Kh M`&MiMr&M M&MxTN&NxTg&NxT&NW`&i2QWr&Q W&Q`&Ri(uA$+Yu+3-+AfAvAAAAAAAAA ]AAAqA%A5AqAи/$ и /Yи/,uY9YNYmEX)/) >YEX0/0 >YEX/ >YEX/ >YEXS/S >Yj^+Tp+SAgw ]AqA&6qS9Ag])>A)>9>qAh>x>>>>>>>>> ]A>>q,)>907Ah7]01.'#"&=463232654&'.'.54>3254632#"'.#"6#"&'.7>32654&".5/Hq-!**!!*%xx.',t6"8)6_Ld9!**!!*"AUf:am+&*p|~6%>-/ZV4M3>]?C4 'g325LE  8.8###aWUE$+  &4D,CgF$;3-###+:"D?!(  '7I0@jN.\.>#*F3(# * `&R&RuNC+ ии"и#и;и@EX / >YEX6/6 >Y!+и  иии6(Ag(w((((((((( ]A((qA&(6(q!<015#"&546;4632!2#!!2#!32676#".=#"&5463""!**!""e"")D2FB/&W\]+W|O%""@&&,##&&&&`7S78+$$-).YVm&&uNx& uN&2HxN&SHxg&SHx&SH(zO570+NG+ +NCA*:qAiy ]A qGN9C"и"/B#и#/7+EX3/3 >YEXJ/J >YEX/ >YEX/ >YEX&/& >Y +#&393,=и,CиD01%2+32676#"&5467.=#".5#"&546;232>5#"&546;29""YM+":#R/^jYLBgEnM)R"""(=)@tX4"""&&S{7%&! gXMB"ygk.TyK&&&+G38dR&&&0Hx&SHx&S`&Ui`&U(&Uj`&U@2a`&2a`&@ `&WiQ&W (V?ͻ+/5+ и"и'и7и 8*/EX/ >Y+8+ иии!и*#*2Ah2]#6и701!2#!32#!"&546;5#"&546;#"&5463!2#"&=!!2#""H"""""""""!**!Y""4&&&&&&&&w&&&##&&H+A9+.#+и/ и /.G*/&/EX/ >YEX4/4 >Yиии/и/ и-и.и4=Ag=]Dи.H01#"&5463!2+32#!"&546;"&5463!2+#"&'&546323265V""B""V`""""`\""j""GBfGEx,!**!3?8&&&&m&&&&&&&&<^B#8-###AH9a1S)P^N +4-+   и " )и4O4Qи4W5^EX/ >YEX0/0 >YEX:/:>YEX/ >Y&+ ии*и:JAgJwJJJJJJJJJ ]AJJqA&J6Jq*PиTи&[01#"&546;232#!"&546;#"&=4632"&5463!2#"&'.54>3232>5#"&=4632{"""""""&99&&99& ""6"%O|WQ::s?2D)&99&&99&&&&0&&&&####&&&jVY.*" !7S7E|####a$ +EX/ >YEX/>YAgw ]AqA&6q01!"&5463!2#".'.7>32>5Y"""%O|W+]\X%/BF2D)&&&jVY.)-$$+87S7;<6 +Af ]EX/ >YAg]01%4>32#"..=##=..=##=.#=..=##=..=*& //01#".76;2 #h + (%;'j +Af ]и EX/ >YEX/ >YAg]#Ah#]01%4>32#".4>32#"..=##=..=##=..=##=..=##=.#=..=##=..=#=..=##=..=;#: +Ai]/EX/ >YAh]014>32#".#".76;2.=##=..=##=.7 #h + #=..=##=..= (%9<';ٸYEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#".9.=##=..=##=..=##=..=##=..=##=..=##=.#=..=##=..=##=..=##=..=##=..=##=..= _<';ٸYEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#"..=##=..=##=..=##=..=##=..=##=..=##=.#=..=##=..=##=..=##=..=##=..=##=..=\';YEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#".5$11$$11$$11$$11$:$11$$11$o1$$11$$11$$11$$11$$11$$1 |';YEX#/# >YEX7/7 >YAg]и-0174>32#".%4>32#".%4>32#".$11$$11$W$11$$11$R$11$$11$o1$$11$$11$$11$$11$$11$$1 <';YEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#"..=##=..=##=..=##=..=##=..=##=..=##=.#=..=##=..=##=..=##=..=##=..=##=..=Rz +012#!"&5463;""V""&&&&  +012#!"&5463 i""""&&&&| +012#!"&5463=""""&&&& +012#!"&5463s""""&&&& +012#!"&5463""""!--!!--!6#`+и и /EX/>Y+ +и "01 !#"&=!"&5467>3232+&% {% mm$*  B""(KOm/ /EXF/F >YEX;/; >Y и&и Oи.иLи/иBи701#"&546;7#"&546;>323>3232+32+#".7##".737# ""L""b Wb W""M""d Zd  LL!''!!''!7 7 !''!!''!   P /A ]Af]EX/>YEX/ >YAg]012#"&'&34>32#".-160-Y*8 8**8 8*2y02 8**8 8**8' -//EX/>YEX / >Y012#"&'&3!2#"&'&3/7#$7/ /7#$7/2>22>2XX@$d * &  LxnFN$nZ("!@!"|#"#$%V%&&&T&&&' (N)N*T+*+,-./?B@@BC`CCDFHGHHINIJKLLM NN$NOPQRST0T^TUzUVVXX0XXXYZ Z[[[]^<^f^^__`f`aaBab`blbxbbbcddeffghNhbhvhiijj>jdk>k^klmrm~mmmmmmmmmmnnnn&n2n>nJnVnbnnnznnnnnnnnnnno oo"o.o:oFoRo^ojovoooooooop*p6pVppppqqrr*r6rBrNrZrfrrr~rrsssssuu$u0u:ތbfƏptJ& &3%: _ l y    A 4 LA   J   1 $I "m 6 , " 46sCopyright (c) 2013 Quote-Unquote Apps.Courier PrimeRegularQuoteUnquoteApps: Courier Prime: 2013Courier PrimeVersion 1.203CourierPrimeQuote-Unquote AppsAlan Dague-Greenehttp://quoteunquoteapps.comhttp://basicrecipe.comCopyright (c) 2013, Quote-Unquote Apps (http://quoteunquoteapps.com), with Reserved Font Name Courier Prime. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLCourier PrimeCopyright (c) 2013 Quote-Unquote Apps.Courier PrimeRegularQuoteUnquoteApps: Courier Prime: 2013CourierPrimeVersion 1.203CourierPrimeQuote-Unquote AppsAlan Dague-Greenehttp://quoteunquoteapps.comhttp://basicrecipe.comCopyright (c) 2013, Quote-Unquote Apps (http://quoteunquoteapps.com), with Reserved Font Name Courier Prime. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLG{  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMOPQRSTUVXYZ[]^_`ado\WNsl|ghbkr{wvity~epqujzncm}xf      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~NULLEuromacronperiodcentereduni00A0Delta commaaccentAbreveAmacronAogonek Ccircumflex CdotaccentDcaronDcroatEbreveEcaron EdotaccentEmacronEogonek Gcircumflex Gcommaaccent GdotaccentHbar HcircumflexIbreve IdotaccentImacronIogonekItilde Jcircumflex KcommaaccentLacuteLcaron LcommaaccentLdotNacuteNcaron NcommaaccentObreve OhungarumlautOmacronRacuteRcaron RcommaaccentSacute Scircumflex ScommaaccentTbarTcaron TcommaaccentUbreve UhungarumlautUmacronUogonekUringUtildeWacute Wcircumflex WdieresisWgrave YcircumflexYgraveZacute Zdotaccentabreveamacronaogonek ccircumflex cdotaccentdcarondcroatebreveecaron edotaccentemacroneogonek gcircumflex gcommaaccent gdotaccenthbar hcircumflexibreveimacroniogonekitilde jcircumflex kcommaaccentlacutelcaron lcommaaccentldotnacutencaron ncommaaccentobreve ohungarumlautomacronracutercaron rcommaaccentsacute scircumflex scommaaccenttbartcaron tcommaaccentubreve uhungarumlautumacronuogonekuringutildewacute wcircumflex wdieresiswgrave ycircumflexygravezacute zdotaccentIJijdotlessj period.alt comma.alt colon.alt semicolon.alt ellipsis.alt1 ellipsis.alt2 ellipsis.alt3 ellipsis.alt4 ellipsis.alt5 emdash.alt1 emdash.alt2 emdash.alt3 emdash.alt4 hyphen.alt foursuperiorvedo-2025.5.3/vedo/fonts/Theemim.npz000066400000000000000000003304701474667405700171470ustar00rootroot00000000000000PK!鲰VHfont.npyVH|:i@BK BZ-ԓ6m9^^ ((+X" ׊(*Ek&xw^okgΜ)Y,*ISYm1Ln;m#&d6 lɣ$O!C_C؄)'dF)F̨ 6q*VUϔMַfpi< !KP>p{zz<73+.x* OTe65LTHsBTH!͖v6E8VP!^PO`)h(`0`PpP.`8`zumXOl4R)+50Vl4Qj"5L0QjTjLj\j 0hK)hKր-TRT) 0MJt)Cj4CjRGLfjنiZiٶǥ pD~T6œ^_K64N2qHן/袣*{z+Ӕ,+=zz;wQ@YHka >Ӎ{q{ >p;n;Pev;9,qD<ղ6y06z`06u6hrvnx袡@Cƶ=Z4hn̢MMJj9`K`4yfvnfWVx9;\ɢzƻ=o\|9$?g}{חU*G:5Ӳ<*^uEY2fڒUPQķj΀ķ 2=^[eg%4R_H/Yf748&Eh@k,ZMc>QuQá9h GfMh"`8Z4Q4` 4D,6C,6I]6 92J--*P_e&쯘jfxA@<#aCkU[W-d ڧZ=_^?d8Nħ7ő3L>ʗro<_Z&-|bA}s;*{U}ߝ:{>MWu=z^saZŔs|oz Cb~8 N4>K` =ɮIt=Ecݬ]!~0=CXB:eRNOKJQ-ʢ\ħ|֔';;3X4_д-I}TYŗ_/|}W٣R2Xĕt1Fj''iƈPv,5B}X=RV]WK}[y_.Y_㕼 _aW~HgYes#ddN{׎Ielex_o!+ qQi,5ĝ6ħ _eY4?28yS/3EʃThj3>o^oyٴ1fłdwsWW!ž ۲OC Vj&r+ݫUZ1TCk0ѡ;Bѡ1\cjq:8kୖ0Q#GmPKŐnBT k!Nm(a"& m EjB5O<56@Apl 3JQmT6B:fJY΀YR6(eK]@HJ9ݤR] ހ=><>}=~8Gi i@p4-JC!0paR!p(ȑJH@s29hT%``ЖhKh`K"Bi,]-y=+ɀ>ISJ$ JK AD]2@Gr@GJQc 8iF@äi<$%dV8 *(M*̀N:p4 p4p1 J9Ӥsہכ F@GHII K pppp ppt(WX a p%`Հ] p;Jt]MwIwn @z?6Ivnv}p'C@w>w@y@*mR,If$[ht 8 Dc3rvTL?B\~Xߣv^6[KrlZ^T{h#!)2=OKu|I|N?dFO"6!k\1XZ? 3OmR_@ɑ#SE((iMu_/ʭz8=H>l-A~Pz"ܦ#GyxhTSO}|q{!7JUVĹE8L蘛 %FYjqE$]( 4 QՅAa[s֢cѐh}`}BT WE]}hDSx ڄ"̉xwhPģ .^"ZhA&B)mO" Al"$ 񗁂0_&P4vğAv́c;° ŞmW{ݠPnPB00hؗ"?`?=P$@J}@v CQ(Db8n8pba0t0t+*AaB DJ2q0pS* Tftg+%( #>U>^>bQpF5x@1fh2@M6~9i4 16J'JӠ4p4e}n#>Xv1۰i>=FV6dL^S"MoIrOr]NnkǴvz7]ejrV,W$oK^w@CtmvQұfh6Ԟ7kW`eeh29M6e$t'zna^h7+fyc"Gɯ*4_\Sz7ml|NNćU!^*WMƢ^y2=ol8ҏ'MC(}zYiwv]p&:%gYu'Cnf 6nA ),^H2Ξ:;&hE| &y۫y6_P]3QmD 6˳ U[+vWߨjڟڣlV½ƽ[?Zt7†ad_Ēpߒ;=]|:Q}&C`vVqsI0d-|>+x}>V'?ik9GzKq}2joy5'`L[gH>.62fuw?@_.f= Ew:<//q5u'o`^lVmӸʼvn>yлX&toCn0@r`$Q Z+| 1uIA?v$7a8&Z[$6#Dݰ%-5t4; M Vۡ#z3 ,m>ujxqwG_wwzf}4v3=PxN7MPwV Vz,^hoeVz Mya ]MB[SmC^LEڙڙ p&ftm J4 p8iwt-.Z6 uDTaOE3pQڜ t,scA鱠%.723 gd{z'6[m` nk=pPMYPZ FeT_`':_-K. 'Ns==w&gz#/ x-=[ pV( V:,i,@gI;8 NnFfroz7f|nY+\!KpB=,77tx-o,;ˆ#Tkyϣ⬏9=y\ x,=!6H1%5%멇&D~擊TC<-.\xgCqi] w[(O˛3rSR?Uq&1o{;ѳ]"7T~R_v~ߪ}P;_޳g:Va;V:sRxW~h߽ޯ<ŋ: ?改_[Iω>09sAp; R,ʲoVOZ+>FRX ªNBQqFcO4:p{G#RkL{! Uvu4_R̗kxxPhFIsC6XjjZm:0_J;!** `|uնo//fڋ^?a~#~"r5)!_w>"?%*IhQcY?}A I+S\r{'ջ򿔡>M =NZܮjyriC <p>z7e=JT4uZ^"hCD&fҟ&gi*M`h1{K$h.sy2W8 XK)5.2(c72~G ȳ|!!+I3!#lz ?Kփ{{[ 9zHPb? Юl ?\a׵o>o}WwˎصՔ岃JTϪˑZ6Jq-F{UnW:+sޫ4Z>8jeR[uI ?dWϤ)dt}.cA"kG|4xX࿋ 7b4,ű j};77*0C>Fj\gv>③k7nhlyGkcoӱ{zNz79#k1vDm09l$rH䱑Y#F mc;O`8jhɇ#w; E>Վ8OfeU޶;`ħ&gږ}G䧙hw.4 ir,s {?mY{ ~`'#89PꏼT5?mrn|SS{!/|4j8g"D(9ݟ39`N@Acf0Cɍ(6C0smz` n 0  @_E@_E@_  QP}%v҆7R#dKl)6&mC46*z͊QC[$ϓ7B|KÀ٣{x6)(\IUJ'R/k}􏁉"@ imA'/mD\89M{XRH#bme|I&7T^&Bcz Jn.^{Dcjv8]oqؠj}m@:]T㕥zwpJ.U2uP<Õaj;|WIP8ӎ}kK?} 1ɣ F5`fxy$e[)4β >ݸaWgOxx_wׯ]o钊gʝ֮=zyJ?UF'_V^ ,=d44%FW#_'ܟi Kmfw5[]s`-m0d`!n11vFyrE*&k 2d1XcPuA5k TYkf$#cM'Z$#+m 4婨"3MEgi*,Gi*2TtB.0 gPb@[BôF%B' apxfc4Ltf g.\(*MZe9@]Bw!m]T06sd[ #lnpZW*M2EBpfbS&317Sz317CC3Ct:D`xa>L}0 Ps-n\tc4,b\@1۩XZ }1[Kdot/L>pY@H=Ӕ01>}r?mlȓrrE?ԣFnWV %;ǤMu%Ac,f\66vOԈ;qY S;H5AL[0_i7ST>/iP׫[vU/)G4y'ǽ٧a^v.7]^~;j# I7:BwA*wa}u v~H_;~S f/-'ԷI>LWWjcp @9s\n&3e3<5 Qsks/=4Pjk270ǀ-AG43~q{qys*o[μwy40AF5yfjG zLj!XtL׈L5:rGSzY;2ݍFki2B|l>%[o,ϫݕ|O(VCY%gVyV8x;mppR'z yx+ȆJ':TLspO. dv]jHm;f!dE,HB癄 WC-Nu(kӢ1 8Yp4Nl 疐JȂTfv2_'[0) QQYEy$R,Ll>+:]f>s̹)ؐ ,D؈zFV,7c6D{B)P2i8-A39gb!YsOL@{b'Z=8뉎3J@W]i"D"LD0i$D^L J Hvb/LA:`6P"[X怂 Kr`h'{RL~P;Ȃ9`,X^hb25ӏS78SƏiSq4L{a(EjH4L~pmp4 `"(3dt1PZ(Pa8`ċx=Jpĕ#Nfe5N?5 >NYϾe70ހC6R";Չ|AJ{CֿC]+>SѼ>ǺhSi :ܦz.ozYC }|w rL̡gt.iBћ5N}zn4r$(ZL[v0p>Rgcckae~$DVyA^&_P/降Eb^<~D~7?;\{_hg5fe2: /xc|+?'6((kFg눻\fg`>w`k2 i4vT f貙ah4ThCSdC&Xod4Bgig sD &@+`(8+h!h">KB֗i iLޚٞR (ΨvFٞJP$Pb ` ROdkC000 8 ~~Ww-`pҟ`ŀBKhY'*q !pM`{ql({j5bk`χ=ohR|fvLoft 釤 +/W KӟѯW !Uzg}vU\Gq뾗}/صWz}7\^˻Vc%J#zjVs$tͤySߪs\ѓŎA|ŪC<0> ⟳uG}Z?M_d+YhCN֓vW\s#\r+:w+kr< >6+e!8{ Kv|9Y`hiX-mSsz3RMd ߐiJT;}7LecpRBCN}鏤J sdVRMݘ4:?iBvvW:NIB)4:*jsxq޳k/ܠe)mn1 Lk7FQ8-M}cQX{B %ř8 MIm~q开Bqsss/5ǣJ u֓dY^R_Z %'H:JtVz)˔SJ-ך{H֒}i"aO6򁠕~ƃN2C1Gv3RWSGW6} Oz=NOPmS3EΖ}No2^虬QZ*UZCޯ=* *F9I5=^דzP~0Ꞩ.ZVOgKî+_p6S&}e9GMRhrD!=lb dw'; l &~Y-Aᆡ1a(0f𲆃Chh䇣b@pqne|M0_Idi/^6f$yPۍPhGn$@Z*󤭬K@dL`og1 QfXA~(P#@P8(@qPA [`Ls6,s kBڠjϒA޴E%0;1?ZZDV_Y}%2{Bb Π 8YŒ_(Lyddd*PMz*zSUT c~탂 >̿;`@ ݁khkhkhkP  ֔*i{=fXi,gA֗dx{ߔ px =n_'/snlr$3'^x>.&V6Y }`ܫ/u.QT֨O)A[橓*7L~zmA tP ygpd++XϘodF}|{ ojH>JFMdQ^ K>{y|l%?#QeȯF?Cۯz,P]*9\a%vf{n6 _Oa84L[/ ETjQYae_!CFޥvnh .F=ll No춉JCRm & Ǥ֚y5+uD#|%|SoS87o80(:taVtD#ѬH epYپ,Xh?.4+ 45R&0MBL(BcKpZpC#}M%Qm@]©F08QtILIװs&ǐMd':v;-)MI;{p}hZSxc{؟";HWI%yAO&`X?_b#v֔U;i]vI%뛌׌F/ #|$/=x`Y~CP>E`e8s>[ۣTôwM.Vޒx HߞOػ]{]Q^6rZ<\}ZCzLg`hB%pϯ ~:oi4 #tDʈFcsF#.#2~03g9i 6Z9ɏm[)ހ{y!y}MzeSl?eq,$I]Gso&}6bE^Cz_զ+z>y-5τN!S1w]Qz[! H!KFCmHڑwNz8NA_?Xr~jsՍ.^t!qWy~]]˫ϗ|zڹE7`gL);+Tt|(+?|h_Rr9Oޡhc]þa| Ϸqʟ3a73@s~/Ѽ?%9,{F{چ zj٣wkb<]ݱ0ņ:=:,ڨ~<$tr|Ⳳ^ܙsX']+;9Ϲ?x}{ȑPf+>vpw=񿁣t zo{vfCjDPյg[nm/T)^+eQYGaP! HQWG}g-*|I7%4hGƟzۏkl? ~`צ`zm+L m06 nEX!S0Jضk]uDQ?gu C/{6koLm"YX25$<kS!A8`E-XA?Hat-])oI"DF_%k2 +^hJ,:ztkEDqZjyb<$5;OVi7Jq}N\|bmXaVBϒH|:yѧ4SDjFfunWVJ Џ$P]K1K1 Kj*+UVBp5@^AZ\~7.*N+[kJp%m@z)ۥ@wz);q:.%=hGeFI%:JzN ni/[zn)O÷g,࿤}JK/^|!a{~_z~U׀=<0/qupCP:,oKz n7Q%PTCEl-! f4(*ն1Vx擆t+ɔ#Gs33'mɝ{@{Y+{zCuIA$i4?u!chEj8A7ܶ\#AXӖufD<キA3Ce0<hPoOnT`XV7eP@ԥRK8aLqtq'FH_w^6/dOZV ӍjϖFWi3BA} O3I˜H:ݍp|D3I,sy>Kib^%Wh0eOP)WR^L= f':6H~P_I46diA"o++lˁkib7WomMYn֢EVתyir?ԞwZ;E?Vv0uPn"4EsfDL*H5xDj0oҿ1(W & n L5Kx3i6&o\YLYyUYvfUOU]G+!~sV 'e[xP?I17Ƙzv_mi=g[h9hնt| JK0Zm8,".t (n &0@&~ĞSWe8/@E?bb)~\曫yxֺ+8}}y^3?=X7Nn+<-ԞI}"XQ=I4^`&?7룬iFpxtdnv6y"in/ t9snд|PM8kw3  )8SHA?D..h0ą#{C;㨏m vS 4cF0 rpac{!)? پh"EXP0d4qq2 ɘ}ukɐB )h*ɐ4RdHAS_/;p6,c?(Xl=[}o`u-! YfEЁtZđd$ >ߒՇL>5w--u8N_|!I-=F~0Z E]C<5v0v.飫Qmq?˓荋I#v.ޛ>GP3@ q1P?S{bYY*^O{b-{b"5=1q F,5B桄‘7C_G3S07)tzrkKNj6D=olOK_|l-˒b8,ϔN{e<4EKԵ=1bP?+ݍ3NѮLNv}2wlUaZ®3B>u="ψ}b,Fu)X!\%u῅}= JA:?=?Y}!ICK$ɲ2,Ǒ [haAwCr@ZindΕ!d\ȲB<OF (R00 L 0kg ke'}`-yX%_RK=kk~f@A(njr/W/z~gg}&3;Rc_guq ÁwEZ+/ŨZ3"ДB' u1&v.xe>S1$9ڏ9 sbvY jD_.:x2:b!wîށ33YTJ8*[G_׬N|uٷԪ^q/Fuu'+hi'jw%Sc8wWPF"%"&)r&Tu5H  zc}v]͑#De򭒯VQO_?UV1ѽS5,`>&r7X9%/{=ݗ+aMn&~~2cra頣廏T+M-Wo\C?w|U7~I!BzHHP!s˖sD R +PDAFȃΙ=7P|{}g7ɽ{O3sf;8RRnTC(\bErJ#(uJQFctӍ5l C/gFOcȍ m- /l;iKfSϝ㱯ws[0[Yi YyP@[?T!bԳ3gوG,0z\$ADpdk&ǜ cfT1XoN C98lS>Lo6:m `H3b߭%p8TY)'5ul ߻qx9:þ~~+k","`r%aS$'Vhn`\>{7;|ە/.9>vG4ϵO<1q8K.=pGUmX%/H=K(ig >DO~^bF3,N D5^~FcFl>_hE_a_lOKn>nHhf\ڦ?\?q?"PdFHAt]\s .R,]}T 1_ba$2Suk1c9*7fVbfU _s%vs}V>>=&`X.G"#qe B,\q4Rs48=rO8^8x4i]o bqO!(|Z7 gR1.o[?*OqG#Ag~yQ},#8O_KzJON[g9,F+әYC$c KY(߀͍z#Qf ƿk1 _:)}<;9eʷOhܔ;[S$BevoYw>r5 oY]ƍfn0\ &1x  pw?3+xN|z-V'У$SLD%Z^rqcƿ=2q@Y{p>}Թw#̧p7۩nXdO,P3BiS7G`UVFjށPViF(!!FEc#|e?qۋ՗fw+a߈þo>ahs+n1л`G}D㧡Qe N^@Xq=1 GTjq"\ W;`8Y!Q:]{"2G`@njq~!z=MmAt堑FvAS[F3|Zg>Bc]h (E|l,tX^{B/nqa<Ȓc2/+l2+win\ӿ* obM37z=>H/7둷Vl2tc!_7_ޔ;\&s/]G2"zP@h F4S6GU|U;n絚}]p_tdzԫAʴ2"cp8P_l !xfm!~?Λȣțȣm(f(h(f(h(b"\gri8*K:t qƩx_QC= 97pYެ|-vJ~[;RJ=)]j3j#n0g#hw+cwk-^o-c{e 6w]܍a\/!U֩Q-TlZm9+d,s^l3Vnc|#[jMZYUT9ª*U*+m}dDdsW=K*3ȻY4U4W7ܣG~B bsV/}WN=3tikNt:䱊[vn=vW{Hfj B })렮!J $ @+)8JR0܇ cb;r(NKZ8^Ǧ"!ۋBc<&# 4m[7H=chymV'@^ 5]g5S{"வI[^<>o[+y -`ܲ`dJ8#VsJ#D5 Z K}~DGIt^Zi9MҗjXl qzVz^-S eӃdڇ>̔Kd+h{=eR4EG2VzBVW+f$RE#4-d߰Z_ h9mEV\[fDzwh$讳.vh}O3AN˜o4`ff2B'W{%wkw+Eo܊r-hTܪƸvJHrHi ؋U A:cgrEL*L؊+TX\soTD0^͏'ns_[~&HFb.9#jo"k%[4 "JČEhPr7 x-<ɮyORPK$j&]IWhIN.PPwvoBBu\Eɲ5N_𛘋k8xK})!=t;'Q z菳PQ szoѾt`x)+gS7E뭁5W1(cPA"PMƓzhe!nb_$q±EzC`b-_98tJFT~kmX1ȋ<փCdG`u4һׯUOXʓ[;N3}phM}mᇉb'5*unEmG=ݘ2h6Jrl{@7{,e A1ͰKB3 ٲD` }{H=J6¸)_ ZD?L-@CC1Y&$5x@cJ] }9ڈaaa*f;EsF@8IBGWsZ?C7GOUvm w`ۧKGK'_(@g:No W3,w~8~"{ (}s .Ӯ6DvOdt||s>b"Я/3z[w=iT/UVd~w/kaFǡٸ#Cydqթh1atg*=H5Y` bWң(A5Fy@)0{Pz'ww__*O ..(4FA(fQX as|k0h񖻮> "UQ"0jS䜦xd%7;?u@ýlYe$kU"y:/S_FJU)Uo?TC٧uxn>wxn}>bZonMF`ښ#yÐ|F}}01E2E2_f)>iK<ǍnK^PE~h {b{TGw\kOW|tŇl ‰VV0{v2NZd{;$>a-;MQ;x-l1ѓ%҅%.`\ݠ6 B/9:qurP{UNk_j! ISVi4f ҄fy]~N,.JYt Bsd+(G( JJ  ^֍5f%r/YNCORU^TgoRR W(ccX.ŔvvTgH2A7ew55ۙ[^z>oWъM(\z8dpk'CJBiM% 猇k.n.ЅCN oy|E3v4?mB}ʻP%uM٦Mg5cҔfҧ::U'X8lM@L>r:Uj߱E;NlAdzܧd*HEU³ҏ;K|/ϡOY$<%f3۳<1,i4{Igi?N,zQ(GY.'Y2y AZh$]pmeCL<B +aAK 'f3gUt\@n+>Y)sr}5Iї6;vV%]\ݾ=7F. cu,X /{;޺J:7PĕUWs@ j wl(gXc0|r1XH/udM1FRz M:\30ԳJqV OrF?W:M6Vs0#v  ( - >9Cu A(bPo0np-;`a@]7wh9m7 uީj^$jnC]x| (p?RA#P%ӥ,=MKߥX4y$P[ }* 9d74x'ix *\Ii'QE ,Vl:B>zA4$2А胂c2} xOVt۪v+\[;̣HjY0?FV,'6>ELF g;GIozVH e:)b`i9E[/$' I9ўt-W 0駱< >u(w+_Rke`O-c4UC[В ;C-V ,BzBu"t1gtl)Τ9Y꟪S&{ۂ~Cۃ=bIoH iA Ig/ dniJ!yDG9]9SJ5 ^"J0Gʕe*|FQqldAy\'pNXӸ$gj`7kko4f &n(TFBնp"Jw<1 њO@$΢ȪQC$Ziŕ(Tp: (S!!j~W!@WaTj2Һٱ놺s1Z~gACŘm/Q# Zս [N"*Gd`nW*?R љ>p-5#T2(2yɫEU#E}!(7gjcҘ*jq}ZZz8WUhCDzmR@\`&&K U•64yF{%IY"P*rLKvKJYmLty\% `7[Ck^;#&}^76]aw=e2ی]ӇWL}~Ro7&ˌgPGcq >Xl3p.عK1WqsՓs%}@ /qk$v׫FW!pZYZ7X^l r~V^hHBuj||ǹ.Iim&[gyb!!$绎y#nEkg}^z;=Qwk 5PĶ+.æq=|Z6J+5ʮ OT^c=ΩcsʖIS֋T_T 3E: p̖>W ZKȃG+Zk?/M| RGq_sM7?\Sc=㥡|tg؛LgM*ݗ s]qpi}* yzSJyNx2ntF%R,r 9GʦȯKPfW4s}=YN`k)jW2L/{ ݬ/6ubNt#9t$I f%&&mc(]@Oct*iBzc8׾吪mv^S5lUjwW/UUU\}޹#S*:wUǫR3]%ߒOyT9=TIc.8S;OϋV=']*jWʿ))J:4BNbs? l`}\*BQԵuEECT=x6]Cmp~\^Q|E|J.cqp|&"6GDzd3q-D>] Ogoum\. Zn KAk  )L纣2 K`Ki;bRI^̩9y3J1R D $|LxR >3Fqc]r#D@䞃A@FWK3xd?T:e`(hcȨ;tt jϨOsLGTkQa)ptVюp?q -ϪEo/}3N9a7>sbpg/wPy B,x,v \bٛeXQxr,j~_YSֆm;ww:0f^fm&S -=[nu<-/mot<.|0mpx/u>nC;ݬw +о nr7yA C2,}s'Nhy;n.oC+ ;p]%Ю].q./dZ*0U?u!DiXo澗͟6ax&PѪY vlLlboupbWËm#1_ü=X7GhP;^n&0낋zTECBt' 8@\il-pvxy:#Dh;"?EL [A]q=`;ȄD3|a8cnw}.?"Bq à1xP#cj&"  wMMР !@46K_e 8Jq}0ְ<m"\HJ9ns \)++f}QZ8MeԫvQZ*S7>O-/NԤaT&~uzo5pu@2gΣ{Y2w3_B";WqKFf70P0xC1)/'xF^2bđ\@m9C%*NhquZi!vU c*͈KB#. 92 0 92 92 8gp:ݵ5 eIvʒ +8êNYDl-9L؋͞Rb'uԎBo].B;f1I$WyM~H֐IZB7K{\X]fKtgĿ򃚥9ǜ﹯Tx0l@yν^&GiNBe:Ô,nXcƾ{i(-7FkN&Y{RO$uss^-OU$ؼyO,Ԥ8N̚jڨj Qp"anFkkصj(- n΍Rb2?'$TeKsvvr06_ hA4GM܉;K"uBжJMuĐx ϛI}̮i]zV޸-% zn-iNCwvНnEiFSˀͱȀ xHw¾ :8J-3h(d}O. º2l7m:[Z:VnP,kSԦhj] ;{C~C>$G-'N%9 WO[od,rH^߃P+\;jkIγ~8t/?9!7k(uB' L3$1&N&We("j3C$lz<>Pa&@VdgpD w]iU9:ə1?MIa q!AtSvlwBu0V{ LUi'Ζ"E/+2pwh;mjdI '=QfyOzQrθYU놅ڢV, En\z 8Sղ$s: ;+#hc&ƽ6FrV%XWMfc=Vk89|C^SU7`ys&&ViZi]> (L|be)̭~^=c0qaQ ՊLȣ0sYi^>䪍ǼM$l\9vOL\y5,y`ɳnR_ V8L1>5;8| VY0>s) wpzUXu%ZnpcRbًf?EbZ:cVw{7BiQ=qW \}]1{^|/338#1Ԭ ewA,Y d FVQ(Բi>Ξ :Yt򐠓Μ= #Э W=ΤiKf}֛E{4^cGHڒENuB(M90~f'US+銏r+D2}#[sc#3"-aa;|B~'4[LVf.l֚}Bez,Q͇qJ18e5F r'oi y]=ָ,f 0JcG0I05@ΌC45`ܴq *9$n>h!Xq O+sgqi清9nO-16BkXp #"9GqjWRds%R*;g11b3X!'g;Jc\gB`9U' ~kӞ4iWK5tΗ> I IU[byYW[Kuҍ<,)귪H.a9ɧ]H NnEVf(ɤڍL$qr^H3IlJR<]V46 o9Av-.f_hOVF'ݝ\J\+Q;<$6,f]li?3bs;EӋiJ":rL)PRWj2@UQ>U:*Aɂɑ6ISr=eE49&QaK)Uz==+6Z8,j8mfUG*4Bx O Gi:f8h3 ˈѮ&0Qo5ēj >DZtn*d<0_~ -jbw&-,lvzKghFn 6?˕2WKyO]I.%ZM/@v/ci, $ S|{/eR"tϩmY[ts,'In5aɅ' 7po-1Ν8η8r:{Gxwm*HhSAkB!HvP"X5Q8ѷMNZXOoP |^ Y'g2M '^ovOۺ ~!~A?!:`37ڬ5%1/NnZeBk~8\;2#8*:v ; \LƘUFGc,"wQkJsukJ*Y6p]=7ON{>B =֔PO˟'3ѿؿ~60ēb{L\@& +@ o Ec?+#'7U)ozGwXaq@`!r1O8NN NY.VC;gCS?WǸ/ˤj#Yց).eBP9 +Ađu,(;mk;Yp,ZXGfvھ_~~D` .%K`{ptCʶBc3Ͳ0h x9g( +\5I( .(%#_2H8-  A"p+(FFe[z|L>5qϗ߶0#б5< ~!+=O"}ҕ>Ee E,U|uEڬvQ7tHN:Cڝ\n+ϔ#䚺^ejo(XH'Jj\ݩzՁc1HPOFbc` W\# 2N&VwjEpEUWZ[?p>zd~Frsjg߸I哲l/j#irE3ٛfBz:S'Rt-5j(,HL}0N}\Na, pU8Nd ̼$AOBB1v)T p7kH_dU G f+\ זLOFr+,AhJp(#fIVD;k/PZu> [vthJktCqME\So,BGA>IJtEU> `٣;dC=dW*8<* +DaPfaS&Fe!29&H6<!# #߆w/.ۺwICDa1vω4] 2ѴVd6Qd4wxl |l]d an~wny?+!K.ׯJ_XS նne{:z<==oWkIP~U"M y9PPxC*ԁU 2(2W871+:V8*FǽbaB/6A,xI0'WeBOбgtPM?9IƐ$>r4WHcI%Jn!K5_7}R!?U3uñuckũg$>7@0)'[Y8`GYD1Gyta[z|CCo WOBWvK4ڼrXE {D੢.G0׷q2,~)3)"zY덳GZN}E;Uj*w\p\L^/7p);J8P` )Q'mr]ٮq!g3^lW+ -V.tٙgxQz**>f_},Lf>:>P/$7N)Ę☳Ę8 rҧ=(2aHV` Ŵ3{`xQ`=OZI5$Sl 5RijF/@mf6N`m6  01qBsĄ2ND#Ğ沛Ky׳Nɗ>Uj}J6U>Î.TȮ;eY(SQ,'1mVb IsnyٳXZ"g+1 %jEtUy~QV< +`>ZS}O^ Guzv=L+TxzJiP;4tE>IwjA~I9iٵoa\p򲓇sTyNGiv'[^g3uu\]>o]a}`0A3Uhm4M;Y[/,bjⲎDX|\‚%(R? n\'LNugggm9]LSPemQ.=@Oi/jjjQ }Fy^~E?M~nMZ6[_w{C 1FqE?WOHAj#mg!څH~SdJwsct$kEi\LЍFU2cLQd;H2Z}VYۡΰ~JXE%w[J887;{˒Tyj#9|QitV;ϗ /y*(^{\O^(!OJqRrtO,QBںsE&~`2WSߵTO߫= VϺK`4a5Ч25ABbt1N?txV^qqy>l][V484G_?}77~g JyYH`k~\^ȶy z)2'GYcn~QKJ/ia%CFpNc6~RgjyAVοCXn(mQ 'Rh,MO$ XpGofc!GcEY=Un cH&%p%C<,;Dtd''Er:6G otdo²g w.#!fg0 .OA-Wh _ \ \ L*K5eĜ@q) h9LSh)Bkz61 [c &hB&Cnxhhs]sh[8&BMz#HytĢIGLtĤIMÒϹ§ 뾻NgB`^NDlīf Vl>\>|60h(6 kb0İa쇠n1b'Q& p}n8ͣUp] ]wkfo-wc\W8 p]X p} !k]kewQBF0FZcŮ5kڛL׎Z?mVںHӬ3StV$,OV$vU[fĀm=Fs7yCYs,+w6{:cI쐧'zWL fS)[|u\$s6u=2ɥJf9r4Nғ\zmڞN:- m|`_: pmK&~}Hڞ>Mv=\y5+OZfl-5=\#4r%^.+$RoW[q{Hnzj.Nj i=AH>[w1SfvQzGb]0Р61V4o,$RM1DI*Z-s;S1ǿp-Oj=u@|QDR>;/\S;B..-.aZ:eFwxL3:q&SPbJjęgiP,RL$45a0}HmVG@@OΒrK*dzP]9y5V q'xJ>+)X>ӣ?S@}, {vJѣv: KՋ,I9E,=6j ԾN~z"Ĩ3?O:a;*F BH !BZ !=[nw,:"MtAP bCA#%Mޱ̹ }?'Ϟ޽;sڜz7K"TCN= TzZ9¸4( m8.=p 'lOR(-b`pxCMݬJrڢ'8Љ]8ݱݞ帄+,tg%*+:˺uX9:"T Uط9^,pp?gtHQr?RV7a 8T f?/fFG,hf0Ser_0#67nfkkղJQl~-op?E;{TƲ* qKB8Ʀ̆y+ =jCFV@qG&夙6NAу`>NkGI64$1~i} Lƃ>cR^ѿ3,=VCI(]>eY)g4Vyݠ= 2([Ukfjp^i>.'({]49Ƶ^Y'V^2 pz[Ud}:KK ~B!= 5k.TX2}% e ֖״Aw&ktvYaOWN#y216MߤXKcҗ$x}euX.O?'?)7+rYQ6߈IlI<_j=d2ۮaʨƢD(R{*Bp!9Rlpi-If*ŋJcDLp|u)D7Ah B27X:V;MzR[sji(f4 Iêb'wM̾&$G!  ihBJ4qFfNW1ayqoqqbP,o \\p1^oFcr,Mv5TWl)7v̖v dT)f 3nC=lO.r@Z.r@Z.@r Pp@`Cs5yը`Fr5Q\jݷ̳ɭdzmVMۑl$CHWe&)Lwa$+IR1T u"Q']KΞȑ9^Q8YzץJ=qHZ#i~iO\JwRL?I$Q6R'IJ23y2!{IKxg4ę%9:bۘ7Z֛gBV=Q_w=zSxEMѿՂ67vga ]x$b/#t|GF1H4` t+V8N蝍>P{A 1z{URƲv~כ܁۵w.ZHmi 5HJN='6ah(0}SlZigVoh%i7ĉ3 mN(?-e׹Zvz Վ6)j qFIv$C\nrA 4[p6k V-6鍅Mz#(/82d08CYߡ#ۊ"Wt}Q P<ثBۜD(g6nD{,gRVʿO^Xi{Ǵ0ӕ0e:UN>fv>t\%ǽz̥#\C"rALW/>VD;t;gSB=y i6;{ϛJM֣t ŏӞx,|yc{>.{>)a?a0"^%뽞y%]U+xrx{zuλ?8iwhsk*Hu:xmCq;&>Ԛ"_}9)d9~=5 V,uaܘ};I$|uY0s6+3tEݏ}4X ѭ]Ev1̟ԎV,&L-iS-59My4GZk풢ސbUr0)!q[ΧktD7jzrN] bkZ <[ILx9xŁt*7?GblS~L}%k{dMC,M1I3S%p ~hvÌr۩xb'eប1Mk ,xO^KO$GBiYp`Rp,ÞZK`#UEx]^EUـ~] p-mV[ux]۰ŏv#].8ނQnwxf?׭xf׭xDBEZ] X{J޷J|}%|`{CGV'xOJ_XAϗx_Yxo,ه]>ܩQԭWkZ>𬍾Fn.( ԋZ8٩=OStx4ܩOk5tmLw#2uV;HΡR3G˂jg -Nk?.(j8+d4E:߹F@ޡLTvptէD=G6,u18$p#C3;o؃Fi0v3 ;GqS-p 3[`Ql6Lm[ôA:$bv qL[x`xplȀ3M *-UfʾٹuDZ mRe2\yWΔߑR.?&KI {e?j?jwk[L4.gq8fA~J/fȨ ctbxQ\҂!$̆1B-O[ 9^V?9s#UΎz)^Q^VKc_WI^J1)\q=QoیE@%gh$Jk)mmuޥ46Y]׉^S?CoݴZ9E'Y=tUcN: iB;Dzdl-Q.Lc-Y,| O4nK[--h#/Fgk`U+({yA~ nP-:̹ikmM#y9âNb {cjtk-Eڥ9cjBsϤݐby"5YI4%}0@^E4jxnݡbT`v*ic6mjD*QHD" i6 a@^bk84Gmg]: tj#\DN+mG %I"% n01jH@,Fu (Ęf3<^X4A|oWn{p4.+#Vk OO4Q~WqD!GyPDu9˺.KW%Yp3pw -G Ku>JsJo>Еt]L i$&r$#H_:Rmelprtw;z;8:?+)h<%0pQ G'O*?h!Z51ut̗ta4#>/NY DiZ=b+ܚ';\ïe6(mc8`&OfLŪenD<Zy>dҘqy-<s*cy-QOrL+gd0`z+pBbR{ȕHuvREʕ:4vT@ W"N&|P'A v@-Q;㣵:J} !)'ϑB,c_E=QYR&ޮǞl:?uγs={ I\${Q%Q圜ܮ9R~V eyT_:ࢮ\"IS5e l'/ȷ^D橇li%F]SO+GuHSȿKgץRU~獧j֔3g?셳GGM8w(QV|㲡eoŕ*RQY1Y٪"`YNevYKr6;g*=3\{,86eƖZޡbm*Ȋok=v\;uߝb\NX$`ҿ4D ".XA"s[;H,Ψf_Ԗ뵅;M5jFzUٔ"Ȩѱh4E#Bk:wK4 gaHG0<҆,~GmQ-( JS+Jkbt*&1GiC)'!V^v9vHR{ҞV;JU e=,Vj06 6ёDc7SUF?Ƨ,\Y)YZ:?fzؑ1;Ma98z3jun: o)]%0W¬$r֑Wg&ȭM?y?;]4}=z]Ӌa剱`K j1"}0O.LgsٯpbnklYgMytϴ5N1\=,2 eo]`grYKzZ2ۭr~˺vqdhMTlj6c ff6-=\;~[`ޤHÚ=Vn_E6H-dgd^;(L{{'u9xӼ§?SuW uĭeAۃوsh;Wlύ=ym&5)= CK[zCY%s.ssΒnw͑v_J-J{C*]Ǝt盎t|]\;O]W|\V\(~M[_=S~RUjl`mc9affD`9!b+q"Ƞ5vrlFWojf!_]B8o~\¥tzҳ f+:-˺uXLN17_~gRZc)6x,2f7*4z>l {ku?vT^OgX4X";Ğfك jְu+'aFÌQQC!9V<(tu̘s6_i5Z+ϵ +J}I#q4@_i8@IhqXtX[p9׉ϱtҙ5X@W+@Ԅ?f˕DBfSD]!aSr6]1)H34S35i |"Wsf #E`"Ǐ=EnF17H llygnF ]lBl-b#oō*6r,]gFр'@cr>aej%oFĸU"9_wԉ1H7Y{I " b 2Sgv6u b=:}^w#gﱟo7lX$hl )!BZJWk&4#'eeRg [yEaEn!D'B=HvP|I[hO6Z "=L`u\%ѭ2\]\uzQM'$S.zvi9~vyR:(]níJ6muWjg1uǃj}!9Wk)Xb-0,_鷮8g8eQ2c Kjfvgʓ'pU qva-Pb -ͮRfXWQ7::sםMO,hx@[""#)0bBcX4 uۙz; qSw&im@a[ Kk槶h~j槶h~ c@ozc, !0X`'.;_qx1.$MQD<,uiuLi10*r Ycl]wZxS'mIރȺG M'5Sb  G}b[y":=(F Uy?\U/ASIfn:!e y c0Y%q6 ]q'\.|? 7"hV7ɽT MUi9A#0t!|p<0p˃w8< <$s s%L1HLq: &1 w<6䁸Xd*b}aMKNTN3fE[EX`ͳ! _~0V GD8_~\RnJ^Qch;N2gII$o% 4YJ^:jrn?ZH4cfL#&gK+2 ٢Ӆ+P+o+DqW[WW+˵A-?E.t#i]a7}MyKo.#xljK&cor>`G<-`l<3yg bua13[C4F|CElAdvB =@cZFaD#8Ƴgcνu߇ƮZ}S%H;K6| v ʬHUל uo[]EUج %|/|ku? m_6WB_V'xW38jii ikm?ʹശhtֆ׾#_i,3%TZ#j_ Jn}ڝ<;;?t')3Stp{4w{{{wĽϽs2xwOwws_'\ĥڊ2߈e;P{lYkƃDj3y "]$\MUAHA#A!X" B} !.He򦖱nM6Ax S^P BI =B vcē_ Z"@<zPHϬNWfؕy'*PpŴK'zu<-80=gL|W2d0,^b-4VElٿN4zϳz&ΆqiHΫ&ܤF(URxVq+`X=Vweq0B'M&z#xtϯvp>ϭoq_pv'1^?k=?o;4?NĆ`2 X; ܋sSTZK єIKAȇMGwf`Uj^ o!9G]w ZcJ'<)Ġ$#1Z1jZ fnfl)'#L^%R^}>0p<[$D)M D7y8=X衎Ⱥ,P?=,cD%7^?D'Qt}Rړ`/K}nֳ߫f[/ %WBG !} CA!zqbPȟ'xsIw;ܩw.3ȟ pp륇Vzh(.cc2=zX{&MzTǧw[ir+p> әIslw CAPpʨQ-2O7˱tD)eX nfNy"Y$\lpnp3YN : }h;:㏅B $BNs,g{Wg*?RY/}[+vw(ƽ߽ 4\Y;b/0^0:JwQqjl3b}Aq:a!R]ޮNpRr?(/o2&^ORM̦R7[cUCȣC>@ZMWh h?m ҾwW|MyM&tb+mu=8d7 kH\(+ʹK4ڷ@31fv]5MI ǟ&^uYO?R:08)(,mq(w9Λc?ŽHBB90\fa_ ¥EfE+[&De%z6unK &Ɖq=Z$Pj}`I4L\N}Euց,`2B-,ikŞ8V*j#-ny휊 **O/j!T+Zv>DWӽtx>1H{zp@a,"I!Mi;}6Yo?ӷ_|R_kkH~Ehc۵O/uTͭkGOYq}`6;ng vzSkSi8^N#sMN )չTi8Rǒ ʞ ]xw4n uax}?S}K$V:_i!$!7P;9ͱgJso[>\+*{W U+,\춲r *ժ:U]G}PbgeEkUU]ZWUYyXy|yEZgGXgg{z}ZuQuN-ctro2wM-$%2-ꕻ|Eq*WթS:l6ur\S-fhc1(4F{#`b]BegF>A-bc#ˆ/IζB֌j)R=s+(Png[9"ZՃ>l\jBeg=rX0XD`oSr<5`Exoxι[rOLq V_Fs<=<5pίBQ♰Phyv@{PSu@. -&Vϝ5ok5 Bj'ͶfaIq86tLlmX'`67}r w5 0Bh:} x S!؆b|Y{֍1 WeX}n֤m n7/Ƚe{4,ģG[٦c ?8+Қy՞:zf˃YELl~:FPӰH4>llwr=yXgh K,Dz=\o`V]FJ5yS0 [af lX hXGÖ֯հUk5^a! +$"xnX{ d?K^BbqdI҅lSS_ޫlVw++( b5JQ𘩯c1vdlR iR;!F3l7+eŬ-ۯbcY!Kaw"~^{H[eh+5^ bZL7ߗ ҵUï M Mk\'\v?ij\'\DVb?m@%cIbyqyS,ZOUM=h;b+ w_3l-cЛyg3_0|k䠭QkC[c$r'\ Xs8q1W<^9z |3f(DޑI&L”H,R0H!3ZR~PKDŽ eb,:=l~-ԓ4JKibq3iɍЏj2ݭWo{RZBZ%hAbyP -U*?0ZZ4JKbspsfഔ'h6lv*k'jv83uTv;+KZ`B|E|v|}98Lj敞BS7n@*X]WL&P2 QhmBM= mQ0lN-G K#QwD=0q][8:!r@CjB;@No>Jk"'PHOBzj}Da4q'n˂7{$}ي<7q 68IGFd$`VܭR(%P%B P|*z :ߨ+z+=@NÃg=<pu+}2n[l1Y,^j'N(׼Eq~B/-BiH=@%bO/!,PFqk_,,땅ѶY-ѶY7L8/sc2P&ȱLĘLK MOaq4,n-:֮)pqdRki{@.g*$l4xeցYn0Fp`4b3 Qr-AN4ʉ 4h:AisΉ&(}\iO68ZI EyEg9Lfj >?V9/Di=7}OGd)8)M5I)}_u2K] ea\B4!od@i Ѻ=ηqc/_peWz/Z&~U_ jG^k\x_++R*ʮ+c\+uQO\ Jcg--ZY+޺R]nĻ`)Yԗo.(hE;;tlw0E\G]]! )7m*q,%7XJZ 都pW* Ennպ[:݆MSO aqz |L`R~8DHccRuD+HF#ti$(ͮ%_M7Hsƒ1i 7[])Q CIXʬَ˿Â=w .%w%dGݻ6Vl5Uٛ1vOz0 g`6cWGgwAa,5n5;Íyn3gq?;f#/o&}Ll4q  C[ M7]F! F;u+~cW U 03i{^6/r_jQғ yPyHn~W6n'GUn\{ؿG,~ǯ~A$AμjPMeCVbZ0OJ C^j\wv$)L˓-bRE<@:r:hz".x"!&`\ EbCjoIxXMP TQ{v҄1L jiDsŹ5g^Y3yQ`xD g-BxXPNvXf0Vu(sPvD1t~]Ekõ%zj?g#KTh!X2X]~^A6Dڑ3E5^)J׷BN4֑C6V $kma uJթSGpRcbe~"r0 'b <1LdaM.>ESֳݞ+E$CKYMHK҇ %ȋƇq;^Ћ=E]ohFxX[F3}~ ?hD_zKFuAeTDJuPYqxzhoeekS~R'ulep7u~R6Ad=Cpg\ Oz36򐈆0H?՚1]_7uC0P|gX'Cd|, )fyF.D~|,DO3ol<Qj q$}KR">Wih\-LKFi; >@tJX>̒Yj#dYB 1I[s뤸EǴpg:k9V@/ \yׂGZ [D_Z| <)[2Eۚ"Ѿ"VEVhgs&v5$8c*&; @>:Krc+-wDm@ӄޖ&tޖ-|LX$t7;TPdoȀQD-EoAs3T=>rXpc@& c1lLI:5l L5 pmf0 xl݈ õ+-Ĥyw&aR<Fm @x`Vj[W*VX]{n9KyA"16xCUb G$ןg!1zç_UUoW7ܮg|VB67ԦQ4yB6)ӧQ0fnp7a#~R?ߦo|w念WMrq Q#Д)Wx+wrJ>Xm.ǗR!>],J0BIe#ZJ,fJ|STsh&լ*U SKL/4:7z4R!L%x,}t ck~O=u8$bH573:HxY,w1m"#0M8n6^dG)1S u d&i@$;KH=OS2xԯl-Ș c΁us,/ɱFIirI@`2dAK;S^A.2.Ѹd2η7c=z ֙McXe Z}7ʥU'78;9/+1gsw=uxDU"N^ >o[T1ťӶţyFJmٙ#r䵘Fm]i+"zc#1/*i|1H1hQ^1Hݑ#򾟼0H; '`amu,)2vvfH*׏|Lec,dCY?փEJ=R¥m>τCפ$ܺd eIAk~b;vZBBZ rFϑAu7pҭh!))+bp@ʩvD "y!P6{6{5:3fHt_p3{Ec,5G~ :[*cqRF>{'?NM0WUrU#I B *b}X$X$X$XDx FA-h3x3"xɅ]6( YG0>l҄|nR|O?olΟY4 b+fTx?G>ϙԖ[c\y#UG ٦魹7Q&J᢫۴ܘB紆dmhzB?sH 9MOgz/gt_;KhOz)#ȋJ]uڒ&{ɯdNmVSZH;Ӥѩt+aZjEh6OudgyEf+)˱Iv ?1Xmmvw8]y5Npw>I^T*2~NzE*\m G|twOnƝbqY#ccQm)KxxEu2ЇN}Ab@ -!yݩf 6&Kuc-ܝH2>bA%zI!jB^၂y9 CTo% &"Zmu$6IȬf2߮-ݗH*k ^qڣd/UZŢ|C^ChFbUV7i٩ۧ=ʦx0j=bt JAfMdtYe2]@:Ow=Kp׼BÍu\"%fC^]0]J x2 w%w<,N.}aBHc}n r7ŀL wE("0*xI 3/3/<y2.k<ӇNET3_@8tޛg+x#Lw7ĺ՝gMGTtOú_"3? ;Q𯙀Gsna`0zJhY| |x Yb >*UC}^"YBfr<@ |8 8i>Qj/s3r+^qwl^+%>H4,|jk|x [ Bzх会(9W9uY]ƋNL7݀c7 ،EF 籷 {:f@R]KVEX{#bi Z<\ïm6ZkF0#u..^ٱ;'cxBc˸k+EtaEш[;E3r%!q&v6Wq &t h䱜/ [d'cbW2%c*Oˇj\ }m_ @8` 罃1k0&| Y @ %GE=-CFvhW CG x ELqÌ`0-Da!0am=&Xm!Us%}yX+s ѳ6 نv+.Hb$6snSpK~>D'@ȱϠtsO:jGa<_P5CB S BhH @zrܹ <"RQQQ*"+vQW,k~gwntvo}~ܛ;s9/CxOd{^BP|hOx|X~![r*䋲lE\_=^r\jL.ȳL9AH'37 m }& >*-xhy:{2t0aNj< r?Š^JDQ$otG;85pw?__ 5ިC/)qu{ ׉pDqF uwO}㪣r)q-uJ\[DOۨ5:@+Ny%&:APǗj_g. `I~WF%|*&gp _H$G!VGYo`KY'.ԅ2p(,VWK.IV Mz  ULWtLdV/T y"%q"4FHh&0OW&gTdgշm.H +Rޢ·mk>Z%/Qy,+ᱬE4J:SM>!o2bhqa4Q<{f8FyfE4r=fR3Ńz"=J\ hEׂ\K|1x _~99Qf#.w/]kˤ$?cܗNsaw{ɝCGZ&=? ϟEGZ+,8Ke"qN'iz $w=YsKyͻ^]> ~C q#c׽B.IO۳l> 9]yF-,seZѵCV ZkbsY V.[O}nWL!&{y\!Ρ+i$ʗWétA#45'Kxŷxgd$ج{ƺ;hJk%Kv=_cϳpVbg_ Ԗ PtOb!C\ ։DŽFgwc,eIl KM#. J݈CM&NDQ.su]b 4UsͧB_waeZX Vue# Cee+/)/{y[,1ܹ b<hU_V.//>u+([Z.lW|p&@kW74l["T5s+bam3>.MLޖR5Q%8_okY:iPKĭ<%C-oI=hSbrhTޠDD$)~֝Y,э+RT7J"&Vvy*O4@ߥ8^"쉉ȬHKK(>4&Ҩl}`YDcY(?Q.\"5Pq^媸a?xY 4*g,1!Wo}xѱ*hTA ~ pAQD%yzE<.h>Y[[r|Jx*l0}.;L:F2✪6^)5ʝD'Mt /9Ÿٞ}ʴ(;(u>|봭":z.Da ;:AaiT|q1ѳ6hgT4* E^Dg绂Zy ^No#> NQ[Co5ڨEBQxKm4JNNᅵo5ʍQwи&j=wx 7и>j#qc]4u7wEmn/cdM] p6f5þ9 | ˱cYiJ5fk5jLakifi3^ȶi|([Cy{-b,ѺlY&k̖eR6ŞC8nu*\qh,E1A|6o,ưl]G<ۊ%/q21Vd%+%"v| i hVo PvY@Y;kl̎w}\ǚ)a7Vۻ4kdv=Zgn`=O)j֬}[o?NgS{qw^|'{txwgbh>;t1_88'%Ͷ(dPފG77o1۝l#@9AM@5R=9YD]]Շؠ:,V8`7&" - 2# k*A29@gjl ťUulm*Oy:vkT:`.IQymu\1ۂOEZ["N-f[QUZ霍̊v؜}Ч/ ҨlO\s<78O[{6{!;gTe\FW} 1X #P, Ҡ1L2KSx;\ Rqr}ΔwԜq b:[Nͤ54^M\n&4tF ΤU4*Mp&@gl5Z}lq >s#z{ޕ}9*el-Vc}j|o>ncFm.TG6Yb 鄷Y,g [?ݼw2Lcn-yiapi~:춊e{xB]]f1VuXmnbm6EDz X[[]_!;;Jo^%VR;æY/4Q@zҋa> Q0SSD3:$Pŧ/,h|kxxvsYbG>2ŏG~%=Iy{8"\fnɰBk1@lOIb S* S۩T:k{]v*:T`t*tT4u1߃>фAONh+Uu@Tq;Шb&@i yMQ6&@&@&%ؤMo.kBU7Ŷ #QUlm=^{cGQ'OU݉-uX5J4 ]ߟx<]4vK%*H>yd [?|C V2R+H&D$&/l+y~Kg?r"? ͇{\@| W4*(ʁ4~@*ʁ4(Ɯ5SttLT iTK$>ebiI:SִQ3WRޣՙS]|P9^.>F `I^w6E4N)dӘGH*QKZIZuk`k[+Uu;N͗́ƻGCio. .-O}هe66LzbB|:PMDq[NC/bL >Oђ:KW!D3|),}?p?ݣj=,7^6Ln+M *mm_Y{+'^w/?߽k?6s>'<}?q?$>]whm%wTZ%8\A㷇nrqom׆U GcPm#aYY៕FF+S2F-+~,<KE[7cǂ3YGbgVUnVG3ݬ̗Lx< 9ӏ^YOzEu])ƔH)ȴOz*  BiP >Pgy[9C2Z|Lz\,GpXv+(GIkEf:KE)?JuǷ}'u}Uǚifߖ  ? 0/0maR\,oe{e"Zo ݺnOy-/ +݋ 3 7͕732yX-I/񣼷pcQ+J%q- 'S'Z:c[ha`W򔲁ݳsKE)ǧ.*,H$C/%vw?- hX#mՕck"qba+BO;ØEufn}k-:=IU^ fծQpAb5gCv04QAZ$Yb0a:(1k62a CC-tq"5i JM.40F_71fGzʳ|:/fY{v]>AXD^kLf4cό} $U$N"W@$lN7lMDnl}NܴX${݀屍彤TW&_6˟3"Um>e-v ϭyV/s9hն֙I>RL=@I ykhJV$wFuъA:J+eކ=G^J]?&q(?濱 :tv*_AFȃ_~y0cBTd|, 4--Df(,X`1k5kz /[X׆4lŃ |`^T ) b]D.e@p&+Aj5(TJXbт/b=^c b@5_Z,J Ej_w?m/'Xi4hM 2и6|zno\>6.jǃccÆЖ4z^|W2 ^|wcҮoHwr5zkiA_]*p`;UQU{=(yg%դ57}%wAO?E\QRUm"!$}( !?>#V; IA`*>R{8Hy?x;xbEj/j=fww]N 5wz9L27͍f'kUD9쎱/o ʉ*fg9N ,3.gF{U>Ub F u&7|>U:`4o ?]MYyw'b~v|l18ѯ dkW֧tUΞ_=1MTX:b^T|]Y>ib"|>qHV^Ocg9&n2%y͖bF 2Xq2";,/e` v]\~C}Mߊ]]I 8GŸmM=g^{_Emu7Z6t{P_FKşR[cum|ϷO&rm$׸"_;zjk{V{5Hi B5M[uR"m$6VXUT43it@[{ \yHXI6{rmUnXjkW5?MEzû߇FպAͼtnwA,!>9 }O/,za(P9CV3ޕls,sy%)Xz><})W_48N]UӬ)xCs(GM JMJ:k:];O|:şljzB*RΆKq^ ^0."ƺȤuEǛQ,g>2~,r dW,ϗzyNSd&gv~~kF_c^z|砇"4U f@4=g3+6դj}D߉״$6 aN)wwQlGiGkGkG4D1? _04Qj#fM7ۚuzc\eVz1%x1LϾn|c%,2щ%?mx"W3o?mOԎUW'ַ'zKU/V-U}TjO4D?wQd/QvG?;h d $]!((Pm7FWy {#e/bs 2 D^:R*N`.0P х~K ê#֪DqTV6eϫ (U4*8D`љ*D|bbw"jvCMR@RݟcwAX˻1nև{6L|)OX$*3umDq]I~NФzd=4Zj/ޓ^=2C;u:vUd5UpuoMע i+m#)LWW닺n{s\':kUu0Y!{8$b3=y]\(â4sNOg\!hp8]oA۸9n^uIZ{>gyoNYn_7?M[+:fdc++dWvU/p4d\h|։r:XycOE)Z|*oW,OXmҴҤ>ʏ!zE^?hTXXXXc7#Og)J} tT-U UiV.,Zs`dsdś46Qae 4V )5֐Zӷv+ʠQoFݞ lfgD$Us!GsUkh).y"W aMW3U#uDG 2u u Pv t+eXߪHcRR:tYu5N@~I-UZSGK:9Vf~X|gw uN8vVm.ɝu}w}-=p-=xګ&zE9UJ Geha]cP(B,kK bg$1+=7+"9죯/>W_}5LuD.Opq CqiSk;V'zFz3r\i-=;[ʮm_컓k#Cp'Cwu~ux/)u[9:MV8Y! {IB "$A.dgN'r9@fo%NqX.B0Nu Wůw#rn7Y1[[kM?u~Gu&|[^QR^N0 ŭHKȣ(_yI(w"#1g2ZX V*R䪪5w)%h*RT7Y Ɲ2. V4x*n n n n n MBdP:Ѩd]V͕ET'ԻDqJ -I4V>&jis[7nD J$12K1G+# "?)iȷL /jVbs5ˮ`SFgV% A%WXpcv}Ddcʂ}+^)Px.\EVqR' ;"iv96Vc79Y 5(@!FeN>ԢԇRTTBSWgMה˫T >yB@:WӷnE,_74n^CCOϐ>uCz6{lؑ1SxN#שR_\تN:9?她6zuMBxzϔ+ѧ5*@ - %U0|*u׊lVl124ŷ"Sq>' t/GD{=fuqepѽJ umt-!!~L&NpyN<#L=yeMa8nfvOe}ɽ~Mֵ{E,*0;itC|M]!# cصbJqV;ǗLMqۓG"XBWIG$k B8 }X<ƢR]IeZ(@R/FU!c4JcuzX|2DId"$"!K8! s|u}\ y~||M B]9F3xY^&,\'Vm44.N4qUz,O^^d ~b{~ ױL_G+uUVe{u#2])Vnr(|SR5z7b ˷"rJ-zj}-՜]얿Kz "X-4VԆL;OK| -rja~fdZʬ\_Unޠ6Aj2j!UfHHy2:󌓑53VMuF7֨jQW*@zTWXڀ^[=ɲ!֓#*nƚmq ~:XEAbArMa{/_g__9{|DϒG'38uұ=꺇e6u[;qwgn}ptsM:Xp8?&c~>XtOkZM,z^tU )xbSHp) 8( \ruc $:k dȽ-1+sewA}YϚYYYuGCfTH$v_l^:/˼Rg/ 5ۡEN}]Ԛu: W$>XYHQNL 4W d)AŢzxuRmL^zsb<Пe!l3,g!l *yzG+7EvV^n=wa^sg)ZyCUsg)%{ KzɈzRI =)5E5AM@${rZOkg5y_qGu$F\xyVD&&Y(ߐ:2Z@r<&Dpǹ+NrMzbN*??4>W:z֕LތownG0/9su;8Gտ_ uк~!8il\S Z-/>!Z`#x QZkABؔ9\ō8}k- pK%'r 2a\%xN ^Bg"l6wCpqsǹe.Iؗ\z&S^fT[,w>R5=H?)',z(REyr~VqU*!W86 @C*qXQT/J!D^U^ uֆ04K#T]e>(+FG PX3="u]֋;ZEǩj[h}1X}jպ`Jpp^~ΓysB7#ݎn )gɂpqQ_3Wuu"O.!q>T{ qO|+?ןsK%ŝ-|e8 gT=]Ky="Yaq RD m`҉F 480HDRNTHZiL$^H_S5Z @worX3-w{慓'kMl9Ll[D<#Ndf?2mvw{ң~!Kd laA/:|օ=j_i&t:N{*a(̷s.KN+"r9[#ϗYlu o8Y{n;S(]f{xJy|G~/7tu"f9NNb|x3I_tY7h,mg#X~K ZO{"6 U͏MZDq'3G<"EOE~2 BL+[#[ JNDlh"7DՉ2Q zeRZJJF\]}TU9+=ozUHwFgD9u Q3t5'3tnM&2蚆Ҩi OPԨQ5$T11 #)j?Dfj5_YDGDX&{nV3̛쯬C\ E`y3^L,eV\UD>'uM=H 4oS>N4t!M[UOTdԋR*q6D(X| gq )BV|}4i΢c&}w7٨NP;a+YKr>dMfiYUrQN;\'D9*܋Y uI%#$G\@:JWl~ugz ^ T514=?{~ ׃li} iTg"b uK"݊OxbPKHΊTʘdeT lTOPn% EYDc *Ç>#=>蓭I4lN/Pfw\iH--2h9#:b*>b#nMq!*s~}7"׿ruuUTc׆W gt=󭁮["o-aoNt9%KR`O*Q}!2q=sZҧ(<2[umEQA\Y(.rVp*ʝ/oTڕ*;TֶVl/7^Y/wݝFwĝM.{'kd/[o̙fO^N\ F,Sܾ R"w0,w!qk!l{.1,,eLrkX}8P(?eˍE>gW^"HYEՓmE_;ĽML_pw;}[>/k *Zn}G?e#/7:B2f[Is פ88Rjˍljguժ4n:Zj.KɩR > u,8N,XHNcbu%bb!B:t 4 eP{)o"樔i3TIWJ:̈́tNc&*"?jrvr?4*3xSgYdmaGưciT ^ Egwzw)b/Y: IIgqB4*38:W`G"%Fl%ݙKtDTFMF)4J=ԓNgg8-j:gF͠qzLg83"QU{&jH'ШjD힑3U{FjHT=#Q'Ƒ9E(!CMHBk,H+1t,Fb4J+ZLbI+F%t4h,FVQұsR:vѱstuؙf :D"J'E-ʨh\u5WE]C:~!2tl)sqz-[w"EΣL75djE覑.<@4'qAYn777fXPUn'_]ri]g =CÕF+=8DѹЩtq>s;&}u9ZwZ1u_:֘?q_:;o9e'y%У5cͨOQihh83|W#9A;?Ovq4#m*wLvs;TKzvL`yD̔wB6ζK9"N|vb^;\xbxQi6 KD?*/;0d_ՆM$H1ȡďڥz˰zT]Q{ES׆ғm"Bb!i{ܱX`I5̣lM yQ{2--`ɨʹj do do do do'SRiPv4gQvFcw:ky 3ݙLdNe֐ τ!( "3k@v t{CQ~tEwcy^1 > 0Qeұ5++hT( τ^,Lc˄/*3Q2ёѨzChc;Tll؎s]NfO KG]tTd#įW7GE na?MInFKX |~x@l⏉olp9 ${A!H ~b`:Rt?f~598Y!ѻ;X ;KC-AǏ݃2ֿp!_3P6-.-B1/641_ oطׂѡ,z$->Yѻ4ߧӢx# vYآ*._ŋ7 G&Vd-z@c3tKwbo.*/ lB-_: kBp'neR~dldsBFW#5:g8ыsETh+u?! 'i.{@=AωuC S`xRtݠ-vnteFI/Ie#{4蔅4$@F!+3W\ٞӕ%^꿿ij7O[^"j ʽb[# uuOgU8F/A~)V ݦ|8Vh;geQzCC ambȺJ;CϨJڵn!,B^ q u{-Pw(CJiٙ4*44!M:SM-TUm;~Y5ul.C\ngyt< M45ΦIul>l>Ges7E&s'1w"zoޅ_d٤X?e/s_٣lZQ=[cefؿYOF'0ڛm,{(7|nDsCmT }h~;נ_~x?txfUo|{j0W  6[_8ɁDŽ8B?N [t mOL'D|⺲!%x`7w GEη+Q_+z_EE J_ط绌Wbi|%~K+#gVͤ#;NFFڌ^i=+iun2 10Ȑ̎VLt?00SaYKRe<]*'ҦMSP5*[S]ūꕰ[ƽ.Z̀-+bb]uc5uN~1F(0\e2 e2 JUhV)D?Fuv:=kCAڧfpaPhzӪ (ѝ 1x7R]뼌Re)R@#\B|J~]ag>,@|X-ئVN!MAM!BШY,rzwUi#!GCrqE4*{zg3:S=8KiTd|џ~4Чe,]/-|x'S,QHuJ1ѹ*G;e˃ Cyg؎m\ڡ_I`@QAˢ o TC‡3IO_l 71v!.iqU<ɾ+ wSIFwlQ`q8CF8!~;*%?ЄCw諃{d wn`| wߗ;:y9/$NI:*&L< ťD׷4efxmơ>v*~Ln$>)~Wd%[CLXVЌE_Q_Y| Z4 mV}‡RވȮ׶{(7tfh>__73^2;ߏ5I]ZIjхGhݳ)⋪4) ˡwQɡСdW/L@'M:P5Zrq]{hs9>ȩ,QU$֫}Ld̀UIZ*RT{3t\ݗv#5ѐCG(ZCl U*4D(lDdT-rh0!b6MF ɓd"EVҨRM:i 3Li;8RTτy&tD 쭅:REzv6{+{d['ZHdյVBHѨxZkl"U*aiJ!#zsBE~^Z5DIbnkf{=Y:[b4GX_[_[힤_lurͻ,xby9h>, #qy=c$iֳ <"41tak05 𯁽!r*n,U8u̬_XKEX/RŃzPA3&>寰,{!v^iyh`kn 7TLDbZ/2=c S8Pӕf1(5Ru5N, rv2tJPC#U|lgGPz*.NH6"2yNUdv@v@vИAsVeOGEc- z 6.Ni '[G۹V ƒ{n<zba3ц1pv}Ķ:1>*5Fs5<kKvkvWj8I((_@;x ҡDS$t"3H?\FAБ]uo{쁽I<5}GwRoKy u_aHQv4*ZFk@UK/ tLF5!ǫY9 :xwpVXw_ gjm慷F3~列3'>k+˞nfwbgYSjCz-nHs[!B:%?."~ I-د;+bT7[NwF{cOhOpI0+Ō&(0bmR}5`|>s^BO jQu>sR#|'a_ц0Obix;l>i6vckef6WUm gKmrAvs_wϺі4+9oϸG{H֬fɫyoEK K $NC!LwO/U ,"" ((KX"$ "=u& {=̩fUWg?n1[YZPMuԺn5{ڲ=^^;ծobMUm4]WdN=[2ĕ|Q⼢fg;shSZAб4Т>belpΪqN+~M *KIC_?ry]DBē@m\ʃq\TМ9,'{Z~ؿܦ`,׋^*]^/ T.~yA4{Y}uD'Rd`a3Q(D!vFzQ DX!s'22ǃ\$CVG2Ou~cTfu-*w'c)@'FfTzh8teh&Y@l4Fqٮ@t10GQ=;x5߂ 5_-_L2vOt,\4CĜJ#$rK9Nj_ƳJcNHThiu-z co>gj 7OӭJ:Yon0g2(ѾSW~r'줇HSAdH dUxPO/kmIжtv6.#١%KF.YY@I'J^(nUs3NpFXVtyfh4=vmʲu*ӯH+OW'"2DF5ξQ䑟$2#dj'] -]=&KSjuCyjh]FK.7M1moӦq%3*t <"'GJBgTZ$YU@*"%ʌ8g-j+A#8s3q44}wSh!'ꌭg5IxVۡo"e]8: 0dJ h{N=+'@3Z: YĺsY/|e*` (yE DK.rq V,#uz{8v]y>pcy4]<:qt$ @ @oB{'3vw#f{ۋo_p{Aqoim,ͣMBϷ$>/T&H}ggbHOT'Ƚ&gJ5QKDzl1qT45eS{ݯO.hC[lF~02GWVV{NyLNV(Qi,5Z__zZ6AS'9j}jH r kL ՜ΦC1gGD%2&ANZ nlІO]L&!726ӶP=Veat#k'IyFUAO>Gcxd{6WkYcvv#[΃웑;:wRs},ןv[&оްiXb=h-> 7vm(r媲F:m.7L=iAV{zE]P>-wBiv'ـSq9Ɲb?tw Y'ƑԜ@0,&r+`aQ%ˎ:-K{kw";qto #Q܏r?5x"v.R~\'T~SyJL%uZ נJb K;(jGVp:zU2 ӿ,;ȇ#r#f#Z#Z#ZTP"WEte5:\Xtۢ|4mr$JCDJC$JCDqFs"_5Q=` #B F?c㺭  GQ@V,uD_#< ǸeXuvXkT#ˌd<]jumE tx8 r՟tNYt.TKG5R$il j2K]g 6Bw՞jo_#>`"u$E >JTo%'GҝNA*jžU#Zsɗf$u5D|)͗}F庴ByNAIj-EZI_4jz>dljbO/7퉶dg]rno/cE^?Wv!Ůao ? .\*z^9} 0Z[]KRǾ'!綜S8s[[!G7rXK9-e(Zl˳oXg5Zkz~|ssg8eg-擝g~pG:Gulf>+hCzJ&z=F[S*r[s&JۥO/+F.2lo.{[pmgEϳ.m5RFXph)0RaUlXUx)CL4a4FDDGUEFH&w 茎.=F=1*Ri N^pKwDK;h D,CX"Ɩec晣!f[ e4=- )(-e:c|Yg:LmQ2YZ̓oU Kd8vcx?{ď:"F`<ho6nsxwM!@{5IqI@>zP  (Wra\[ݸm@88s:W> W?/~Lx-8sbLKF0&-7A L}&W ECJ"#s]]JiшׁhHAWID縶;~㺥}|]7BI d5%F(6B|nxkbH,К7<1L)m$zvtWJ=ܣNEwєr Pn?j6mJgw<;nݮJ06 8"_Ÿ<3<9h;D ,<` G22G}2j2ji@e\oNC9 Q: #@εtԞQNǸl<ގcu6u6zE+=.p&x`~ s<%ЂoU\'c>N&Q/FOtO>RYURM=| 96QG(u-Bw2Fxy62=zꪋզR-yzMV[#Z+}o֯A#Nb] GO%^&~dqKJC}M|7=|=/ ZvJ>b՟?4Cڙ3qhG l+5y5)Iå?yx*{m -6bq3jf=oiqmC= ,, c;mͲ6Y[VO@UlK`[6G˜W߂w1=KLӟˆ d7x[kveza͐rV1}y:"-.fxÚ;j!Vhnxj2ekѶʉQm+:C~`ܺ[tJצ |S/H:~28 ĭm&rR7 3 5x.O\/R/x. R%O=Fyq2`lǃrAxP>Yp!7Ypm9E8r*A h|##"GF+_ ǒ<3ˮVwV5EgLiY,2W,9c\B@u &yn^)hjULLy%d3L+w)UƋq*\Ud:o\UdFI.e|UȪ/(ヮ`E;Q p+\fcB Y]Smna#Gs|mai( 2lIqQ%VUPUlm ЮkSc=+yW]^W[j6C[-5X;v`?NM}䱛ڿ6/jvFVdo6 ֡9r0FTwi=>=-U]U}}}|.E^=3oFlJd%G%9:n;_g>ʊY*q$xڱ*c?wKZ.7FyI#d5G3l7[XkVB^{r]fY6Nzi-z#zl)a4[u4l.%AfݠHLa]T>tQƜ' K].pr~$&8I(sph(b2b: Gc겿. {_^0.bH`_ej7 23w7̇s@ט>k3#l>t]Y0t$Jezycd~;/3LS>ENwRN](B, f Y?h~AC$Ḳͥw|X7sX>u}밂J73sMeo{nۯfQgp|i.e_@FEѕ3$4+@L@T= )wXơ*]qoUmсk SS6)_}6 5/4O+d Z"H7U]=A[,*3,d@N_/jjCھ.y}#{1;Ϊ3VrdFI%*9V2bvѸ0;'@X/@A3Vp/mor3kޡ˽}3ݣD֔Vtb^v:^(+yR.l;zaݓU{ylvtLWߥ:NNLҍ'zآӪHEr{Po۔<^WpFbIt%I,q: tGR_HNÂ'WA_ի :TA(EˡQ1D9;ƾz0J=akRH ѫC"f(ucZ&a3\hrF[tUm8`:P;=uCu2`(.iA6 S4M'H;||:P* μpccQ@t.H2Ep;D^M^I19P%GG)aᏡaC 0<5Ccה"0T<ģL2EG>Tx}:](%Xnj P.itELWttEL6oƣo<@| d|ן- 6HA6HlΑ1M #%H"=I>'4 JY,g}RpiTi WG Z?U4RCپn)&^Q>_>mZ܈% y\$i+ڜSrXaLtxCU yLcEN G &TҒ 51괈FH4I"M^"}^(앴)1nQa$IU&jeu6 d%ReI 1viG"Am @X]*+׵ YHV#tmz][uU4[fjEz@xFb3S,~U:֣~VZ(]px Nv6Isٯٲ~nh ;NAo#Z Imi:^X{av-,,߶7_왬[^cYϏ,z裢 k yx墧&^?s|qu5vK.IGv&M${?;K[CPyk5v3_|fs.7`I,(؋,sd1I&Kۚb[u/JĖ.`^h1?`ɡtc!#&K5NM-(:Hѻ.W y2X^GuNCp9 FLtKw-Gl>;}~'m=Ь< * [e@q*h5΃X9Ơ%*e삻% ,>G 3c1kPP휜N7DeKl) 3 ]쁎t@9cǎ ^"E=  ZNa(ap<] HВE|[N(C%8tS偼N*. qݒ܇H.D}hp/y 㥊= yda,A0+ Eq8a"Qz12C``嚎f3ca<Y 2 x ,Lrd̅O\q=  A"Ý·+?Z-ww-oߴ构qk ]O8еE@]"2~]zr OJ+\tʵj3@} i-goa ppAvw^{ܽ$ @FPỗO^5gQMek%G&R)s?{ |WlK/1՟$e$^RIBDzW]IJZYgs ۼEco4-ga4d 4mNZRmG/2x(g$Ip nI,]daWs+Z 9i<SY4&| .`D4q JK#Gy_2(Ǖ?.$P#uPQN T+GBOH m S2>]e +2jEYHڢ P uCJcHsKj1Ir ;Q 8^[ q  $]p*P-p.u@80pbۼsbBޱy'WLvNp19wFɄyg5_6Xi'!ټi7_PbCd\e|;~3c.%q9J=L-֔W+-Y[ZYSuIoj~u Kz%vn˨*VQNW^] ڟvB։E1zAJߧjo(b{Q>TQ.lbWA4ӗ`PL_`LLlJOq剐ip/ÀFzZz3@b(l2В .#?KgBD >!êBgu2RtD"I3RFkR*Td<Ԉ!UN=;Q9V)$hn LO5ZA!ϓ/a-$ݨ|BI5ڃ>DkqPM%ɱoV+{]-pjɿ)/d ٥BպCHQxKMP/+JEZ&ˋgI%ZVgþQfQ}fYTѼB#Xy$;H_edClE^ {*ژFQE ig?W³=,ɐy7,q:[N+-2wAzM:AɷCr7 "KZЊ4њrΞ*̒hKt$IajZ7H1.)"Oh:qJGu})>e\<֧(}+TZr#TC7 D{U(B\^SH;5CP딶v l$P5FS\ (_7.$mPӮ$4v6C@Nv tv;Wa/QN."f KAdHAkN ~_L0?,N:19?w׷8=EwPTGwSjv_3 ⹏vg Oq c<2_O/Qх,%|^~, +s;96WVޒ'lmp}UaVAt,ϯfXY\luT}$]ۤUG1n"mFJTvn^ӽ[)J`n.ub 29!b+l[MM%dBsBwBP -%9'y'3‘w‘c2X\18Icc8 GG07:m&+±Q87$w¾We>T|GX873n$<!ۉ{j'2h~1eQP[ohʑ.P V]Z^V>̔Ks'oYF3rы%cK|ڐ\~Lr4Kl9\e s<`15>El2pyll5ol+Ƕљ8UH{!fžƤDtűŰ}pAВJ)~%K"K^|$(zcA%갷JY]GSUIB-Udj~(]G_" AI>f.PJJjgr'xHV5+SAJǰ f׬M5 fA^iJ}A\H4~HJs.O,p_u ԉq)M]pL jV(ؕV|mWٕjЀU[ J phrZuXKpmնbhn+m 4c=:`V UQ 팢ig ,a s"Ep*|>^\ꁂ/7euD1#X: ZhJ-(w'aܴjkI0':N=GParzad: 3snlQ *`aD+fښjk6Nnhb>)rn{Q<Ї{Nyσcm>tЕ/0؇y@}@yՇ$02ؑ@~t\KZO=C 2Y묦X^+b}xk9C2f;G sy-eYQIwhNIUn<IB$eyrs0kUYT)rTn4fRk6U&ѤܓQGk۵$7Q,MSdH`5ܬ ;t?if<^mVM*5|zaƅ.dE^%%3//4Ŝ//P2dw^SPɓ%iɂv%K9.rp AWTV=A>}e=Upfϱel;fkNӍ+|DI̙=ViI%`ok\<բ綝9_;TX-+~ :^X^$zRz^ 8/?G_WCAَa p倖A'|ЁJhQ?l P67=4s^N0Q8NX`ofvhkaPϱ5eDQKD.151v 9Za1i4q k0r" pr348JELELELE nNEԬƾh쫋hfTI7$\Ձ򐧺Vbv]߭„w&սGXe<; {* *E*tR1D*CR1D*CR1U,55hA87 qt0Ν \b8wV\yt}U *Y5nlg[U\+ĒJsβVSyam65agQ>:5b~ Tݦ S+埽7==FއRj0%%/U4$SӴ:KRAiJQvp:.DyN*2yJ?5&Jbe_*٪-E&?z\Ҏj*#rey 2Q=̖tiN?'ȗ-I}vMۨZu:wEy_Z}Q9~qX93dxS •γjlz}tFf73vdn#%TkW.\(()v3{4kўbw:Zլl+x]|tZ%2ԹB+{C{&'EkWFԓ@vS_fđ`,.Fр'-گ#`SHi(Nuؿ֢3(uC_*bKdwtv//$:.L^k^Z#F@q5h!jistv&Eu7A}? ~D \^z6ʗ9XՍ=*=Xs#|֭+=]'yE X$(Wr%(O6Gr8\'􁣎pLDގ@Gb੓{Vx";El@nxmyUd8nF`5^e]t,ȚRI)Vd2Sp4 (韌5h|W_Ls)_F4F jDM!+g1׬io7jV?Kt hgiYz|F7lHY)}%+ݬH5ΰ̷ZXQ | gaݠc.=d+[ Vk^4ǀ2YWOFC1~PK:ohWUUyZF{d88J*HUrL!:k6ͷH.`/S{=<؋s\)n7:ҟ6>lwS}.̳vкa_.?󩔣\zrtT'^>d~(=,_RU#lz=+FloU<~?T? pCq?ޙD‡BWw ջX&f7D()Z6//]bdp\5s";mEN9u-R>\ {wQh?޺#uGxǩ#՞ Y`V/ldjQwrZ:i +@Oi5򞡐F`tode Hݴ];5_KҢ.Z-vMj*UU>ej^"];FI\m=M70LʴXשׁv*[Xm۞djE{=žhϳs A['# bPQW b3vY&2V;V寄Sj"#X*8UqV&Xm Lz1jT ᯛ$T㈑@k w#QV<ˢ^1bT6BAi4~6Srg6͟;lɮXy\+P}˥X:EO{Wh-?ܬ̗}~JgOOQѱ7SWFw:8GRDw|=Ҙn%}M7Ų"+ijehl_[Iezs#vw;F?~tc)V=hUYk)02L#tU{{vק~ C$;Ra ~Oƫ:ϹT_;¹5ĴFjsl3e4^`սjY-w<`-4[B&L\ 2q-8;KRܶ0%PaR Brb"ǫDc/,'u᥵ȼ[R=eP ~U5P kTn>h!qxnʩ@Z@:! J {VWQ5@4TvTS4jpAg \曁hŒ ZBAXZnBBՇg vCߚmWuB x^w3RᬈYd-;2JU}6J S{ﵗ!CR_XsPo?ȲgRWW7Vٟsmhz2q1*:6VAg: StqmAChm,mOM^Yo2w?k}@c:F-iBY绡]b}mvQ')ss)N=}vCu ]VOM.0oKHYZ ;ne?`ߴ4%{J77KjdM1+uzzʪf55ޟnsgur{n-;|[r[ /=|xG + 噹Ks_=;.sV5 4Vc пnY16׳=~t| D jߞtShkYll5˜ru^fKxc)Q2{.]ZQ%5Y}V7ZըN@Γ0tx 6r\%JE3Ő+5K۽ZYI'Ƙ%cy^7,$St`OD~o I"k}v{Vȝt!]P=spi uV*0VpAoeK1qu,;4ȋCw4"a;;Mѥ֣z8Xo%aXbs0֝kƛY 0'q U(2^[!/t'3 &AE {mDbG 1pA#HC-/+芮]Q느O -\ꃭ}fjsry@z>8`ah: [c&e2"8-5،;!\rQŃ F,6ν^6lt^`cˏ!`3c?g_6~Kk>ް'5]jSLl]k=n욁ܙ@g`cؘl3[dXcX{e:^Z:] >ZBbp$]K>z RO] t>4 \+`\Z *Vø]ZzƵƵ޵,u=z\/;nyFxo]\/ %_t / +@}*m׀ WzM0nr[7]; v6]w ׻@w} W}͵\`|އ5~_s/;e}񳮃@?tw= Ax/AQxУ@xu0(uw} c0>zUYs@`< "g]0uxu @Ϻ.Øe>zugρ\A#[P,u1;Y`c݄8p=f/wzՎ{uz]hUOZ="kUgeޱ*XQzsʦҷz-kYQ̏f= )jzVd"FuU \Ȯҁ MzFcB_1nRv.d=͹v&X+c11jNMB}R5{=W2? ~lv}_ *yV\#RWJ`/+vg)-beTx"&)v bJzzRީy ֋5 I9NJtob:p:td-BK {ppV\=8Τ2W.Tm2;jP=&&`ŝ:ӻ3.IL#m;WDS o1!lvYѣ!6`êԉNvI@/cE;f[cE-9mqKۊz,w( 7nIv=(Fɽ!n qlh i[hCJ!nu6t{bF} +dPsEiMB;~qULQK#xǘJ]{MvI}.5-vцV4U?cڍP lY,h*\ƖW?jt ɗ$v!!Kcn1 dXU }.#iZ@VVK6dZiB|4SU?ҞPSdNI_i@}t&wtIQ"X&EzSe֜ =ޞgZ+qra7lp)ּiN[Yqg)naw{7m:/=Rho7dhQESnj~}?=Qw]'#;egCK φm"ơ8`6"L"Dzu(XjaE'8 %qS(C[[ľb3ڼ['O7M<fPOL1qUf7Q ^|V-33W\,(l럇x,W >|O / /7H`oM_NX .Ma:Լ>Zѵ"b'o~;o~Nwݺ)Wb%,_t\_?se\%na5š@wm1OܭX/GiGH/edt1K617fi~\~HUR[ȳ9p={gLxT_uk~ZW|WU=kk"-2dڵGGU &B "5BFJ-LX{gݢ%/b6*! *w !DBVؙΆKnnv̝o6tfZ~O[ɷƳtˊZKYp%'cŬX ;kbB5?s ,BH~cގ{_cbX~,cx>˟ۄG 8Pr}#TUV0lH%╉VJ%`3.txD+ÁGB8Hћ%Zٛ%V4GH@.$;/d6LȦ7xKD-238 x̆_mH!WڞߊV&_kv؍Xڎ i3^ci/v*]yTVA5*Wxh<+pV j{%? ~:D@"y sPY}C7OHYt=*oGy>r[MSZʙKBFeF4lی^2 EF2)"sI#[HE0ӓY3@]ߎqfĮ%ǎ[Vշh{qm:zwigl|tkG ŷ :mY~q3>Śa=Z[[_ߑ3|Hy| ku͓ykjSKZ8$cI@:N{5 9 hG\I %. `[URAAO*+@RIxlU{LJ//B&TA4P@=A4lR9B/^p|yi⺱/K 5/^PŽ@@NJ *yРցd?hA2$x-<\Gm8buw{iuiCSx84^Y[CpGp$|c%\n#~3ZY f (z$sDdl.h֏,/GZ<F-gJi,Sxz \`LoD4H_݈xit.VJZAƐqri"Y;:%KOiwL#~:~ONt5AH1Ao#I~ֿ}>PKzm訹C!:vKUR R)t0+U*.Hi*uA2gC5܋L80$K5lJta*usX|q]$24J u12y찱<3%IwAB倾 ྋnzٛmqom@ّ0䉳q֖uڲƯ%GAa2ԖI%3WӍ6ӥ0ڀLOw~Oo@>rFu;>v (/4$+2W(un '4Hmճ3sXj6<:&|p{?Q7nɭOҸi25ds G/?7920p{q1>1k5 Ej #S[aSP~~?N-7|)[1I~~jxa ԾTc1OQj%{c0Wnab';=~erb(R#Mdf;L[/Ûh6Zm"_[ŏ/Y0&zfYXl(rwx܇CjDvD]FOZ{z16.Ji 5a5'>cѢ'B Ţ7O|Ң5wRqǒzkh=šBPGO=I\>sN1FpN0}šI^JjG6:^|cpjGO[9wϨG}sVnJxMQ)ΩpbWvJs"W  )@P)Mza] H*(]oֻY=8X__ P̣:ɯBU\o1|9NkPלˢSu[N֡. **lDcD[ؚCTTp*VxY|I>H_zN%STeJJ8r^M9r4 hAБ*͎Fv7APK!鲰VHfont.npyPK6vedo-2025.5.3/vedo/fonts/Theemim.ttf000066400000000000000000005133041474667405700171340ustar00rootroot00000000000000PDSIGHFFTMO| GDEFt{i}HGPOSc,yX0GSUBDJ POS/2or`PfEdf(cmap `%cvt wrfpgm_xgasp! Hglyf\"XShead-y\6hhea9P$hmtxP{8 kernBu{locagumaxpW name8post *<prep:(_<O+$O+$0eek [xxdP @ ,,0v t `~p>JPNz~P>fP`rp^zztZfT>TT<8<z zz(z,zz`>z`zffRRzRzXDpDHDx P `*pp~N`t``TNXTDNRNTT`tDt`tTH~8<((L<T  Xp88zfRXpppppp`````XTXTX XT`````<<<<DPDfN@@TpVp>0R``>>>~6`zv 8  |pXTT~>P^>088R.` 0 zz>j`D@nTT`0zzP8z8zzzdRxRRRXXXXTppppp<pp pp<TxxxT hDRz`~N8p8p8p```` z` h`z`z`z`z`z`,zN,`6.XpXLX zXTzzT`D>zNT`zRN`zRN`zN`zN`FTfTfTfT<RfFTR`R`R`ztTztTztTH~H~H~H~88&8X<X<X<X<X<XDpD(DxTxTxTX0pR`R`8p0pRXH~8DDLRLB( b*btJ*B00(X(pZfRphLBRRRBRRR8<zzzx,zRz>z8ffbR$zRz(pbxHLRpb\,zX0`\8"0xj,z|XX0xf> ~p0`T\|xb\\ `V\R6T<\`T\`<\\ \< >T\\(zp` >\<\D8t\8\\\\\\\\VV&,z,z,r,n,z,z@&@X0X0X0X0X0X0X0X0  PP&ppll@@&``T\T\T\T\T\T\@&@````````R <\<\<\<\<\<\<\<\tt&\,zX0 T\`<\\\\\\\\\VV&X0X0X0X0X0X0X0X0  PP&pp<\<\<\<\<\<\<\<\tt&\\\\\\\8848zpNp~X0X0X0X0X0  z$&DPt $D```|x|xT`pbpb Fphr <\<\<\<\<\t  Vt@>  H`  HTT,zT\FR &,b,z,z,zzzT@T\T\T\RR2RXF(ppp,(((((( >PHpppppJ*,4H@0XTpXpfpppDpzpLp"pZphppp``|"TTTP~37 (1EYuz~EMWY[]}  " & 0 : D t !"!&"""""""+"H"`"e#*%%'"19BK\ty0T9 27 #,BYtz~ HPY[]_   & 0 9 D t !"!&"""""""+"H"`"d#)%%'"04@DPrx0T0yaKH|{pm]J0,)$# xvjޖދދtq_/0$ "!L!D!<  ][ZY (|~p*DNp|z0bcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklCVWXYZ[\]^_`abcdefghijklmbcd   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~,K*PXJvY#?+X=YK*PX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-KPXYF+X!YKRX!Y+\X E+D E++D E`++D E ++D E ++D E ++D E+D E +Fv+D E4+Fv+D E"+Fv+D E +Fv+D E8+Fv+D E+Fv+D E+Fv+DY,t04@4@lVR2c&_96;=.CL*fFX]|yl8pB F 2 " hdZ4JV6<&,( 8j"$  !$!X" ""#>#$,$%*%%&'*'(4(()8)~))))))))))****&*2*>*J*V*b*n*z***********++,-../(/012b223*345j5v56667L788899:f;R;<<==l>.>>>? ???&?2?>@@@@@A ANAABBB(BZBBCCD8E2ERJRVSSSSSSTTTT*T6TBTNTZTUUUUUUUVDVPV\VhVtVVVVW&W2W>WJWVWbWnWzWXXvXXXXXXXYvZ ZZ$Z0Z\J\V\b\n\z\\\\]D]]^^^ ^,^8^D^P^\^h^^^_v__` `````aaaa*a6aBaNaab*blbvbbbbbbbbbbbbbcc cc c*c4c>cHcRc\ccccccccddde*e6e^eeeeeffff&f2f:fBffffg:gBgJggghFhNhhi&i.ijFjNk,k8kDkPk\khktkllmFmn^oop2pq&qrPrsst\tuHuvvwxRxxyyyy(yz{T||}l}~d~Pv.J΃ڃ ".:FR^jvʄք*6BNZfr~ƅ҅ޅ&2>JVbnz†Άچ ".:FR^jvʇև*6BNZfr~ƈ҈"2BRbr‰҉"2BRbrŠҊ"2BRbr‹ҋދ"2>JVbj֍D$0@L\htԏ, $0LZhvțқܛ"tĜ0PZdnxž2Vԟ@~`ʡBhȢP𣰤Х^Φ `'2+ /++ /+1+ +1 $ + /+$ +@$ +3/ִ++'+'++)+. !+ ++4ֱ$+1$9.9!9$+99013!%3!254#!"4632#467654&#"4632#"`@ NNNNToi{&`!B +333+ 333 +333 ++222 +333 ++ 222 /!ְ6.. . .     @ ........................@0153!5!3!33#!!#!#7!!>S=WXWNWXWS/WXWWXWlNS``RR`h`RR`Jx4HNU\c?+A3QO2D+?Q +@?C +;2!+33X\22+ZZ +@ +2d/ֱJֱ  +  +J+CL222UAV222UW+54&'#5#"'#5.327'5&#">54&'JTG'7SaIiU+<<=1%jQ<8B%02"&2>4."34>2"&2>4."PFFF@ >V> >V>4tb FFF@ >V> >V>#gggg6neh>>heneh>>hgggg6neh>>heneh>>hz.*4@&+"3/ '+&+ 9+ +>& +3A/ֱ+++5 5<+ V+ + +@ + +@ +Bְ621218 8899991289......1289......@5&99< /99 $99& 9/9$+$9> 999014>7&546267#5!!327#"'#"'.7327>54#"z*HoyNRg{ng)4;GOD>tfrx5>Fx}qz~(!$\c9YoGliW.xdYG44xt9&x5ZePEf?)@IcVf "+ + /ֱ 01462#&2X2 888 .<<.RCS  ++ /ֱ 0167&(mm(EE~  ++ /ֱ 016'7~mm(nhi"+F/g3A `/M3 #++2 / 22j/Yֱ22T $;22PTY+]]/3P(2kְ6 K K? K  K 9>>?9 >?K...... >?K......@]YW`99TP"+99AFPR[]d$9`9;99 7899&(/$9"$99014767654&/&'&5463232654'&546232767>32#"&'&'&#""&547654&#"#"&RR RR-%"8!.N -N- N.!8"%-RR RR-%"8!.N -N- N.!8"%-rT .  . T2*,:1 ZP> )66) >PZ 1:,*2T .  . T2*,:1 ZP> )66) >PZ 1:,*2>B N +/3 ++2 +@ + / ְ2 2 +@  + +@ + 015!3!!#>l4l`.`.fX// /ִ4+ + + 901>7654#"&4632fEmT-BD/SMz=>-45/jChKnvZ'/ + +/++015!tZ.+ ++ +/ֱ 016462"JlJJl2lJJlJPG+3+3/ִ+ְ6..@013Pf4^`  C++!/ֱ+ "ֱ99 99014>2".7265#"`*SqqS*CxֺwD7uu7}~`Ĝ__`yӆyށ"vHA + 2+/ ֱ +@ +  +@ +ֱ 901>73!!5!'e448rR$SY00qO:r2+ + &0 +& &0 +&* +3/ְ2## +#- +#+ֱ/4ֱ#999990999&999014632!2767!5674&#"327632#"&r߻pn:Nsff/,0J֨YG2)%&*2V=`DuTXR>9]0;Ah]7/#,2+=WpJG+G + +5+""5 +"- +G5 +K/ִ  + +  +0 +% +%0 +%* + +Cֱ:Lֱ%5?@G$9C999":@9901463232>54&#"'67>54&#"#"&54>32#".pd>1=%+pc+9K>/cT56\t@EpO5_D^# +!2 + +32 +@ +$/ִS+"+222" +@ +@ +%ֱ" 999 99 9015>76>32!733#3!53^k}H5 (N`̨8Wm$+6WQ{ :"0e00z :8+8 + +++28 +2 /+ +;/ֱ +  + +5<ְ6.././..../....@ 099+28$95%&990599901463232654.#"'732>7#"&'632#"&zQ9<5$\b&>gC\7#H|$E19!$#Ugv:8E.%hHWC("-&<;ױI`=~ !-P8.KpAΫz&*<x&+0+ + ++8+=/ֱ+2+3+"ֱ  + +>ֱ+&08$980"$9014632#"&547654&#"632#".732654.#"zB3&8QIXJ#~U\>n҅fL@pQvy8`@N h͉a?L.$*2&$.q~1Rmt=X 4|JPf8n^'(9%++3335 0% + 8+:/(ֱ+Z+;ְ6.999999...9.....@(-3$990%,99 -.3$99901363232767632#"&547'#"&'&#")' Uq;a5%'f'C +A#b+;\F '-3{cP[..Z/H' }q%*&';I6E1w>]n,)4'$O+R5`t/@+# +>A/ִ +02 / ;+&ִ ,+Bְ6**55599++*9,,9--965659779889@ ,-78*+56............@ ,-78*+56............@;  #$9>#$9014675.54>32#".732654./>54&#"txsw9TY9$ŵ!2]XGskm&%G30[`tIwH?r]xI/CE]4zqQmz/O:<+3B&=2#'I9fwZ*< + + ++:%0  +%=/ֱ++ֱ /  + ++"+52 >ֱ" %0:$9:0 "#$9014>32#"&5463232>5'#".73267654.#"Zn҅fLB3&8QIXJ#~U\>8`@N @pQvyX͉a?L.$*2&$.q~1Rmt>X>6B/ ++/ ++/ 015!5!>6``8``T,a+/ְְ6..............@017 7Te,T@X`'//++ ++ +% + / +   +@  + +@ +0/ִV+-+))/-ֱ# + 1ֱ)%/99#9-+$9 99 999014632#"'#3324.#"#"&462"hqU8\e5J0H"-M 1N2C F(,JlJJlZqs`S(&&`8dbF,6GJ+;lJJlJ$32#"&/#"&54>32?33254.#"32>7#".%32>54#"%lEւbLz8+3 222+3  +3  2/ְ6.   ..      .@  ...........@0135333!53!3!8< `^,~4~44444!z&j+2+%2 +'/ֱ2+ ֱ (ֱ  999 99 901353#5!2#'3 4&#!5!2654.+ztߪ&zjk7kK424w ș4`4{=e\463w/+&3/ +@$ ++ 3 +@ +4/ֱ$+%+25ֱ$ '/$9/-9 +9999014>3232673#&'.#"32>7673#.#"#".Lh;#",,$M2QuHHuQ2M$,,  #;uȈA/!$)j 2552 j)/fz=+2+2 /ֱ+ ! 901353#5!2#%!2>4.#!zZ}JJ}Zdb@@bd4249wt74Hxܼ{Jz6(+ 2 +@& ++2 +@ + + +@ + +@ +)/ֱ 2 +@ +2 +2+&+'*ֱ901353#5!#.'&#!327>53#4&'&+!27>73z` 4'JcG 00 FdQb0&4424(2Z(hl"zz"j`AlWAz +2+ 2 +@ + + +@ + +@ +!/ֱ 2 +@ + +@ +2+2+"ֱ901353#5!#&'&#!327>53#4&'&+3z`4"KYj@ 00 @j4248asj%V%j`443(+/++ 3 +@ +"#/ +"%24/ֱ +&& +@&% + & +@ " +& +5ֱ -/$9& +$9"+-99# 9999014>3232673#&'.#"326=!5!##.#"#".Lh;#",,$M2QuHڗ,%)LuȈA/!$)j 25ő44"#Bfz+3222+ 3 222  + /ֱ2 +@ +2 +@ +2+ 2 +@ +2 +@ + 201353#5!#!#5!#3!53!3zP@P4244\4444^4z F+ 2+2 /ֱ   +@ +2 +@ +2 01353#5!#3zP42444`Z"f +  +  ++2#/ֱ  +  + + +@ + +@ +$ֱ  9017463232>5#5!##"&`K706 ! .P2MxLa6T6+&0#$7044=okN/oz&+3222 +3 222/ֱ 2 +@ +2 +@ +2ְ6  .   .  . ..... .......@01353#5!#7#5!# 3!533zPfiWq4244/B44*444~4za+ 2 +@ ++2/ֱ   +@  + +@ +2 +ֱ901353#5!#!267>73zP*f693 <4244>LQkf+3+3 222+3 22/ֱ +@ + +@ +2+   +@  + 2 +@ +ְ6. .!..........@901353#5! !#3!53##&5#3f\m;2 .7  LʮLuuNȈAAff\TUez"d+2+!2 +#/ֱ2 +@ + +@ +2+ $ 901353#5!2#!3!2>54.'&+zr]?<4M1 &K57o42480ڬ4":Xc?5ciXB2<t+6.+$++;=/ֱ338+ >ֱ83)/$9 $99$"9!)*9996/9; 99014>2#"'327#"&'&'.'.7  LʮLu-YQs.%'#1JA=Qmx=l7)9#fTNȈAAf- CD6+0 2*I"/7% w\TUez(5+&2+ +42)% +)6/ֱ&)2& +@&( +& +@ +2& +/ֱ 7ֱ/&999% $9)99 901353#5!2327#".=4&+3!2>54.+z\rd2ER9> dm1ZY5yy6I&7dB424ֱ<9&8;99 #-46$9 9#168$9901332654&'.546323273#&'.#"#"'&#"#,T?iHprK/ZJI* ,,"=%D,>jP>nw:y9-.,ܙsWa}0)BRwI=bZ8Kg3S61Ilf?(2x + 2+2 +@ +2/ֱ+   +@ + +@ +  +ֱ9901!#&'&+3!53#"4XmmXNL442Xm+ +3222/ֱ +@ + +@ + + +@ +  +@  +ֱ 9015!#3265#5!## XP1[lFf44VyAȾ440Dw + 3+3 222/ְ6 . . .   . .......@015!# #5!##DZ2<f44!44~D\+333+ 33 $2/ְ6.  ..  " " ..   ....@ ..............@015!# '#5!# #5!## #DTk+CT\/f<~< f44d4444~_H+3222+ 3 222/ְ6 .. .. ##          ....@  ............@01353 #5!# #5!# 3!5! !HX*+08} 444*4444`4D+ 2+3 222/ֱ   +@  + +@ +ְ6.$. %  ... .....@ 99015!# #5!#3!53DjL̶Sf44g44"44+ +@ ++ +@ +/ֱ + ְ6."......@99 9  901!!267>73!5!"*\.7+4]2.5,VFRpo06BJDq5++/ִ E+ +@ +2 01!!!244PG+3+3/ִ+ְ6..@013#Pff^`$5++/ִ E+ +@ +2 01!!5!!`2<,x4 *V`+3/ְ6..&............@013# *`^]*q/ ++ ++/01!!` !+ + /ִ+ 014632'&% B%j 3t&e>p1<}/+&34 9+#%22+   +  +=/ְ22 22 +2 +27+2 >ֱ72 /$9 +,99 4 +,8$9017467>754.#"#"&54632327#"&'##"&73267pxNl9%J4<\+*0/9+"0%`v1x]i4\"0URixv )%j%DC(4) +3+[m=83A\JSpqP>!N#l+ ++ +" $/ֱ 22 +@ +2+%ֱ 99"$901353#5!632#"'32>4.#"N2jdQYccYQdj`To--oT`0x02772ioo`P+x)+j+) +@" ++ + +,/ֱ+  + + #ֱ""/#-ֱ)9999014>32#"&47654&#"32>73#"&`Ct\HwE$64%- FGv5U4#4-DuL]L0JO$1H(@$#$%>ذ&;NK&0X_F-`0#u+ +  + +! $/ֱ+22  +@  + +@ +%ֱ99!$901676327#5!3!5'#"'&326&#"`cYQdjrjdQYU-oT``To+720X027o^o`f'y+  +@ ++"  +(/ֱ 2 + 2 /)ֱ 999 9 9" 9014>32#!!2673#"&!2654&#"`hǂPR-,l4*OR^*]a0M2"~@dv:+%Pn9k]9(.3]'?WWTB%"+#2+ + ++32&/$ְ2 2$ +@ +@! +$ +@$ ++  + +'ֱ90153547>32#"547654&#"3#3!53TY6T\z9*L !/Uu؎@D0F܎Wm`T=DG&#*Ǭ000XAT\%=+F +3\++% % +@% +P7= +P Pֱ3 X,= +X]/ֱV BV+!+/B!+0V+ 4+ /04+VZ+) ):ִK +K/: +)"+ +^ֱVB. $9Z,37=FPR$9K9)'9:%9"9F:BK$9PR973 9,09%X ).UZ$9014675".54675&54632>32#"&'.#"#"'327632#".732>54.#"26&"jl(=-"^Q}ҔS2+@1323!534#"3N2 0g|E?@@d !0x0puUN00TVABtS0T&~&|NP+3222+ + 2 +/ֱ 2 +@ + +@ +2ְ6 .. ..  . .......@01353#5!3#5!#3!53#3N2Tby~n0x0T0000p0N @+2+ /ֱ  +@ + +@ +2 01353#5!3N20x0X0Tl9++33)-7$2 +31 9+!2+:/ֱ7 27 +@79 +7 +@ +27.+) ). +@)+ +.) +@., +)7.)+  +@ + +@ +;ֱ.7 9)9991$901353#5!63236323!534&#"3!534#"3T2 c:[6 ]El> @VP:`@yC!00+HG'4U`000RSgN=)cHA00BʆAV0TX!+3222 + 9++"/ֱ 2 +@! + +@ +2+  +@ + +@ +#ֱ 99901353#5!>323!534#"3T2 0g|E?@@d !00puUN00TVABtS0`E+ +/ֱ   +ֱ 99 999016  26&"`f=yyytXD%|+ +2 +$ +&/ֱ 22 +@ + +@ +2!+'ֱ! 99!$9013#5!632#"'3!32>4.#"D2jdQYccYQdj2`To--oT`x02772*0oo`0%+ + 2+# + &/ֱ+ 2  +@  + 2 +@ +'ֱ999  9 !$90167632373#3!53'#"'&326&#"`cYQdh PjdQYU-oT``To+7200027o^oT4"+ 2+ + + +#/ֱ 2  +@ " + +@ +2 +  + +$ֱ  99901353#5!>32#"&547654#"3T2 3w\HV60% =5K!<00{j[E5O(!8JCw0~8y2+3+3#9/ְ2&& +/E+:ֱ&68999 #-24$9/999269#/$9901332654&'.546323273#&'.#"#"'&#"~$*>T4gmjAVL%`IR)1#()$cP:D A;5CK1" \D^\.MIHU,*@\?k.S81-I1 1#"7|kx%8!+ 1+ +@ ++ 3 2"/ ְ2 2 +@ +  +@ + ֱ/ +#ֱ9 9901535267>33#32673#".58=0 $8:>E0 8\;+K?$D00zE5|P8cT10U9<@tw+ 9+++3 2/ֱ  +@ ++ 2  +@ + +@ +ֱ999015!3267>5#5!3!5'#"'&5<2@d !2 0g|E?D0|VABtSl00puUN0(tw + 3+3 222/ְ6 .  . .  . .......@015!##5!##(܁f,D00b00V(t+333+ 33 $2/ְ6.''.(.  ' ' ..   ....@ ..............@015!#'#5!##5!###('úf,,D00m00T00XV<(t+3222+ 3 222/ְ6 .. .. ))          ....@  ............@01353#5!##5!#3!53 3&ݜ8g8888788;8t&$+  $ +  ++3222'/ֱ +  +(ְ6. .   99 ......@  ..........@ 990146323267#5!##5!##"&91#)D3Dvʢ{5P (.I,Tp/1>) 1\MW00l00$&1C'UTVt + +@ ++ +@ +/ִ+ + +ְ6 .   .. ....@ 99 9  901!327673!5#"T4G1,09O!,D06|Tz8 *8~)o!+  + ! +*/(ְ2+2(+$+$/3+2+ $9999 99015254'&5467.547654&) nr&)~ee~)&qo )&,KW6JN[OO[NI6WK6 ++/ֱ013l^XV)e)++ ) + */ְ2"+2"+3&+2+ &99 999901>54'&54675.547654&'73"Xnr&)~ee~)&qo )&&)JN[OO[NI6WK,KWpz9/3 &+/ &+ 2/ 9999016323267#"&'&#"p(Q0'$*BEV/$8^:jDEV/?A" :?A8'TD$8'ND$6'M&z6`'R&(f'O|1'T2X'T8p&Dp&CDp&Dp&Dp&Dp&D`P&VF`f&>H`f&C>H`f&>H`f&>HT'fT'Cf 2'>f:'@fTX'Q`&PR`&CPR`&PR`&PR`&PR<@&bX<@&CbX<@&bX<@&bX;-+++35 $255:+3 232#"&'&'#4&'>=#"C0 739^ #.B|B.# ^937 0CC0 730k<($(p($(323#"&47654'32>73#"'&#"`kCt\ >T\64%- #Dg5U4#4-DuL_O~?vP7˄]L<1H(@$#$(9D&;NK&0X_F- kD0KWB+I36 B+O+)UB +U B +.3 02#B +# @+# +# +X/ֱLL+.. /. +@.0 +. +@ +.9+??&+& +& +YֱLIOU$9 GR$9.14999)6;> ִ ,+/ ,+ +  +%!ֱX>+62OJ2, ,+, +2 +O__/gֱ X#9>d9@ )EU[]bc$9_M99%O]d$901463232>54.'.547&54>32#"&547654&#"#"&654&'&'b;/:$mS9\9&(I>2FXb1hQbVX;,3!####.afJXX`n@bN>+&+& +& ++:1+0?/ֱ> > +@ +>+#E+# +# +#)+7ֱ @ֱ#01997&:$90)99199: 90135347>32#"&5463232654.+532>54&#"NY8eϥY}K=&.88&^^3KvH227_S0[Tk{0܎Yks(臨gUBR)$.+@|z[90#L]ky@HEN + + !  +3C33 8FB  +F%$  +M3%O/ֱ"+C F2C" +@CE +"C +@" +$2C=+J20 (20+ PֱC" 99=,+$906899! 69B /5=$9F,+99$)$9016$  $& $6&$ 53#5!2327#".=4&+332654&+@z:zz:p ppȔwqqw)2#"CP!==$IH>EGJK:zzzzKpp pp00] cA>3*@,E^t0[FKl@HG + + D7  +D=2%2  +%+2H/ֱ!+55;++.22<l+,2<+ Iֱ;5 %@D$9<>97DB92@  ! -);<@$9%'9016$  $& $6&$ 4>323273#&'&#"327673#&#"#".@z:zz:p ppMUPX4% $0JJ0$ %4XPUK:zzzzKpp ppԴvB!5gDi`iDg5!BvTJb2)+33/ $2/ +@/ +2 /$33 "&0$23/ִ++  +@ + +@ + +++00 +@02 +0 +@ +20'+" "' +@"$ +2'" +@'% +4ְ6., +.)*)*+,.....)*+,.......@99/(901!#&'&+3!53#"53#5!!#3!53##&5#3TB( 6AiM@MiA7 TA@,jnO`00`Q000000 0Vl !+ + /ִ+ 01632Vj%B %30!e&.>X./3 2 /ֱ + 01462"$462"6T66T^6T66TT66T66T66T6>B+3/3 ++ 2/ 3 ++ 2/ְ6.6  ..@  ............@015!7!5!3!!!!#>QpC}p6``6``60z04+(3 *.222 +@& ++422 +@ +1- +312-1 +@- +1- +@1 +5/+ְ22 2+ +@+) + +2+&+'6ְ6.4..+4+.4-.1-.14......@901353#5!#.'&#!327>53#4&'&+!27>73!53!3!#0 4'JcG 00 FdQb0&4Jnot 424(2Z(hl"zz"j`AlWA4`4^"*+3% + 3 +/ְ2(+2,ְ6 .,  9 999 99##9**9@  #*..........@  #*..........@( 99 %9901?&4>327#"&'&#"!24'Lh~_:u_4tTs6+A`Z2ԩf^YߚH\T`*:/32 $+ (/ $+ 29 ;/ִV+5+V+<ְ6$$ .$!$!$9""9##9+ +. 9,,9--9@ !"+,#$-...........@ !"+,#$-...........@5 $9(25$9014>3232#".'#"&732'.#"32654.#"`{jEx\:Ʃ{jDx\:ũH|0>[I[-`Z1<]H[,`XPv^-ZZB#϶v^-ZZBС:EX0#6:DY0#]F>Bd&`>B] k+ ++ /ְ2 ְ6.6 . 6  ....... .....@017!!5 >*e*``TUUT>B] j+ ++ / ְ ְ6 6 6 ....... .......@017!! 7>e*R`T1`1P#+2+3# 222 +3 2" +3" 2$/ְ2 2 +@ + 2@ + +@ + 2@ +%ְ6##.). .  ##".. "#........@015!# #5!#!!!!3!53!5!5'!5!-/>AL@Nj00E00@@T00@"@R~`'7`#+++3/8/ֱ( ( ++9ֱ (#0$93+ 999 $9014>327>54.#"'>32!".73267654&#"`L\Cx+S;8qG;6RJvK2NG3h\:RJTi(>RJTk&>X{ՒSSH8:Jtd6MP9@X6Vuw?f-WtwhtygZ+  +@ ++   +@  +/ֱ+ְ6 . +  .    .... ......@901 5!#&'.#! !267653!g 4R9w]OR4J@.pM9!47zp+ 3 222+22/ֱ +@ + +@ +2 + +@ +2  +@ +013#5!#3!53!3!z<,:4444:4 >t0|+!3 ++ 22+ +@+/ +1/$ֱ*+*/+ +2ֱ*$"99 $999+(9990146763!!327#".5!"&54>767#"#" 3*HD7Z)NT5M*)\7Oj#^/p,K?V\+3Us/Tc<dZS2I5+N97ϾV28~,%9#/ # + +/  + +&/' 9901463232>32#"'&#"#"&8@8*.V1PXpQni"=KM:ANtT>.-U> HF ):s 76TkW# ' *<06CGTP| O+k+/ k+ /ִ E+  +E+ ֱ 99 99901462" |"$&蘘*9+'3 2 +@ +%2+1:/ֱ+33 +@39 +3.+. +@.( +%+&;ֱ.3 $9)8991.3$901333!5.54> !267653!5>76 4424DbQ;TޖT;QbD4244H9/qq/9H%$ <][nʚ\\n[]< $%i>?Dn D?>pPAM[?+83E 9+/2E? +@E2 ++ 3 V2  +  +N)? +I3N\/ֱB Bֱ /  + +BI+2) N2)R+% 32%22/]ֱI?EL$9);<$9R /8999)E;<$9N9 %9990174676754.#"#"&546323632#!32673#"&'##"&73267%!2654."p~R'K4>V+*0/XiPN*, "7Z=l4*ORw:'ti}HF7z1cN|<)(I`H* xl6$@;#7* +3+[zz?fu:+%PzqJ+n9k]9NV=gr{`EU9 -*+PG+(<[RX#+3+ 3$/ֱ!+ %ְ6 .   99  99 99 9##9@  #..........@  #............@!99 9901?&54327#"'&#"32654'Xphun(phun:wy$:wyyow&yowvRΔ&vRT'/$+$ + +++/ +$+ + +@ + +@ +0/ֱ + V+)+--!ֱ /! 1ֱ)99$/$9 9- +99999014>3273#&'&#"32765432#".462"T8\e5J0H"-M 1N2C F(,hqURJlJJl`S(w&&8dbF,6GJ+&ZqlJJlJ~;++ +/ְ2 + +290147673"&462"~+8+FF JlJJl5ikiHaalJJlJ>B2/ ++ +@ +/ֱ +@ +015!#>p`(x / /+ / ְ6    4.5 .......@  .........@01 !##t@R+VX08^=+0332;/  ; +  ++/+ ++" +>/ֱ +  + )+ 9+) +)% +?ְ6..-49/4/.49034./.....@ 034./.........@) 1;$9014632326767#73>32#"&547654#"3##"&Z@+/=P|78V_J5^B8+1*7-SF5_#I]s@Ld|@_/"93ZJ8\nGP8CU,%. Wr8"P]Ec>B)e /3 ++/ ++"/)3 ++&/ ++*/+ 99 99" 9$99&9901>32267#"'&#">32267#"'&#">>fX_0$>fZGFa-$>fX_0$>fZGFa- YoB:IC$YoB:B>PYoB:IC$YoB:B>.s+3 2+3/ְ6.++..//........@0133%!L8J&('(' '8`'UD$8'OD$'O26G.+%2+:%. +@%+ + ++E +@ +$2 +$ +@$ +$ +@ +H/ֱ77?+%2%+2 +  ++,Iֱ?7299%099  9$%799014>323!#.'&#!327>53#4&'&+!27>73!"#".732>54.#"LhAU5P 4'JaI 00 GcQb0&4P5UAu1= =1ȈA (2Z(hn"zz"l^AlWA f,0'>'0,`%-;+$3 +)) +@) + +37,2. +.z<+  + +/ִj+ + +9014632'>54#"#"zL0+?!HW!EA%d45C#;>!\UJvP%>HB'8&8``  +3+3 /ֱ+ ְ6. . ..  ......@  .........@013 # `2D2gghh&t\D'T<VC+3+3/ְ6..33....@013|T:n*i!+ %+%/3& %+2/3 %+2 / %++/)ִ +,ֱ)$99%99  99017332.#"!!!!327#"#73&47n8|O(gx5h& &5&Wʋ8&p;lLv__p!V!pLX;p&L& / + /ֱ 01467&ncvvcXĂ0'JJ'0  / + /ֱ 0176'7vvcnncJFJ'0Ă0T\&0#+'3$ (.222 + + ++,33*221/%ְ2 2 % +@  +@ " +% +@% + )+2. 2.) +@.0 +). +) +@)' ++22ֱ)  9015354>32#"&547654&#"3#3!5353#5!3T&Pp[zz!) ;2؎@2D0FOoBtX*%7#%)j000000TL'$+3%!222 + 3+32(/&ְ2! 2!& +@! +@!# +&! +@& +!+  +@ + +@ +)ֱ! 9 9 9015354>32733!534.#"3#3!53T+Heo?zGm$@'L7dq؎@D0Fw~T%UUH00d@cT-˴000i]+(++=3! .2+83 32h] +L3h Q2c] +G3c V2j/_ְ%2Z*2BZ_+  /33B=G22kֱ _!]c999ZB(.V999h]Xb99cO999 @D$969!9(#-990146324&'654'>5#"&46323&'&546227>32#"&'&'67>32#"&'&#"&54767"#"C0 730k13ll31k037 0CC0 739^ +s6vZ7f7VF}3@ZZ@3}FV7f7Zv6s>:s6vZ7f7VF}3@ZZ@3}FV00z&z't&&P +;GW*+E3331L2+9$* +?39T2 * +X/ִ + ++!+-+-5+'+'=+I+I-5IQ+C+Yְ6.......@  995-$*99QIF@9991!' <=C$9999014>2"&2>4."34>2"&2>4."4>2"&2>4."PFFF@ >V> >V>4tb FFF@ >V> >V>AFFF@ >V> >V>gggg5ldd<7#"'&#"=md8 ,=md8 41-"1-"n'/ /+ /+/++015!@nXX@r = / ++ +@ +2 /ֱ+ ֱ 90132673"&0uu0rhjjh<:42'/ + +/ֱ 01462"!?x,>!?4i&$Li&$L6+ &+/ֱ 014>7327#"&)T[Efb43S<2E*Fh8bYF-I{C5>n '=D&P${+333 +2/ִ+ְ6........@0133#,d#F#!/ /+#/ /+$/ִZ+!+Z+%ְ6    999   99999@ ................@ ................@01?&547'76327'#"' 6& ySTzDzjmyDySSyDyljx9xmlzE{SS{FyjjyEzTSyD첲60++/ְ22 990173#3lllZ<V0+ / %+  +@  +./# 1+1/ִ l+ &++l+++ ,+ +@ + +l+2ֱ&   (.$9+)999 9. 9#)+$9014632327673!5>7654#"32654'7#"& 2:U)lCS61'& 88CIbaLLSL>$,.'1S1_B07+ "4/LZTn0 + (+ +@ +$+++++./ k+( +k+1/ְ2 4+ ,+E+ +2+ ,+2ְ6%$$.%*%...$%...@ 99 (.$9+9 9901463232654&#"''#"#!27632#"&T0(&R7QOCI7*(4&#iyY)*9!$+{[Uk' 6?wmtXx" E+/k+2/ ִ + +@ +  +@  +ֱ 9016733!53'xFV~~ ?J@$$dKx''ppx''ppT''pph'r+2+"2 +&3 $2(/ְ2#2 +@& + +@ ++ ) 990153#5!2#!53!2>4.#!!!hZ}JJ}Z1db@@bd@\49wt74jHxܼ{J@t  / ְ6            @  ............@  ............@017 7   ICJJCICJJCICCID`'R<z*+2+ 2 + +)3 2+/ְ2 22 +@ + 2 +@ +22"+,9013#53#5!#32#!3!!2>54.'&+zP]?<4M1 &K57o,4b4480ڬv4":Xc?5ciX`!) +%+3+)*/ֱ##'+ +ְ6 .    9   99  9 ....... ........@#9'  $9)%99999016327&''7&'&546;7#"26&"`\= G@a 9N/9nf足=yyy"/N] 6Y/4SX&t\N+++2+2 +(,/ֱ 22 +@ +2 +@ +2#+-ֱ# 99( $9013#5!#632#"'3!267>4&'."N tֳt 2& bjb && bjb &00tnLnt0ޙ2*..*2ޙ2*..*28'WD$p&D8^'KD$pr&D8&)+33!$222+ ++3#' +(3#"2*/ִ 3+  +@  + +@ + +l++ְ6.)$ ) )!!..!$)))!"$)#$')!()).@ !"#$'()...........@ $99990135333#3267#".54>7'!53!3!8< fdJ46B $$0T>$EM4^,~4~4APG;M@!U>6bTD%4444!pHSF+&3K 9+#%22>+8+0 &++   +  +T/ְ2I 2I +I +IN+2 - N+;;/-Uֱ;I FKR$9-NBC99 08>?$9F023;999 K BCO$9017467>754.#"#"&54632327#"327#"&54675.'##"&73267pxNl9%J4<\+*0/9+"0%:2>43S<2E*Fhpm8L1x]i4\"0URixv )%j%DC(4) +3+[m=835-\95>n '=D&PO]K DFJSpqP>!6`'R&`P&RF6`'P&`P&RF6'J&`P2&RF6`'S&`P&RFz`'S'`'HGh`J++$ +++) ) +3 2,/ֱ!!+ &222 2 +@ +@ + +@ +@ +-ֱ!99)$$901676327!5!#5!3#3!5'#"'&326&#"`cYQdj.rjdQYU-oT``To+72~8 08027o^oz6'W&(`f&>Hz6^'K&(`fr&>Hz6'J&(`f2&>Hz6>+(3 2 +@& +4+. ++2 +@ + + +@ + +@ +?/ֱ 2 +@ +2 8++3+++2+1ִ2l+&+'@ֱ1).4=>$929.12899901353#5!#.'&#!327>53#4&'&+!27>73#3267#".54>7'z` 4'JaI 00 GcQb0&4J46B $$0T>$EM4424(2Z(hn"zz"l^AlWAwG;M@!U>6bTD%`f2?0+ '+ &++:3 0 +3@/ֱ 32 *+7+ 2 /Aֱ*:97'-0$9!"99 90!"*$9 999:3 9014>32#!!2673327#"&54675#"&!2654&#"`hǂPR-,k 8"C1-22/43S<2E*Fhns0=^*]a0M2"~@dv:+%Pj8`X2*.4W,5>n '=D&PO]V(.3]'?WWz6`'S&(`f&>H4`'P*X&~J4^'K*Xr&~J4'J*X2&~J4'Qt*X'TJz`'Pr+NR'~K`#' +3!222+ 3 222$  +$  +&33 22(/"ְ2$22" +@ +2" +@" +@" +2+ %222 +@ +@ +2 +@ + 2)0153#5!#!#5!#3#3!53!3!53!5!`P@P@@4444@,44^446T)&+3'#222++ 9+ +3 2*/(ְ2#  22#( +@# +@#% +(# +@( +@( +&2#+  +@ + +@ ++ֱ#9' 990153#5!!!>323!534#"3!5362. 0g|E?@@c!!@P8 08RpuUN00TVABtS00 .&O,<'?fp&W,'BfL^&K, 2k'Afz!+ 3 2+ ++2"/ֱ   +@ +2ִ3+ +@ +2 +l+#ֱ  !999 9999901353#5!#3#3267#".54>7'zPlJ46B $$0T>$EM442444wG;M@!U>6bTD%T'~Iz&J,zl'-,T&LMX``&Pn-H'>|z&'Qn.NP&QlNTVt+3222 +3 22 +/ֱ 2 +@ + +@ +2ְ6 .. ..  . .......@01353#5!3#5!#3!53#3T2Tby~n00|T0000p0z`&RD/N'`Oz'Q/N'Q`Oz'/N'HOz'V/Nv'BOF+ 2 +@ ++2/ְ2 2  +@  + +@ +2 +ְ6     ........ ....@9017#5!#!267>73!53FP&O*f693 <xڱ445b>LQk4 + 2+/ְ2 2  +@ + +@ + 2ְ6!  ............@017#5!73!532@T0b4;00fvf`'R|1TX'Qf'Qh1TX'QQf`'S|1TX'QR'Qf0+.2)++## +# ++ 3- 2221/ֱ.. +@.0 +. +@ +2.+! ! +! +!)+2) +@ +) +@) +2ְ6*))**)*..*..@)!901353#5!#5!##"&5463232>=&5#3fb 6`Ak:0-&`;M# 424443PU8$gd6G4$.06%HH5B 4T1+/2+"" +" + +( 9++2/ֱ/ 2/ +@/1 +/ +@ +2/+  +  + %+ 3ֱ/9%  (999(9901353#5!>32#"&5463232654#"3T2 0g|E?b9*"* gE>@d !00puUNqa=B%%&,NhpVABtS0'W2`&PR^'K2`r&PR`'V2`&PRz`'R5T4&,Uz'Qr5T4'QfUz`'S5T4&,U`'R6~&V`'P6~&V'M6~&V`'S6~&V'Mt78&W`'St78'HW+2+2 +@ +2 + 3 2/ֱ+2 2 +@ +@ + +@ +@ ++ֱ9901!#&'&+!!3!53!5!#"4XmmXNL@j44@\8)#+ 1+# +@ ++32# +32*/(ֱ22 22( +@ +2( +@( +2 ֱ  / ++ֱ  9 #9901535#535267>33#3#32673#".58=0 $8:>E0 8\;+K?$J6006tE5|P8cT10U9X'O8<@&bXX'W8<@&bXX^'K8<@r&bXX'N8<@&bXX`'V8<@&bXX/,+ +"+ ++32220/.ֱ. +@ +. +@. +&+3++2 l+  + +@ +1ֱ "),$9, &)$9015!#3265#5!#3267#".5467'# XP1[lFSJ46B $$0T>fh f44VyAȾ440]ZG;M@!U>]PDHt72+ 9++,3%+ &++3 28/6ֱ 6 +@6 +-+ 2 - +@ +- +@- +-+((/9ֱ(299-/9%+,$92 ($9./99015!3267>5#5!3#"327#"&5467'#5'#"'&5D2@d !2'0BE43S<2E*Fhzr 0g|E?D0|VABtSl009a<5>n '=D&PO^OpuUN0D\`'P:('ZZD`'P<&t\`'R2=TV&]'J2=TV2&]`'S2=TV&]XBf+2+ + +/ֱ  +@ + +@ ++  + +ֱ90135347>32#"547654&#"3XY6T\z9*L !/Uu0܎Wm`T=DG&#*00z'WpP'>(2$+,++ ++13/ֱ)) +3++l+.+ 4ֱ )19#$$9.,9$ $91, 99014>23267#".5467'.7  LʮLXpZJ46B $$0T>kbsNȈAAvXG;M@!U>]Fh\TUe`!)x+%++ &++)*/ֱ##+  '++ֱ )9'%$9 $9)%99014 327#"&54675".26&"`f[43S<2E*FhhiMuGyyyƣ/O5>n '=D&POZL@s;X'Wo`&Pp8",+3 222 / 32/"/-/ֱ +.ְ6.   .      ...@  ...........@  #&,$9)9"999,90135333!5!!3!462"&264&"'76328< `i!q{iii)BBB>+(E4<44444SSST22T2M-#)ypf&D&0z`'RpP'>`'RX&P'Q6~&QV&7Qt8&WQD'W<&t\tX+   +  ++/ֱ +  + +  +@ +ֱ 90146323265#5!#"&r9*"* *,?/2\l=@%%&,+3{0}LR?+/  + +/ִj+ + + 90147327632#"&LIQ(8@.IO AQ 4,1?lRX<+  + +/ ִj+  + +9014632'>54&#"#"&R@.IOIQ(8x1?lE AQ 4LR<+  + +/ִj+ + + 9014632#"'&#"&LOI.@8(QI7El?1,4 QA CB$|,(nh @pr:2Xrb. *$dlllC\T"zr:"b.QtJ*dB|0N` , / %+/ֱ+ 9017267".00 uu 0FxxF]qq]O\\0N` , / %+/ֱ  + 901>2."0FxxF0 uu ^O\\O]qq]tVH(h DBLjOD/+3J )+%2@JD+/3 2M/"3 )+2P/:ֱ K225Z+#2215:+>l+>/ 31l+2>:8@995199JD3<99 99014632254'&5462267632#"'.""&547654"#"&546764'.%&  $  &%*)GG)*%&  $  &%*)GG)*+"#*! !*#"+ +"#*! !*#"+ X|  / + /ֱ 01>32Xt 5) '-?*,7p(L / + /ֱ 0147#"&(*t 5) ',7B-?*Zj " + +/ֱ  014?62"&Z) 0 )5R5FF**F'55fX&R  / + /ִ + 01>32R4*(.<>+ %Kh</3 2/ֱ + ֱ99 9901462">326462"h3H33H׎4*(.3H33H4H00H6<>+ %KTH00H6L&-/ + +/ִ++ 01462"MnMMn)nMMnMR'R'Rz'R'R&R&\'T8$z%za+2+ 2 +@ +/ֱ +@ + +@ +2+ֱ901353#5!#&'&#!3zB4JZ4244z6(=z+)++!( +! (! +@( +%2!( +@! +#2*/ֱ+) 2)&+"2%%%+ +ֱ)9&99%9!( $9014>2 .7  3!53#5!LʮLuuN444ȈAAff\TUe \z,z&.8w+3 222+3/ְ6.   ..    . .......@0135333!53 38< `x4~44!4f0f1 '+  +@ + 2+3+!3& + & +@& +#2 +  +@ +2(/ֱ+2+'2'$+ 2##+2 +)01333!2676533!53#5!3!53#5!4422444*44֞444z%$$%I(ج\2zp+ 3 222+22/ֱ +@ + +@ +2+   +@ +2 +@ +01353#5!#3!53!3zl42444424z3+  +@  ++   +@  +/ֱ+ְ6 . +  .    .... ......@9015!#&'.#! !267653!5 44!bNtH244Z@lV6'$%I#7bP-"+#2+ "+++ .+ +@ +./$ֱ$ +@! +$ +@$" ++/ֱ$99999#-$901>323>32#"'654#"3!534'.#"b:vHfH 9JRk?YSN80!@x`d24.eD=L"?Gvg<^B=M 6/@ھ449g\gLx'/+2+ 2# +(32& +.3 20/ֱ!!+$22 (22 +@ + 2 +@ +2!,+1&#99901>;5#5!#32+3!53#"&;#"326&+xފEPEއފEEY9999R]44]]44]4ZH;LYE+FB2+2)+6 +6) +@6/ ++V ++HE) +3HA2Z/PֱG+2B2BG +@BD +2GB +@GE +2B#+993+,[ֱPN93919,)/99HI96$,:PQY$901>32#5!#>7>32#"'654&#"3!53.'.'.#"L.uV5 1=S1P1S<1  2T;EKO70!+! #:MmDE$/  %%8WXg8(9WAP9<%h44%=7S<\4+StzJ/X<>U 0*GlwXT7%n44DP*o~h+2;/4R&TbP'TD\'z'd0'2'`R&\+;u+ (+0 '+ ++7 32#"&'#"&32>54'#"&54632>54&#" **ZPW2\KazzJ4!,*&.J 'YCrI(`jM,8B)*'_Z`LQY?2-cpnMxBgKH[l6+?AntN}MPZ/.+> =Ckt05P%++32 6/(ֱ""( +@" +7ֱ"( ,$92%  4$999014632>32#"&54767.'.#"&0ZC:dL=.  #))06>U(SXE #0172 CM-[I@0'Gh9j\BVc{RK%ES3Wxz<=ga?MlrB8>)jL&4&+* @++1 @+/ /+ + +5/ִ'6+' +.+#6+6ֱ. &*1$9#91*#999 9 99016327.54632#"'&#" 32>54&#"j)+ :Wp?g@Ca5B>#ABsfVXVfVXV M}FX`&7;&qQ(bVp|_Vp|z2|0+( 5+ + )+ + + 0 + 3/ֱ%%ֱ/ + +4 (%+-$9"$9990174675.54632#"'&#"632#"'3267#"&zB6%-|SL>0DFz@U?:VM7RL"0d[lKp;u)Z0t=3TZ@>(:&*-/1 D%N`-<\nXlK8+# <+ )/3 +3) +3/ +I/ k+L/AֱA +@ ++/5+&5& +5, +Mֱ5@  #2327632#"&546323254&#"#".54>7'#"&XsE5W?)*:QSV/{P|p=*eG*B37U}e0H-#3&OHF6<>32#"&5454&#"#"&54767&'&#"#"&0M4-H0)=Pc8;[2 046:WPTE.[L?(8/?= &L2(3P)32#".32>7!7!654.#"f,QNSe/EpEMQ9"F/7Y:$ s'T3.e%{ Uzm5hjAr熱OiKYE+ ++/ֱ+ ֱ 999 9990146323267#"&54'&D129LN$3 /A\LEQ 5H8,Y{!S: :$Jai]>?"+03 +3> @+@/9ִ l+9 +9 +@93 + ++'+l+Aֱ 9,9+9'(99"+,3$9>  '(6$9901463267632327#".5'#"&5467>74&'&'&>?6(@) aZ'r76p.-wVK!-QI;^9 RQ$&,,B;D$$ 0-'TC$.2#3XIoD5mA2OS"YWlT)9LbNUc~O!(90;,M<9,%  (++ )++# # +#' +)/*ְ6   999  .......  .......@9#99014632#"./#.'&#"#" N2YnY46400ZLN&E52$# JA6W)$2Ef=QXij546323267#"/#"&'#"&~.''-"+uR=^5! ;951*& -*=+D8M 'ZmHW/PB<>5LMVkG>NwTKpU;8T/'*>@cp\nlLܫ\1e0&3++'/ֱ + +( 999014632>7654'&4632'&'.'.0*")I6'* GA&G#O;lpH*:'P<4//!16]e;M]Ot?8&$ZiƨCm)#<`DVUE+( A+, + 2/8 <2S/ + + V/NִZ+2N +@ +/%N+HH/%>+/>/ +>5 +Wֱ%9>@  (,EJKQR$9/9E8/>99,%H99 JK$9SN999 Q9 99990146323632632#"'327632#"&546323254&#"#"&5475.5467'".`^42)A$+4AGZ58T6S30i_>me*B37U}jb+8.")(-KF6<>32#"'#"&327654&#"x .TQV]S'Z7';?B{WlXfVYa %[^~݆2FF.*4NUmVps\51+ 2+  + +#/, +,# +,) +6/ִj+ + +/+ / +/& +7ֱ/1991, 99014>32#"'&#"327632#"&546232654#"'.\bQKi8,,/3c30$:A"/6.(Npzd1G+<60pEJf4oܟcIC10 KJF_6Q+zZm*.!$ &_\t\ + +++ 2 /ִZ++  +  +@  +!ֱ 999 99014>3!!#"&7327654'&#"\XptಎXuVoU_HIOhI+2wԋ_qlxryPQY5 nt"K+ + 2 +@! +#/ֱ +$ֱ9 990146763!!3267#".5#"#" 3*H>oF;/EJ95J%j#^/p,K@U,"-7ZB/V_>V2`R-p#+ ++3./&ְ*2 &+ ++ + +/ֱ&,9 9#99&9990146323267>54'&5432#"&547654'&`1-,2.YQKm648 +8.]x))AR5k$whyBCA8BQ+`JsŤC,>?5D\5A1+#3 @+82*++3> "+B/ֱ  +  + 1+2#68221-+'#;+4+Cֱ1-9'#*9;>99> $99014323&'&54632##"&54765.654&#"\Д - COs0ayUsc^MFH=V1?>1(A!j_/d[`A*"s !jF_3@io`jJ>Vv'+8+*5t S~H-VJpQ6>"++3 "+" + ++ 37 +7 +7< +?/@ְ62 2 )03'3'19 92  2 29)(()93'32@ '()23............@ '()23............@".97090146323632327632#".'##"&54767.#"#"&6Z64ZB=(*;$,GVd4. E *[EMnU!1?';*!QF[+!&.9S>aZT-&2}}Ѯc5b8'Hhod+%/1&.~ɑ&"$2TNF5+! 2B+<++-3G/ֱB+25!255+/92>>/5'+/5+'/ +'+ +Hֱ 9>9B<9599!/99014632&54632>7>54'&5432"&54767.T<7UAtWR@9,9c>:5 /8%Oqc %5^5% {~DQhqM^&UN(^?Ek9K,:b _VQ@0$.9\yL|J-4JJ4-J| \@=+73 .+"2+-3A/ֱ +&+3 ,+&3 +&+ +Bֱ =$99:$9&"799+39:$9014>32327&54>3232>54&'&5432#"'##".\5O^) ;+|\MHC5%+ 3'P.I~GZH&&'l9/3KVj0CaK]|LK #p愸l|.ZH$=A%=?34nbY: $`TE[klH_|6'T`R&\'V`R'V\'B\$4D +( (++@0  +0 '+7  +7E/ֱ%%-+=+ Fֱ%99- 57$9@990(9999@7 99014>32#"&'>32#".3267654&#"3267>54&#"\9rvTp;[j2YtDK\"+}3mY_ɋhg7l~YDc:j~YDc:j>S.|2>F@&9neQ0pYM;f@%q}-;RBgb˔X~@JuX~@J0$.N)#01]a ^GW2+E3 +U )+ +P3* +2;2 +;X/ֱ>> +>B +>+HH +,YֱH;99 28Q$9, *992@99;7>999* #&,$9U 9017463232>54'&#".54>32#"'&'#".'.#"#"&;&'&#" pPhboeEe7;PEtL.LX.o>N*bp /C !7TY9+LF1$7! #%'-?-Ci]~O4*KA[WeS] i D1-&`PҀN=7. "$+$X15U7( `D\$'3?%+- @+++ ++= @++@/ֱ((/+$22422/ +3 248+Aֱ (-9/94 98=9%9=-04$9 90147&'&546232"&54767#"&7327>54.#"\ $5^5%  $5^5% D6gF?Ieqeq6gF@G |J-4JJ4-J~̳}J-4JJ4-J|"B@(+ n nL"B@( R/P+H (+!+3 6++) N22) +@). +) +@ +Q/$ֱ0 0:+BBK+Rֱ0$'(999:!3O999B8E$9KHN$9)H$08=$901467>3!267632##"'##"&5467'#"#"32>7&5463232654&'! 8.1F7C8.1FOKj0C@.7Cv`5,C86+ 2(z4l4E^/l)+'$40./l)+'VhΠDZԡU@ $40v'nCu 5:!69*0ҊFwK>`U8+F3 +3T @+#/0 9+0# +0) +V/Oִ l+O +O +@OI + ++=+l+3+ Wֱ OB9&)A999=>9-.99#09993899980 3995ABI$9T  =>L$99014632676323267#"&5463232654'##".5'#"&5467>74&'&'&>?6(@) aZ'r76p.-wV%=`Ζw03 , KN](d;^9 RQ$&,,B;D$$ 0-'TC$.2#3XIoD5mA2OS"YWl.&jǧyZ'D!'%DEp<*ENUc~O!(90;,M<9,% r+ 2+ + 2/ֱ+   +@  + +@ +  + ֱ9 99 99014> 3!53&$ 6& U&Ut\~JJ~\ 44}`\&z+3 5+++# @+'/ִ6+++  +6+(ֱ9 #99 9#99014 #"&54767&7327654&#"\/?>1(A LfVlXfVlX s'+8+*5tMVpmVp$+2+3 %/ֱ+ +@ + +@ +&ְ6.,  ... ....@ 99 9014327.#";3!53.݂^?ìt3!!"327632#"&546232654#"'.\On(X_50$:A"/6.(Npzd1G+<60pEJf4ݭ\Z[MF_6Q+zZm*.!$ &_z+2+ 2 +@ + + +@ +/ֱ 2 +@ + +@ +2++ֱ9901353#5!#&'&#!!#&'.+3z`4"KY05k?4248as~P/@+4dt]++  + @+/ֱ 2 +@ +@ + +@ +9 90147>543!#!!#!#"E8/vX15 LCU4%;8/>/ppd| + 2+2  + 3 2/ְ6..++ .. + + ........@015!#!3!53!p*-f4444H(#r+/ $/ֱ+%ְ6. 0 ... ....@ 9 999014632%267#"&'&'5'57l++ +< >B20A =\d؝'E9'E4K;2bl `0L+;3 @+ + +,/' 4/C3 M//ִ#!+#/ +#) +#+  + +Nֱ#299>99,8@A999' /9994 2J$9014>32#"&5463232654'#"&5467&#"#"&54767#"&`H~;r~xc%%E*B91/0*~TDQy[[v y?L;&3OGD_g&*=)5&chX8|jvАiN%,CVXY 0+_:6rVd? -$Nt: Y_#"0 ^m+ +/ִZ+ְ6................@01%.'.5432''%&' AtR\67E+; @+#+, $+,# +,( ++C F/ֱ@+  @+/// / +/% +Gֱ/68;C$9, 6999;99C 99901747>32#"&'#"5463232654.'.327>54&"\8>DOFB8TYa 1arP?_S,wgx160(4X:-hpVj2Dvgdtoh4xpLeO$%9V;& "5P4hyL ! '  Uy|:OM]m\ E+ + +!/ֱ + +" $99014>32#"'&#"3267#"&\BmCVL&@MWH~2T#u^H 17#_{'|#T++" +$/ֱ2+2 %ֱ99 99014>2 .72>5%!  LʮLuuBzΣzBu dȈAAffNN45C\ *e%+ *++ '+ + +% + )++/ֱ 2 +@ +, "99999014>32#"'&#">32#"&'3267#".\8Xpl2c-DIBQddTyVn> r4kqV8chGc-4+/AI[iAb 2++!/ֱ" $9014>32.#"32>7#".LhS5)abba)5SğuȈAi"K`99`K"if\',\',\',\',\',\',\L',\L',6&X6&Xf'f'&''L'L'z'z'r'n'zL'zL'*'*'Z'$Z'$&''0'.0'.0'.0'.0'.0'.0L'.0L'.'''$'$&''L'DL'Dl&l&&&&&<L&<L&'''$'$&x'x'L'DL'D\'\'\'\'\>'\>'b'pb'p''&''`R'`R'`R'`R'`R'`R'`RL'`RL'D't'$'L'D\'\'\'\'\'\'\L'\L'''T'T'&''NL'NL'\',z'0'. &\'`R'\'\'&,\'&,\'&,\'&,\'&,\'&,\L'&,\L'&,6&X'6&X'f''f''&''F''FL''L''0&6&.0&6&.0&6&.0&6&.0&6&.0&6&.0L&6&.0L&6&.''f''f'$''$'&'' '' L'D'L'D'\'&\'&\'&\'&\'&\'&\L'&\L'&''''T''T''&''F''FNL''NL''\t'\'\'&,\'\'&\L'\L'&8^&KD8&WD4&8L&zNt F+ 2+2 /ֱ   +@ +2 +@ +2 01353#5!#3zԎ0000)+ / ִm+  + +014632'>54&#"I1NlnvPO79hX)-kSZ5('G54/NB$L'l//(/ִ4+ +" + +4+  +  +)ֱ 99%9"$990146323254'&54632#"&'&#"#"&NO/\<67#'+'/O/\<67#'+'/A^53n%%'=&A^53n%%'=~'/7+32//63+ 22/%328/)ֱ- ִ4+ +" +-1+5 5ִ 4+ /4+  +  +9ְ6.299..........@)/9-+99 1799539"9  $990146323254'&54632#"'.#"#"&462"$462"~_Q^[9=# "$0_Q^[9=# "$03H33Hg3H33H?PO2)!3?PO2)!3H00H66H00H60&6&.0&60&6&0L'0L&6& 'r L'rzz&, ?+ )+ + + +!/ ֱ  + + +"014632'>54'&#"#"&%4632&DE1`f=>.0#.& *3x(,7,7XY"#M4>  +BD\wK&S+ +/3/ ִ5+  + ++ֱ9999014632'>54&#">32&>/Mlc} [C432vO5H</74?XOTx3* &,\w60H :71J&+wDB+.KPL'7 +3%2+"+6/5+1/+ @+/328/ִ4+ +" +)+3+3) +3. +3 +4+  +  +9ְ6.299..........@3)9 5699915(9+)9 9990146323254'&54632#"'.#"#"&4632&$_Q^[9=# "$0_Q^[9=# "$0lK)37/M q?PO2)!3?PO2)!3j+%&! N]#(`Rt&`R&`R&x 'x 'TRL&`R&bP^'KDbP'WD 'r'h</3 2/ֱ + ֱ9 99901462"462&462"h3H33H.D.$&3H33H4H00H6,60D6H00H6 f / + /ִ + 014632& (*4&. +>32#"'&#".!?+0Ld%AE!WH!>;#C5g%PvJU 't@T$ ++3@+ 2 +@" + +@ ++%/#ְ2" +2"#+ 9+/ 9+"+E+&ֱ# 9"9 9 999015>7654>3235733267673##5@-9$#@=c( lb=hDy#+"gvVy('.>B2/ ++ ++/015!>`` `++/ְְ6.2.2.........@01  NV,V2222Hd++/ְְ6............@01 7 H,VN2 `|'/7?GOW_[+>3 +:2/ִ+ +(+-+/N3 +J2/^3 +Z2/V3 +R2'/F3# +B27ִ3 +`/ ְ2 ,+2ִ ,+ + 2 ,+$2)+02- ,+42-)-9+@2= ,+D2=I+P2M ,+T2Yִ] ,+aֱ 9999  99YIOW99MKS_999][9+)8=$99997'% @E$9#!05A$931901462"462"462"462"462"462"462"462"462"462"462"462"`(8((8(8((8((8((8(8((8((8((8(8((8((8((8(8((8((8((8(8((8((8((8(8((88((8(8((8(8((8(8((8(@8((8(8((8(8((8(8((8(@8((8(8((8(8((8(8((8( HTOj&L+(3M&*I222h+]]h +]S + +3?2? +? ++".Ec$3$,Ga$2k/Nְ2I D2IN +@IG +@IK +NI +@N +I++/2& !2&+ +@&( ++& +@+) +-2@+8 +&P+Z #2ZP +ZV +Z`+2e 2`e +` +@`b +lֱ+I 5<999& 23$9`Zh999? 99015354>323>32#"&547654&#"3#3!53#53547'#"&547654&#"3#3!5346323265#5!#"&T1Snw@FDvzz!) 61؎@ '.;61WL-؎@(9*"* *,?/2\D0^pyR$YctX*%7#$*j0000>fh '% .()Vg000(=@%%&,+3{0}T&A#+$ 2?+44? +4* + + + ++:33822B/%ְ2 2 % +@ " +% +@%# +2 '+1 21' +1- +17+2< 27< +7 +@79 +Cֱ71 ?999015354>32#"&547654&#"3#3!5346323265#5!#"&T&Pp[zz!) ;2؎@9*"* *,?/2\D0FOoBtX*%7#%)j000(=@%%&,+3{0}zt&\t&'D't'$&'L'Db8L&zL'zL'z&zL'DzL'Dz6&W&z6^&K&@L&\L'\L'\&L'L'&W^&K2xR222J2J2X2F2L2L2(Jh&|tBJ$\/ / +" + + +%/ִ4+ + + +Z+&ֱ 990146323265432#"&'&#"#"&[@4C<] 'U@(O5U0 $,7`$4P*2X&"Fd$5U":J'/ /+ /+/++015!@JXX&t5 / ++/ִ+++ֱ 9017267".(!ʆ!( 1Kl~lK1diiRN`S$^KvWZJP"MH&L${+3 +222/ִ+ְ6--......@013# dٜ$v FZ/ ++ 2+ ++2/ִl+ + l+ֱ  99 9 901>323267#"&#"V>@: $ $V>@: $ PQYT)+ QYT)+X./3 2 /ֱ + 01462"$462"6T66TB6T66TT66T66T66T6Fk C/ ++ +@ +2 /ִ+++ ֱ9013 73"&,0p0,kŌn'/ /+ /+/++015!nXXJ$\>*Ff?,Xd@4F\kAHnHB0*9+  + +/ֱ + +901654#"#"&546320 (86*AE+^F,0+,9^D.Och3Tt#y+ 32+ &++$/ֱ  +@ ++/ +@ +2%ֱ"#$999901353#5!3#"327#"&5467'T2'0BE43S<2E*Fhzr0009a<5>n '=D&PO^OXZ!/  /ֱ 01462"X6T66TT66T6f$ ^ = / ++ +@ +2 /ֱ+ֱ 90133273#"&f0!vC0 ^koڝX&;+ +/ִ 3+ +l+ֱ 999014>73267#"."2TJ68;>J46B $$0T>1\HO7%&,3FD)G;M@!U&f$/  $ +  +'/ֱ  +  + +V++ E+(ֱ $$999 90146323267654&'&547#"&=+$"a <!-0A <?[2;b\5C$)"8&8U(1%>* _GW9E^A/ / /ֱ   +ֱ 99 99901462"264&"薖VlllppppzMMzMDQ,/ (+2 + (+2 /!ְ678999999@ ..........@ ..........@9 90163232>7#".'.#"DJ&I'"!)H%# .J&I'"!)H%# c!!z4`p/333 +2/ְ6...--........@013#'z)d-DLP? +/  + +/ ִj+  + +9014632'>54&#"#"&L>.IOY]PJ (6032%7>32) F) F/#%*4#%*4'/ /+ /+/++015!\XX` E ++/ֱ+ ֱ 99 999014>2".  `N­NN Nزu??uشuAAu ZA + 2+/ ֱ +@ +  +@ +ֱ 901>73!!5!'e448r0$SY00OO:8+1 -+'+ ' + +9/"ֱ+j++**6+7l+:ֱ01$99 '996*8919067999 "*$90135>7>54.#"32654'7#"&54>32!2767dzF|2^A@c8;%$6 0M;I[*SY;c`yb3-$0*@2Yƃ.PG)-GL%.$/&;O6R^X6i[7Ayc`K' 91b` :7+  7 +  +++# @+#+ +@#( +0+"+.3 -+;/ֱ (2 +  + ) +)/ +3<ְ6"#".,"-1,#1,."#,-....@ *07$93+9 399901463232>54.#"#"&5467!"#!632#".`P72@I9}T}F!# lKYR., .$A tv:B`5)C"*VZLPNtC8</? z>ʨKZܶ@63|;8+8 + +(+28( +2%( /, )+54&#"#"&54773267#"'632#".N8;3!b`=IY2 E"#3U}="Ms^UL_ _uDR?% ,!DFw 9=9(o 'CGO0D(6|%+,+ + ++27/ֱ)2)/+2! 2! /8ֱ/)%$99! 92,!$90147>32#"&547654#"632#"&73254&#"kU_نwA1&:~mj xdR&tӀ^qmhyH4}~lRBT+#)7*$IDtN쑙7,֞n^Ku u++ @+ +@ +!/ֱ "ְ6.9.........@ 901!#"&5467667!"$ #e./%0,02S>S{8d(R.-  l-6TEZZnF@>"(^bwD>=T+9+! +7:/ִ+,ֱ/,4+ $ 4+!+;ְ6''1 '(('921219'(12......'(12......@4, !$97! $9014675&54>32#".732654&/654&#"xmf}kQo]-o|uz}as32#"&3267654&#"|A1&:~mj xdR&tӀ^kU_نwhyHqm~BT+#)7*$I>DtN쑙~l/n^KzTQN+,3O*.K222 +3C"2C +C9 +2+&2G333(0I222R/Pְ2K F2KP +@KI +@KM +PK +@P +K/+32* %2*/ +@*( +@*, +/* +@/1 +@/< +*+  + +Sֱ/K -9@$9*67$99C7999015354>323632#"547654.#"3#3!53#53547'#"&547654&#"3#3!53T-Mdm8?^=$o8*P +nn؎@#1/:ix؎@D0Zj|X)7<(^=AC'($;0000rgT '$%& 9ձ000TOY L+(P33M&*IQW$2 +3?2? +? ++".EU$3$,GS$2Z/Nְ2I D2IN +@IG +@IK +NI +@N +I++/2& !2&+ +@&$ +@&( ++& +@+- +@+8 +&I+&R+2W 2WR +@WY +RW +R +@RP +T2[ֱ+I )5<$9& 23$9R9? 99015354>323>32#"&547654&#"3#3!53#53547'#"&547654&#"3#3!5353#5!3T1Snw@FDvzz!) 61؎@ '.;61WL-؎@2D0^pyR$YctX*%7#$*j0000>fh '% .()Vg000000TNK+(33L&*H$2 +33>2+".D333$,F222O/Mְ2H C2HM +@HF +@HJ +MH +@M +H++/2& !2&+ +@&$ +@&( ++& +@+- +@+7 +&2 E+2/&+  +@ + +@ +Pֱ+H )4;$9&2 9999> 999015354>323632733!534.#"3#3!53#53547#"&547654&#"3#3!53T1Snw@N`zGm$@'L7dq؎@ '.;61WL-؎@D0^pyR$UUH00d@cT-˴0000FkX'% .()Vg000{` $&$*$2$4$7L$8p$9$:$<$F$G$H$R$Y$Z$\$d$g$hp$o$p$q$r$s$y$z${$|$}$$$$$$$$$$p$p$p$$$$$$$$$$$$$$$$ $ $ $$$$<$=$>$?$@$A$PL$RL$Vp$Xp$Zp$\p$^p$`p$b$c$o$p$q$r$}%$%9%:%<%b%c%%%%%%%%%%%b%m%s%u%}&&m&u'$v'9':';p'<|'bv'cv''v'v'|'v'v'|'v'v'v'b'm'sv'u'}|)T)T)$|)-)D)Fx)Gx)Hx)JZ)M)Rx)b|)c|)i)j)k)l)m)n)ox)px)q)r)s)yx)z){)|)})))T)|)|)x)|)|)|))|))|))))))x)x)))) x) )$)%)=)?)A)m)n)px)rx)s|)u)v)-$\-b\-c\-N-\-\-\-\-\-\-\-mN-s\-uN.&.*.-.2|.4|.d.g|.|.|.|.|.|..... ....$.<|.>|.@|.o|.q|/7t/8T/9d/:d/1@1mL1o1q1s1uL2$t292:2;|28@8m8o8q8sh8u999$9&9*9-"92949D`9F@9G@9H@9J`9L9M9Q9R@9X9\9b9c9d9g9i`9jx9kx9lx9mx9nx9o@9p@9qX9rX9sX9t9y@9zX9{X9|X9}X9~9H9`999999@999999999x99x99`99X99X99X99X9@9@9X9X9X9 @9 X9 9999$"9%949<9=X9>9?X9@9AX9mH9n`9o9p@9q9r@9s9uH9v`9:::$:&:*:-":2:4:D`:F@:G@:H@:J`:L:M:Q:R@:X:\:b:c:d:g:i`:jx:kx:lx:mx:nx:o@:p@:qX:rX:sX:t:y@:zX:{X:|X:}X:~:H:`::::::@:::::::::x::x::`::X::X::X::X:@:@:X:X:X: @: X: ::::$":%:4:<:=X:>:?X:@:AX:mH:n`:o:p@:q:r@:s:uH:v`:;&;*;2;4;d;g;;;;;;;;;; ;;;;<;>;@;o;q<4<4<$ <&x<*x<- <2x<4x<DP<F4<G4<H4<J<<L<M<Q<R4<Xl<YV<ZV<\h<b <c <dx<gx<iP<jl<kl<ll<ml<nl<o4<p4<qX<rX<sX<t<y4<zX<{X<|X<}X<~l<<P<4< < <x<x<4< < <x<x<x<<h< <l< <l< <P<x<X<x<X<x<X<x<X<4<4<X<X<X< 4< X< x<x<x<x<$ <%<4<x<?X<@x<AX<cV<m<nP<ox<p4<qx<r4<s <u<vP<DMDYDZD\DD%DcDEMEYEZE[E\EE%EcENDNFNGNHNRNYNZNiNjNkNlNmNnNoNpNqNrNsNyNzN{N|N}NNNNNNNNNNNNNNN N N=N?NANcNnNpNrNvRMRYRZR[R\RR%RcRSMSYSZS[S\SS%ScSUUUYYYDYFYGYHYRYiYjYkYlYmYnYoYpYqYrYsYyYzY{Y|Y}YYYYYYYYYYYYYYYY Y Y=Y?YAYnYpYrYvZZZDZFZGZHZRZiZjZkZlZmZnZoZpZqZrZsZyZzZ{Z|Z}ZZZZZZZZZZZZZZZZ Z Z=Z?ZAZnZpZrZv[F[G[H[R[o[p[q[r[s[y[z[{[|[}[[[[[[[[[[[ [ [=[?[A[p[r\p\p\D\F\G\H\R\i\j\k\l\m\n\o\p\q\r\s\y\z\{\|\}\\p\\\\\\\\\\\\\\ \ \=\?\A\n\p\r\vb&b*b2b4b7Lb8pb9b:b<bFbGbHbRbYbZb\bdbgbhpbobpbqbrbsbybzb{b|b}bbbbbbbbbbpbpbpbbbbbbbbbbbbbbbb b b bbbb<b=b>b?b@bAbPLbRLbVpbXpbZpb\pb^pb`pbbbcbobpbqbrb}c&c*c2c4c7Lc8pc9c:c<cFcGcHcRcYcZc\cdcgchpcocpcqcrcscyczc{c|c}ccccccccccpcpcpcccccccccccccccc c c cccc<c=c>c?c@cAcPLcRLcVpcXpcZpc\pc^pc`pcbcccocpcqcrc}ddmduf$f&f*f-f2f4fbfcfdfgfLfffffffffffffffff ffff$f<f>f@fmLfofqfsfuLg$tg9g:g;|gh@hmhohqhshhuiMiYiZi\ii%icijMjYjZj\jj%jcjkMkYkZk\kk%kcklMlYlZl\ll%lclmMmYmZm\mm%mcmnMnYnZn\nn%ncnyMyYyZy[y\yy%ycyzMzYzZz[z\zz%zcz{M{Y{Z{[{\{{%{c{|M|Y|Z|[|\||%|c|}M}Y}Z}[}\}}%}c}DD2222  &*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}$t9:;|x?X@xAXcVmnPoxp4qxr4s uvP&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}$t9:;|@moqshu$h24bhchghhhhhhh<>@moqshu$h24bhchghhhhhhh<>@moqshu$v9:;p<|bvcvvv|vv|vvvbmsvu}|44$ &x*x- 2x4xDPF4G4H4J<LMQR4XlYVZV\hb c dxgxiPjlklllmlnlo4p4qXrXsXty4zX{X|X}X~lP4 xx4 xxxh l l PxXxXxXxX44XXX 4 X xxxx$ %4x?X@xAXcVmnPoxp4qxr4s uvP$@b@c@@@@@@@@s@ppDFGHRijklmnopqrsyz{|}p  =?Anprv&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}MYZ\%c&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}MYZ\%c&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}MYZ\%cmumumumu$v9:;p<|bvcvvv|vv|vvvbmsvu}|$$\$b\$c\$N$\$\$\$\$\$\$\$mN$s\$uN&&&*&-&2|&4|&d&g|&|&|&|&|&|&&&&& &&&&$&<|&>|&@|&o|&q|'D'F'G'H'R'Y'Z'i'j'k'l'm'n'o'p'q'r's'y'z'{'|'}''''''''''''''' ' '='?'A'c'n'p'r'v(D(F(G(H(R(Y(Z(i(j(k(l(m(n(o(p(q(r(s(y(z({(|(}((((((((((((((( ( (=(?(A(c(n(p(r(v)7t)8T)9d):d)3@3mL3o3q3s3uL5$5&5*5-52545b5c5d5g5L55555555555555555 5555$5<5>5@5mL5o5q5s5uL:$:&:*:-:2:4:b:c:d:g:L::::::::::::::::: ::::$:<:>:@:mL:o:q:s:uL<$t<9<:<;|<$t>9>:>;|>bt>ct>>t>t>h>t>t>h>t>t>t>b>m>st>u>}h?M?Y?Z?[?\??%?c?@$t@9@:@;|@V@VmVoVqVshVuX$hX2X4XbhXchXgXXhXhXXXhXhXXXXhXhXhX<X>X@XmXoXqXshXuZ$hZ2Z4ZbhZchZgZZhZhZZZhZhZZZZhZhZhZ<Z>Z@ZmZoZqZshZu\$h\2\4\bh\ch\g\\h\h\\\h\h\\\\h\h\h\<\>\@\m\o\q\sh\u^$h^2^4^bh^ch^g^^h^h^^^h^h^^^^h^h^h^<^>^@^m^o^q^sh^u`$h`2`4`bh`ch`g``h`h```h`h````h`h`h`<`>`@`m`o`q`sh`ubbb$b&b*b-"b2b4bD`bF@bG@bH@bJ`bLbMbQbR@bXb\bbbcbdbgbi`bjxbkxblxbmxbnxbo@bp@bqXbrXbsXbtby@bzXb{Xb|Xb}Xb~bHb`bbbbbb@bbbbbbbbbxbbxbb`bbXbbXbbXbbXb@b@bXbXbXb @b Xb bbbb$"b%b4b<b=Xb>b?Xb@bAXbmHbn`bobp@bqbr@bsbuHbv`bcccDcFcGcHcRcicjckclcmcncocpcqcrcscyczc{c|c}cccccccccccccccc c c=c?cAcncpcrcvo$to9o:o;|os?s@sAsPLsRLsVpsXpsZps\ps^ps`psbscsospsqsrs}tMtYtZt\tt%tcty$y9y:y<ybycyyyyyyyyyyybymysyuy}}4}4}$ }&x}*x}- }2x}4x}DP}F4}G4}H4}J<}L}M}Q}R4}Xl}YV}ZV}\h}b }c }dx}gx}iP}jl}kl}ll}ml}nl}o4}p4}qX}rX}sX}t}y4}zX}{X}|X}}X}~l}}P}4} } }x}x}4} } }x}x}x}}h} }l} }l} }P}x}X}x}X}x}X}x}X}4}4}X}X}X} 4} X} x}x}x}x}$ }%}4}x}?X}@x}AX}cV}m}nP}ox}p4}qx}r4}s }u}vP}~p~p~D~F~G~H~R~i~j~k~l~m~n~o~p~q~r~s~y~z~{~|~}~~p~~~~~~~~~~~~~~ ~ ~=~?~A~n~p~r~vd|ddd | |LLLDpDxDD  ttJl|ltttllTPP|xXx\XppplplXxxPPPll  LLLDpDxDD  XXXLLddddLt^ttt|P | |LLLDpDDD    ttJl|ltttllPPPPPhhhjj~~j~~TPP|xXx\XppplplXxxPPPll  ``p`x\l\\\d  :::dd|||x|xdxxTPP|xXx\XppplplXxxPPPll  t^ttt L L   L D p  D  x                D D       L L   L D p  D  x                D D       L L   L D p  D  x                D D      LLLDpDxDD  LLLDpDxDD  LLLDpDxDD  LLLDpDxDD  LLLDpDxDD  EEtEtEJElE|ElEtEtEtElElFFtFtFJFlF|FlFtFtFtFlFlGGtGtGJGlG|GlGtGtGtGlGlHHtHtHJHlH|HlHtHtHtHlHlIItItIJIlI|IlItItItIlIlJJtJtJJJlJ|JlJtJtJtJlJlSSSTSSPSSPSS|SxSXSxS\SXSpSpSpSSlSpSlSXSSxSxSPSPSPSlSlS S TTTTTTPTTPTT|TxTXTxT\TXTpTpTpTTlTpTlTXTTxTxTPTPTPTlTlT T UUUTUUPUUPUU|UxUXUxU\UXUpUpUpUUlUpUlUXUUxUxUPUPUPUlUlU U VVVTVVPVVPVV|VxVXVxV\VXVpVpVpVVlVpVlVXVVxVxVPVPVPVlVlV V LLLDpDxDD  LLLDpDxDD  LLLDpDxDD  d|ddd | |d|ddd | |d|ddd | |d|ddd | |d|ddd | |d|ddd | |d|ddd | |TPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  PPPPPd|ddd | |ttJl|ltttlld|ddd | |PPPPPTPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  ttJl|ltttll  t t J l | l t t t l l  t t J l | l t t t l l  t t J l | l t t t l lV=| 1]   R   7%6 7.7K z   b (  & 4 <a < "n 46 7 7;Copyright (c) Alexey Kryukov, 2007-2008. All rights reserved.Copyright (c) Alexey Kryukov, 2007-2008. All rights reserved.Theano DidotTheano DidotRegularRegularFontForge 2.0 : Theano Didot Regular : 23-11-2008FontForge 2.0 : Theano Didot Regular : 23-11-2008Theano Didot RegularTheano Didot RegularVersion 1.00 Version 1.00 TheanoDidot-RegularTheanoDidot-RegularAlexey KryukovAlexey Kryukovhttp://www.thessalonica.org.ruhttp://www.thessalonica.org.ruhttp://www.thessalonica.org.ruhttp://www.thessalonica.org.ruCopyright (c) 2007-2008, Alexey Kryukov (alexios@thessalonica.org.ru), with Reserved Font Name "Theano". This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Copyright (c) 2007-2008, Alexey Kryukov (alexios@thessalonica.org.ru), with Reserved Font Name "Theano". This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/oflhttp://scripts.sil.org/oflTheano DidotTheano DidotRegularRegularp`e  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg Omegagreek Deltagreekuni00A0Eurouni00ADAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni01E2uni01E3Oogonekoogonekuni01ECuni01ED Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni02BB afii57929 afii64937 gravecomb acutecomb circumflexcmb tildecomb macroncmbbrevecmbuni0307uni0308uni030Auni030Buni030Cuni0312uni0313uni0314uni0316uni0317 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni032Cuni032Duni032Euni032Funi0330uni0331uni0342uni0343uni0344uni0345uni0359uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdamugreeknuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosbetasymbolgreekthetasymbolgreekphisymbolgreek pisymbolgreekuni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1kappasymbolgreekrhosymbolgreeksigmalunatesymbolgreekuni03F3uni03F4uni03F5uni03F9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F72uni1F74uni1F76uni1F78uni1F7Auni1F7Cuni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FCAuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FECuni1FEDuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FFAuni1FFCuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200B afii61664afii301 quotereverseduni201F foursuperior angleleft anglerightuni25CCuni27E8uni27E9f_f_jf_jepsilon_brevecmbomicron_brevecmb Rho_uni0313Upsilon_uni0313Upsilon_uni0313_gravecombUpsilon_uni0313_acutecombUpsilon_uni0313_uni0342epsilon_uni0342epsilon_uni0313_uni0342epsilon_uni0314_uni0342epsilon_macroncmbEpsilon_uni0313_uni0342Epsilon_uni0314_uni0342Epsilon_macroncmbEpsilon_brevecmbomicron_uni0342omicron_uni0313_uni0342omicron_uni0314_uni0342omicron_macroncmbOmicron_uni0313_uni0342Omicron_uni0314_uni0342Omicron_macroncmbOmicron_brevecmbacutecomb.grekgravecomb.grek uni0313.grek uni0314.grekuni0313_gravecomb.grekuni0314_gravecomb.grekuni0313_acutecomb.grekuni0314_acutecomb.grekuni0313_uni0342uni0314_uni0342uni0308_gravecomb.grekuni0308_uni0342macroncmb.grek brevecmb.grek uni1FC0.iota macron.grek breve.grek uni0342.iotabrevecmb_acutecomb.grekbrevecmb_gravecomb.grekbrevecmb_uni0313.grekbrevecmb_uni0314.grekbrevecmb_uni0313_gravecomb.grekbrevecmb_uni0314_gravecomb.grekbrevecmb_uni0313_acutecomb.grekbrevecmb_uni0314_acutecomb.grekmacroncmb_acutecomb.grekmacroncmb_gravecomb.grekmacroncmb_uni0342macroncmb_uni0313.grekmacroncmb_uni0314.grekmacroncmb_uni0313_gravecombmacroncmb_uni0314_gravecombmacroncmb_uni0313_acutecombmacroncmb_uni0314_acutecombmacroncmb_uni0313_uni0342macroncmb_uni0314_uni0342 gravecomb.cap acutecomb.capcircumflexcmb.cap tildecomb.cap uni0308.cap uni030B.cap uni030A.cap uni030C.cap brevecmb.cap macroncmb.cap uni0307.cap uni0327.cap uni0328.cap circumflex.itilde.i dieresis.ibreve.imacron.icircumflexcmb.i tildecomb.i uni0308.i brevecmb.i macroncmb.icaroncommaaccentiogonek.dotless DotaccentBreveOgonekCedillaRingTilde Circumflex commaaccentAcuteCaronDieresisGrave HungarumlautMacron zerooldstyle oneoldstyle twooldstyle threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle nineoldstyleffffiffl  <2    !%&'(,-./4567CDEFQRST_`abnopqrstu  =>BCGHabd "*2:BJX`hvDLRx\ xxx x x bcd DFLTgrek"latnF   (AZE FCRT FDEU dMOL ROM TRK F        aaltbcalthcasenccmptdligdligfracligaligaloclloclonumsaltss01ss11sups     6>FNV^fnv~D|8<4FJxN>   0 N h |  F8LV`jt~ (2<s &-5oDR`t  '.6pESast$(*,./12578DGHJLNOQRUWXcn.LM LM  $@$=$=`* 135789: 0@LV(4@JQ '.7>EJ&SV,_f0v}8@HPyz{|LMPQ yz{| LMPQ 0 &dIObIOdOIbB 0  cILIMLM cLMIbF 2< H( H(HH$2DRd J (.4:dIOcILIMLbIMOdOcLMIbJ 4 "E*Z^djpvz~ XYZ[\]^_`aIyz{| 1 2C34D:G9F;5E768*LM LMPQ ILM CDGFE 1234:9;5768  v  (08@HNTZ`0/.-,+*)('&"*28>D%$#"! 6  lDFLTgreklatn.(AZE (CRT (DEU (MOL (ROM (TRK ( RQDkern mark&mkmk, 8@JRZbjrd *j J"-....b..,    ",6@ f +X^djpv| $*06<BHNT,D $064`@8*8$. V8,4,.n+,DEFGHIJKNOPQRSTUVWXYZ[\]o 2MapICG BHNTZ`flrx~HHHHHHHHHHHHHHHH2N U $*06<BHNTZ`flrx~ &,28>DJPV\bhntz|B,*N&l B*,@xT:P6$0`@<lB6@B'|*B&l B0Bn$35=DIKLNR!U[&]]-.03451279OPQRST  28>DJPV\bhntHHHHHHHHHHHH> &NTZ`flrx~ &, R$00`@8*8$. V*4.n&DEFGHIJKNPQRSTUVWXYZ[\]o MapIHz. $JPV\bhntz  R$0`@8*8$. V 4.n$DFGHIJOPQRSTUVWXYZ[\]o 2MapIHN (RX^djpv| $*06< j0`@8*8$. Vt4.n(DEFGHIJKNOPQRSTUVWXYZ[\]o 2MapIH  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv||B,*N&l Bn*,@xT:P6$0`<lBJ6@B'8|*B&l B0\8\d(8<84`bvB\\\\\\\\88888888\8\\\8888844n&$=DIKL NP"RX%Z],023678912;=Tqwz| }&/6?DKRW^gm HH$. 5lrx~ &,28>DJPV\bhntz,L,B,,,,B,*,&,,,,4,B,j,B,,,,,@,8,,<,X,,,,B,,,,@,,,@,B,,L,,,,*,,,4,B,j,,,,<,,B,5$%&'()*+-./0123456789:;<=d 1L`o1; .4:@FLRX^djH,H,H,H,H,H,H,H,H,H,H,v^ "(.4:@FLBD6n  0% &,28>DJPV\bhnHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHlVv  &,28>D@Xp Q  *06<BHNTZ`&&RRvv> &NTZ`flrx~ &,\\\\\\\\\\\\\\&   !"#$%&WXYZ[\]^gimH (.4:@FLRX^djpv|HHHHPHHHrHpHHHHHHHH>HpHHCGCGNTZ`flrx~HHHHHHHHHHHHHHHHHHHLLDpxXLdD2Tt^x|PLLDpttJlx|PPhj~PTP|x\Xpl`px\ld:d|xd|$         EJ SV       0        A   EFGHIJSTUV    2PLpvp|T|xZL\N|tTdLLt|hPxZLx h"H`x@X`4 x xPl4X> ??@@ AABB CCDD EEGGHH JJ LL NN PPRRVVXXZZ\\^^``bbccoo ppqq rrssttyy }}~~k$$&&**--224477889:;; << DD FHJJLLMMQQRRXXYZ[[\\bcddgghhii jn opqsttyyz}~~            $$%%44<<==>>??@@AAPPRRVVXXZZ\\^^``bbccmm nn ooppqqrrssuu vv }} w$%&')-./12356789:;<DENRSUYZ[\bcdfghijklmnyz{|}$&'()135:<=>?@ABCDEGHJLNPRVXZ\^`bcopqrsty}~$XX@@ rrrrrrrr(XX$VV>>$$$$$$$$$$DDDDDDDDC)7]O*colr GSUBGPOS h:LMb  ')039<SV_bkmnqrt~=CGl(r@xW~| 'c '?Xu'Ic|1QA]w:Y'ccmp' Simple Glyph Composition'ccmp' Dotless Variants'ccmp' Capital Accents'ccmp' Subsitution for Greek Accents'locl' Localized Forms for Greek'case' All Caps Forms for Greek Capitals'locl'&'ss01' Romanian Variant Forms'ss11' Greek Contextual Forms'salt' Stylistic Alternatives'calt' Substitution for Initial/Medial/Final forms in Greek'liga' Standard Ligatures for Latin'liga' Standard Ligatures for Latin except Turkish'dlig' Discretionary Ligatures for Latin'dlig' Discretionary Ligatures for German'frac' Diagonal Fractions'onum' Oldstyle Figures'sups' Superscript Forms'aalt' Access All AlternatesDotless VariantsNarrow Accents for iCapital AccentsGreek AccentsGreek Composite AccentsGreek Iota Subscript to AdscriptMedial/Final Forms for GreekInitial Forms for Greek'ccmp' Simple Glyph Composition-1'ccmp' Dotless Variants-1'ccmp' Capital Accents-1'ccmp' Subsitution for Greek Accents-1'locl' Localized Forms for Greek-1'case' All Caps Forms for Greek Capitals-1'ss01' Romanian Variant Forms-1'ss11' Greek Contextual Forms-1'salt' Stylistic Alternatives-1'calt' Substitution for Initial/Medial/Final forms in Greek-1'liga' Standard Ligatures for Latin-1'liga' Standard Ligatures for Latin except Turkish-1'dlig' Discretionary Ligatures for Latin-1'dlig' Discretionary Ligatures for German-1'frac' Diagonal Fractions-1'onum' Oldstyle Figures-1'sups' Superscript Forms-1'aalt' Access All Alternates-1Dotless Variants-1Narrow Accents for i-1Capital Accents-1Greek Accents-1Greek Composite Accents-1Greek Iota Subscript to Adscript-1Medial/Final Forms for Greek-1Initial Forms for Greek-1 ,2\b7lNrex~ )Lr:g $=[ ,'RQD ' Greek Caps after Accents Positioning'mark' Mark Positioning'mkmk' Mark to Mark'kern' Horizontal Kerning lookup 0Greek Caps after TonosGreek Caps after VariaGreek Caps after BreathingsGreek Caps after a Breathing and OxiaGreek Caps after a Breathing and VariaGreek Caps after a Breathing and Perispomeni'RQD ' Greek Caps after Accents Positioning-1'mark' Positioning for Top Accents'mark' Positioning for Bottom Accents'mark' Positioning for Acute'mark' Positioning for Grave'mark' Positioning for Dotaccent'mark' Positioning for Dot Below'mark' Positioning for Capital Accents'mark' Positioning for Greek Accents'mark' Positioning for Greek Capital Accents'mark' Positioning for Iota Subscriptum'mkmk' Mark to Mark-1'kern' Horizontal Kerning lookup 0 kerning class 0'kern' Horizontal Kerning lookup 0 kerning class 1Greek Caps after Tonos-1Greek Caps after Varia-1Greek Caps after Breathings-1Greek Caps after a Breathing and Oxia-1Greek Caps after a Breathing and Varia-1Greek Caps after a Breathing and Perispomeni-1TopBottomAcuteGraveDotaccentDotBelowTopCapGreekTopGreekCapIotaSubscriptTopMarkvedo-2025.5.3/vedo/fonts/VictorMono.npz000066400000000000000000004064351474667405700176630ustar00rootroot00000000000000PK!H  font.npy   tU6\7$!!*CyL!$w霪 (K%,4"`TAQQN " " 8!H+'K۽^o\u~>Ui[['ҲkzC[IoY<.RX"r{8>?joo^jtEdxf?NӴ].=\#?\*~ʦk T{B#TW*\'¡C7?\T;SS .?+k%3.Vc=Jdk.1205[ViiolE-JĔ`W؏ۋ`}Ҋ!%~ę}=熚 ^|"X?SሴvZ/|EIJyF4T7Q~W2?$z#FwqU~)nĨQWh Fk ZjttUH+VJiՄjAZiZ3TtUZ:tt HS&ZcZ#FZCЭ ڕ T- ]):E}9XJDLiujuhЉIjC.7/ gHinZ:?Zj]3?eAqRn'\ ) =vj/3^si?iowUjJEOY>vBԮ:燻]Aޮ<$鲾m6gY:xn!ƊX*Uaש66`MT fCLCА ZStV]@+ظq+aVh!H`!jb! xYoBބ e&4Mhhӱ!pg AiCjйZt2 Dѵj)bky2D3!C  V$DtHmUM!z͠-0WStJkcVc+i`@i?tt?/tR4iT6m1Mn dR9k!Ld= ۡoCAB`>ZoZ/^ZOZ6t }=2W2W]ݠuo3tgt'E\l7W=G =[=K =S + umCmH"e" d!ad!Ad!A=22k5УGkFub̭j_bbbLU-&h,&@-k k5͐5-58miw`=I=Q+.&@Ozw@"RL㡗B -Vw?hˡtx~Lkù%Qa1W`x~@Y} F(ʆ5Xx苂}g? ;<|ʈE&Pݯφɸ|ԭw+^ًU1P˾~ҭg~cL1{~qX0ħ̚ #JF@,@c1eCp>gB]1|v /Rŋmϰ$(l욢+^Ek#yIrsB71 a><}Y3D>*o؍5Lsf;3 sZ: Χ9y#/sbo(&槣ih,{=wr:ns+g~C7S-6x/Nxgzzd_1c7s /sǻߪ!g dS?&8|1 1  oZy)v?u?OKvW1y!K@>wĔgZog 1 gثu.:/@yŠXgifԸ8?׆O)*qYôT`;n#y՜l3vu˜ n,дA%jyaSuupoqWܧ0 ^3 9&YF7K{:{unƛC5o?"P=P_UInI؋Ay#ãTި|3#a:@ցƭ[4hÐh #A.B/B/-ПZ|9ЇC0sN7ГRԍ9,n9 ʋˋˋˋˋˋˋ@zp(_oMqweuNםF;^w4ziui2PiQ&Jy]#+)MzSt2^ʐR%C V!;b0K[ʰRR4KIi, ^ϠzAA\Be y1]sm*QFQF e uU Ԥt}H(K t*+ ~TTDyS]wA/VJM%|SQJO0`*=T@k ЊȊZH9LR4r$B{Q$H&GL"ZP^_[YH/G-!\,![B%Pǁ*2tw8Rq(h Mm#0~+:$H鐀)RhCHF< uPIQ|IH þXa27x[c ZqkLjǔo\X#|s nQVb\~x|E0VVTc]m)Q[MOR[)2YE+wF*<;tyi~xڼ:m [c 'ŇtW}0-Un\a~`nkY@ P>Fi/9vJxQ>1QVfv(_kk_?y`~^eUŝ{Ff˰}=5*P\q]Ff w\U3 p ʹrUwFjh?`fp_L3K³b{ass V{3}=i{]v*ڕ'U_> QPRM3ڛf7ؾayOվeiƘ===...QOOOxZxZxЮӮӢьg..N<]x8tq3ęxLKn~߇5?X>dcFZT~ .w\/ .TbJd94 ōz[:4;T`g[ƶP?o?_ҒjLݰcئ,+Rа$]=nPɛ9+Q+Q+Q+Q+Q^UXhU`````ɈV V V V gdeى 4 4 4 4 1 1 1 1 1M0M0Q 6ۉ\(tdcڑ#kG6֎l#kG6֎lQޑ#jG(+JwGyJ#|OROjj~uܙ;ɞiʹ΀"; ՜*t,P-DG ss;!h7|IxMUG{ ?\ȃ zl'WX X1 q$1đ^j\XGK=MNfP"%7(PI &݀ ިN)Q݀Mdvq*kUW~|./.u ?R~4v^?ZS]B.bl-ʱ!KO`ruLեWgtR~2zmO᭱(W{:?:\7uϪ8{18~ fgk3_дcݏ1Xna)6b[-E4RTS@:@][P}m3~~𷇵OJc9ugPwF ^PVIF7G}Ѿ ]H(+SVR[ J='}dV:lu>0_.sG1ߠ>EEI"E"E",D柨lb&2VH,H&7剴;DZDZDHeiiI$S6Usl:نu evsa}n܆=ZŒK6)Vc_V1+`WsM^{VoĨO]ߊ]m#NW$1暑/eӱ/ +9> jr|t|DE"UN7g=nNiNӜӜ9:{[JZ3"pi؏ՉAz)4-MfFL2j]:[Nul3WSC * }׆Ob9GbuS-{Y>Q4xI-=s~dn}[UX|Zуf2_zJmM~auo_\jlg|J (^ScC=~cyUf}b7D'ZyΧyGs/y?^YI+&G{]-U)W0 }erX*c {I'ٷY_~]o|/#19e7:zJ5ÖF|L򭻭ᴵ%Xc}ʮ#} ckEnk 6c}Fcn&|/4y@>tpGVHo?a ZyG !.gg\&g|ߪV]jzɡFu\|{X+ΗNwwD lvgiN󄔲#O OF-#KO i.u- r\!d6 ?B*9Edl.2^%JBILIX^UgU}P(t|F C lbWzWzWzUjho`6$H R ye0RJ (e4A ]+z3t`5 K3,`4z* lvb`Df"3ѓѮb|t¶iuC. &¤);].dFV#M$[UV7788T1y&S8_C)Yc+/Jcy.ɄdK%3]*dvc$'3HLKy %3̾dQ$k71ȖMneVZoeJϭ쯼 QkRZmdvd6}kِZm.{3U~z37s.{37s.sPˀ\T7s.{32?rhP!LZΰr/gq9C^ru3$J?F}k ~Rm/WBIST~GjE_ A^cgFvq'0̕3d|Zv\+bO,D==Ֆ@׭6qDS[ӡ/B߆Ά~ ev/lsws܉xjw3yO y^Y+ZatN}cMW=@xEYTX}.Vڬ>sju*D4z1֋1^D^\,fd1%ddѐI)t)mp)n))Ѡ /R4~_edѪDqR BQ4@ EDd80Wai( /:D, KCT%rc&N!pJe3mG ؎Ң9e//Ў/nyXu1 b}Q?07͠jhgEpLv7 0Y.Y(wɅV9RW2q* #:{7L:;^5
&yr4۱g#4hSEw ޲﷧c k1hcoA &VU՝o Zɺ=dbw?rd7\ B\Y/W5@,]i]~ ES 8x޾E.cX`}6Ny jLOꅌ >ۿc޿p5*Y`nppZO5zƘO=e~byپM+NyqWH([8-k Gw&8˝gNu7溎v#nm%H` 8te,%\wW߻pn{V~vyS_!<-ľzog\w&Tm5VS9._%-BYO!&b=ɾl|))c>81ߢCAްrUlj\Vseeim"DG5MP_eMx]\&K j*d4f4f4*VC;*l&PekOh3qILA?mެ= Sў´ zZE *!)zm+dVN!3{Xg0_e,b"f,b"f,",RtJ(^:QYIe%]tQV!YCd 5tHЍX5Lm\i)Rw 8=DOtCCh kp} qhXTd ݭ)tL`@@r V8Oǀp#\>'hO!hO!hO{9fWLavS.NѕXJ9C$$$$n)evK) 12PJr"3E ER;H 9H9uyspI rQ9h\N@.' arv3Q`n9# Td= ֳ`= ֳ`=(z8vO |J"4-W]䎑fydڴZ ]E9bc<%~55=[ h꿝nO֭uxxmbǃuku. |pG$$*4@IZE2R5șk0U>E_Tl+Ҏrq}$}!zz:FOoG]ZXvҧ²áꢏgU nc^.{0 x\\Ԙ%ɽCy(&b9xPآ8"|9Х+o9Nmep'!)b1pOZ)0 f[~?Dk=`'ښ}9ԧ?W/S?7yPrJ8݉s%ZUn`U*TM1ӇAe6W?C*ˠf. jorE}>tɼVRJ*e*[V:*tN)Xn]wCTL2W|rn+^B^B^B^B^B^ =v8p:!Ca G@NBw(t"t-b@"t-bk":EdQEdQEIEIEIEIEd3Ed3Ed3Ed0Et|'A+fSH@1.#ٗ eGYG]FҚ9H:#l9H#6ۨ8r'yDqIt'yDqjjjjIt'C|| *bvɨvtQQ٨fG[JO^і]QzBs* l)zQ-+|pHQ]q |=_ɱrLq ls.EyDnIY$#2_^-/Do8}kJ&'}.NzSa%YO2q1+E'r|O6qLgL>SdL>3(7&~9E{!񜨋*p*.ʣ_ nH:A{:jb0F?<禘/D:/ 6PUִΏXO>*M#,7[XYNVwobp1m^o7.N;rm~&yͽN^?,UGMCnpjy_ulWtM.0+=l1}+Ih1 <$@R1v3AtJ٧h8gg{vfdϠAc=z{= hg) R@W2+hjWԮRz 4+P1ZAⷂ}C+7}C+4I®$H B*$B*$%q,cc^pblD.K$ID.K$1-^LbZq$q$=r'ȩDL UU244444444P8qnL9('9('9('9('9('{.8w9؃6cEbqQ1M f*# JD7( RK@._ZcVfT!=BzT Qy(֊Q鄨tBT:!*±Uc p_LOB?mޢ=U@TlQ $10@I $10ā!Ii(ǒBxiYiYiYiYIII"}q\Nr9 -+$tESISISISISISISISISISISISI>I8I8I8I8ҵ  sd!<2FmPڨj |XM,0n3[7lE\T&ȼ¼B˜ Y&jvc^`q,n,n'~3]v OF}T p԰QAy+ӂ蹎FJeO.CB2X|L>{zzTHEeQGUTjTL}TmHT uQUQսN۾+zV:uJ.*^TDyeKK$`X3zcEUúH0%şUd%&F )]o҂w- e"̘ܳR9ͪbw )*^T(7˳2g<G%Ntpj;_7a rs;xA^_`NgsPf(q쩓_|-u9FNb2AWxX$:_j{ vkX^/˻(K1~tʼ׬aMNXWٽɞx0=1مr,e<,!q8lo[qD_BovЏz~>xdiBд=2b?4Roh1lsYJvK1OɲttT_'åTZ6w8W3"5/z7zo=ؾ[݋w;K88SgUb];lgx`aaa3άo:S ·Nu=ĝr<&@`,o%{?Gqu[;ܹ>mVs?t6:d:1Y/ zzgi#ӼL[m;M `'YKB/?-X>BO[w7Kкρ)>ʜfKm6kڍ6/ pR#įbJeTwp*\k3K n& A l"ˆEĈEĈEĈE(_Q!Nד;]Ot=N*3m߮0 ;t =anJ%y:Xơ|<ǘa;eH0TSbydydytMu`+֚G֚GZ(<\1q q| q| q| Q;G#jy<"u:cn1G#^as <FO1^%0^;+ 3 L 1PnvxDYwDLYЊee1l,g1Y)gEEE<,Ye%g/ KN/;DXLly1b事u&Mfv7`[턬Y{ =(_-sE涋Czw1l3vdbĒb-مҜ](*%%;jZ%}ZҟjI%ZOiI?%SZOiI?%SZrbh'?CY;}B 38;)i3vqzRI'W8qݸo@ҵ=t(3WTbCR:$;uHs*HJIJI~ KMMMM?٧ͩWͩ4vc$ x\[|>>>}v1!CGijhB}>{ikнާw i|:4FiG^f7DFLDmMc+njn rU+TΘ-,җMO$Y^)^ur&/R]ToSI~&Xf1[_)8]MwD}? zCa/MX]f? ] {%a!k]agG伥 w/ ]o{!-zm&W?T 7?_X,fUkuҪmIۯۛ{{fL+v-+֊_+w˫!mNv_qn2+gɿ OD ;Y^ ɝw;-t7iEAk8&KK_dgsީ6!ݕn"Swo{M"T]R%~n{7ý92il_ū\lb-f\e3> ńbRbbbbbbb1VTTTTTTUpU U% WD{K(!PJP^Bp*!8h׾%/a} B K@(Q%TLH#ɻ4\Mʻw5)j$n9߹YN]ҭ@ 3 T0P9I9)Бr)'a-UtVdjO'ȯ=I{$-L͞9rep3\-$ /2;%t,[=Dۓ'Cx=^Oz2ד! ӓ$=I@{$I ؓP Q$0RB4wL"O S6j*mԴW~kU??`?Ǚ6 ]st/;c"DJx\-p=~#7=(_,?3&A|*abFG03rL̊f0iZ AhM5afrf)er;f/_LLf5gCVn4lU}٨I+w=!xDTngŕ#tiJ6!q+ P`Πbw3؝P5n-ظUp fD mLLue`qW1w&sxw|%?K7 2H||Hsr94bChӴ).x@;h"X fDW1VwG+dUecVFҪ: :,33X]g{U+O}0$r*b\z 5=>o%-bYS~0zxP_6rzz_ͩS`o5+PFwSS*uW\G͗N{1O!OVO]E ezѾ3:o wd+Q^ʧw'DOxx)zG)8gX˭'#VM=k/auE AtD|,r#˵qU 89o;OŒr;u8e8A̐[k @\Q#{9Zr%>b[<-//"I^3j*[u^s&p-n-sZ^2fq,mo5.w)snas*4fqKN.&%qg,ʮ<$p͎(RTd{}]~Zf V3S?\%毲T-(0U6R5Yѐ>D8Vg"oE<#f1| t0)h T52oG@*2:bW9999}o6j[vqdfd8ȊqES)NxG*uUҴ)SsjqxN-ϩ@>To:G@iS9JRQ[InS$o*IT$yS1RO]=m6A9 JaPbl6A٠͇l78h}TjN0{fȳyjGS;S! Ћ&]XBA{SY,kd+gp -bntj(Rm1t[EvHّ7{*Qv ħ(>Nљb, 0"}x׼!yI )ytK~SE@fh>k^ak54fbIIpöq @LHN+7y 8s+ذXl);T|"g@a}{[b`d}uy63<=u6}~FeD)δL9N6"K~!V=o?mUJs.gBmZLa~SMPp[G"]ӳ~>`l7݅dWlzY:_g7si; wm.ta^%byc{^dOpZٿZ۬ u-̗qҭ1ɸ8c]ߣk qƨm65[oӍ,&ރu.KU&iN}}ƙk{=xbRǫ~k>Nú׸ 4~Yf[V7Juk&un6tov'3cr'\by6֫܏6w]XBUCS2y7jnwn%bOϧS]|>C>!o @/NBhCh_@h_Bh_Ah_ChL5ԦԦԦԦH~iBv3O?iv#9"6>"6>"6>??A~#~*gE>V> ^0O|S`>"l>"l>"l>!c~0>QƌzF'= D/*^o}Pu!Bzv=g_MxWVVVVVVVVVVVVgZ9Ctmo__ _ _ #D)0B}ua* ބ&k5'%kNJe}ǭWLWcUo_2??:}"T|V.k`% c*K,,e"Q&e"Q&e"Q&U*GyLN:eBQ&$eBQRI/PQGw;82C;:RB^FShQNП?LKU&Uej]UUe\UUeYU&UecU?VecU?Ve\Uiq8**x_tU_Ujj1Ъ*~utM_MZZЉD$_]_%C'jC]}/ .zz}S|)Щ>Ki | |iЗT}+|'mkJ+}W@0eށ_E_Ha˜,+BP_bhB= ~!zݐ d0 y(`Oh{B3 f'4D_Z6$oH!j)) ʭH[B"nE S 00Ʌ)L.Lara SR">D{FL?!Qǿ!6A&g3ESwqBl1STKkgOx#hxOczoS&576K_5.Zu5gj/wn E{+%-/J=O2_mVFv]KLE;y+o3YnGqG}J/jN;9:co8[e;yL?8do4W=B'6(+Զ{/SxnW-xo4嘆a@[xUOaҟpr׺7[G{uy_$3p-x. <1!;*Pw`{?;.*7,^_k4]c0&/*|C$gW+kOjsh)UfרY> TW.U[TmRnKS_2qqLnho~$!S&j\UKK_}StvXƻn$irN9Υ3EKx\EuyP'cr,o/"Q;X}Pyn7«!j>4uG+5yce00㰲!e}~4W&jV2kV0ԗ+d1U*L>/wJ7 *!bPWDTQD./k*cE'535235K3scfXcfFt1r.VVw=go>g}罬wu$+&q$w9倣--mrK ڻBp$s5.dq2hu5rqrqrq`q25[EwEwEwAɶR(c]JI%Ac}c':H;H;H;H;; ; ;a A)H% HaoK.AF| p<)mH%"k#ԫp,RB^X*Ið^,erFɍ c!>02+*DcAbBg?x< BB4&zF|sizz>1C6bPbtgȺn'tۑKB#kp*Gk Ci0TB6XͺmR]frkwW8{})ԖˠM?m~~~G,GKit%h={v7 )ym1d7HG]쇮e8n:Mp9h@_W/l|bdEl6Mby0>(kX$19-DΧkb.\T~m3(Jm:OO41 D3ʺ:hu ;)_7$0r˴^fpr]0i@Yq']exe[<{& mQۮ׊Z4ꋼyQlXM<9( #)9b@ A. TMRJ)9^%sz0L0.04L%  '%30>U{6*U3@Sr @$SsIC T+?҆`Y*`W^ %|%)+ds:eh{΃K# %/;9$PC (9[uB0[vCvF8fT2wK ,RUKCUT-hRQh:)v,hV!Z#4LBNHCXD(v%u]+EZ{Mp<[5eLe9;eX,3 r^f8gR ͥthzvJgwKSwC\! d4jlJ58mvwBݭpvҾ .k_]P ۴j=OGϩ/s|eieeux2KWGLZYw;'-d*)b(:Y|טk{̅0q(dUdmt&E.)(bgwoWu6M%꺶SZ]-1bųЛW=նlDe1_͛jiZኬY$ǝUOSohطq|V0rƌ2 j^Egφˆˆه eWTuББՇW> ^C\(\(\(\\\\\*XU '~T~THQ0K.~Q*P6 e~3=PH r<@*EAa9E#`?*Bh9~~c5m]rD᮳ ߉cQJ]km/ Ŀ-״v|btJ)8NPl[ePxZa^s_Νv[K2Z1s0ԩPwRl[/UoZ|UC.㓂w8;ҾU{f[V0wbY2qNmkjggϿ[l&]aݍcɴ4C;[69ٵBM/]U:V?zڊ ГW5qF}ƷF6 jDu &7iGGSY4H4?_{.V=4Jl;{ڻJ\/Ɗ8qǧ~="Ycp6U;Uu/T=UvDЏU6ɳ7S]=6q֗TLF07PXxٗ/wU Vk7{GbgLi(u6}џonulcMߴ\$q 8gX>+zלA68m{jz?wgϳ ^`=Cq 'Z z[  rC6[i "'C쓖դ/ξ|89ݐ52賰ȩ,TdKu(S00 00 P۴?K%Ւ K"L,בI"*6A&lL BKYiHJCVR(W9/ S0/ SP$ P ,ͮ' vO4-h K[6llHsa;ptבB)--C瑔fT8];`K(xacGyEdǤxQ.>8BxefXs#`B26悯 J!.$$@wt%h3$i[ %>cn y$sl0Oߘae } }(Gx1ol#Ң,ow#%xȳ&sbxKlޢE/t柰=doG/6f ][\o[c<,2SDWx-3 #6<{>"[J1K< 6B5fn6ZXY сҀOu{5-Npz־[qkkNlpbc @9̵':=M IOOO:j0 ^%poF1dCrgYPPP&i @T *J] |:ʽ ~ '>IwЦ! LC` SQXeu۳uHC8LgK2Fj q`7 Ǎ 'Ryǣnh) X۝wd?RvڂUHw|hܷT}BkзlC8>Gh>z3p_b3+pranƘ/e< ΒM4婮=9o})>?gYnƧO=>>-2#5]%zgWeʳ[]“H-CO07ٛ,|77'X+={1]XYT$Z%Y)Y"2'j.[Dx gA}Yhg}}fU&vvr֓?{1PduN1QXcO->NGg:ϱ˖3AZ Jx 0+0.pyUB60ѵ$nWl"?ow*m>L ꐭda T0gBCP xJ,K-D{OM |_ yT3K%dx2`udйpW42`iݻԻԻԻԻԻԻe& rúȅɟ ?Aii#$0aPkàֆٮVA5 j4v;1 DO) ٹo#l[(ضPmZB m D[maK--i[S 56V|bw)v(1{<$Ů3QNN-g-ZC?8'! dubSH![p =ACv^1ϳ,2,3Y#=jw'"b7p{4ALw9j-j,5|54|54|5t`ڣE ls 2T t:bbbAX:w5e=d.L 3f/D [+.Jgi+Hk1)R4TQQ9Ǐ*:[ {Y+b歰Zj (SĠ$[Lj&K9><`I UKQG ?1p Z)H   <Y *J$FZ;i{ [ M1,b0z0z0zzp:*ũX2e4PHvkZ!V;bpGL Q jPgK r c c P4XT+G:DBL=7\ Fzzzo@DElm@VH ԒEaԃ׃#Q z\=,zXrrQzd# D/G2a5OVϑ`ROm]:Űao*U KV1\B1 .+Y d1,b4z tU USƨQQIbiSF[2Hh ))%S4uʉ}=~j=BrCQHDj~6/p/[Q 8Fsp9҅q ?Qw }{SIqlruCHM֪W1HcUv$Ow}UP.eg!Hf[ ^v vvhhmԡvO,[+RSDBRfN CÝa$?*ܑgw*+QuDz YF;]ǠkήLJ;(Cݵ"2ΊbS=+zCG&)oZ޴5hjKEy'0)М\Oy*O 78wIk7tٍvseh<9Qaw#v`h`%Nq^>qV˖ԣrP9ӂ.9/ۧ8V]V]b ^]—pUEwZ`MU9/w}8 ]n*v` .6opЃע9q\ 9FFb3/\gmH0ΚnUhbg盃ڗ͚o^Ve2~Kdf#|V`%Ϝnb61M`Z},+6hjf73*q/9"OD<ÞcYKbn*^˷S_xvlLc~Zk/Aҿ߱N~T_$`V{ϩG2dn-}*k$T?T?T?T"©8; o*| @_+gٟlً=dD+mVko-D&z)R|r>ez.>NAJi0Vb[w"Ac;^cԛS^2[IIQ[ϴzCW,Ys1޼| :YiDZj?RWu[Ϛ7yX,JD$bD>;.vST;Oۏq8{!'ϗ {2p'%#SX_ C4<8tЉk08l<<<<q8q8"ʡe $ttdp'k=\ZOۗB@E!} 4Ts@5Ts@5W0Bp)˹EbiHy$jEb2E$&SDb2E$&SDb2E$ ӫ p|8`>p1"1<áááÕ[[A >ۀ=b !,gowgrKTy3ٟ~nG ;xSW^bIOG:Tq?K4'SM@G eguިCdU3չ~5F3Z~@d$:c /y( 4[k8*NK̫6G!.'ʵSWX@;o7؝:fkYg l91nFtyF}1|nF[IV |_Nrw/4+hg HK^}ҿw[=yŐ+}Wkb&8~%Ӌ,UiFoolllPz &Ո(P9]`|a 5\0F΄,j '.Bu.@WC!jt5] @WC!``޲(i2KxgQ;;;cǁ.33mKE匡1 5dŊf1}N{SMHHHHHHHH%*VHvBڟ챽c5{l^!M֟UKc[ }Sw׊8:4dS7{-ZYU:I-l&ZMQN?O6v6WL]Rw/jWb '}^&~wBLjՋĶP5GhbVN-Q;GDsXsQo~.kx*d ouЛڇGVˣ"oÐ,)%(b/HOQ?xzig*ѧ$=7>"=<GVT˺!%E;h%R )v ;Tml"l"l"l" Z dtQ)ئ `m )LJC(H[HԛC:UBI:$P()рv] sss4KMl[. lI BKjjjjihhhhhhM_hh$`l@CNxu1ޱG\ Gl8IoB|"ƙcdJ3PVL\]T{h+6z8:_l"l:zKFM%vŒ2Oav wk{IŞ_*Wl+~h\-_j.=haÙFǯ ^SC*_ _M$N0e/\xgYuzZIjvP۫۬lKQ-xV2k4oheJldx7|Ag7tjeRJ?2!Jj (^8'OՓļ*/KY=Ab|@pՏ>w:Xͱdm#>O<.FQ' F#At$p!? C~4 iJJ%R &P F$Ҽ¼B`7 KPFۅ.waK] rَ.d;`*`*`L !X&,<^ ~UJJ u%Hr2!3 3 3h_OÞÞ2[Dž!87 ]%ɻ(Q(x<EʉrDyEVoE+B_*)5GgC)effCefCdCdCdCdCdCdCdd[(:Q;2)>IyyyZK`tWl)wuf¼,1OâH|wl []W SD9~GI|[BθQ7Nڛ=dJo23o7hj̲At&W'v{ƅ/8n`VrhpTƟ=~#W5}*#A3=З~~Eo4,v @_Ӆb.&*XizOvZ[Iueu{:q`=㰾u.=miO8?sa8U WA#'Wy=yr>]p߅w8KS9~l0ٴ.\d]PKC}g]|eeإ̑ 34)1<1*1 @11 3s39 Fl}0ÃQur "h`DJ-faF`,8+VӟeyUQLESQdKyH϶;'lzN7X0(f2sbjql+ hKtgN^ʻP}c)[Į`+Z=I]Mk19^u[bVn-5ES},{2~!u\79fs(p;1V\Agٷ_qdT s-S;tJTsC5'\Iʻ w.`]DC"I$ ɤ'C^FrxrR  !I[7n mPuAWq¸va\@\Pp @]zӟ= 4EFQ@(%ᖏeDF刎r;Ft[IEIrDwF~=>/u:87л%  A|g$>Җm1}Fx,{JvYW=k^ 4~ V*njaUm˶>@+W QPUVkEږ-%9Z/A,A}o֤ڑ֜QwB'~ eF#H*B;v 0ʄDLtΤƾ%~h,RAL8fx7z]Ui9, $'Ku%ҫxȨԦI*vvTqSZZuZgXܾω]XK Z:8Q^;YUGu mK5kdan12D =|& &+ʬfqkx::cgl+{^c㷒="Do,ycv>@k#DMok`mx8CycKy*=z{yy혰#u|7^a:"8tLvH7]Gw'Hq 4DGCD4T`Q^^^^/INt'< 0awy*a= h4G^d2W$ĬfdA,c!A\c !1WI23A23A23A23A/3A/322d0A2|H~8fu 'w:?lz?}Dk4ѫTOET"蒖@}>r s2GQ3ȱp!JZNWc191]X`PA!} clC| yJ0C,0~Qn+R-m6hLOqEjy- (>hs@[ݎYQn{VTh>TLC M= *RqەӤ09O*8-gv|f*t<d_0v|n!^`Fmoo [ UY /n.??mE(75EGe4?4g&QDN|OvJZyce_,A}iy6vQc}zgz/y4ُM[hd4TcaDt=_OӣsrzZ^~_qlueVXÍ jwY󭙖nM"ku[ڿkf ""Kb@cE9 |?-bN33kuzu5u|Ҽ޼V 3ʔghjmg3Jo%8#iSæc hˉ!-]N*D#'qxa>qQ+G4\p\p\p\pkkexLa`Rf֕b88pp8) E#Ba t0A)X=8#1#B"X@piN&+&ttf v]c٫&ċk~~:a?yRH-$ ZOx7{ ==r֞>oxFݦ^Y BYsl33G3I6/;[J? 3_ x1NN\Do[t?H\&ʟ7:n{tYc񨞢o*hzTglAzHU߯GHK(ʝSHpfsH<;H2Jpm8{5S\bF]홟Ǟ#V|! ͵C?Mr~"HeW/IQ r9H ܑR\M"+( Q0|G>;m|!>}uҟ_jT4@%T=TJLpB8SI43%%kHkUgZ?bhЊm}?a?itS+H TR1#s0R1# ZbAT\K%$[*[*[*NF s3?s A9I:G?pAr`prXaKegv|Jƨ"EkEY,`ĩ$EX"%-"Xb,2A,iMp %e&$Z[RL `*dGFTB_je|(扷EWw=;fc} =fWmb[DRBW5yO ۋB1S,⡖O}O5~/s|Drh Num:Xۢ K&/`ZX[}Q6%vqgb#/?lk4{SUYXҲV,{_Kwzqʆ߳U+&3 O*|2o{{Mcvm3B-M;nPk)H5eIkhQ5~sF;ct|MqM兞#/OF}Qb  _{/91ΙCf^h.3w7hSC|Ogٟ$eD}ԧO_G-\脕[Vv[c#XYdÊ\VECPȴÞ4@dĤvJWe'@`G 0R!ZtV:,p&+{$X,R)d'2逌P M: #qiǭ ) }}}@̜$T9/Ur8 DhD˱LȊhлf@WhpERјKk<\ߒAED"hG4#!C!eh!2Z e$C&HHH|$> ?1111`ISnq+|w>8N{.8\nNI!XnTNhkϵJ^cD dd6<_S$y|l2?1OvE$D8MD~+y>it,M5zmc+I z[֝V"6k5aB Ƭ2?t _mV2}prO+igĭ#Ih;wᖭpg}r崤!UxW(o]1Һ^KyUddddd違^3-QQd@`.Q$Z& IV+b!ױ2b᠉= {*T,X_wiCbEjGl:pРpAJAJI!{(VaqOyJu+!F<ؿ<ɪ>6IOӾ5GcPB+mT-zU*VWwb^a^#;Nz0AHfERK2ԡ u(CJIHʉNg)UbPY *Ae]|(PCB %?77׼R|@kJ< XRtH8ԢR=íJ>*(%χ ͧtnS6J<*zijAyUE&Yg=*^eP1ԋz֢VZ dvY{5*{F~jUVC}2rX5kr?|Gyr%tnD#]aQ@(d`lWYC=v'ټkjjP]r, .UP=TP=TP=GN=vꑶSZzzR%ԒkRBJY θ.Z͵ kiZւMp-ԗ~B)kRvJ]^W)Qsgrt ©S0U)TRJ*E8TGP*A|򑅝,|da#ܹe4A|Ai>*+2 ;_ a}"(EP0Aa._ZnW)urVG1C~qXK8o$^L^T,Wj^IgPg,xe~h۴|ـwCVsO|RFo{AtjާQ}DL:owCeMyDz)g&+u9n~; OڷwnSn9r2 kA̮#8ptcȁ#w].'y_.z]u w9- N08%adx r<>!!4|Ce1t a0@AAQ (W¦V B͇h|C>!ɇCp!8|0|LaG*|( URi^G! &y@Gti L0b/z(l @_C*s/C ^qs܅Gcݶ!yW^}"#f C&'496^:۱ظ*mc|gz7w^hnG>!X_,A 6Z63HIlf1hSmA[GN٫ ֆ:i+ qdնCC7!x -7v|n8:~iżv2f,?m.:V3U-&;lD>们_Igj!۱Gv҇[d;;8Pݺ@[{}h,m~ݛ̾Ӹ[|93vwOMH\={{.^7jO߬2F2c\śOl>glqJUt.כl*h:^5&vq<ƊǏiGpxwNaSj)Yb)Tx%/>Q^禙MO7c^D ܪ/+}}_ a忚 V?z4z4=eπHC,^Jꍈ|s>qw b}b}b}biC(&jYP0##)fY,`0 fY`iY`iYH˂2ʂ2ʂfaDfaDfAeagAl%#<oZG9G9'CH'='=YYv,!(CB ;F" "ZvK0O? T;D_[m>_CCFu3EDf2iwxOo J˶eG'ܼyst'({aS։:.cM(Ҷᆬ@ "dIKBXE"a RU}#0c@ FaDTTDD!Mn?u&43μ7_wI鵺~gjmJYEEG7yx~cyTVwh>\l->-q.Q!dDA" ps$G2@Y.tns>0f?f?f?f?f0I_Q|E9 (1F9NQL90(1҈ #1^e<|T^Qy6)DSzkJtM/iiiiҷG# G߽DziSӠ"Ra*]AFE (E.@tIP&!&|'LQG2&|"I.A&L$'ىL/2׋ԛ%EWݸY7SԏpqK3zWgl\ y<#\~[Ӓ49^fKtNӶpz |},-Q߫e&t=c1ӘL:x3Ʉ{X މT^o`i_h2[H`55I0׻˵Uп׏B?m #Zk3K:OMy }. /]Dgh>$Nۯ߯,Ic3xKs{8]Ruz,;rpY߇l0buy 0AM4~ФexfOk@wʀ0t0t0t0:'Y闞p$c>U:șuooo^cCiB"cq*.Z#vv@Mq.i[Z$9SV0Շ>6o)CՇj:! !`f:FDDDDickD~#e$‰NPiK[D'bD 8,'B%B%B%B%ސt4DDD'&ޘH la&2+^[VÜ@*R./ohRI, (C C M `$\>LN *8YS$UAB ](pK?:n0{($P'k}t2!Dh$Ud 1)$2 ^$]IXMVA1--%2},%ۏ26aJw%e&D-5%lqIN#F @"F5>#rQ]x2K1>c̕xw2lf۩ OVO{TQ[-J{4v@^=TUVScL ?䯡c(^dq<{IDy'?;2ym3sX0ч/WCy9feqX_[1zxucz;=VĊz7$pި8Ve{㐱ƘA oWB~ٔNL;!^[oR+ mV5B/_Í4d6=Ͷ>b@.jZIxsz:g5`ڿr1jdg?;Wj{c}mg]&OVUd!CȻf5r{2FM5Gzi%!穑jTqIUTѼ47NS2ДӔ%rc,X}*uO z A׃У9?‘{NaBNVVVVJJJJJN qnXIqBIkB.d`,L9KkBY*FW1r`Q 3G1|]>^>^>^LTTTT7L*Br!\;A:!VA s+p+n+m+`l+pV ;ZE[ё:v0WfvBhf'fvw"Tå:!L4;>݉wv *z'蝠wvBN$W:A0IReZζ;р\& ]4"\2wyAؤ$ÂtX`r,09 >VXXcyup^ WiYC`:ݑ7Pt(pV>XkJA!+*D]y?3>RbNq0}v{zT?7{ֳs3Λ+uڻ\F8x>Aǝ̺VH1}jV={ywQ.Z{|BZ#XO$c~Z 5׀yJOl4e; [Zo~ih*֏\cηZX qxNV/3꧴)MזhhA9B]3_ū⠨.i}SʷxO=p^x78a^@7AK,)dCYeTz^Oꡲ.%}u!iR)^#yVxVxVo[HB*{KVw8-1B';'8( L S@TpTpTp< 6-ROG/G/G/G/7 kq(,#CW E_Jg88,O^ODbƈ'lC7j6Fmc6lZD.ă#E-IoiIfQe8٭*V$jqjmkz%eh.VxggWԹZ~Ta Ox/̶Tb$t’Nhael]?dk{ZGcuZ-.#jc^JJG,ugY$MyL4kY!!%3_O هft'y/Eh[]E]9f~f dR7ӏHxYk%VeĂYo/ƊU;WUn<]ysE=+?Xq凎9pX.:+ʫec cU/(oTeWܯZ0$nxE#R=k |NQՠie^b2yNf Sf5zR ۰iOhpì!ؗs!5+`ewTk'۝~X=6qqMC"f؎>>ރm5nnXM[nVwŜ`L&5ت&SJ-dO멝fCX}%&Xh\1:}~eIfv~b%Ί8q#cڊK|;\ކG -/f8}&Nb#/AejjjVS[S0`XMה0託h-@HD_U.5OiNd1YAL}Pi* >‹OXJM+vl`vvvvvv_+[ c-Z ւ$SOyJ?e'~T)SޤOyJ?m*@T*ߡK%Sy>*}S[@HOihkozDrx&?P~ 2c+dV⭐[l<,k<4xh8C HNb;H &L4th$܌'#hx2Ɉ& B4m$)iy^-|I//hRET/r Ah93̄3ZLګ *W`_"0~fYofA,h6̢#7TxRZ\Q}4]EڄfU\M7U0ȇ`"sCts-)3,-*SZ~4-O+hyJ9I˓>TҲR9NJ-+c<Ӳ\9JKi94d):\>|hoФeQuc*k2 +@2L,_賒+h,-gL"}r$ Pi"&:"'`2J@yJ@G%00-mPPPR (PPD%s `\hK1Xχaz> aT|ʟT|39B#aZ>CK9 0=azg`!~[,{ppHt\T5Zow_wSS_Wõda P?Oh'cqFg;}>QoӶjuk,b߲H39s=~_DxJyqE\]1ھd_t &iPyۅ$߲?ե7w${ݴ$:z}'LWO18e[.p^Cx%+*Î|-"?1LHiԒ{V2Irbk㆐1mqW[hM2v:zfh99999Z pHr)¶38C ч@B6arpoHސ|2:vR.hҖQr] ]AsxK_.D/>4?,rk\4uΘQweUwW '*{cZ d m*[[D Q VTE֭{ ^4ċ8xCqиLж.~o;Ϟria]ԭj@ko{,`ruz+ =Z6,m-C^O04.-#| ?1KO0!DȻ#ǒw&gMgtdgˎik\ѫS]+hK }VIkl:,k]b-4Vxޚ/$8NMOȴ& 7c&O=fM[q[3"Jl"A$KA.iϊn87Ntqjut{,#ŨgJu 3b[t.yی3U#f X}6Fk}WK @bDXt˜7)t$ۡ2bN:Sĭ ĢtBt̰-}}EJ8KrBΦM;o(WˍF4؝FCʌFBvEflf̾/}_ B{%4K@H:)FЯRjh R5K[C/m 5t֐!ZC.,h Y5F)//2OF892v"xxh9CsGϊw2LƃǃO㉽D{KNc1i8-i|SUA&VM X4*hbUĪYUAPEi1tCV"PͿ V*X `5ՠ>{i)Ӊ4"KFd)ifi< T&/RYTyRq*/+({ @[f*KW,UPY>iWZJ|5*IFKia |XX2_yCy[yRޤ.Zi|̇Ue>)aOK|<^>~V8 g%{osG%5["mZU":K#bb3Md,~/GnfҪfK$b跟} u[o7u8-AXn4Y+֕I|$OOb*[8$>ߊycrI9igI;?Y>~!v3\ObCd zV_Ϥأ7 Q˹,_o9TxGNO񃼖#5ⰸ,X3bh6:YY 71ٮ:f]v}_]ڽ.v[g״/Yg :d}NL=KZcvlo߰wUkF/b;ΦsԱX[US+8FHĊ+X]ҎyQUUUUu <%YPB u)-C2eH ɔ{TC,C|2,C2X!`YFL$ 'Z]aH]aH!CyH ҇=נӿc/Bc x @>•ce'=}^:j^rvH'ZS-E}%p 8뼂lp ~Չ O8QT5囊{)֢ۢ\篮g\܊g|ۜkoǵw8׎ 'I!xXu~Ldǂ;q7ϲ9ߛ8[:ҳyDSp]>X;쾿#yy;tB>V40"n.iu\c4/٢X$ͅi1CjԮ5ޡy3GyF;<;3ryC=k]TCkKt+ϳJqF6]]zmX/8yk./8}T[&M_/w{D>˟@̭CS d\ ^xo. g;m6ma |īx]Z.;l{aK-|K%= VNk1V9]|K,F:l1Ȉw4i}Q~<\Lds$q]f;kՙ6˟&>oE rk++ǺZo[Wv{q.8ZAۛWiV姖И =:~y\ޏl[]]jYmbN擹oi#Vz Z5gaնYZ-e߆PYDk5U]i'OV7yJ$ҕ6]u7zÆ m8HKBX ;LȭL-GlK|3`gAeBeBeBe73,)2K?\\ Z5 k@׀<y\ԀF7&hjai4Ŧ,6 `iV+J`3riMLslb'MOFۧM>4 iL#"Yv0ɳqI+I -[[ml-gI!:êN)/JM@F ) ~R R R R R \pRpR[J%ͥ_)R'& ŸZj!<ĒrBwO)*|֤BpBX /qޗu\HK0)^5kG/CT*[[[/0>d#ð< kð<Uw~湤omg4]"XBM<2t}xPX*IYS*墽yȬKc,[Xv{{=^aon N۷ivZg=GO T:d39&6%b(.Z$[α n4sh{#YIf3ce;ked.n*WW^կOTh]H #gƬ>IH1c&tLgΪ|yG6,iY!dIChkq/OGv`ȃ!i_)Ab5j Z^]]]]] ? d0ڋr}}s#m32C98""BKFZ#5h*rA8| r,lm†K2?~ͅ  g4_\(1x(didkD&[32d$ EP2N433JߗO"i9oZ/l' G{tuHQnt5]JfÑR_FP䈡<"]ϗ=Xׯy.6c"e]骋X{[E|.klPwsZoY1xj6b&5w!|du,ɻf3^fOYHykv(5,g\?я;eVULxQ ? Z#ϰa5OF@ub-+#B׾bϱ6Zm((6 SY=\kUhzZiz܊[wع̰؏OO7q}־bd_a'qK YZw+RYQY3bߘgl1X dc0B FtC(q=ywޑ&<βl{-f  1l U_Y['N:3=ao%\]G( {ll;|B*;:rEe t $^v=ɶlfo}m[߲vYoX/C_+ bͬXBڿfE#"J(%fNNFn4R8~1s;9hC^P&ڐ̝6 BGv{u;/}j糗 3?|ҳ 䥤#KS/Hy14ň=^L:BbDd,:bЋaYטtטl-fn1vٰ[̆b6a l UO@:zOL2-mrmr?|0 ` U'7  '@O4}l#_& }ٰdS]Kr1bŐ!C/_ Rk1$bHŐ\!Cr-Z ɵk1$bH.vbd2|5~DLDKuK8hͤ9ZG#z:AR |lܰ#Γt-Lg^ vus_w缷="]S_Uh65.fhhYD;sF ]fx1ůT1BL 9.}| s$X{քhs^}v@+}]}Yޟ<=+]k=g<=;Ezc;2n!qYqZw5]9H#u]}ɌtM7Tyq^{Hlb-Z@fdlFG)Hb&֤f)Ba pO7S-%اS2B <`S <@ềw((((((( ͂@JqC ڞblRH)t(~x]hwzɊb`1U71}ĴS[>c b_UޏX8#._\#,3}xTƚ"Dʷ9| ʛX fyr7!γن:F6aNi*Jj[#"r-bSkQkyN -bBԧHx@H/d:bK西ʈW/g({`<֙¾# ܊AN$(NjDɯ&"Bq<_ak!֝TOƝsxBeJ^YXrue?Q9~˪Ll\]ώ>>xw+**++Nq$h~>6 v%Nl<'tR9u=b:U:F9#J)`::ι:. K{+.T B3H ΠF s"#{A&zA&Z]&/ e"uu7yGtJˤv/d@@@e`s}*}*}*gbzezbzbz\z\TH@ @2 Wy-_xovtE~/זk1׿ӆhmFۧ35966\s=4B,: Qk|wcݸqν,x5@{C. M946>5huK)"`̛$]$&#{JxL+,NpD$wMNv~ >}{"Z:XO7_.}i[XjM>!N@˻bx["!sU4~߻o<[yVK?5${겇J۟3J­?UA6f[.g;B}RԿjYb]-B}n0猆+|㜘#2qUGc>c~fXZV)_Xvc?e6lmOoڧ}zzҚlXVt^ ?W o7b3xZ|*M\b~d*V= 9ښkd[v#;lߞ-~~E4ceZta^X+#Q4 f4;Mh2:Mfl9ZU3d, q 䠟$I~'L=W}`C@O#> B~ g%$ap}'AN\HF%A n`;ڑ$hT2d&AL%3 Jf$(IP2d&AL%3 Jf$(IP,L&AL2e2 dIRFpnF75x Z ~g8tM;nqC2I"]*b0/ī0pДa= = &04[9yev0EH]W"8.C"8.C"8.ua C]P&01ԅ.L uab B]fG3Efv{pvi ns?MQKGf,csb!͖~ZkqwϹuuEO;(p͐[. |Z <) p\ϸ#Xg|8~^X<#9rww9)w /Q:rW1{鲷zb*'SS2}M7-)JK[u Io| 'w}.rq<3%\!H@nL&іR'j m5ZknBkI7$8cpbsds͕R= oIʩQ;#e7g?Dהa2ݗeJ{|97 #̾8s\Q]l>e>A 3hfI{V$ \xη$w7-"RYV-]qb+#̧fVw+$[.V &:]0q6\ߠMu+}7KOMޢ/w+ıV,3rf߳ٯ:ľcI7mcl.q,bE8@e'xh&ZWD##w$oȏg bY>:r>YuWdecf8UOgN^ʂ+ЬqwR =&Otٹ7>A]BZ.T@BEԣFўrXq!zBgBx 3  p xjE뒯[ \ @™p&$ gB<y6l8ȳqg ƁC>}I҆%"g_ 0Cs 0t JG IIIIm/ )*gNM%>h% k:iw2 < {Jiy<`Z0-LKo|[>-l,p|H[!5wG $gB ywWyw#ۼn6% gWނ]C̣zggg;[[kR\Ѻi>^j\ɥ7i봕m6/jZ tuW2<D{JVhj{՞j=zx{+:J-UϨu۴$/iY&~FC5s*߰3- emYkƝk]}+_ ~6O}uFscf6j#5`%Å6'Qܵqڹ3O;S~6ѧ]يߩ iSܵrιvUZ©9CB h7_ϟ??QDc{o{i7ETfhd%{@Dh:6 M`mx$VoVb0AQ;5sxbHߙ,?Xk`4\H17#'7R4_:NHS)OH{{8"3p*P3?)'U?)BJ!OwoIv~x~3w/ r7z5\(Q3*¢ .DJ4D'ƠƠ(XЯ;w@":v@@m IK6Rk]=td>&y$F݂/p.$u[ dHBHBHB62xn!P ;T9HH61*x*vW)=\<%F&39r8V'ܔֳ1l g7!týTRsD%1g0Ak@8( ZO6l$Ϥ3dhPQQ1`tĄZQ.L4:hd1N#3%&„G"srmZ5UjR+b̈qc*wx.w4Q[|4Exvgb4zXh2~0PD=>$̈剼=»W.cI&{zbîD{M}վ5=02`&' $RrYԋvx0ڿGv}=՞bO'!:^ , LZn Dj{kz,QVN~܀LL6v*\+!< ucE9іXqfNZ54j2rQ7 %shIDڅ9r.?)da $l`H2p# H/w' o24dd{&&&W)>> LH!# Y)E%rrrt,`M& vn``5ͨtn-[: ::::ÖЧ? u0N6FD"5Ea} o"~7gjӲ666[mS\8P.0.Z:ψ5F:D`}4[\3/Ѝ9 Ncmi%œó-v9ϔV5 Ug[њ\g2 ((r8xF5 r`[SwiGsGb}PI u#C[$mH@qjʷ\Il^oU(*DƘӲ.Q+2V` o.[.[벵 m )3uwJn8?NwRsyyY)!>POswy #uwB?%%bKxc {1ƆA6{hou=fb{js"mZ?'-sQnDΰeXYuP,5c? "*kI?}xNi?fw^iuٗ7rLggw̿VѷH']`u%~|1e=#Ky F-SU-*yV~|±zWWZq#1'f8z"dC˝'lrN:QxwO$|E:qZ)劏+WT"cM>XcQǔ%]UgV{) w *7ì g?bo\QkW+W){$]vk;>c^VX{ylwYflM:[_淢DdEHylVИ:|˼])mnsD;w ٺ!\q$,O *la-ISzP/ +X;rرÎvَv,lcaL'a^rXcz!7wODGG$OPMrh -7,IVB4x,$XY#Ȃ >, #ȂT͂\˂T͂T͂T͂T[[[ȢkF#~%l %8CKp $H2)[`RiH! 4'NO`/ll8Q .'{IKy[{|ȷ|ȷ=t8<PzqMP C1&bx 2%ԀB# ҙ/ Xj%%'RJ)QO1-ҞSޙbx4X #i_1N:bLuP1A1:(TŘX@OU6Rl2UyTLx0UySeNČS11TL8OTS1TLu0SLTS7Rv6,oLI2p/)B7o yߔ>}e-(=]Zwݴܭ 69B&WH it}MZjdi`iiFӠ[lni66663 :ft4iu] cA0 atv k+iX7e3ϫKsEE9sۧ%``2TWT4 ݰùn(WҰ^;r q:`V5BLMi׮Dj`q`&ꢯ.94]U]eyC~]8A;u\w0uQ\?U%aHɺu"4_f"vw(hw9{::u2}ăKMcI p/~W<TQ?~t rexuUQ:Ym~/mU>Q[i{_^Em 9 32 $@s@3PU@DDDaq**pQQ]tBsw7ԗ9CZ{׮]vE_ҳIIn`xXa?k ͨoԗIFWe\#Mcy˟ycD8&.*fjTyAN^R1A Ds=?DU1.e9#sWv1ҫ(^UM(*P8Up@(k0) }. Q4DYeM*K*KAi 'J%zK!o2 j6PJ2Mh?R'Y4RK$BK$BK$"#:Y4u9::::dՇ(QV>D!|?!CG]N2`0 /3e$gG2c Ae"'Ce|t!^PνXtq.DXD5k=n,elS:fҷ'];,t&Wjj7Lͤq.S:w*;K#ԏC_*"QHCAÃraXt-˯]ä77`> -8Y{QEi Ig\Es[qܹ{qǽIŒ|܋;bsNwR&{rq .9-vߓ%En&I7tY\sp>J7b߻E{t&]KvكxdaWzU9ȤJk\P\ DXFN ׆u 6:N}k%bm syٌjXZ +ںLk{Oċy&dJM,%$K{"Ib%ɞ.k_~w2ye6{=L{S᷒}iek/Y7YN3\'w0*9!/Z+RwcXJooO]m5ӌzlg:3̺7J⻕|p#n-[n9YE˥ٻb4I*UBO΅I'[ `t0A:X!1H` Dk X-m=Y%#. JM%æaijjjjAhO6/mZkX$66ucmQem Fm'ߡ #0^x"2QW4Y:iIJFKߡ;JHуjCfhI[0?4LKHKT` lP)m?d#H{{;8̷q6t\Vywp;qU8] tQ'=sN\bPAC Vj,ĝxO-zvqr=u5(T_h藳-,GJ,{d***!Yɩ iIuTw+ú,CgeD>+***dR6PeTXq*8V mmm~ohTI$[dOFP287 K&c|#%o(OZ}2Y{jfȊZagdBd)Ga`ɰ\===AL;a%-qP5r>#>YDA XO_`Z_TG%~rrU{ѡqa²}nLtD*z<uemoW-̹2]]T m73ڱQraw9d3ϛ?b#rޙnv0'|,ʟc 8Cv*H+/Azes/j>ol*2\?Ϋ+l5IUԓ]d LmzoTvBO#F}5ͮNb=ܻ?A]mym֒|_.{v~>w ]O+j+۪n2͓bX.&iQMPIޙ64ͥ&Vz;;XgnYE?d}o5,Nl[~+zgV658zSߡ&u[|?{w/[Ʃ.N*8u)"tfBU =!{GRU􁪐Оq{,w^59`H%h"k#k_F8ʮn5 +HODq"Msڶf%MD`S"G5F^[c5F^[g!ȜԚmMAj/D`J"0D")HDT"Dx UdnI4O'ͥ^I/Mǘh:D1&Ё:(yQ:r]dN^Obba@kIHf*cr6`8)ܙqBdP`>sB7R֤pQM̋)WvS5jBoԔuh+-2~i+ǀ1:pΆct61+1+1+1_+cK(r8Əz3da:G\|O(7"sUq7"V@̈Q_GzÍ'.&I7"U'F[!\B@w܈cNwiDD'Gk'syQ3^u#NW]l2 srd.G?!2KL Ud9N% SJ<̍cZIA nDqVپv^l#ʙ|6[9Nz{@y?<`6=ݣ6z1G*j&ff;3Qۭ[yn9.8Hm4.si+NRKiϲRy+i+.܌#g,,%ʓԖ(;1ca3i{ԞRL9c3vvbNى;;Ew."x :{N<.uON')?Jd]9(8+LOօwTj0OH\Q5ʟRl !9sPWV ^ UvJ\ \K)*\\届*b5rЕ5&W` ڏTH ڏTC'YI=IųDΘ|T"`V3;HșO`&e?p `G*HKT`1#aqUq*Zk6kBgmn0oa@gE:ߤj+"kXdcpJVvSǩ'Fo^ ]#T;Yt=09E!"q]})]nz~MGll>h54ϙߙ?BcP۫neUM~o:mZ檆t2k%XyfxX,KDFZEVo ǽ?{ojRadoX{E)]0lG1\ Y8_soym1-4.|w2?eoΣ4O硯!'4^He u*GZmen0 C^0j|aaN^LpUܛnN7,r2z z z { /]f߫ U@GHJ[Ye(TP/FD$k !94كC1#`(f ŌXPߡ2q 2 q p 4h1pc@yԆRԁ&MPJD(:Puwujnv[׃ʩ=`}9Cɵ*ףuO,PA}:lP5 ꠦA4uHAH%E(· tW"PB"Y;#~:;J!̥ m&m61$PDŽ2%6u6}@`Nx'{;x\M/TW{ԳjZL#cX}n#R If1JQ!vSj_ۅ_7vl5~CFQk["Bl$:mf_ZuMWV }z?[_1m˸` `l3m2OՁg}ͼ[F6$U4-˺k[FmmZ8A&qhVvvvvv!R SJA.m riS=`ޠgVCTC 2|-gD->R&&2kj}İ0`X0, FGNn{RV1?U}Wh/8<0Ɇ P- #°RGu# ortftftZtZtZtZt.@.@.@.@.@.@.@.@ kH@S0[fU5즍nҜnՌqr:VwtM'vmMwMr7avsn<^xBmB9y2b!"#r"yC%q<5dT)@Caq sVr $c^2Q ">D4|hy#5&(ϖ#1b>#x<"xE/"{*mJEXI<~$.T#nkb@YKQp)ƸJ<ڏ\k:bVHEe.",2Ɵ>!`2 7`t ͉(w@ G 묹B2'b,& z7ܠcqK8NJ`:QN2qjT^$2]-v]<\Վu``sk-lJ{6fk__yE'ZSYkOlj8m6HN;I3,VZ״Z_ZM{o?/?_S}^?`živZijM&Ypkg$ !E1O A>',5aOC*em{}ތAٓo8|}?zk.@sujKge֞[|?ˏiWnƘff3@1fhu5ޚh=hhƃ+'&k1*^xZ9)=+ dy0vص=`sCzn1pƽ=`|ۣQAfG%OuXqpxlnrfAH*ԺA/XolnVΩ[T˭}憎_wa5.1"FD_zxd5̻~dpvi=O׷jQht&iG}W|/yuVI_AcnVɿ} ٚ0eGXsaղ[-45djf3_#]"I> 6fYQ֖]t]__xqFkc~|SjPR  /kG_jAu7tڧZOonf4>+:*1!+?Ŝ"Ӿw ՋmhWX%ރXV\m"R ̽9"]m#+JZTd[5Ssœ`3뛗ĻEo kUdv]"3֓&k5Ҭtoƚ9xEwN|Z[ B_kEQcއ\?SGWn=zlμddyfĤg2rthSik|6lkbسԻ" @R[}W? 4 _K}}ƻu>[_ځ< ͛s)viɛs x7rs۰ Pk2G b'Y~\1bb e}e}'sͺ_ʙ1wa5ӻ0Q^H!g,_DBti"RU˺Oק_UKK鵮κOwo]*7+'.jMHoKzX +V.]OyjS+@Z Bv!)\ېtrnR*F*F*F*F*V Q Q QL^A|7x;AЁ;wRGňHe Il܏P֣~#Uz=e/@~Y"_E ,#Pm?By^ N}Mp.67sv|7Q~5Qj~itB\,rr~/r~/1~ n|p iw}X;O_)~6ˣšh:ڝ0<1a6d1O*r/rx9k fQT8]!pn/vk kmU!rדNʑ޶jlv){}>n,kۇ#CmTj3B{k)/3od貖7(78N^ռ yy_gSǷv4۔ZB^y] ;fp;]ւ?q llr&&L*GԽbR*WJJ\)w+J=CۘhFyh kquG'TZzwG {_W*EghAۈ N0چ)U~ʯSUާwhWW m(zj۴}[9ES[}K9I[YeuTx{:+YkuzYj'T>vRIgKKwNH#Ԏ('Qޤv>sEgj_]uNJ[9EoQ;[e%R_(sz5T9Ԡ!o)_S;|C߿@t5. |M(/~7_ W} (-Wuﱻ[{um=.8핤}0MUvp#'Z[\gKBr1Ykv Ons'qe {, !bBv8Fuh% Ge=W9gp6:gs}Џo{^D1b$[fA}FqRl#a8Ypl1$q}||m6LL0ExO m-}i|3_ᱢɳb`YO$?зƾĊc=Y ȶٴ$__呢= tfHo(kWtk|%7x3{bәȽ~nڛH81]:hX$&{Z֓8xUGd ZA 0hFGcT !2P[!rC[!A[!25[!;S(33Z \7(8'dvPpPpPpPpaBL2000000B&K0 0C}fKe ab CcÐ(傥sҹ\ڟ PЛЛЛЛЛP2UNIۙn $nHK4i )ٙe}NJZR5@kBDfTPPɥ^[f gL^N&^ޘyЛ$+k!\/K LV&4l&4l&4l&}j:ҶZXSIO9 Rh@2/˜^r=χ|1#0UHE!`1Uwio8+<2 O`oyy$-9r6q9Fw %g_V.rnY%B)]U&>>r]ɽWsOqsW Ϝ+Ioys}K+ߜ_Y<5zW/zu_E#saH#+ H'l@Jv-,2|W59+ܮ/}nyӡk =+GzrE<%*_W@ߖOm$ʛBֿDtЏcW:װ=ڥ j+/]PPLYαm;ύ>cJѧxT+CB]ͮf!hcs_x878K=VƉ56)0CLs*J N¾ot]ɸ) :ǛM.-I5ѹ:Ϭo7N.3P%jr][kl68 RBl7:&t+LhnI|اZViUQXMs;n=^'Vph2ukpױ9R9@yw;@ z7;Ս"bT^$>VXM7 z}}۝> rtS*;']N\So7']u4*[X]+{}-:އ}v<\KxUymྡྷ튄 d5Θs~Euތ0cJ䝝[8̨ouRֶ>bgF{k? 㵆n1^0Ci (i5Z=֠#"HU$(٦ef+>L|7yw^.MjUkA].'c|+| Z^-QO &oWkj/{kx8qWYa-v[Yv#ݕ*;Goz-S>k=mieY/3DgQM kKWv]1 tv'j3?ͩTGf1N uuxjz1rUzv6YS{ j[J:tK;_W"M[qwܣNz]Xtbq_u,FdΣ(c%%,QwPwPwPw(TC[!`]`BBct> a|F06000000ŒIU/e)Uo%Ch}??N?N?N?[)O!*r*r*r*r*C٧"g`*r^ !!rCdP&P+TO'}$I!C$AS'AS'AS'AS'AS'QZ{ԧ~LOXb4֪P+s9P6T !|]RKAKH[TTu_̐1!ƀssƀysO!"7>hTM>՞ޕFkco+Z Ր+Z ՜\j '@UY&I--ɴѱ:“O#<:"#rH:*0\H1: 7RpMIfxT34*ևBg,pfe:P(y_@nT->c6qqukJ5C(x5Z\Iq!V|(~|ugpu_y|8Py;̔FNҭVkUnfeQ1|uǛ8Tkgy3sGBVUW'_?᪥TGh/h z1 ?UȏS%'lNHՔf%Sx/~Mdl1ܨh֏50#>uOb3`67a0*~[œ%*yN嬈-bw J򂎱K,>G71OG nG~ι՟Vwn`?w|/ji`AxC()YɈ$C'ßjo# J\k \k \kI{:^[Kx5-#]]8-8-8-Z @Zxd|cŀ{j@ZNASuǃ}%Nm*{KߚmEXC?'˜gQSW'iadm,>[)"6{?Kv}Za <b V:BuSw`Ͻ|g}9ZG1ayW>kuъYE΢H+g^o^|/l1TWF>㺧{Cs;7\rJ\ BT\!m欓%a,؍zTQsBEͅ 蓡@"=i/C!Djêk}J d d d d -[RRXQSSڥ#0#0#,,"/yM횱x|I :td7nБݠ ɀ:%tNv2qà   $nӷzd<bݐ qnwCў3F<6hhhhhhhhhc#zMɨYJr.n2"Ɉ'# ͚|2"ɤdLӱW\*4_]h|uuAv]D"}UJ+.ՅKjTF*aF?Pzk Pg7J֯0-4b,}g7?0XU%fO~ʅbQ%9U|şe3Y՗i|M}󼕼ss䔶4"U-u6Iol52"=BDG1Oʅ&6BfW+ YR)Y[_N!Vv%lDj` MKԞTtyYkvWsԙf]G?3t-J-W ~zX|+#ge_r-W{UraDQFn[4>3OmIj)tڧ^nM[M_]-j>h^gYD>+;u`kY7<*ֈ+byc5Z&6jZgH4W0OF:ύi-Fƚe5c\i #bB]+2FvNך/Q;*&MCs#J[?P;m{Fˬ͔a/W==1I@;Je9,XҒk'k5Ȳe&my2%Qxxp<70Cj>X}zB 5(H- '3!zb&DOx=1'bo,4l 8\%Q#P#!qqqqqq9pp9!nD[8!{K@ux: @<$bV-- ܖHho 6X Vhm[$HuI+2q7# DHf"Zr "'E#9BWWtU44#ѼR +;&W&W1g%Ws2};^?+-*ks~QoS|Zp ^Tz{έ-VWu>chƘ—>,^5a,a-*r; [<}bchz}}6X>Ԁ]xuL7UIs:|wʹwзhE+`m z18g$Gg"K >yљtw\Bh 5̗芯81|?y7JCQ68>սM}= t3ju-AYۯ7~4$}Cwe.8%~UH3ϙ ˴ {vk5ח[s<+0>:n.7y@M͆ԼB)b+f%jJw% 뵭h{̜LLW7_{4#WNb|1se3?b}Y[A#H0m֒{ g_>8O?PAt^QP⩥% _uolC 3 ]E!X:̨j:&sLc2{$KvXJP@@GMfge;a>͇>R)O!LBooo&D11~ ?h;=c+Aބy؛0{t Pha2c"E,gfܹGQv?U0= 30=욬paz$4lj 3HAY3HO\7%c @jC$KF\/$q; J5jcӱXt,X[bo"6 ։STV2P,(Kjm8bB9߃Q'QBjc3%;`t0b:1NKL+sENG5t+WᯤIG9;fo ~a^::۠0nC92 ji3JCQtU)#91 0ޑ9     F "T X! ) t'9Q1=\ٮUvRL[Y/JP/JPߢ-JPߢ-JPߢ56JPc56JPc56JS y*z+z+z+Z*40~<]5 $7{P\&BqVX!cEК%XT Վ ,u`,ؽ;Pwʒa"!Vp⡙s_&n ,ڊĹ oy}5γ[YhhlW}Z1W;;{^:-0oܻsjBq[չīZ-KS]{yR/l$nTƔtc=f^o~'V"V|Ͽ{{_pSI t0_ù V5)$XE$ ޳̥s3ªnճbҽĥ;*YgXdZ3.-cxܬ_O}JI&t;(vv}N&;.1֌7O_h!~7HHG{''B>GߧХjkbɾc .+ow$J@`l !gaCذʃI m{*͹W]uL7,De+I+I+I+88dsmCǒCG*M̵}.~KGJ3Hf*Gs+ B  o7%C?ݡ;93RzkKf(Yt1tENWꁮ3ƕ+jRRyENkRxy ~dGߌB}fs'ȍsޕEunͧ_g ֱ$Yq^T"w+ l2n]E+\lqIJWiE|+Έgqg_,&im"Ԝ<0m_῔I&$K}qXiIu:Gj媓eU&''ԟfJ(Z6tbG$sT!4 }9r0`s>ҀRYPH OGI92c$.w ov5YJM"I!] ;%S&+L:BzE Hg䃍FH 7%SF‰ '2.YHJlehAq.YK?LpL&8&2ҙLfvpq&řg" $4 T6Ӓ!UGȮ:Bv՝P!CyoSOޚޚp !CvOvOIuO$YMj8TX*ޖHkA[ۉccF@2!XbE +̠Ki i iMlӚ,Y'dStM")HI!旁RK")z vMA/ARKQOByqay8,]㰼krq?!cqnr?8eep8c#f#wsHDFDI9qWtsעayܿ EPx\bQhI '(14ϛ?V$mi۰EA)ޣ6\ u濠1AnJ&'WD#͍%3"tbd+5jN{} dt jژ& PBS`)pSl`Yp*nZ;:Z̹X8Z#z?M2M$&ro0S̳y`cSy._ov`oe׹-{L,]5cQlT2U cvsSe-\nS3/EzScQ's,{%Y0b8F2*-b>Qs [n'u});Nnp__ߠ6V/7 f\1lN_AR+$AxQDQ߭cvoMV6bF-3I '2Eocys1IBT!a-$nWꄲ׫zDKգtnX.}XWVkG#H3k#Fj]mcjT&i<\ϋ8Sf%uU۪Ca1rY[ۭw_*v]݈,{}7djdG{tc[m{o\d}Sfvc:B][['C>hۭk5nљ~E79IX>{Q7j35X}6MfE ~]d1 TX'?jlK[M3$ۋs|%f%l d֐55mZSm{߻- -F<Ɩ8D(vKr8n)$DARAAˊeEDq[PQ| wE bk "+o!~o!2ko["aN8!"p/]_$H15##{mhbC!C -\X ra1u~{Io?NG8BH/10Ȼ#Ȼ#wGGGGG^"HY Y,%fƉ3 30NAArX2ݚ df`D`D`D`D@( e, e>jQEˆu?YdYEd!E?7YiCJ}mxFp~2dɀɛ ) loF[Lny t5RLg@CAl8rd{' 8!p 2:ȀK.zg\JW: bn$reȪBV`<zR@@@jiҔҔ');mw)j])'iZOy~0zu8e?8ԍC8ԍC8jqʋ┗)/SSQSӏmhT NRV*p9,aG+q_q+m0nE110%͎*i+i+i+ioi f|gp&7r4ہd9Lvu6Zn5Zzx?>'uC"z3fUϊ/kO 1sMٞėhIyX-#{H<,&"R:u`cBQS |Fƛ_yI]4Z\.2( X^&&]/g8o<ڋnnuΠҟNyz|=JǎDޛTNV=wϾƾ7byo ZZ哋N7Z6,DPs.p< L uPԁBYLrhn@ p5 =_YYXxO-d8 ׇ? ?k0#A@A*ArD#<H$|Fsͅ NsAJtOP 8 Fh]`va59PP]! a!͡MZ(D<"6#JOḒB,"T ~zVpppz`xr<8΍#*HTѼ|yU924׼(VN5~oϰl6FIRNx}1jUs^1^^-F-臵4:]"uUATUqxON6Kl '' ŃbC,GNUm>8f`&b6#;j-ƺǵs|xWrz߮VD!~+-lGjnٟ?F1&-sFkкx^a5[;묓V=VqޗZ4>|r/=S`Ioi{o{`5̃nz{;Pk:Ġ@@@͉ABD :PT5/hJ*@"6!V/SΒh"Tf&AMN#5~Os4iPcӠƦNHDCD""!ԃf~( RiO~O/'/R~HRF"q\֪բCu%jTUC ^GH&5 CukV*EV'̓zQzHJȀYe*dUHI *#29G":V Jo  )3[a="w"wv*~` IH_ѕhQCC*!Zb*uFյta Àa^^p-c OwO ll*'<}I8܌ &[{(6t`&g77nnCxiKipw΃yf`N#*ӽWk5?22݈'vI{ւ#!nOeJjfx8[h?۩'~"H@:v1KGetAdچ,`xZ|*.fOsYH;Ll&/]VU\ 5ȡxElm%QTY۝4d!$,$BA [ $$rZDA 0NDTĨ """"v%==?{{޳s9KWK>LS/8Ô\<{3nퟝž/6no%/]¸b\S1TWhI E9բfN9eNI=0]0]0]# (5+NGG(㡤XWh8`TC}jrByGy(jʃ&ӳlD65b01$5D$t֘E'\%J#xE&j 5ͿWK||B=Ҩ5ƘGn,cXo{~O];bqxA|CNo)r|KC~桛Gtsy7ѿ\{Y?aD;YQH3R#KD[`G`Y@[ZípktdH D>_>1oѲ1W6o8ud};U5#o:rOzQ/ЗtK:BM!G -jV@R5ap=·Ӟ|ڧϫ6QhIM*aZ(8gC,Jݨ e"(tR[%E-IRՂU1p86^+ ~JCBBC ww+9iYU:ؗtLinhM>>>hezMxt<} 裲O9, ar\̷5]= QMNPf7kKZпKF16gMY(o* Lc*/4{ؽd=YsրkGuBA1Uߣ z6zyy!=zyz5_J\+՟ÍY2c RmʫJ$S0,"ې#TQg9`}ORu0ݹT Lo0֎IwtT7Hw.=jC+YTT)2i _&/— ˤd`&b8v. C. C. C.:! ɅaȅBdsI,s8Z+M [o&7gB VbP uuuuDj&r 82]C})xS|?#T-~suT>%-'׈ԇ4Kw۬)+Ê^;Hw/wX hY9BɅa@轛rcAkě(}o|H~#URnDt(L ^W̷Z1USOfj;|z=Fvu~oO~xY>Ձ>|(͇>{9x:u5ٻ5em|˶=Y~bO>=YmMWMی/bsy`FtYUބISI+%'?}i򬑖fOVI|z&+x [ZZK;dkjf5./A|]n귝rXIZrގf c]X kDF;xw'}kwP3B@|*#P9SGs> ti>ʏg>Jm#5P (F!,6 aQDHD2x$*#Q2,#]~rb.rwU2T8QiTeNקJ[֢e尿Urab9,FUiFq:ZmӶm\h[zeh[rD}ۋ*T >P1x9"(%.zTQ|?w-?9gܵ6N翏kP݅}CAYJlN{t.ؠ3Kޟl{B+N<.K7xߑk@$^oprOʘα&ˉ䧺MM/ _M)A񴿧h,>O<=ndD k~ꊝϵ#cYHiƖ KFXn:bo[C_]ēb/?w{1F;sh%S2sw?@6 f,x9犯.#fa%[VgG3Ns~D_iEOa/z>Y{ܿw;{!68ZXHX:!K]vȏX=8B=}>Y}Tb֦aa.p3ۘFpԮH^uEڪ+N 7Ū*ՓN< 4X4S2 Li(gJC9SʙRKiH.!J>eeE{+ [as9~H.)DDt/GC?O5*YpjP`{0$TiBUDd` ` H'm6L@0IڟdlҰ %Hp#cZDԣs bF8mJCJ#[U2Ą5[V!7-39U> _%G;JжL 4ci~c5b<5'Z5ZWmw;{hFKVX>xyq˾,_9M'vj 4Utָו`_W&!t,qE1R%1$]';9e;'s,\A1f`<##aIPB6 iM3l!dKqo:` ))jBm> >h^@; mhlhlhlh: GᰡᰡᰡᰡᰡᰡᰡᰡgcȆÆÆÆ*)+ siza8g3~0?D&D(Gm۬f:k:Xt t?QMM+?@vn:u:pt:< qwGP[YLXLXLXLXLXLXLXU˙ߞ m[lXlXlXPW/eUaUɢfîSi4-4mDtdتBiGMӷwރb|1n<V^Eײnƚ'Y*m:tOfŦ5([SZ([6\8RoߧcfIIpn_>WFZͬVս~k/Se_b+BIkb٫tL \VO7ߎ ԶkYjq񭡙/0}vE|7o$!{}+M'zqo|͡n?w_?a){;g۞5NL/.fOww/oO?Oծ6kMj=bL01m`Yxќ1}*ֺ_ d=gXˬٖfXpX"s~_>(ȟd7VC$'-f.O%|(ٜp9gDH=}Qߠ[zk}D+6-z=5彝Kw`ڇsw `CUvqǏs>fBl;9Ѽ-] Y.WhF%K&98HHD\q!wPEb^T8Of %>63)&tK Lp@,Ӝ"Q)dUJW)ħDQ"E@%Q0@ [@jS?Em6rsSiA%۲;"U t iu"w' G>ooo eY@,p䭈LUr.]"^)՘"^i52]ՈVN S[[[[[[[[N, )X,X,ءjggggdM [U ErE2\{rK.J7sm,^.s\`z.0=== Q,oBkB,D\qB5gaga{eRV.eUNM)):%6dllllWT̫HHHHIF$-Ԥ4aV`7rw̆@W};Vi[ӤY Cv1B-&6;g`.FV09֚O~_[AqYVȓbh)oO1Kp}гg,+(aW32hK9_ڶY⠰IIX ɗ >NKgJoJzQ!K׶B" 5.:c0JBv*MMn V >5!'Ur_4B+W= (SVl= d^UZz `zBA` s%RA%YdYϨ\KJCV&ٗm!F?BGk(TldxXaq^42[˖J1w\G%x€F&+;6gOMO1bU'{co_?|`!Njߺ"ܺaW3Fia vavP.Aa U%ZYKh@_DԂmQk^#ߜ49vJS@% 0 :s_ Z_; ::J8fПύGuKPLew},'q&x!+G ^o< 귇<x?~}Do+?R^CZk.y[^JmStU#x:+fx mvO==Wq aS*˯4ָp=o#ԤKiY!ZVh/P:afuyMaћ¢7-o [^&X{Xeee,ceUD1Rh"aDNW4 4 TT8"<#C8qp 0bRoe2|dɈ*4iNuOucKuOWNC/ 4=! VB9xXkVaAE'*:XYIUHl\BJ|/bv2 JOwyqcQd|/[Oi#yQ9[wjstbn!>asl;{ͭ~obY<'NvJyat o_7ޜ̚ X+qrY6Gk5ź/KnQ,>!ˆRͻL?:)mݷqD)[o@vh8b*lZ.몛VvgmE`=ЬZov(!UmQ&@;b}LLu:CynfW8 BGi4Mo47 FC~!E:$:ND'_w-F aD4ViI@m;C;C;C;waВ%3Z215dk4*yV c!ԞG.\fʫ+nl&x[lOGBib2VkoY_1}H"~SZ᫈$|Ofb3aXK>?l(h~k2E1x~-GK՚iM8-VSejRVoG 'օb\d/_)y^3Hbwy\"~( 519[0ls]b[mtf#2+n8"$SPѥQ e˧r3#a/GT''-FD5:\E< V< r6}rWLI"8Y"`|>?|<0i|@p%\ISם>>>>AݨzQC(xm3ofČj[CŒ6fҷﯖodJT {rexBF4b IǞaK-l*dKdf(3;e}7bBϖe=_:~])KZ>*ϋ~<9ZKm¿Ϸ~{ݷw֗jCz:;z11n3f$n6瘷BH1</6,yh*ay\[V\-o;O<-nMwq|fփʃbt-?e5Қi-j_c5sqƒ73{bOfwbT/W%$ FXw("[D9 |n"N]l]mqBal tXаX D,"c")G5Cގjr.,WBP>[F55U!IoEVsnE>n>(j&yP*3 O@ޔi(j:fMo5<+P 5_UdE(1Ze9xY,^/%$WYԬjV5+@MV ptR]aOVMb/BE)AK$52Iڙ w@̙̙̙֘MQqK.U-߉|ԝt}yȷka?a?|DaG!|D%G,mj;/F[%*ơm<*ݮPD& 6d"ڐŘ5PQ 5 iE[aR+BjYH0 >0v>`W]Usܮe]v-͍uܮ]vĬ@7f1+ЍYnv͍Ynrcf3ܘv ~.xܳ$xN(l@QWonD3[c\% 0Tꟺn;b8Ak}q ZAPdNjG;ޏBEBh<7hxE^W95+~5׬uŏڌ!1S+jg;5PK|heY:7(߬A| Ooo1 V+y c(saܰInx nx uC >m{کmmQx[=kk[dҶtK<](v-d-o  H[.4M4r|J(K8GbH;<`Z*>\t1~B8}7٢7Y'Bp|AFHR zΉ$g->FDRNW>f2a2^H?  3j'ƪ1<ؓHTO*,b"|`|` Jb@ ``]jTy[tEޢ+w=xݬz_p}s+^'o(}" g3jfFq3#*#*#'# ڨ21ȑȈ6In! %C&# +c^ORU`r=;ЖaE˯T[lQb&N"͢YP LP5툳+[0`***}vZ[4RU?C"D@D`}!Y@(GH(y#VUMr)<0T9sTtBfGEI"X"X"X"tBdi#RcX{5bQ#5 [[L/:VKN|~VW`lkU5R~)hg4@@B/Saw{ {>^R7l<>>b|Q|8ޛ߼4 -omm㝘R7k͝NVKR.-3w̑" mvPK5.}~D7ZF?P Q:씹ͼ,7wݳ&}>JѳtH[U+ޮZ6̟oвdGݷP㏲TLq(Jog{Q܃}z?~XtO?" l2†ȄjUbdHAp+3Y Y-"71 71 71]53NfdY$@-`'Jt4Pj8Sa8Rwg/$0! !sC HpA->lX%R"}\Njoz>.ӞӞ2d]2dސKs(9jl% )V`nPhֹHBpο9wY8s_ڿ#A]Wғw9rr+U&tU+Or\tb_uh=VO|SyyO;u Ż B(eT` B1qw^Ywq.Ʊޏ1K2^,gsgyŔD+*۴:o댣c"Lڑ s$Ɖ"KD>nr_b:ic"-q-_ utdNgh%yd0ҼV&:vuT,p՝<]{˿TGy޼γ;ϼR,"9S/\N" e%Q)6H+u?Ft| *:N vg ˻ۗ1^b,6Nuߛ^7һӳQg';vV -Eg8i|lVg?Xo=~#3GId ]#m^#GJrQZz=;qce)ZW@@RumZk?Z ;he5 :=.pWÁ?;:L#Z`}`!Oikk'{l5^7|#X-rTgtsf46+5A+JFY2CmT VJUNj뒢ɐV*}!|R ݊Fy['g7 *Qi}c ]cToC 0]B)4AA@ZSЂ'$HL{qg̫PR U ZSg3XU֟Ahֻ6! MmoZQ`SbBX+-yh4ϵ+.E(gZN"8 lj6Ͷ ~@q-CӰeh Wa*LN\ɉ0-q&$BtB2]uf ]BrBDY** f@k& f/Fk5+k|JPF#>1L83΄#8L8g3̈́sٕ6.lh͆6.l8h~j6Hφ4lG͆{4Zr3t g.8CwRkѕНA~5˫j0E``cQ ~V vW WKkjjjjjjE8(})G"~|QboD9S-%'H@{"/*ȑ!Up E 1LQEרet<Ӵiy,p cp>~ k߭,.6AL$CD&1C<v4T#Ε*p\Ḍq]}V|r{嫕Wʏ*U`Z1TPTB D(SKQ`؆ QU$ kp#>!YTw0101n̯ %Q8sWʇ;|kƯ)uFW@v aibOz^ Ps_W"v-["jCtl;hO 3h`!$lXqorTR[i4׿ӱi4wͫ{1n%+.WA(bD)cY\#KT,9ֽ߬΁Ko _FwZiY QR1Oc=MDI߇eϗdgv]VИmve,8&Xt7ց>d'87h:pe-|>XXc:̟g8 b;EװEƄȰz!5?9,`!,`!, t ;A\k8p @n;}:PO@:ptl, S˼+kʆ*Tt8}pŧMMMMM* nPuCY_ u=[7ܺ!r"G_:zɥR::)\:z藍1ՌKGvj:t8pWzyȩ!j|y `Hf`8F=|<:rnùٛ5=~ߥje_ѕ/$KD]"*LD]"p$}&yqXen0g#eUX` G%pX1ko+(.ҁ-n w uN\qPEGdK'\9Us}I8nUl]TsmU+m0 F+ #ySp쩎X :w^4|q S1öt6z#d|. "0 {^Χ|$MuְB?<[6Z<+;[Y]_t~`OGrUDʉ+-_YBNƒShW˷|.ͻM.!:+@T=(vr]n'n VuJ t  d $CgvY [KC9FٍtkƄ>Y׶-.Rp=*ZsZңB֎MMMMwqLGKGKGKG`y: ؜M&ka)MgZHab,6AСxSt@Iѳ2Pa(Quf3DY$"QUHطHR~+U Hr]9[68uSnv{oQuYhogL51=۽w>n?,bE RgIl\9N.O7~yL'|_ңEڲ*sjֳ}=!vժ~kG ڿOWz#d6gtew?y{講șN|M> '\ ƛD7q& {#\)ײH)cE-)2ҪvZɁ}S\:GN_ L \D>vXO[[눩a(,0ص302h8aZ7X9rN,+uM3ro#%gힳB:oooBsz;#۰ Z+*dz.Z4߉ lYYdlwڨq*WUn2,dXɰtaTٵdUShThw{W[d͆Ǜ f_KVViZjiJ儁_kB+˦k1kZ;~-_ ? ,,'ID 'Sn&7//IʤeR/)jytbP.JCRW}[)ϩޏ.wXYh@)i|8x$ױy=󭉭[c}G:Yĺlȼ¬4}zҫ_;a(ς> >_16H \NkFjZ6yڼ`X؍-lKXc6q̑3\2H1#]LɞY\҄aV<<9Owww7wf5>5 øW8a}_}y̾/8a.^,T#pkfjrֆa uN΍= 6z1OOOLLLLIIII.騽 g8hd@G@ ʡTѴ?np4hG8cQUzh{bl4]4]4]4폦kTTq > m7}{:"oir"J< "H,YϜcVx͆mȍT>R:w윊6Aoc4'O)]{D-w(ʷZl[ KiJy䮔IOVFd*3h'>xiJ(jO8\moowwA6e#I&_[ўپ3Z6?3)_x#C.J|On^́ҝg*308c[ e|U"l(ѫuFGsهN|9'E{G+zusU[<3FX}^YUȹOѹDp#VoEYP-B+~i&$(})(})(})(})mmmm7=ɸab\yz||"& &. &. &. &. &. &. &. &. &. &. &. &N!2rJ^,T4iiZ-S|M5dP5H".D1zA8r=pztv#p3g͜ 4Fj6}Ov }@!@4hT;l!`R!ERZG,rT? EAAʁ`zEHWٕ[Lt(C::::#!2hWܺ 8S [ك `g5%WҧgcgcaңZ1'hL[#d1ȸXi#%8倚倚倚倚倚倚倚倚倚倚倚市C^p @?;zf/BͶ:#/%FXuTZR7QQWE[ji]YD /ܯ8y}Wq_#u5QvMx]čLQHD6Uơz5>|zwڿM]}z3emeLl[00i~gJEQ. *jEwo;<<{^6pu.`NQGB%u})!#>觮}o"_|Χc, 4{苴7O^&xx2<*6:6 mv/Q|}~Ao32۰+(+ٷ?şW"߱ mG]ROl?σh' A$E%&쬹01fh~ef#|:<"?JG G2/xscܧOb_mn<]YK ,DK5b?% ^2_W  oWtPB7zsk:wοs{ (7bn0.n+xCkG!ҟ9E=TPwu*PPvwWU:A-|=\8N>W8I ]! RB*슰*w*F@Xzyڿ;3I[KVxwW-l0Uag[~p^9?3]?{3 ̾΢h 8O{>3/{#tdcV|DY|=%Ir$Ox+ʲr^[NS$LTx/chB{=z,)B-^0Lv=dNփ^7a3zn\+oȝiJGSG\2-#VF?ɷs̅ G<&/Ί}Bz3chV5YqX01 [[쮿4 .ΊWBU`.!].54A?7A2C[EK溫>pMuw}W6:[ ;CⓀoIA"pzfϽ!*_늳Zjn|˹⮢iF{m!b].'!QLdZu'N8; ͡}\FD06Ni[\CmQh QHEXi[[۲f[N?kO}*_K̯ecX$ { ?UaiaFF_lg0qbdU;>g_oh5`Os4иեhGZԩuINƭNqj]_iݥ]B}#~1:$Coz~6AEq)d=WУҽ.к.к.к.з.з.7}'=+mO'n /NX׍~JNjJF@Gа*WA #t2:i`H1-Z!ZwSZ٢&Α}o̾i%GɅr<$pG=:C6{d|Z|7#2*o^byo+n+Ŧd7[;xO$a{}m#-KNsjY}kֶeu]iң;yЇ2<}(oͻ{4+gkZCzYyЩК9!{R=B2aΎJhֿkbziJ30d0ɩYϲҬf2^UM$s1PԄoMij[K'3i~kv`C;"&_r1w*"ϚCͧn_*=6mViWq NW U"̊O=+}Jh}ݽ<;;/aG>4y.mzQ%,u:o K @19< W2"45pW՚nN$ȶEDJ[ `C^UKg> U&n N W+Gw>uхQH[kI/TZP@b_骢ЛЃ&>(D2Ɉ<$#搌x -ؖlK~nYG*vʻ e3h$S$ڠ j c5/R9O!m,)əF2}=3gBAe/R)xnS0]WuR+Ga(~4QH7E3 ՝QBugLFdW)¼*)P vUriB *_V5UX9 MPY*TUAU *\yO >u`-!}l_Poor'y[` F8a|FVSW3u7YOL76''[o%%YO'>FfY/stYQ"]/?'F-v? Ek=sc{7ӻCSϰT^Lس#|{t}₸4Z|%pS 'pzYZE-X+}vqOYln I-'SPVU>O8'0p,X»WN_hI{-f}@6-߮&b`ڡԩA;Q5VahQ5;     2e8qB^7= ݨ JÁGu0@nbW @)n` @!Q<$,$^U>|`Y>0j{QTuZV e\@PE( ( ( (&AAAA{TT @$&0i;uT;B@@@@t=R+ricT5?0_Y ! Nnz-*:6U2)zJ#Ku"lDΉa;'vNOu*VCwX VHhkJڢF-umkK6YdU:3d3LɘU]Q%hiɮ9%n-]ї8u&yB9` 'կ7V=dz,#_07f^'<*+֕ϭ/o_<״kT9ya,e3ulGQhjOjӴZRKZvVFߢw%o.k5X':JfW`¯>~׋DyG};&i/> |>!C T@@Rଵzze1k5* 9R6{_E݄$,fcDH bd [ KB[UDqĈ % BPD"FPA"" +zQQqGz34*^{RO:LϤy9u43xg#Z.~#G3iѶ{yZ?d`!K"w"DR )Huޕ."1h.˲iMg!׉ao%B&»Lw}29.ՏF$HWJ[sl5gv\X03,aO 4a iMCX ¶kM$7!1tic;W _uBXb&˞J+uO xO c\օ;]qWkɗ!T;_ߨg1NMySވf'ٻ,"4ޒu^WkVרlUjzqc#N!ͯ(:ZcbIpՒl.VAMV Mx ՛Ry/X_ye6wufxSG;et7fǵ2-J{F H| }-|@}VӦihE zqF(L+zU~sBFN53|< d-!aGAR)6dm.$rfu:ZmfG>5b,;~A{KX6VeΩ"q`b{`[-kE[5D$|颓MTx{qtu/wXiR325f? "]ծ'r .?|glѥ=w/Y}@P_o? B֛5kv3[hV9wsRmZ%n~ɓ~B7Dԗ^[<|5$/5[_B%EnE,MbK͔j |5_MUXgC`I_/d\(8t+Rda e>#j>K FMFu&i`Vt&>5CYH2_04O\p0JFƜ6-W2dTRʐ"U2zXD6a# fH06htaӍVH9"{Gdiѵg( LI3P0i &̀f̓fCy$H"I ("L @e@eZ2hjMmQ-,,Ԗ~fK&I;:T*J+7݉< U*HRK IRI~i%~=%>xD$$b%!+ XIn$_L"D $ cPɏ2MQi7Iyg yl<6QH1Y*k#oY& EnB驛@j p5x[ ViwtyEK%c`zaG*끺s]Gz]𺪩E(eyp GypA GQp _jE+>?{ifNxاG:YMwjV?)z~qhoE9v˯{BUiG| >t^y&ys.l3k *~?!P{^Wy/R汑{ۼߜVF~DRӶR{w܁^VB+#ԋڏbqݩݾ -[\`3Z+V?luPO_OPF׿b[ dk`T,} g[? g;R*/N֍m7 3|[L:ƻ]*)6&fwy> Q }56_af WX|#Cm?H#x,]G~`i5FfHRumosg'&LpbD{Ot/ MwmL!L{d/lJd"!ȿoy'N[T>>-r b[@aE i| %C`Ӑ}5?4_aGY?w]yP;d}^$.n1癪9L5;G#L}ϳ/Y^׷:@vkVCX#"}-V%/|c 2Dyx?%f3<Y$yh^jFsHcoo;Kpp-Z_5f{~VNV3ɢbsXq}"x˯!2B.>'9yMsxݬ &:oqNTz~& j'ͭkZG}bTQfi&L#l)us ϴhƵ66sdtOt9)]3]bJg~)Cz&ddddvYau3 Ln7Ӏi4 F/#ȑ!e>e>e>e>e>,|XGhH:y4A~ 'ౕ+VHh"e6#1Ld;1Χ3r LFeAF ,hoc_>/ؗڀܿ})CCB20}Ψ2fȜGo \G L;S3y-`7@*l7l5y:j,qS`g׻׻%1'(Qu<{oqX`Xhis_kRm"mF{[Q@~Eyif#߈2jmN6<>Uӯ3t3fLk-#-p1W]@#MO׊lROM `nwqhLﴕ]6smr"%,J IXXXm,6B FD7f`m l``[mPSn ,16bJ9=xGUS~LA-}{"8HHHH-hbe#pNs\{ K ; laXâ}ðhdad\H# fG̎0a)++4)lRc\B* ɜ= = = =F]L_L* JIB$@$$T `!"22L蒥Q'2B҃Ҍ˂3.PvSyp ΃+'Js1p°yHCR@GpG fffcc`]WЖоg@f@f@=S?RgU΂/ _,Y0 W|JL,YH/̪_xyCs>x\iǣUю-i` yy yy>m¨0klt&S,E[vWyyDO9L`=ƿ9x1A^j+Octw{cqU>TRudAZH8b$fcS:v]Sɯ~>N%!;`nv6GݟY }OQ^rzcOY^71EP3qJD~9xy7'{^[Dg'O_1bN,˳Y<"nDh+;:^Jm/Fut]7o`kĞ'~+G8EKM=Fim-Uՙ}K;=a\ץ".?>(d<`Ral9,23ͮf'/;gVˍFc&#zٔ~IY`ξ`-%|4ȧy4l[ b(=E4Vn1|=:e>k>jk.A}[EbHf2W։ eJFlqxLgM*`𭱞6[/9~< 1᝼&Yyy6rHI%3vp}%  n 5#Q:ɝ$w";];,?}!˄ /]&̶L.092!LZ&Mq|Q:&s9'^/ ^4ެɡ{Ԧtwꍌk/E3vyc `3jhF[?א,j;}{W6ǘaNgϯvҎi+unD>se UxX"ަϷ: tSo93>l*}fN 3~:iWV{zyNwfi뜪)r!HC)@pdx2;%F F F F νf^1/{IILطݍߎ/]C/\C/ GC!R&Iiؑ$$I03| !nXA{7W!MnwyvCILBvvR&a'eJ&ad5$d &!k0R:IpL'UVt*SA荠zo{C}S|>|>|>|@7IkjC~5Z\;'L;1rł:_fȑ9Ŧ8,6a)MqXlbSr7>C $8B|YLF&N tXtthЦ9i'[TR *1mz4NL F?Ƿk_|foV20Ki r}lTO}q/U+ifs|{bw{']\ݤݠ23F7GR~_([Qʔl}WvE_ۙ[OYXYWY.`}'i1biOES!gWG݇{Vzxk^S.Ng6GtpL˜z)s񵏰)R/ziM_gHPgHPgȠ Ƞ HyP3} ׻G~vh>"h%Xi0P4pPR l 1W빂@Rc@c@c@c@c@c@W@W@W@W@W@W@K@K@K@K`Li6ċVH9SW鷵2Pk\\D KHhHl=;;;;;;;;)|L6+0 :mS'w&w[oݧ>U(B_B㲯[뺝6S>^\MМ g8}={<]ծRQhcޟپG|5o-YV߮77&FeƘԧ梛5!59j64GڥNuNʡ9z❾wM8@q`biht`sw|rWkFVcʊ-F"eNmuh{Ct dze|g$3G>Q.Ka`oH)A(Nvpc;O z6. "S-IJ-'Mt_/xT^:TI:TI:TI:TI:̸ttk0aCCCCCCCCCCCCUcJe! DWfdic}"G6ޗĖC>P+U|\ƭ+[j}MWj[ڣd3!v&jhN0&~4l5sn~.:/x:mc2X ri4Oz+ՖڍڧX}g2^귑F-Vu>W=jzΦ-1#{5RTpi^i.1W Kb@$Y2oi rfZrMtUnML2{CMd[CW z{}[ȔZ_ff9q=*֊V!R֊bx\}"أRSՉ^->xR,,E /mNvž3ӵeVW::`O08}Z1o'r`c.rf/׫zvtl t@]^esHpٌ>=(_B^L {!2lù ^0*)) 4E.P &](6HH]ơoL֩ztʌ"nNV+\EFky}.n>#4} ,M+%`EpE`<#sק#fxo ܂qҾyZ?4!4!'9W,,来nm.Y~]T??ƨ-s;19..D^w9k7L)߽g==7gIRNj*22 ۙU tY[#&ko>5#ZPuvX{`gُ=xW`!o9?AnO&KSV5R2j a2:yy>\axv8esiy>n$T;mP)P)P)P)P&2. uqb|?$s*HJ`J{Uh?A>DLDV"$$޿%J= 3844 D( D|_W+ HG$# |D>"a4Ghq 8 @HQBJ_)]X)sJ?hUz)ԋ}[JsJy vgg \: x)V x%v{q/8ǿY)i}6b^` gQcVӋ1b4f ljb8.vV=C-^x'6pGul<Yc&A}vRk&Ys>=h!:n"=Ժ*Oϣ%J`٬+ʫ(}NZq*KdȵN39G}=ݩǝ,4ǜ7s,>$q!5/u?ɝYw/]]J-k?h:=xhkSdo5wm; e_ţzfk7G?r-!釙DL-Ӯ*w2I^xp&MU $aCcj4|=AYr?fmz8-tvσ.CWCn dsJq_ .%3[Nҝ®bX%=Y??љ=4Wu6$%Vl8}8-m:Dx㼳<-=݋ݥn7k\ۢ%Ui}qȸЮո`s͇|'$YyqׄIS;m7ݖ[Bw띍'@\X^/56 򧻘{1J$pCSG/X=p\\qd{}\-ͷߛ;sql\|Zo~f^b mGT-$YSءYͭxC ĵʪafVoeYX6A69NMqҞ*_b|Ȼ:LޥMFx$i$*AL*y"Wl8YN`< xv#;5{@{mڪxT2\M_$2hA6@VW5k ikHY(+Br< HۯA#JM{Wh _-iʶzGs#X*t؀fhX1z]&k*4 Cb D#?+Ea;0+5{DCGůQ,ȿc BMb_1E*_uAL22ϻlaG+ܙ|_D{N774" BKէijW B4zﴪj;z{cqh`Zo7Յ-6<6-cg |VU@Vʟ9-WρN7)NujOΘ"])R.iW[n sn:JnU ޤ(#)!Ő`4k{(8*Q$`R Q(3IG܆]w%^*(((((((:(lB|HKc.\8psN)&.4@L & IĤ\@YIF (APR^ kER] e1yCW9yCЬ Ύ : JXn\l%ؐp \Pr|.Yr\dr|\=-υ[ <re\d}2ݭ;r2l<~r R U&k ӿSmé6m2T8(_o:YVڅMϼӽ]_xvzjBmgOwf_*Փj:sFFw#!F{~7)Z);-D$f pU*1U3fGN<7 /D5**e*k ^^v[VSW g?ֿY^?A??>ȿ[b You8JtMQΎ@Ơ^N۞"}0E:fMj3ӿSmV@mtAL Ld:RWکd}g~gN3rBm 3a(Y|S~.E?cکTLg`i&HW=eB+‘쉲939#0<erm8AsE[96^ʸZe.=|?J}_hɡFާ󗫝|}o+>T|Vd0&@.D)<{Z7zΊXbqp\4#تߡ&~~Zd2vf9l3Dh2-ԦkOd?ok[̀)P(j{sN7|ϛ{+z=ۗ{˻޳=}x5 ̖̝|-XL"{\-8+ bJTz 7&kIH>$ce:+Ɉ%#bLYrR;ң 8LBA҆n;»#[Q), tw͚\km Dj , 5F&M-MH.OtA| 2N;#%;Y#HM Nl4t)rP/%-Z>Z>Z>t4z}]gVkRrUjzZbH?`H}틁/b_ 3@ B X`X`X`T`U(J%ʁrʴ*od5{Dh#݋fo5l Cjҝ:1is9h~ml40m:UM~xNZk/GV:OqVB6Ut[*fU~GVt?sEhs8¶6#@}Z_ҧSCm^LwX57 s*FvqХH!??K$ KtyO! rFNdZדM?yfz]M'G;#Gm+Zl9IK>}b5Ϻl~fb[1ftjFku\w;BESP[MOpQWh|ͽQŵv\m)q⾌077;;LqbSU<ݒWo|:P-f1ECP[i.3皥(e32.7 cц[F9yE$B\7z(5ZtKX?mӖk&]sT9H+t(É???N $E\t슂G2z``lnp?F<`(, GW$$0 hD4"HE$"u-^$H8Np"8Kg#F 810p a0paI[b0-{ཀ l+XwL@Ns#I"ΡL$KD(?[:#.sHO'|" =Nt' KHD"L TC(j_Z@X-CjQԏZU{rdq(ُcQ:U>'tX)GxD|Hrw:]y)xHy*xP9@tne (_yo+OKG\[E\[E[A<[/a/dTH؋THK*7P۫TP۫Hm2^&j{*7fY &r3RޤtG?{GM.:RޠN:T^:P^kv:nW^+t|Ey/+My/)/bdd ` 4f/i:V~J'UY l-k2XZ ւA8DA8h8h5*a(WW ::_fW̮:,nՑ7̹uw0\P*ud=Eg:2ePfc :u٭2j[0UYNP6]P>B9AmV(_P[TQ_+_+K:~IgWʷV(Q[|O (O)'z# t|ڏF?6 :J &`RHm,&j˕-{<W6q3]N+5 wV,4K'ڰ2 Rb;icUzmf ~޼<߼c$W }YL^6y4's6kȯ~bY$9։c1 ~mD^NVgFm&/7z!=f'p1SG{? Y,3lyӕcOJ~;Iޜw *IWPS]țv)R JY1dvx8nȿe㻏?>+}Lq"z/( WڀV /vB}`ᢎNs5@^ dPg;?-M'w~[07y42&*A#JSam,곫5BNM34B`d!&`baf̈EXd8I.zE=baf̈ 3#fF,L [wWʜ.g: >9^\S`S pC]I0Xri}w;tO^oٶUUa{ Wý!X!RvsH5=UErXY~'ҍMVÇCzؾ#JRpjYnlWÎ׍5 /[siq`5sHknעuv1rHOC껎Ͱֱ.wh+{Gu]|jZ]~_z֘oZ+O&rsth]=j뿹`Lz (>`!&$lD:BeE`s·پqS[by !`?4EtdbIou[ɀ\ԓVE!@ :v/m>h/Q< *&&QO$֑M]KH4jW! lǐ_sy};vvڷ@ K7ilS~>@PB/Q*-].`ͻ2s1SSmQ<%DŽu%ng{: -U?3KM?wf){eٍ,-0mz:R Wk}.uWZ,j$>am?'`+3-g:uQjN׳g@>H?ϸ8e0ǚw_[wZVA A3\g0;*VZrD L{k^|ﴷx}w~{Y՟0y ydeML PE(Y؟gZu ՞'QZ]o`4;Mq/yEM>:Ϗg){Μb&[ H?VSգ͞u%ZTj]Ǟrobʽr${mӮa$sκr P1Y!|X(& 0 #d,Rg2bSXM)LRΥq%{ϵ:C4*M0iҽx©4oҫ|^1ˮH̆ 0>`6|l[ϝ&(SO"ZL,U0M#Ϧw#s3,&4bB3,&4bB3,&4SEI-^R{IA%^RWIQn̡TҏAvMwPk<,k#azk&92,ͳyVծ~izMj!tS}s8ֱl;0.X( DSRH@C2?Dp #?oQF>fND 5P* 10̪7w3kH2H"tq>S&z'.2 [9'"-Q6jAMQtV ̞2ܜu|oiEl6KeSz\ۭTgV{# =9tGN2NJ~%&N7.DXϷiz'ruYyV*>w"~oÖOi/*=Tj3m8Yr|$AtPp2#1~JIr\pmuGFFFI n àA{#= ! ROHRIWJHR)ROT)FHa4+v Z Z ZUb:_ @1k1u1 XFV72K=,-dL A \rR; K+^ҫId$F7F7F7F7BXaR1JC90tޏ-~Xa#9Ϗ)=+|BEi4mAs{sps\Ȕ>>)/~O?'J(xo滏ܿƞ9aJ\ks]OJ}Y]abPɽ-BbF2 N՞M/ĭzRf뽍Te^i^g&-l ?lj1bp⟈n=6@5-w L+11'؏y l@k-\ *KS7&\oLޘj1zC$:A$:c BTGSAܾ4%Ⱥ H`t0(]6X1XlYTfm 4]%;4N`q2S<S<;NGk 3@Lh`*KlDS^Nh wRN!Yr鯓#SIVLbT(J`HGu?.#2$0\FjI@ XI@<&i'#=)3lCpGxkJ5&BS@:=;.hpl*J|[z= _pB:ߛ:蜅v?Nq*%N9CZ 񯂊yg(/ t:fH7HЍЀ{NUF1V:{{{0[̊b@3_gVpM(Yj"Q6PLOn9iw;h.zLqp ;e_g3ԾN0{Q @6q ^¹8zE}Ɋ5&{Rr\+[V+͊ҟN@>:QGc\AYJΚ_cۍ0*B09" isH.bt붻GcdzNEjXHkѪ&Z=| B^m>=qƏzAYeha!us}x\'GGWַ|eLؓeu^:M aFˈ6.>34MgEz>F_*qZvRz{|Qޏ=3DNSAT:ҕ~Oj#]ԓ tf#' IB/RЋTE*vFH-lW6S+[ŕ{ŕNhJД:)uBQ: ]5* n# ߅///^=gxV7儊d\|ɬCnJ~pSDF/֞#[Q2?nw7Ft{xj&:mZ= ݴ- 9mNӷx[tvtNZ!ӂNziCzQeuzP+Ԣ1z7ZX|ɬOεc>rc{ ɇ)N\.%C"Aúξ,37ٙl̘hJopOT,H:qIb?Eo8"s9^7x|F3[w4_@UKqp]iLJKZ_8IbR I?iO[U*-QJNK@z%lRJ^AQ[B2 @/N,=`XzEFDFUevF`gJKIpq8-@b2uĺb].$>@ FJnv~7xm#&o1L ,l7TSXKd%dßߞ(M:Ӝa%TVu89laFhw&/EB_3WfDr֟Ht?ZK$Rc1l{ #ޥ|G3- .Y;zUS(G-ٸHhOel2ld.-yyuVK*TGi]ŰbXT1,%Jი$+G[\:΅$ߐ֕ʃ]7&_uKz4/>/ml25H~+V{+6(l3)d̃ɇ)/ab!o|#/B`IR A A A }>B!bf^v?vo;v?ϼJ;K:"E)KۿߺHY-NZ_HK%_IGWQv}̦3̨y)J=a XRb`w/ڟسrş8YrN:_'@TD4V wwp.$=G@+#/(Bl+Lʙ3(gbujg4(yb7aݫLDHDQ:E2E*GʽS5f Ԙ3-@2%@2P2Tf0) Z2J$]]v$P0) da AePj2JE[0^^^d1>gz8dzGa,|g8dofl1{Xh_H^O>i&'W$%k,uJ"H ƗY5JU[Z$1pf8Q \@?.qns|+7˃5ItG^G<(Z(s66zQ&lMot/v\<q@MWi".^Vs_U'Na+E8:麭NO;B,7ɯ<cIԞnR_g{[| 3qM#n=z@Q0YGԞěγXVo`_>ϔ~ Sz3V v=GBRnpp.#3b JsK_ϡ\ֺ40)GmI9 t,s6Ou9[ #d|'7z: (7z: v+Jn%`W mGÄ*BBBBA+>V}LBdl][[*FkքJ&hYM8`.PPϪUA=zVK/4*ҘMi%KE5f-1kQYjZTORYݡ5~VSfjXGZQڝlHi ]%K5e9%z]z]z]U53YdQ!E=L\*IC}" ʕ5 kB\jzUV~d0<y2FoMOÛ0xf_v|`ѐ5t+ԡmv3Q9﾿}/(ȇϰA)scH 62s^ğdATPK!H  font.npyPK6 vedo-2025.5.3/vedo/fonts/VictorMono.ttf000066400000000000000000004541741474667405700176540ustar00rootroot00000000000000 DSIGXtGDEF,GPOSOFRGSUB#"AFOS/2RʬcL`cmap_'c cvt 4Hfpgm6IxgaspHglyfmXLhead<6hhea$hmtxu^~locadiǼmaxp Q H name_Vhbpost,f *prep0W >#%%'TVcmmort}      ""$%'')2446688::<<BBDDHHLWZZ``'(//#'8FFJZ DFLTcyrl"latnP BGR SRB $ .AZE 8CRT BKAZ LMOL VROM `TAT jTRK t   markmarkmarkmarkmarkmarkmarkmarkmarkmarkmark markmkmk"mkmk0mkmk>mkmkLmkmkZmkmkhmkmkvmkmkmkmkmkmkmkmkmkmk $,4<DLTH\ *>. # ntzj#8 ,,h,,#f#O#,#0,-# Bt #ZZZZZZZZZZZZfHNHT`ZZZZZZZZZZZZZZZZZw &,2,28> &DDJPVDJ\\b\ J& J&,h,n,t8\\ zVzz "j#8 ,,#,, ,::#::0]#B@ $ W, ,,,@@@ ,jh,A DjJj 6r4#4A,#,JJAJj,J,j3jjj #"""""""""""".("""""""""""""""""0 $*06j#8 ,,#,, 0::#]#W,,j,j Dj0 ,x]j"jA"A" # z z z z z z z z z z z z h n h t  z z z z z z z z z z z z z z z z z[        "      (  .  4  :  @ "  :  @  F  .  L "     R  X   ^   d j d j d j d p d v | j d 4 d p d j d v d j d j d d 4 j d p d j d j d 4  4 : L  "  R X  d d d j j d d d d j  4      4  :  @ "  :  @  F  .  L "     R      "       R        X d j   d j d j d j d j d j d p d v j d d  d 4 | d : d j d j d j d v | j j       4  :  L  $  *  $  0 "     R  6   6 "  6   6  R 6   6    X   ^   d j  : L  d j  : L "  R  d j d p d v d p d < B d < d < H d < N T < H d < N d <  d < 4 d < Z d < ` d < f T < ` d < f d < l d < r d < x T < B d < d < ~ d < d < B d < d < d B d  d B d d Z | B d ` d d  d  d B d d Z d ` d f T ` d f d l d r d x d T B d d ~ d d B d d  B H ` B d d d d   j p j j j d B d B d d Z B d B d d  B d  d  Z d  ` d  f T  ` d  f d  l d  r d  x T  B d  d  ~ d  B  d   T  B  d   d  ~  d   d   d  d  B d  d B d B d B d B d B d d Z B d B d d Z | B d ` B d B  B  B  B  B B d & B d & d & H d & Z d & ` d & x d & L d & , d & L d & 2 T & B d & d & ~ d & B 8 d & 8 T & B 8 d & 8 d & ~ 8 d & 8 d & B d & d & B d & d & d B d B d d ` d x d d B > B > > ` > x D B > > ~ > d B d d Z d j#8 ,,#,,,,9,g,,,,,,,,,,, ,,,::#:::::9:::::,, W  D ,0]#a,#^,,F,8,j,0,,<,4,7,,,,A,!,Djh,6r4#4j44474A6<4!4#j7yy  ,jhhh , ,<00  <   (""".4:@""FLRj#Aj740!BB   8 ^& ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j#,^ ..4:@@FLRRX^@@F^j#/'248 FFJZ Z`'(/mmort}"$678;?DEGIJKLMUVhp  u  v  ""$%'')2446688::<< BB!DD"HH#LW$#%% 'T!VOc57'2FF JZ '2FF 4IKZ DFLTcyrl8latn $0<LXdp|BGR 0SRB R  %1=MYeq}&2>HNZfr~'3?IO[gs.AZE NCRT nKAZ MOL ROM TAT TRK  (4@P\ht )5AQ]iu *6BR^jv +7CS_kw ,8DJT`lx !-9EUamy ".:FVbnz #/;GKWco{aaltaaltaaltaaltaaltaaltaaltaaltaaltaalt aaltaaltcalt"caltcaltvcalt caltcalttcaltcaltcalt rcalt calt calt pcase case case &case ,case 2case 8case >case Dcase Jcase Pcase Vcase \ccmp bccmp lccmp vccmp ccmp ccmp ccmp ccmp ccmp ccmp ccmp ccmp dnom dnom dnom dnom dnom dnom dnom dnom dnom dnom dnom dnom frac "frac ,frac 6frac @frac Jfrac Tfrac ^frac hfrac rfrac |frac frac locl locl locl locl numr numr numr numr numr numr numr numr numr numr numr numr ordn ordnordnordn ordnordnordnordn$ordn*ordn0ordn6ordnsubsDsubsJsubsPsubsVsubs\supsbsupshsupsnsupstsupszsupssupssupssupssupssupssupsS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd                        eeeeeeeeeeeeffffffffffff            gggggggggggg                        V^ft~&6FVfv&6FVfv&6FVfv,:HZhx .<JXft&.6>FNV^fnv~&.6>FNV^fnv~$%,428`j    . B V l    . B V Z l ~    2 F J \ n    " 6 : L ^ r    & * < N b v z  ,>Rfj| .BVZl~ 2FJ\n"6:L^r&*<Nbvz,>Rfj| .BVZl~ 2FJ\n  0@RVfv*.>N`dt&8<L\nr$4FVhhx(8JN^n"&6FX\l|04DTfjz ,>BRbtx*:LP`p$(&$!t!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"" """""" "" """$"&"."2"6">"B"D"L"R"Zh"@"R"Hh"J"Jh"N"8h"&"Rh"@"h"D , P)O*R0Q2 L)K*N0M2!!28!   !  !fgYZ[\]j^_`llmnopqrstu)!fgYZ[\]j^_`llmnopqrstu)!*!!!!!i!!i!|!j!j!j h FHSTUVWXYZ!x!x!~!!!d!j!p!p!p!b!b!b!\k!L!L!F!Fl!6!*!0!0l!!!!l!!!!!    l   m   m  m x x x  f f  f f rm R @ ^m , , Jm    $       mmmnnlloXXv|FdjjFFXo2>Do *0opqqtrrl`rLXLs88D\&2JJ&&8s $sstuuxxfrff~uRLju,8Vu<<<6**$$uuuvvxv||v|jdjjFFXw2>Dw0*0x   yyzzrlzpXvzVVVDDD&&2zz  {|}\}xxfffffT}R@@~J,,~66<<$***~vvvvddddFFR2>>***"" rlvXpbbV\PDJJ&&8$ ~~~~fflRXXDDD66 $$$xlldd||RjjjFFX2DD00  r~jjVV>VD,DD&&2  xxfffxR|d,hPTTT<BB**lXX|FvjjFFX2PD <0  |rLpttDd44*$B00< ,, ^vvXXLH<<,&  n\\LN~*lH88 (^ >zhVVF$bPp@@r0N<<Z,JJvp: (                  r t  t n b b J R : : 0 * 0                          d  p p    ~ ~ ~  n \ \ P P P @ @ @  0            h h  X p p T ` 6 N H H * 8                           v  f f D V b D D D D 4 4 4  $                 x   x x x B h 2 2 4 " F  j j j Z Z Z J 8 8   htbP@@$0``P.rrbX@p.."`  :degYZ[\]^_2`8l    vwxyz{|}~bbb FHSTUVWXYZ#LRX^djpv &,2@Frfdje lvkmwnxoypzq{r|s}t~ubbbbb  bbb)*bb b#!b b"b b v FHSTUVWXYZndedeEfbbbdbbbb`bbFbbNb Lb bADbbb Bb@bP(b.bbbzRt bbbbbbbBbbbbbbbbbzbbbbbbRbbbbbb#bbbbbbbbb !b bbbb bbbbbb|bzbxbvbtbbbrbpbnblbbjbhbbfb'34578//GGKRm3FFHHSZ,.07s~&-4Wabcdefghij  aj   ajv]b a:]&-047Ws~/GKLMNOPQR#abcdefghij   /GKLMNOPQR]       WR2r UKWN LL`j  `/9~+17>HM~7 #(u~#/359:C_ck    " & 0 : < D q y  !"!T!Z!^!_!!!!"""" """""+"H"a"e"# %%%%%&@&B' 0:.49AJP7#&t~$046:;Dbj    & 0 9 < D p t z !"!P!U![!_!!!!"""""""""'"H"`"d"#%%%%%&@&B'1jjx!xc.yPZOGH6hg/ ݻݹݒݝݜ ##j::DLLVV`h &' #'89>AMOQVW]uwx|;&()-49QRWX`9dC<%De  3(*0HBDE$\h^`sfrv3 $#D:=>Y'[!"%&516);:=<@?LJKFNPRTSUX Z Y [ q"p!t%y*{,z+}.10~/765PM;OLNTZacbjF C_<B?@A28@:AEB=)*,01.('2/+-GI*+,-/0O12UVWMRNQSPT3uvq}{mnopstwxyz|rVSU 247+-./,IGgiacdebkmno lCEGIJKH]\^_h*i)fgjlk6024897135& # -.  +,tnrl~oumsqk}pvz{`dyj_xi^cbgfwh]ae|DLKJIHGFMYZ[ED.(@%gW_O+!!!3b.Ml 8  @hGMHN +!#'##338W77WZ-i 8#"*X5+ 8".X5+ 8F"SX5+ 8"'5X.X5+5+ 8F"TX5+ _?"UX5+ I"VX5+ 8"-X5+ 8",X5+ G?"WX5+ 8"'5X,X5+5+ 87"XX5+ _?"YX5+ 5"ZX5+ 8 "'X5+ 8 "5X 5+ 8#")X5+ 8$"2X5+ 8"1X5+ <E 8@5 LKhGMHMaRN&" +#"&5467'##3#32673E<7CK667WZJ;(iҚ.'#A #'  8!>@;LihMMHN! & +!'##&&5463232654&#377W*$?NO@%+#$$i <7H::H9:  !  8"0X5+N D@Agg _ GM_HN +#3#3!5##3NՌ׌?VCgx MNM MqM &C@@ Lg_GM_HN%#&&! +332#26654&&##26654&&##MWe,#,:.,eW<>?;{;?>< (YLEHWXVd-8827B<@A9!.!.@+ LaMMaNN! &'& +&&546632.#"32667#o00ocCV8P$5,CK KC,5$P8VCPO#QG8:>>97GO#9! "*X5+9! "-X5+9!.6@*) LKPX@$reaMMaNN@%eaMMaNNY@65'(%& +$667#"&'732654.546632.#"3g5$P3L9!)C7!:" ')!LW&0ocCV8P$5,CK KC?97BM& ,-8< X XO#QG8:>>9! ",X5+9!"(X5+D. -@*_GM_HN       +2##26654&&##9^i..i^>EE> MM -;}};z1 ?@<g_GM _HN  +2###5326654&&##3#<^i..i^44>EE> MMNR-;}};ND. "#-X5+1 $U /@,g_GM_HN  +!3#!!v6 MNM U#"'*f5+U"'-f5+U"',f5+UU?"'Wf5+U"''5f,f5+5+U=7"'Xf5+Um?"'Yf5+U5"'Zf5+U "''f5+U"'(f5+U "'5f 5+U#"')f5+U$"'2f5+U"'1f5+U<, @@=LKg_GM_HMaRN&" +#"&5467!!!3#!#3267,<7CA0vJ;(.' = MNM#' U"'0f5+V  )@&g_GMHN  +!3## T MN 40.$;@8  LgaMMaNN$#&'& +&&546632.#"32675#5!#s11sgIZ:P'>1@NEL!40"9.X5+40 "9,X5+4 0."96l40"9(X5+C '@$gGMHN  +3#!#3TTTTR D dK2PX@#  g GM _JMHN@!  g  g GMHNY@ +3##!##5353!53!5!//TT//T*T*uM(MZC ">,X5+` )@&_GM_HN  +#3!53#5h MzMMM`#"A*X5+`"A-X5+`"A,X5+` "A'X5+`"A(X5+` "A5X 5+`#"A)X5+`$"A2X5+`"A1X5+`< ;@8 L_GM_HMaRN%$ +#3#3267#"&5467#53#5!rJ;(:<7CA0zM#' 7.' =MM`"A0X5+#  ,@)L_GMaNN' +&&'732665#53#U8O#6.DI 0ob#PG566vgMLG#> "M,5+II '@$LgGMHN +3###33h(aMTT& ? I I "O6lh  @GM`HN +!!3! ]TO -e  "Q*5+h   !@_GM`HN +!!3!#3 ]TOB T -h   "Q6l$) &@# LGM`HN +!!5737O]bbTM(Q(,7Q+- (@% LGMHN +3#33##TPPT }J} ^HRE @LGMHN +%3##3TZTZkk E#"W*X5+E"W-X5+E "W6l 5+EV F LK-PX@GMHMaLN@eGMHNY +3#52654'#3TIH20 TZ  IHMk E"W0X5+2&.#,@)aMMaNN#"' +&&5546632#>554&&#"3l//l__l//l_AGGAAGG@HPHHPHM7sPs77~tPs72&#"]*X5+2&"]-X5+2&"],X5+2G?"]WX5+2&"]'5X,X5+5+2/7"]XX5+2_?"]YX5+25"]ZX5+2& "]'X5+2&."]5X 5+2&#"])X5+2&$"]2X5+215@2LjaMMaNN'&#''# +3#"'#"&&554663232654&&#"32665\TE7 /l__l//l_G_$GAAGG@AG>LH|PHHPH'+ s77~tPs77s2#"j*X5+2"j5X 5+2#"j)X5+2$"j2X5+2"j0X5+2&#"]+X5+2&"]1X5+'1R#-F@C'& LaMMaNN*( (( +#"'#7&&55466327&#"!4'326651</l_V3]</l_V3#BAGL#BAGR+ePHA+ePHAw<7sw<7s2&"]0X5+W.(KPX@  L@   LYKPX@"gaMM aHN@2gaMM_GM_HM  aNNY@(''&" +#3#3!5#"&&5466325!6654&&#"3Wփ&FIS$$SID(*..,(//(NMOO>>?>Y( 2@/g_GMHN      +2###26654&&##@Xd,,cYT<>?; -dWZd* ~A@=BY 9@6gGM_JMHN  +2###326654&&##,Xd,,dXTT;??;l*_SS_* <99<2Xd./A@ ,LK'PX@.iaMMaLN@+ieaMNY@><53/.)1$#5 +766&#"#"&'&&##5327.554663233266554&&#"8$2 --$1)- 'HT%/l__l/'YN .G@AGGAAG[ M O P~PHHPNs77sPs77~tQ@ 4@1i_GMHN! +!##32326654&&#VTXd,&TJe<>?;P -dWSb.A@=BQ@ "x*X5+Q@ "x-X5+Q @ "x6l3.0.@+LaMMaNN0/&.' +&&'7326654&&'.546632.#"#\>@)C;>CCBW^)+bV`e#;'>69===[e,.h[71<-.D?-6'8K:P])1?@(*;6'.!CCBW^)+bV`e#;'>69===[e,c2 ,-8< U9B<-.D?-6'8K:P])1?@(*;6'.!99>T+cW=w^f++f^w=G#"*X5+G".X5+G"-X5+G",X5+G "'X5+Ge"''Xc*Xc5+5+Gh"''Xc-Xc5+5+Ge"''Xc)Xc5+5+GL"''Xc1X:c5+:5+G "5X 5+G#")X5+G$"2X5+G#5@2LjGMaNN"$%# +3#"'#"&&533266533265\TD8+cWWc+T>99>T Ȓ=Lzw==w^f++f^" G#"*X5+G"5X 5+G#")X5+G$"2X5+G"0X5+G#"+X5+G"1X5+G< &/@, LGMbRN$%( +33267#"&5467.5332665T@MD8(:<7C/%IT%T>99> !% 7.'4Bo^f++f^G"FXG"0X5+ 8 @LGMHN +!#33VTZZ {H (@% LGMHN +3#333#SoUOQNQOUoP] WOuH#"*X5+H",X5+H "'X5+H#")X5+"6 @ LGMHN +3##3]]]] pp;H @LGMHN +!#33VT\\*s H#"*X5+H",X5+H "'X5+H "5X 5+H#")X5+H$"2X5+H"0X5+*. )@&L_GM_HN +!!5!5!!,ge=M>k*. "*X5+*. "-X5+*."(X5+1Ax&4KPX@ #L@ #LYKPX@!gaPM aHN@)gaPMaHM aNNY@'''4'3-+&%'$& +&&54663354&&#"'>327&'#>55#"3a+*aV<8+1 P2R@Tb+ !9>NA8<::<8%QFMT#*5:+*>H!-`O'% M#*!MD?E22,/1Aj"*X1A0".X1A0"KX1A0"#5X.X1A0"LX1A1"MX1A"NX1AV"-X1AV",X1A7"OX1AV"#5X,X1A7"PX1A8"QX1A"RX1AP"'X1Ax"5X1Aj")X1Ak"2X1A"1X1=Nx8FKPX@! / 8L@! / 8LYKPX@(gaPMaNMaRN@/gaPMaNMaRNY@ &#&'$&)" +#"&5467&'#"&&54663354&&#"'>327#3267#"32665N<7CQ9&NAUa+*aV<8+1 P2R@Tb+ !J;(u::<88<.'$C '*!%QFMT#*5:+*>H!-`O'% M#' 22,/D?1A"/X1AN"0XTx2;IW@T/)(L  iaPM a NN<<33326632#3267#"&'#.#"6655#"3hE$QG@(&T #:.7@=7>D(%*DJ=1=A9\ %((@++$QFMT$/7:,+=E%--%BXb+&3-B7(//(FP#"OHD@E23,/V =@:LGMaPMaNN" +&'3632#>54&&#"3b,T+cVa**aV7<<79<<6*65?yy>M-i_`j-C?Bx.@+ LaPMaNN&%& +&&546632&&#"3267#m/0oaP^,F"<6CJHB6>$F-`Q>yy>5E*3$-i``i-$4*E6Bj"*XBV"-XBx2@'&LKPX@$reaPMaNN@%eaPMaNNY@21%(%& +$67#"&'732654.546632&&#"3t>$F*XD!)C7!:" ')!HS%0oaP^,F"<6CJHB?$4*@7 ,-8< W Fly>5E*3$-i``i-BV",XB^"(X? l@ LKPX@GMaPMaHN@!GMaPMHMaNNY@& +&&54663253#5#6654&#"3e++eXh-TT-hGNKJ:??:>yy?7*M$%PK-j`_i-:%-B@?LiaGMaNN-,*&& +#"&&546632&''7&5676654&&#"3;>.h\[i..i[L22)AU^s)DD>>DD>F؍ds43rbbr4\4UDF$ME@Cb"PHIO""OIHP"M #|@ LKPX@#aPM_GM aHN@'aPM_GMHM aNNY@#"& +&&54663253#5##3654&#"3^**^PW-TT.VYB UHF>1991?xx?7*$%OL.j_^j-?K '~@  LKPX@& gGMaPM aHN@* gGMaPMHM aNNY@%#&" +##5#"&&5466325#53534&#"3265K;T-hXe++eXh-TTKJ:??:GNMg*>yy?7XM::PK-j`_i-$%6x =@: LgaPMaNN  %# +!3267#"&&54663.#"e+r F=9A'C/cR^l//l^<4:D"xBXb+#4,D4?yy?GP""PG6j"*X6V"-X6V",X67"OX6V"#5X,X67"PX68"QX6"RX6P"'X6^"(X6x"5X6j")X6k"2X6"1X6<x)2Q@N L gaPMaNMaRN***2*2/-)(%*# +!32673267#"&5467.54663.#"e+r F=9A'C:$J;(:<7C-&S_*/l^<4:D"xBXb+#4,+3 #' 7.'3Bry?GP""PG6N"0X3@.4@1LgaMMHN' +.#"3###5354663K,O +(14T||'ZN.1, =9VNRNVS_*;< x-KPX@ L@ LYKPX@ iaPMaRN@$iJMaPMaRNY@-,&$&%% +&'7326655#"&&54663253#6554&#"3J$=,*8=-hYd+,eWh-T+aVCKNG:??:)4GA08@}bq3*_m08KP%$"OHcm.;< 0".X;< V",X;< j"3X;< ^"(XW -@*LGMaPMHN$" +33632#4&&#"WT'dV`*T;79; /={4bi,ABr  ;@8LgGMa PMHN$ +#4&&#"##53533#63`*T;79;TJJTww'dx={4bi,ABrM::MP/",5+m^"(`mj '@$_JM_HN  +3!53#5pN~jMMMmj"*`mV"-`mV",`mP"'`m^"(`m^"5bmj")`mk"2`m"1`m<^ (@ LK PX@- aOM_JM_ HMaRN@+ i_JM_ HMaRNY@ ( ('&%$#"!  $ +&54632#3267#"&5467#53#533 )))mJ;(:<7CA0ͯ~ү&''&)#' 7.' =MMMmN"0`A<^"(A<j/@,L_JMaRN% +&'732665#53#J$=,*8=~+aV)4 NHMbp1A<)V",m2 +@(LgGMJMHN +3#3373##TTf f R$m 2 "6lp /@,L_GMaNN$ +&&5#533267#TG~$ '/);%*aXM:@Hp "*X5+p ?@<L_GM_GMaNN$ +&&5#533267##3TG~$ '/);%,B T*aXM:@Hp  "6p -@*  L_GMaNN(" +%#"&&55575#5373267);%AGtt~tt$ '&*aX/Q/M/Q/:@(0w'V LKPX@aJMHN@JMaPMHNY@''$$$# +3366326632#4&&#"#4&&#"(T&&+4,38T #T #j((,h]zE@:uQxLLKPX@aJMHN@JMaPMHNY@ $# +336632#4&&#"QTL;NW%T2.DDj&-i_}AHBArQj"*XQV"-XQ x"6lQVxLKPX@aJMHMaLNK-PX@ JMaPMHMaLN@eJMaPMHNYY@' +#526654&&#"#3663W% LD''2.DDTTL;x-i_}@I!M''AHBArj&QN"0XDx,@)aPMaNN& +&&546632#>54&&#"3e++eXXe++eX:??::??:?yy??yy?M-i``i--i``i-Dj"*XDV"-XDV",XD7"OXDV"#5X,XD7"PXD8"QXD"RXDP"'XDx"5XDj")XDk"2XD-;@8LjaPMaNN-,)#&' +3#"'#"&&54663232656654&&#"3CTE7 +eXXe++eXN`??::??:ّ>L8Sy??yy?16 -i``i--i``i-Dj"*XD"5XDj")XDk"2XDN"0XDj"+XD"1X0& )F@C#"  LaPMaNN&$'' +#"'#7&&5466327&#"$'32665&=+eXS0_>+eXQ0 7:?( ::?f%uUy?,g&tSy?,N4s-i`_5-i`DN"0XT#3<@   LK"PX@$   gaPM a NN@) i   g Y a QY@44$$4<4<97$3$2,*#"%#$& +&&5466326632#3267#"&'#>54&&#"3.#"nI IA09<5?E(#!D"B25<90!##!!%%!O $'@@&..&C_i,$5/C5&..&N/oggo//pffp/BNV$$UOJJxl@ LKPX@aJMaNMLN@!JMaPMaNMLNY@&" +3632#"'>54&&#"3JT-hXe++eXh-??:GNKJ *>yy?7-j`_i-$%PKJJ B@?LGMaPMaNMLN&" +3632#"'>54&&#"3JT-hXe++eXh-??:GNKJ*>yy?7-j`_i-$%PK=JxwKPX@ L@ LYKPX@aPMaNMLN@ JMaPMaNMLNY@&&! +%#"&&54663253#&654&#"3-hXe++eXh-TTKKNG:??:)7?yy>*KP%$-i_`j-l xK LKPX@aJMHN@JMaPMHNY@ &# +336632.#"lTW5NSK)"TLjT';=O"')Yl j")*Xl V")-Xl  x")6lKx-.@+LaPMaNN-,&-& +&'7326654&&'&&546632.#"#W$B!.%HN@?td-gZQY%=#2)=B<4<>?;05TSR^++^RBGWWVd-MB<@BN778<<86% 6@3LGM_JMaNN$ +&&5#53533#32667#(Q%||T,'$' O+F9/fUGMM;D ,16% #?@<# L  gGM_JM aNN # +%#"&&55#535#53533#3#32667%+F9EQ%||||T,'$' d,1/fUgMMMMg;D 6%@@=LgGM_JMa NN$ +#3&&5#53533#32667#B TfQ%||T,'$' O+F9@/fUGMM;D ,16% .N@K.  LK  ieGM_JMNN+)%& +%#"&'732654&&5#53533#32667%A?!)C7!:" ')!L@||T,'$' d:3 ,-8< W moGMM;D 6 % "46QjLLKPX@JMaHN@JMHMaNNY@ $ +&&53326653#5#W&T2/AFTTK=.g[xAF:6!Qj"9*XQ0"9.XQV"9-XQV"9,XQP"9'XQA"9#'X*Xװ5+Q-"9#'X-Xװ5+QA"9#'X)Xװ5+Q"9#'X1Xװ5+Qj"95XQj"9)XQk"92XQ$@ LKPX@jGMJMaHNK'PX@#jGMJMHMaNN@#jJMHMaNNYY@ "$## +3#"'#5#"&&533266533265\TD8TK=MW&T2/AFT =L!.g[xAF:6" Qj"F*XQ"F5XQj"F)XQk"F2XQN"F0XQ^"9=Q"91XQ< j'3@0 'LJMaNMaRN%$(" +#"&54675#"&&533266533267 <7CM7K=MW&T2/AFTJ;(.'#B.g[xAF:6#' Q"9/XQN"90X-*j@LJMHN +!#33SPVWjEj (@% LJMHN +3#333#MoUMQLPNUpM\j@Ej"R*XEV"R,XEP"R'XEj"R)X8 j @ LJMHN +3#'#3````j55<>j-@* LJMaRN% +&'73266733#d1"(2&WX;S>G 94]NX'<>j"X*X<>V"X,X<>P"X'X>j"X5<>j"X)X<>k"X2X<>N"X0XTj )@&L_JM_HN +!!5!5!!Q<=3M3Tj"`*XTV"`-XT^"`(Xl.#.2KPX@ L@ LYKPX@,ig   i  W _ OK!PX@1igY   i  W _ O@2igi   i  W _ OYY@$$210/$.$-)'#"&#& +&&54663354&#"'>32&'#6655#"3!5!I IBV%1$# R &?2BI., /&1%V2%&1vT=739"2&' 39G@ MM(4%%%Ng.#;@8iiW_O#"! & +&&546632#>54&&#"3!5!N""NFFN""NF&**&&**&vT,e\\e,,e\\e,MD>>EE>>DNx#.K2PX@  L@  LYK2PX@!ga@M a=N@)ga@Ma=M aANY@$$$.$-)'#"&#& +&&54663354&#"'>32"&'#6655#"3J IBV%1$# R &?2BI0+ .)1%V2%&1@>739#1&' 39F@ MM(4%$&|=@:Lga@MaAN&% +$67#"&&546632!33&&#^+CFEIQ##QIDJ.83/&) ).;-*bY_i-0pfL;@0<=/q 8@5gcakN   $ +&54632#3!53#5 3ssT PMM-My,@)Li_O$# +736632#54&&#"yT 0!?ET",0)+d[=C<6v,@)a@MaAN& +&&546632#>54&&#"3N""NFFN""NF&**&&**&@,f\[e,,e[\f,ME>=EE=>Er=@:Lga`MaaN"& +#"&&5!&&#"'66367#3hQ##QIDJ.8%+CFE3/&)*bX_j-0pfL; ).;-s0<=/j @ L7667;5D)&=.#e(TT.A*.  #dQMVp 2H<=J4; "|*X5++# !@_MaN+!###526!#T'Zb9;#SuNi+>+- VC >2&.]< @_MN+3#!#!TT Y( u9!.I -< '@$ LMa#N%#+3#"&'7326737Vj`"1"&0W p]G -<"Jl5+ M '*@'#"LiMN+#5.5466753>54&&'M.j_T_j..j_T_j.>GG>F>>F >ZZ?qp?YY>q1aRRa0a10aR"6 B +@(LiMN$"+#5#"&&5332665T'dV`*T;79; /={4bi,AB)@ )@&TM`N +3#5!3!TT=T -v -#5 @M`N+!!333335TTT -- N -@*TM`N +3#5!3333TTTzTz -l --K  FK PX@qM`N@M`NY@ +3##5#3!TTT vv -Y( 2@/gM`N     +2##326654&&##@Zc++cZT9@@9/mccm/ O!LEEL C 9@6g_M_N +2###5326654&&##[Zc++cZe9@@9/mccm/MO!LEEL 9 =@:gM `N      +2##33%26654&&##PX&&XPTrT/55/e/mccm/  M!LEEL U !?@<i_M aN !!  +2####526326654&&##@FF@}>&Zb9:#)##)/mccm/uNi*?O!LEEL  U >@; iM `N  +2####33326654&&##HO""OHTTTJ'++'J/mccm/P "O!LEEL 3.|2.#A@>ga"Ma#N#"#"'" +$673#"&&5546632#&&#"3#3b?[l__l//l__lY?8AGGA?$+RJHPHJR+$7sNs7J&.#A@>ga"Ma#N#"$#"' +#"&'3326655#5354&&#"#663l//l__l[?6AGGA8?Yl_.HPHJR+$7sNs7$+RJ` A` "A'X5+#  M> 3@0Li_MN$+#54&&#"##5!#63`)T<6::TS&e4zmOX&DEMM0N.+hKPX@ gaMa#N@(gMa"MMa#NY@(&#' +#"&&55##33546634&&#"32665W&&WNNW&RTTR&WNw3..33..3.EPEE Es77sPs77s 4@1i_MN +###.54663#"3TVbJT&,dX;?>< PQ.bSWd-~5B=@AK %KPX@#  L@#  LYKPX@ i_Ma#N@$i_MMa#NY@%$&%& +#"&'5326654&&#"##5!#63a)'\T 48<79<Tg+c0qfep0N"OGHO"C@MM5 5 D@Ag gM `N  +2###53533#26654&&##MZc++cZYYT9@@9/mccm/nMeeMpO!LEEL  N #*8@5  LK_M_N$$$*$*(+$#&&'.'##6676675!632!Z "T" Z 5(B(5Q  V2$62Y_.n._Y26$22-MMK@.G@GLKPX@<  rge a "Ma#N@=  ge a "Ma#NY@A?<;86#%& +#"&'732654.53326654&&'#53>54&&#"#46632$%TI!)C7!:" ')!JT$TA?54&&'M.j_T_j..j_T_j.>GF?F>>FSddSRccREwvE54&&#"3h.7!# 2TT693T)"MXX!Гz 6x6j")X6P"'XUj #@  LMN+3#3#3#ZZTTZZ55jj5Ax2G@D+Lga$Ma#N21#'# +&&53326654&&'#53>54&&#"#46632#e+TA::B93VV39A;;@T+e[[e,#//#,e[IB$(($*0N.'$'&"@GIA:@D=BIEj @ LMN+3##3^T^Tj#j#E0"JXEj")X4;j-@*LgMN!+###33>7667;.=&':,h9TT,,A+(jJ=>D$j&6-*34;j"*X+#j !@_MaN+!###52667!#T'Yb::#STNH+-j (@% LMN+3#33##'TBBT }J}jkCj '@$gMN +53#!#3TTTTs%jDx<j@_MN+3#!#!TTjJJx&BxIj!@_MN+###5ITjMM<>jX<>0"Jv#J5 ' @#"LM!N+$#5.5466753>54&&'5+`TTT`++`TTT`+6;;6;66;}=>}ii}>=}j-ZOOZ-[--[N8 jWBj%@"LiMN$!+%#"&&553326653#&eX_)T:9<8TT03z`_!;A +Aj )@&TM`N +3#5!3!TT>Tjvj#5j @M`N+!!333335TTTj Nj-@*TM`N +3#5!3333TTTzTzjljK j FK PX@qM`N@M`NY@ +3##5#3!TTTjvvjY(j 2@/gM`N     +2##326654&&##@Zc++cZT9@@9%WNNW%j6005Bj9@6g_M_N +2###53#26654&&##ZZc++cZd9@@9%WNNW%MM60059j =@:gM `N      +2##33%26654&&##PX&&XPTrT/55/e%WNNW%jljM6005Uj ?@<i_M aN    +2####5266732654&&##@FF@}@'Ya::").##)%WNNW%TNG6G05 Uj>@; iM `N  +2####335326654&&##HO""OHTTTJ'++'J%WNNW%Fj6005Kx-2x%A@>ga$Ma#N%$#"'# +$673#"&&5546632#&&#"3#3h:[4WGak..kaGW4Y;=@GG@?'9>4zmPmz4>9'&YONOY&J&x%A@>ga$Ma#N%$$#"' +#"&&'3326655#5354&&#"#>3k..kaGW4[:<@GG@=;Y4WGx4zmPmz4>9'&YONOY&'9>m^mP"'`A<^  Nx+hKPX@ gaMa#N@(gMa$MMa#NY@(&#' +#"&&55##33546634&&#"32665W&&WNNW&RTTR&WNw3..33..3x4zmPmz44zmjmz4PX&&XPPPX&&XPj4@1i_MN +#5##7.546635#"3TXjGP#+cZ9@@9j'MAHP#/+*/ V %x# LK-PX@* gM a  $MMa!N@' geM a  $MNY@%$' +#526654&&#"##53533#63`*IH)$;79;TJJTww'dx={IHM &,4bi,ABrM::MP/ ( F@C gM_M `N  +2###53533#26654&&##@Zc++cZLLT9@@9%WNNW%NN6005 Nj!(8@5 LK_M_N"""("((+$#&&'&&'##667667'5!6327"Z /(T(/ Z 4'B'4WM'&+2VIIV2+&'1ZeMMeZAxG@GLKPX@<  rge a $Ma#N@=  ge a $Ma#NY@A?<;86#%& +#"&'732654.53326654&&'#53>54&&#"#46632#$TJ!)C7!:" ')!JS$TA::B93VV39A;;@T+e[[e,#/D="1v<>P"'v<>j"+vBP"'X9P"'X@6>"0kLK"PX@ga"Ma#N@#igYaQY@###0#/+)"!&%+#"&&5546323>54&&#6654&&'#3@-fYor)esR])!(;-085nA!NH OGdber3K{(YO?J%]TS4147@!PKAI#O[)@x+.@+'&La$Ma#N+*-%,+&74667>5&&#"'66323267#v>WF36&M>3AQkWDf59OA7>*K:?QS:fCbR6F% 4@G<Wk1Y;0=!),8J?=^5;< xU  '@$ LMMN+3#3#3#TTZZZZZ 55j5J<x2G@D+Lga$Ma&N21#'# +&&53326654&&'#53>54&&#"#46632#`*T=77=5/VV/5=77<U*`XX`*$//$*`X(^V7>B;=F!N816;:4R['(\TGKYXYc*Qj9Q0"JXQj")Xm2 :j@LMN+3#3#sUXUjQx(0w@<jKPXLLYKPX@SMaNKPX@SMMa#N@cMMa#NYY@ $#+%3#5#5#"&&53326653;T;K=MW&T2/AFTJv!.g[xAF:6(0j'V LKPX@MbN@MMb#NY@''$$$# +#5#"&'#"&&53326653326650T&&+4,38T #T #j((,h]zE@:Mj+^ LKPX@T MbN@T MMb#NY@+*$$$# +%3#5#5#"&'#"&&533266533266536T6&&+4,38T #T #TJv((,h]zE@:Y)j!6@3LiMa#N! #+&&536632#>54&&#"3c+T@9Zc++cZ9@@99@@9&ZP&ZQQZ&M93389329Dj#<@9Li_Ma#N#"&+#"&&5#536636654&&#"3c++cZZc+e@99@@9:?@9&ZQQZ&&ZP[M93389338N +lKPX@$gMa$Ma#N@(gMa$MMa#NY@(&#' +#"&&55##33546634&&#"32665W&&WNNW&RTTR&WNw3..33..3x4zmPmz44zm <mz4PX&&XPPPX&&XPD "2B@?LJiia#N###2#1+)"!%+&+#"&&5467&&5463267#"36654&&#"3c++cZZc+)/#'q\Da 2}a7BF;9@@99@@9/lbbl//lb_lD'K\81)'9 S!KDDK!!KDDK!V j<j<jIj#5j 8 M V  p: 0K'PX@+M`,N@ d+NY+!!3!:Z-F U '*. C >2&.#'8@5ga1Ma,N'&%$#"'+&&5546632#>554&&#"3#53l//l__l//l_AGGAAGG@rHPHHPHM7sPs77~tPs7*N` AII O: 2LK'PX@ +M,N@ +NY+3#3#sUXU +- VE W!7  NK'PX@g_+M_,N@gc_+NY@ +!5!!5!!5!7FvFMINIM2&.]< 6K'PX@_+M,N@_+NY+3#!#!TT Y( u+7 L@ LK'PX@_+M_,N@c_+NY+!!55!!!7 fBNNBMI H 4LK'PX@ +M,N@ +NY+!#33VT\\*s  M 'L@ #"LK'PX@i+M,N@i_+NY@ +#5.5466753>54&&'M.j_T_j..j_T_j.?FF?F>>F#~<dd=~mm}=cc<~m/]OO].]..]N"6 D KLK'PX@+M,N@_+NY@ +3#5.533>5T,g[T[g,TB;T;B l}<<}lM[..[MG.)OK'PX@a1M_,N@ca1NY@))'' +353&&55466323#5>554&&#"Y.h\]i.Y11D>=C22M*pPHHPp)MO,vvPs77sPwu,O8 "H&[ "HH "Hnd "H}&." HH "%H?}G.")H` "'X5+H "%'X5+InI W@ LKK'PX@g+M,N@g_+NY@ +3#7##33h(fafMTT& ? ;-x(@ LKPX@#a4Mb,Ma,NK'PX@%.Ma4Mb,Ma,N@#j.Ma4Ma,NYY@('*%$+$3"&'#"&&5463267367&'.#&3")9X?MW%kn@LT "G ,$BC2-?Z2.:42@ LKPX@#ia1Ma,M0NK"PX@#ia1Ma,N@'iiYaQYY@21'-$%+#"'#466326654&&'#53>54&&#"3@-fYzOY((YO?Je!PKAI#N414774NT#J)j@L.M0N+#536654&'3)ZrTXSE"dlˡjyC1H/*I5D.%9>@;+La1Ma,N&&&9&820%-%+#"&&54667.54632&&#"6654'#6'&&#"3,dXXd,%UH*4!\L1e%V&."+B] ?AI:??:hKi{77{iaw<#3"8AE "A4^&XP  O>&XPPX&Ax2G@DLga4Ma,N21'#, +&&5467&&546632#4&&#"3#326653#e,#//#,e[[e+T@;;A93WW39B::AT+e[IB=D@:AIG@"&'$'.N0*$(($BIMJ5 @ I_+N+6'6654&'.5467#5!=XH>I02(3#43"##mT'0L7$5$" fj/*/7&M-&$+$K N LK'PX@a+Ma,N@ea+NY@ !#!+%#"&&'#&&##5323KCD[5!W@/2CBY6 *?,MMqi[bMonVDJj}LKPX@.Ma,M0NK'PX@.M,Ma,M0N@_.Ma,M0NYY@#$+3326653#5#"'DT3-(N1TTZ3N- U27&B(6!#)j: LK'PX@ .M,N@ .NY@ +#36654&'ZrTXSE"j*I5VʢjyC1H/MJ5#4;@8.L#J I_+N0/-,%$"! +6'6654&&'.5467&&5467#5!7#7#%74PhL'32 3L@EU;SbD:29j~ v97r B,WF,9 A(4#@1F[ ?4.DMP)-P 55"Dx6jEK-PX@_.Ma,N@e_.NY@ +#7&5###5!6g*,_\Td{! LKQMDJx"8@5 La4Ma,M0N"!&+#"&'#546636654&&#"3e++eX(MT+eX:??::??:x?yy?y?-i``i--i``i-!J?x'@'Ia4N#.+6654&&'.546632#4&&#"J ';4AQ96}q`l.TG@PZ&,@8?J4 **.-6)^Rnz4.laCK &YP6?%SH#B6D:x!IK'PX@_.Ma,N@ia,NY@&+##"&&54663&&#"32665:S+eXXe++eX?::??::?xM&wYy??yy?i--i``i--i`9j'@$L_.Ma,N$"+%#"&&5#5!#3267);%AG$ '&*aXHMM:@Aj!@.Mb,N$+&&53326654&&'3#f,TA::A$"_+ ,fYA&ep00peMbL+9|qADJx(.@+!La4M0N('+$#5.54667>32&>54&#&XMTCL")K2%-($;67> -3ÇBBqWUQ _Uc3`>{1eVn5JKj2@/La.Mb0N!$!+#"&'#.##53233KCQc&])=*2CL_%])@,iMe{PMypYJDj/@,L~.M0N+$#5.5533>54&'3D,g[T[g,TB;T;BT}<<}lM[..[MCM""MC 8j.4@1 L.Mb,N..$&$&+#"&'#"&&546733266753326654&'")B<(77(>W-1Sep0/kaak/0peS1j"<GAP"<'!"<IAj"HGAP"H'N*"HIDj"BG 8j"LG;-j"4GAj"8G1Jj":G<=xBMVKPX@PD2# L@PD2# LYKPX@#a.M a,Mb0NKPX@+a4Ma.M a,Mb0NK'PX@2a4Ma.M a,Mb0N@/fa4Ma.M a,NYYY@NNNVNU+2*)%$# +327#"&'732655&&'#"&54767654&#"5632767676632667654#"673IG A6#T'>GVJ7E/3^7,  6S/ @'28L8.   @jqjJ[B2& y1z{+%*2"DFQeOCwJ( L[(5-&"&I'&' :-8 -@*L;Ma@M=N$# +36632#54&&#"T*"EM!T(%&*;X0ncEM">7 +@(Lg;M_=N +#3373#'#TTwee;X/@,L_;MaAN# +&&5#533267#>=L!#0+6@)]U5M~P>HI #V LK2PX@aET!-2;/+d[=C>9|/"l@ LK2PX@aN@!NY@"!&# +36632#"&'>54&&#"3|T+$FN!!NF%+))&8++&f+e\\f,E>>D!+i5<|).@+La@MaAN)(%,% +&'732654&'.546632&&#"#GB*%C1+:@H"NG>F=,$8+&1FN!%UN@)67) !&0$27$1;& '5'4:|6@3L;M_<7=WWTuu! $!=/)]URRP>2&.+=@:iaMMaNN  + *&$& +&&546632#>54&&#"3&54632#rBBrFFrBBrF,L..L,,L..L,%%%%jwwjjwwjMW__WW__W#""#` RLK2PX@GMaPM`HN@iGM`HNY@  +%3!53#52653V?cMTUMMM1NQL3#.#(@%aMM_HN#+ +74667>54&&#"#&6632!!55MBGT;EBDET-k`^k/GcPKL>1UE36Mb969@54&&#"#46632#f+TA?54&&#"3i..i\Yi0TC=?DH;]h..i\?DC@@CD?2ob"iy5%VI/3$VPO0pfbp2M!NHLNNLHM!6 $@!K_GMHN  +367!5!,tux-SMM1'.+;D@ALiaMMaNN,,,;,:42+*$", +&&5467&&546632#6654&&#"36654&&#"3m/*6) +cVVc+ )6*/m_:==99==:BGFDDFGB.fYWWJHP\**\PHJWWYf.::6::6::qD?CDDC?D9.!1E@B LiaMMaNN"""1"0*(! &&# +&&53326655#"&&546632#6654&&#"3i0TC=?DH;]h..i\\i..i\@CD??DC@%VI/3$VPO0pfbp22obiy5NLHM!!NHLN2&.#:@7 La"Ma#N#"&+#"&&54663&&#6654'3rrBBrFFrBBrF,L. A$,L. A$.jwwjjwwjMW_BAd5;^W_CA5;v{wxy{z{{|{}~+A@>iiYaQ  + *&$& +&&546632#>54&&#"3&&54632#@$$@((A$%@(  9:e??e9:e>?e:D*G))G**G))G*l{1@.LiW`P1+%3#535'732'3QGG#/ HJDDDNTKPX@riW_O@ iW_OY")+4676654&&#"'&6323!6412  I>QL@'6(3 (=(%9# #N@6B*D2&D-'LKPX@/rrigYbR@1igYbRY@-,"&# +&7326654&&'#5>54&#"'&632#;I ::%J;MH>>H9?M!  D " !J<8B )0'F<{ 0@- LWg_O+#5#533#'3I<%%IKK2i3Do{ LKPX@/pgiYbR@0~giYbRY@ "&# +&73326654&&#"#5!#632#=J  :OABN954&&#"3??JK>I  $L>@J  9BOSF8E $$ AQOBD ! " "! { *@'LW_O +667'5!H7>K2[bC9l^%5H@ELiiYaQ&&&5&4.,%$* +&5467&&54632#6654&#"36654&&#"3A ;FF< AM##  9=I(/' A88A (/'I= !!   +} LKPX@)riiYbR@*iiYbRY@+*$"$%# +&'3326655#"&54632#>54&&#"3=J  'L>@JJ??J  98F$$ AQNBBNTF # ! " Yv װ5+Rw װ5+Yx װ5+Yy װ5+Rz װ5+R{ װ5+Y| װ5+R} װ5+Y~ װ5+Y װ5+YRYYRRYRYY% @GMHN +##3LjL R#W,VR#Z#,xTY#q#,yTR#Z#,yTY%Sf@ %S LK PX@Ir r rg  j  g  fGMaOMHNKPX@Gr r rig  j  g  fGMHNKPX@H r rig  j  g  fGMHN@J   ig  j  g  fGMHNYYY@NLJIFD>=<;42&$* +3#!54676654&&#"'&546323#"&7326654&&'#5>54&#"'&632LL6412  I@KL?'5)1/>HM;I ::%J;MH> .(=(%9# "A66B*D2%60'F<:42&$* +3#!54676654&&#"'&546323#"&73326654&&#"#5!#63LL6412  I@KL?'5)1@ANO=I  :! .(=(%9# "A66B*D2%6BQPCLKG8LjLDND*9l^Ze; UR#Z#,~UY#_#,~UR#a#,~HUR"#,~SR#Z#,XR2BNbKPX@' LK&PX@' L@' LYYKPX@B i  h  ii f G NK&PX@H ~i  h  ii f G N@U  ~i hii he G NYY@(33LJFD3B3A;921,+*)&%#"! 1& +#"&'#535'7#7#535'532'333'33&546636654&&#"3&632#"&5A$$A(4G#/3QG"/ HJG%Q2V J@!$@(  0:e>?e:!8DA7DDN<U=V?e9*G))G**G))G*x @aNN $ +&54632#!!++!!+))))<x;K'PX@aNMLN@aNNY@ $ +665"&546322'!!++!0?MO)))BmNxw' 5+<xw" 5+?#9#x %@"_GMaNN% +%#3&54632#VT h_!!++!!+)))))Jxw '@$aPM_LN $ +&54632##3! ,, !+4h T))))b3#.!-=@:~aMMaNN"""-",(&!!#+ +%4667>54&&#"#&6632&54632#("#)EBDET-k`^k/$2(T!!++!!+6C$&H:69@533266'3#! ,, !+]k/$2(T("#)EBDET-k`))))T([QM`2*6C%&H:69@: OY`p <6T?}208&paN<< PYz OM zC;J'4*3U--Y3*,(KM<xD<"J.MK'PX@GMaPN@aPNY@$ +2#"&5467!2#"&54672'!!++!0?[2'!!++!0?.MO)))BmNMO)))BmND '5+5+.;K'PX@GMaPN@aPNY@ $ +2#"&54672'!!++!0?.MO)))BmNx  5+(<} ?@ LKPX@ _JN@W_OY +%#'73#'73Mgggg0} ?@ LKPX@ _JN@W_OY +7#7'3#7'3gg1gg}5LKPX@ _JN@W_OY +%#'73gg}5LKPX@ _JN@W_OY +%#7'3gg~ @_GN +#3#3R jR jSSa @_GN +#3UR jS'@$LJIW_O+7'!5!=8X8;?99NVGKPX@gMN@Wg_OY@ +3#!5TT PPN'@$LJIW_O+7'!5!=8X8;i99N,@) L J IW_O+7'!5!7'8X8:8X8g99N99;'@$LJIW_O+!5!8g8X99MN,@) L J IW_O+!5!8g8p8g8X99KNM99t-?";@8iYgaQ""$$!$$#+#"&'&&#"#!5!2676632326'>UH!O#1 0cLv@M*,!O#1&'AO' N '-%I *@'YgaQ $+&54632#%!5!!!++!!+DI)))) ND/4@1giW_O%+!5!&54632#!5!Doe!!++!!+poN))))XN(w#Dc nKPX@"WW eaN@$gg eaNY@ $ +&54632#%!5!&54632#%!5!!!++!!+poe!!++!!+po)))) N))))4N'dd5+B@?LJIiYaQ*+%$&54632#&54632#8X8!!++!!++!!++!!+U9tt9ż)))) ))))<(w#LD=@: hW_O +!!!#7!5!7!5!73D C9DYD*CYEYE/NNNNdDK PX@4 pq   h gW_O@2    h gW_OY@+!!!!!#7!5!7!5!7!5!73D636W3Y3"6T6v3Y3NNN||NNN||D.!%)5O@Lg ga"M a  # N***5*40.)('&%$#"!!#+ +%4667>54&&#"#&6632%!5!!5!&54632#(!#*EBDET-k`^k/%3(G_e!!++!!+4A#&H:69@=;:9876543210/.-,+*)('&%$#"! -+!#7#537#5373373!73373!733733#3##7##7!#7##7!#7#373!73373!7337S`jmwTSTSTS`jmwTSTST"STSTMMMMJ KOSW[_cg@ :3918/7-6+5)4'h20.,*(&%#!g M$" Ndd``\\XXTTPPLLdgdgfe`c`cba\_\_^]X[X[ZYTWTWVUPSPSRQLOLONMKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! ;+!#7#537#5373373!73373!73373!733733#3##7##7!#7##7!#7##7!#7#373!73373!73373!7337S`jmwTSTSTSTS`jmwTSTSTST"STSTSTMMMMJD '@$gh!N+#3!7!!7!-WWrW6j-NN~JD 6@3gh!N +3!7!!~W[o4W޶jNNNJ#@ L!N+' #7TX8gW9:Q*J!@L!N+##1WWj*J@!N+3#3W[b[WNjJK@_!N+!5!KjMRJ2+?u?0550RJ2+'7?V?00Ix<xwB%*@'!   LKcPN +%667#5.5466753&&'`%3F(T@TLX&&XLTAS(F3&3--3A'+*>7IJEnmEIG6?*,&d4 5cQ*.N'@@= LJ IiYaQ$(,% +$'#"''7&547'7632732654&#"0W;\.==.\;W00W;\.==.\;W0J==JJ==J8Y5]]5Y8TT8Y5]]5Y8T=II==II=3%,38@53-)(!  LMMNN +$#5&&'7.5466753&&'56654&'%WLTRZ"@@9FP""PFTKT ;;3LW%,88,A34@b0QQ9B<62K8G3LY+VV29@1,ml_hmbbmh_{qMMq{MIaM,,MaIC.'?@<LgaMMaNN'&%$% +&'7326655#53546632&&#"3##mBN!!#||!H>BBN!!#!H>1A(95NJY(1A(95NJY(!> 7@4gg_ GMHN +!3#3##5#53>TSS MNdMM2<#--Q@N Lg   gaMM  _HN--('&%%# +%!'>54'#53&'#53>32&&#"3#3##& 6:qS @=5wh5?0"&MR"MMG#.$6M*'Mo~7? %[WM'*M0!+;<#-,A@>LgaMM_HN,,%% +%!'>54&'&'#53&546632&&#"3##& 79  VB4xj5?0"&MR#̳MMG$1'$1 !N/s7? &]Y0N540=H 9@6L hg GMHN! +33#3##5#535'#533\uTu\ YM;MM;MsGj7@4ggW_O +"!!33#"&&546633dQk  vY[LGUiXNXiMM\\MM)"@gW_O +%!5!!5!NNMM װ5+F ,@)ggW_O+!5!!5!!5!4449NNN9 2@/ggW_O +5!!5!#5396vMM3N: +@(LW_O+!!!v }@W_O +%!5!N}MT װ5+G"&@ & LKPX@0p j  gW_O@/ j  gW_OY@$#"" '!" +#3#33#"'#7&&5466337337#"#WMF-6G9*X:27GU) Y 8M Qk ee *NMi*}M\MPPiXNI1G!p@ ! LKPX@%pjW_O@$jW_OY@ !'!"+#33#"'#7&&546633733#"W-6G9*X:27GU) Y 8 ;\2DMi*}M\MPPM:iE0S:q@ LKPX@&qgYaQ@%gYaQY@ !"&+###7#53&##53273>54'26L[ X 8W#-94(Y?`55-)P\MQQMMc;hCe@xD &@#Wg_O +3##5#5353SNNNNiD@W_O+!5!D0iNK q 2+''7'76666q6666D ;@8igYaQ $ +&54632#!5!&54632# %% %0 %% %####N####D/"@gW_O +!5!!5!D00NN^DrK PX@*pq hW_O@( hW_OY@ +#!!#7#537!5!73DB =XF@vO@vOoF`!]7@Jv+##, [[I)!]7@Iv+33[[IWx @YaQ#$+3#46632#4&#"T5a??a5TG::G<\22\32&&#"#M24% ]*@1.24% ] )C3#<?RCPY(#<?RN[(J; $@!W_O+!#####dTTd MwwJ7 )@&LgW_O+!!!!7(\MacJM ,@)LW_O+#33#RXbꣶ)MJJjXLKPX@JMaHMLN@JMHMaNMLNY@#$ +3326653#5#"'JT3-(N1TTZ3N- U27&B(6!#?#%%9@6LiiYaQ%$'&&+6#"&&546632&&6654&&#"3c.i[\h..h\L-'hDD>>DD> yiw55xjjx5oj]#VPPV##VPPV#X(/;b@_   iiaMM  b NN00 0;0:64 / .(&& +&&546632#6654&#"3#3&&546632#6654&#"3`CC=>DD>+ +) )0mmCC=>DD>+ +) )E>>EE>>EN$//$$//$(E>>EE>>EN$//$$//$*y3?K@ 0 $ LK2PX@7  ii    i   fGN@B  ii    i   Y  b RY@6@@44@K@JFD4?4>:832.,(&"   +'3&&54632#&32654&##"&'#"&54632663654&#"32654&#"3q766CD77D77D26 73C66C37 62;HH;;HH;!!!!;HH; $$ %% @v+!!  %,%X@v+!!X,% %X@v+#3XKK%%,@v+!!,,%k,%X@v+!!X,%k,@v+!!,,k%X@v+!!!X,,%%X@v+!!!!,,,,k*k%X@v+!!!,X%%X@v+!!!XX%kk,X@v+!!X,k%X@v+!!!!X,,k*k%X@v+!!!X,,%kk6  #/;GS_kw+7CO[gs'3?KWco{&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#U                                                      X      pX      pX      pX      pX      pX      pX      pX      pX      6* #/;GS_kw+7CO[gs'3?KWco{&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#N                               Rv    Rv    Rv    Rv    Rv    Rv    Rv   Rv   R6E #/;GS_kw+7CO[gs'3?KWco{&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#B//""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  x/""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I   /""//""//""//""//""//""/I   /""//""//""//""//""//""/I   < 2+7'𓓓ot% /@,gW_O+!5!##5!#!#TT,T,TTAT% *@'gW_O+#!5!##5!TԨT,%TT% *@'gW_O+#!!#!#TT,%TkAT"@gW_O+!5!!5!TTTT .@+gW_O+!533!33!5!TTTTAT *@'gW_O+!5!3!533,TTTT *@'gW_O+!3!5!33,TTkTA%@v+#3#3TTTT%*% >@; g W _ O +!533!33##5!#!#TTT,T,TATAT% 2@/gW_O+!533#3##5!TTTT,T**T% 2@/gW_O+#3!33#!#TTTT,%AAT% $@!W_O+##5!###TTT%ATTA% "@W_O+##5!##TTT%ATkA% "@W_O+#!###TTT%TA% @W_O+#!5!!%ATT%@W_O+#!5!%AT% '@$W_O+#!5!33,T*%ATA%@W_O+#!!%T% '@$W_O+#33!!*T,%AT% )@&W_O+#!5!3!!,T,%ATAT% @W_O+#!5!!VT%%V@W_O+#!5!VT%% &@#W_O+#!5!3#VT*%A%@W_O+#!!VT%% &@#W_O+##3!!VT*%% )@&W_O+#!5!3!!VT%% *@'gW_O+!5!#!5!!TTTTT%V (@%gW_O+#!5!5!5!VT,%TTT% (@%gW_O+#!!!!VT,%TTTK< @W_O+#53#53ᖖ,<8@v+#3#3XP%@v+#3%% @W_O+#!5!!%%@W_O+#!5!%%@W_O+#!!%<@W_O+!5!T<<V@W_O+!5!V<<"@Wg_O+!5!!!V,<*T<E '@$W_O+#53#53#53#53qqqqqqqq<~ 5@2v+#3#3#3#3R,D,D,D,<@W_O+!5!<!<7 "@W_O+#53#53#53ȆȆ<V )@&v+#3#3#3dddf@v+#3f<!@W_O+!5!3!T<<@W_O+!5!3V<%@v+##3#VT**%Ak<@W_O+!3!V<%@v+#3%% )@&W_O+#!5!3!!%%$@!W_O+#!5!3%%$@!W_O+#3!!%% 1@.Wg_O+#!5!33!!,T*%*T% (@%Wg_O+#!5!!!VT,%*T< (@%Wg_O+!5!3!!V,T,<T% .@+Wg_O+#!5!3!!VT,T,%T% (@%Wg_O+#!5!5!!%AT*< (@%Wg_O+!5!5!3!V<*TA% .@+Wg_O+#!5!3!!%ATA% 0@-Wg_O+#!5!3!!#VT*%T*%V @YaQ!#+%4&&##532#FvF**]\TdFvFT\]% @YaQ!#+%46633#"#\]**FvFTd]\TFvFfV $@!YaQ !+5326653#**FvFT\]fTFvF?]\f &@#YaQ   +"&&5333X]\TFvF*f\]?FvFTpX"@ Lv+#5533#-----pwwXwWWwpX@Lv+#53X--+pw7pX@Lv+#53--+-pwwKf @W_O+#53#53ᖖ,fTTT8V@v+#3#3VTTTTXP%V@v+#3VTT%% @W_O+#!5!!VT%ATT%V@W_O+#!5!VT%AT%@W_O+#!!VT%Tf@W_O+!5!TfTfV@W_O+!5!VfT<"@Wg_O+!5!5!5!,<*T*fE '@$W_O+#53#53#53#53qqqqqqqqfTTTTTTTV~ 5@2v+#3#3#3#3VTTTTTTTTR,D,D,D,f@W_O+!5!fT!f7 "@W_O+#53#53#53ȆȆfTTTTTVV )@&v+#3#3#3VTTTTTTdddfV@v+#3VTTf%@v+#333*T*%Af!@W_O+!5!3!T,T,fTAfV@W_O+!5!3V,TfTAf@W_O+!3!T,f%V@v+#3VTT%% )@&W_O+#!5!3!!VT,T,%ATAT%V$@!W_O+#!5!3VT,T%ATA%$@!W_O+#3!!VTT,%T% 1@.Wg_O+#!5!533!!*T,%AT*% (@%Wg_O+#!5!5!!VT,%AT*< (@%Wg_O+!5!5!3!,T,<*TA% .@+Wg_O+#!5!3!!VT,T,%ATA% (@%Wg_O+#!5!!!%*T< (@%Wg_O+!5!3!!V<T% .@+Wg_O+#!5!3!!%T% 0@-Wg_O+##5!5!3!!VT*%*TAf &@#W_O+!533333TTTTfTAAf #@ W_O+!53333,TTTfTAAf #@ W_O+!3333,TTTfA% )@&W_O+#!5!3!!VT%ATATf!@W_O+!5!3!TfTA% &@#W_O+#!5!3#VT*%ATAkf@W_O+!5!3VfTA% &@#W_O+##3!!VT*%ATf@W_O+!3!Vf% )@&W_O+#!5!3!!,T,%<!@W_O+!5!3!T,T,<% '@$W_O+#!5!33,T*%<V@W_O+!5!3V,T<% '@$W_O+#33!!*T,%<@W_O+!3!T,< *@'gW_O+!5!3!!5!T,T,TTTV (@%gW_O+!5!5!5!3V,,TTTT (@%gW_O+!3!!!T,,TT%3@0W_ O +##533333###TTTTTT%ATAATA% (@%W_O+##533#3TTTT%ATA*% (@%W_O+#3#33#TTTT%*T% )@&W_O+#!5!3!!%ATAT%$@!W_O+#!5!3%ATA%$@!W_O+#3!!%T% )@&W_O+#!5!3!!VT,T,%%V$@!W_O+#!5!3VT,T%%$@!W_O+#3!!VTT,%%8@5gW_ O +#!5!5!5!3!!!!VT,,T,,%TTTTTT%V .@+gW_O+#!5!5!5!3VT,,T%TTT% .@+gW_O+#3!!!!VTT,,%TTT3%$p LK PX@'riW`P@(iW`PY@ $('+%3##5#535&&546632&32654&#"TP_r>qJJq>r_[JJ[[JJ[NNL bGn==nGb ZZJJZZJPU%J@GLgiYaQ%$&&&+!#5#"&&5466327#654&&#"3T`6}nCj==jCA7eeN(E**E''E*}YA_n=nGGn=^*XL0K))K00K)V+;LKPX@78L@ 78LYKPX@)i iaMMa NN@/ii   iaMMa NNY@<<554&&#"399pp940! 2#SEB89D ([SS[((\R%!(), _`BWNN~Y>I;0Fg'b+-7^@cf*R#0:- %@"_GMHN &! +!#"&&5466333#3&MBI!!JATT%WNLW' K< .7GG@D%$7 LiiaMMaRN56E&)E&$ +$#"&'7326654&'#1&5467&546632.#"31$33>54&## +`VT[#B#1*:;:IC+`VT[#B#1*:;:I;A -1;A -1jpJR"4D5'(/0=1 =S,pJR"4D5'(/0=1 =S\9939993Z>ddD@Y*:+;Lii i Y aQ  > =860.(&& +D6&&546632#>54&&#"3.546632.#"3267#ӊKKYYKKYAc66cAAc66cA7@@7=<H  D:8UddUUddUNAvNNvAAvNNvAD$THHS$)/1./1 4#F.-6hdD@]"L i   ig Y aQ...6.51/+)('&%$#& +D#"&&546636654&&#"36#'##32'32654&#~HHRRHHR:Z22Z::Z22Z:}>e4 ToAC.IRRIIRRI5_<<_55_<<_52m[[>;7%IP :@7 LW_O +!###%3#'#'#3bTbOT )) TO6 M4M;;xh.8dD@-iYaQ& +D&&546632#6654&#"3Y11Y::Y11Y:2>>22>>2/T67T//T76T/M;11<<11;JV@LN +#3VTTjJV@g_LN +#3#3VTTTTf #@ _JM_GN +3###5353UTTjMMf 5@2 gg_GN +#3##5#535#5353񜜜TTM]MM]MK.HS^hr@XM @-!ljb`B/ LKPX@,  g  a"MaN@0  g  a"MMa#NY@.ii__TTIIiriq_h_gT^T]ISIRHHGFED$)$$+#&'#"&5467##&'#"&5467&5463267#5!&5463267#5!6654&# 6654&#7&'3 7&'32?X{$)'gYIGWD8AZP)8,5,#7)8,5,#;aF"&4+;aF"&4+^~Y>I')+dR(_/~Y>I')+dR3z9`UfaP>, _`BWNtSUfaP>, _`BWNN;0Fg'b+-7;0Fg'b+-7^@cf*R#0:@cf*R#0:?KPX@gMN@Wg_OY+!!#3 TTNR P@LKPX@gMN@Wg_OY+7'!#3!=8X8;.TT99R P@LKPX@gMN@Wg_OY+!#3!8g8?TT99MD YKPX@ggMN@!Wgg_OY@ +!!!#3DFTT/NNR k@LKPX@ggMN@!Wgg_OY@  +7'7!#3!!7'=8X8TTI\\99NQQ6LKPX@ MN@W_OY+3#TTw)07A@>'-43,  La"M#N)(+'.'#5&&'7.54667535&'665X8gvLW%%WLTRZ"@@9FP""PFT,88,,4@A3-P9;{C8g8|PP99;9 ,@) L JIW_O+7'!'7!=8X8:8g8|79999;9x#dd5+\@  2+'%%7'w--JJI$ 7@4 L JIgW_O+7'7!'7!!7'!=8X88g87~]7]\9999;9՟QQQ-@* L J IW_O+7'%!!'78X8gq8g899;'N9;99D8@5 LJIgW_O+7'%!!!!'78X8gM ]\8g899;NQQN9;99(@%LJIW_O+!!i:8X8N9rt9(@%LJIW_O+!!0@:8X8N9rt9V Y@  LKPX@gMN@Wg_OY@ +3#!TT/:8X8PP9rt9 ,@) L JIW_O+7'!!=8X8::8X8H999rt9 ,@) L JIW_O+!!8g8:8X8799K9rt93 B@? LhMa#N   +!!!#"&5463G:8X8vb&&..&&. N9rt9io$*+$$+*$V6LKPX@ MN@W_OY+3#TTbw ;@ LKPX@ MN@W_OY+3# TTbw)07@@=7-,%$!  1L"Ma#N+$#5&&$'.5466753&&'56654&'%WLT8vFP""PFTKT ;;3LW%,88,A34@b0QQQt9{BL8G3LY+VV29@1,;W@T" L! JI   iYaQ;;$#$+$%$" +#"&'&&#"#"&'&&#"66766323276632325>SI"A)! $-#>+! ,-:8X8#!"A)!.>("A("GHX"$"!!% 9tt9 "$2'"$R_X@U^41.L_32J0/I i Y aQYWSQLJFDA?;9$%$#$) +'#"&'&&#"#"&'&&#"#"&'&&#"667663232766323267>323267667uX88"!"A)!->(#B'! $-$=*" )*;8X8"!"A)!->("A)! $-$=*" )*9 "$1("$"!!% 9tt9 "$1("$"!!% [b@_74 1L65J32I  i   Yi  a Q[ZVTOMIGDB><$%$#$$+67>&#"&'&&#"#"&'&&#"#"&'&&#"667663232766323267>323 =1/,"!"A)!->(#B'! $-$=*" )*;8X8"!"A)!->("A)! $-$=*"{  N"$1("$"!!% 9tt9 "$1("$"!!%~*@Lv+3#_tWoX82t9~ &@#  Lv +' # 7TX8gX8k9:3t9>-";@8iYgaQ"!$#$$!+!"#"&'&&#"#'46323267663v@M*,!O#1&'TUH!O#1 0cLN '-%AO' +ARKPX> L> LYKPX@6  iii    ea"N@<  iii  i  ea"NY@BBBRBQKIA@<:%"""%%&&+6&554663232654&&#"#"'&#"#4632326546632#"&'#>554&&#"3FB89D ([SN]+SICO7#&!USIDO7"&"=lp95/" 3"(N_HU%%UH*Wm{82viHXF2))HXF2))CIhu4M83|/23.8(;Q@NL;JI  iYaQ:9$%$"$#$) +'#"&'&&#"#"&'&&#"#46323267>323267667uX8:#!"A)!.>("A("GUSI"A)! $-#>+! ,-9 "$2'"$RHX"$"!!% -D1C@@ iYaQ10$"$$$"$ +326'3#"&'&&#"#"&'&&#"#&6323267663M&<.3TaU)\"-$(*C,4M&<.3TaU)\"-$(*C,##-%HX'"%##-%HX'"%[[@XZ LK[JI  i   Yi  a QUSOMHFB@=;$$%$#$)+'#"&'&&#"#"&'&&#"#"&'&&#"'567663232766323267>323267667.X88"!"A)!->("A)! $-$=*" =1/,"!"A)!->(#B'! $-$=*" )*9 "$1("$"!!%  N"$1("$"!!% a @_+N+#3UR jS6a-KPX@ _0N@W_OY+#3aj RSx  P9^:?j2+'788;;ij2+'78/;j2+'7'7Ҡ87/;;;9oV>:oV? 5+De0QdDKPX@pYbR@YbRY@ # +D&73326653#?TS?8BQ 7?GcA 5+/yNB:nCm;k+dD@ L IYaQ%% +D6654&#"56632 $ 342>G< [5+-C !j ,dD@!LWaQ  +D&5473#M92 4w}t6dD@+LYbR% +D&'5326553#.)TE7tM >L:A A5+}  dD@Y_O$ +D&54632#M9y $2xeHDZ<@ ExP 2dD@'YaQ   $ +D&54632#2&54632#!!''!!'!!''!!'%##%%##%t^ &dD@YaQ $ +D&54632#)))&''&c_2+'7;:>>c_2+'7;!>R^2+'7'7*87$:::V2+''7AZ[@2RP2Y2+'77Ǜ?[Z&3QSDQdDKPX@pYbR@YbRY@ # +D&73326653#?TS?8BQ 7? 8dD@-iYaQ   $ +D&54632#6654&#"3??NNA@O$$##:HH;;HH:M ! NdDLKPX@'rriYbRKPX@(riYbR@)iYbRYY@#$$ +D&'&&#"#&546323254'3#\1V6,* V7+  2> 0= dD@W_O +D!5!4N>dD@3LiYaQ% +D&'7326545# :" ')!T!)C7< g2,-8< 2dD@'LJYaQ* +D&54673267#CZ=AJ;(:<.''F #' 7Gc *@'ia"N   $+&54632#6654&#"3??NO@@O$$##;HH::HI:M  !j*XZ *I 5+$4=dD@2LJYaQ(+D'7&54632# &54632#8!!''!!'Y!!''!!'a;%##%%##%Cd0@K"PX@fN@YbRY@ $+&7332654'3#>^  " ]?8BQ  7?Di0".*ư5+?e0".)ư5+De1".2ư5+/y".0ư5+9o7",*Ͱ5+9o7",)Ͱ5+9o8",2Ͱ5+/y",0Ͱ5+D{d1@.LJYaQ"+'7&&733266'3#8~=T%S=:Ro:p63 36D{d1@.LJYaQ"+'7&&733266'3#88 =T%S=::o;63 36D{$A@>  LiYaQ$#"%%+6654&#"56632&&733266'3# % 342>H<=T%S=; [4+-D 163 56D{V-KPX@2rr~i   e a"NKPX@8rr~i j Y a   QKPX@9r~i j Y a   Q@:~i j Y a   QYYY@-,)(%#! #"$ +&'&&#"#&6323254'3#&&733266'3#1V70* U6+=T%S=: 8H  /<{63 369  2+'7''78HAZ[@Kn:o2RP29~  2+'7''7j~55#7#3D0 oo4)wwLgj2UU[ICntp77@4 LW_O+!33#3'53#'l]mlTnmShm]1[VR!*D@A!LiiW_O(&#"  +%!"5435476322'35654&#"'354&#"J@,*@@*,@<#&�*##+R8={5%##%5{=8_{!))!XV2+X*XV2+'7X3 3+11YV2+YVVXV2+X3%3 11\h84_<L>dLX%\XDXXX X X X X X X X X X X X X X X X X X X X X X X XXMX9X9X9X9X9X9XDXXDXXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXVX4X4X4X4X4XCXXCX`X`X`X`X`X`X`X`X`X`X`X`X#X#XIXIXhXeXhXhX$X+XEXEXEXEXEXEX2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X'X2XXYXYX2XQXQXQXQX3X3X3X3X3X3X XXXXXXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX XXXXXX"XXXXXXXXX*X*X*X*X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1XXVXBXBXBXBXBXBX?X:XX?X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X3X;X;X;X;X;XWX XXmXmXmXmXmXmXmXmXmXmXmXmXmXAXAXAXmXmXpXpXpXpXpX(XQXQXQXQXQXQXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDX0XDXXJXJX=XlXlXlXlXKXKXKXKXKXKXHX6X6X6X6X6XQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQX-XXXXXX8XXXXXXXXXTXTXTXTXlXgXxX|XXyXvXrXjX XMXMXVXVXVXXUXUXUXX@XEXEXEX4X4X+X+XCX2X<XYX9XX-X-X X"XBX)X#X XKXYXXXX X3X2XJX`X`X#XXXXX X X@X`XX X XXUXX@XEXEX2XJX-X-X-XBXXXX X1X9XTXVXVXVXX6X6X6XXAXEXEXEX4X4X+X+XCXDX<XJXBXXXX#X8XBX+X#X XKXYXXXX XKX2XJXmXmXAX XXX X X XAXWXX1X1XX6XXAXEXEXDXJXXXXBXX@X@X;XXJXQXQXQXmXXQX(X@X(XXYXXXDXVXX<XX#X XMXVXXUX*XCX2X`XIXX+XEX!X2X<XYX+XXX X"XXXX[XHXdX}XX}X`XXIX;X@XXDXAXMX1X2XXmXXDXXMXDXXDX!XDX9XAXDX5XX XXAXXAXAXXDX X;XAX1XXXXXIXxX|X|X|X2X`X3X@X/X9X9X6X1X9X2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%X XXXXXXXXXXXXXXXXXHXXXXXXXXXX3X5XXX)XTXX.X.XXXXXiXiXXXXX]X]XXXgXgXIXXX XXDXJXDXXX(XXXX~XXXXXXXXXXXXXXXXXdXXX^XXX~XX*X*XXRXRXXXXBX*X3X+XX!X<X<XXGXXXFX9XXXXGXGX:XXXKXXXX=X;XDX8XXXXEX-XXX!X!XWXWXXXXXJX?XXXXXGX:XGX:X XXXXXXXXXXBX.XXXXXXXXXXXXXXXXXXX,X XX,XXXXXX,XXXXXX<XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKXXXXXXXXXXXX!XXXXXXXXXXXXXXXXXXXXXXXXXXKXXXXXXXXXXXX!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX3XXXX-XKXXXXhXXXfXfXXXRXRXXRXXXXdXXdXdXXdXdXXdXdXdXXXXX\XXXXXXXXX3XXXXXXXAXXXXXXXXXXXXXXXXXXX ?9:DG/:m}eZXxXXXXRXXXXXXXXGXXX$CD?D/999/DDDD9999XDtV((((Pbt &8J\nXjZl~ 2n,>Pj| \n.Z(:L^p , > n z : ` r : L ^ p   | f xB*r$Ln6HZl~ .~NZl0Tfx"4 ,8DT`lxfr~dLXd2"v "x,>Jr~ b n z !6!H!!!"D""""#$#0#x##########$$ $n$z$$$$$$%*%6%&:&&'>'J'V'b'''(p(|(()()x)*4*@********+ + +,+8+D+++++,,,,n,z,,,,,,--0-l-x--------.../&/00@0z011:1B11111222:2L2^222223(3:3f3n3v3~3333344T4\44455V556.66676777778d89*9|9:::::::;;;(;:;L;^;p;;;;;;f>>>>>??J?v?~??????@2@:@p@@@A0ApABBXBBCC`ChCtC|CCD>DEEbFF$F0F\\](]]^^^_V_^_f_n_v_~_____``:`aaLab>bjbcZcjczccccccccdd ddd"d*d2d:dBdJd`dndddeeefgg0gBgTgfgggghhi8i\iiiiij,jjkk(k^klkkkl lPllmmRmxmmmnn&n6nFn`nhnnnnnno@oXooopp>phpppqq.qjqqr&rZrrss$szsst>tuDvww4wlwwwwx x$x,x4x4xxyRyzzPz{{^{{{||4|^|x|} }x}~ ~$~B~~(@j*J`ʁ0LhȂ>l>Ȅ„҅Zʆ"PzƆJ~Ԉ0H`x؈ 6Ld|ĉډ "@f@ĔFtҖ.LЗ 4Zė8fҘHx̙&JjLfқ6VlDnȝ"T|О2PlƟ *D^.\r֡ :`>h£Dl.N|ʥ4bHv§ĭNd^Bv(n*Ʋ0h:f hDʷVȸBʹRtXܿH:BLVhzRBl~ª¾\@zĶ\nŀŒŤŶ,lǖDz4r&&c6hD8 8CIe w   p $. R 8` $  "  6 J  `Copyright 2019 by Rune Bjrners. All rights reserved.Victor MonoMedium1.410;UKWN;VictorMono-MediumVictor Mono MediumVersion 1.410VictorMono-MediumRune Bjrnersrubjo.github.io/victor-monoCopyright 2019 by Rune Bjrners. All rights reserved.Victor Mono MediumRegular1.410;UKWN;VictorMono-MediumVictor Mono MediumVersion 1.410VictorMono-MediumRune Bjrnersrubjo.github.io/victor-monoVictor MonoMedium2c$     bc%&d'(e !)*"#$+%&,'()*+,--..//01012345f26789:;g<=>?@ABCDE345FGH6IJKL7MNOP8QRhSTUVWXYZ[\]^_`abc9:defg;<hijkl=mnDiopqrstukvwxyzl{j|}~nmEFoGHprsqIJKLtvwuMNOPQxRy{|z}STUVWX~YZ[\]      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     " ? ^`>@B  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEF !aAGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~# _      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOCPQRSTUVWXYZ[\]^_`abcdefghijklAbreveuni1EAEuni1EB6uni1EB0uni1EB2uni1EB4uni01CDuni1EA4uni1EACuni1EA6uni1EA8uni1EAAuni1EA0uni1EA2AmacronAogonek Ccircumflex CdotaccentDcaronDcroatEcaronuni1EBEuni1EC6uni1EC0uni1EC2uni1EC4 Edotaccentuni1EB8uni1EBAEmacronEogonekuni1EBC Gcircumflexuni0122 GdotaccentHbar Hcircumflexuni01CFuni1ECAuni1EC8ImacronIogonekItilde Jcircumflexuni0136LacuteLcaronuni013BNacuteNcaronuni0145Enguni01D1uni1ED0uni1ED8uni1ED2uni1ED4uni1ED6uni1ECCuni1ECEOhornuni1EDAuni1EE2uni1EDCuni1EDEuni1EE0 OhungarumlautOmacronRacuteRcaronuni0156Sacute Scircumflexuni0218uni1E9ETbarTcaronuni0162uni021AUbreveuni01D3uni01D7uni01D9uni01DBuni01D5uni1EE4uni1EE6Uhornuni1EE8uni1EF0uni1EEAuni1EECuni1EEE UhungarumlautUmacronUogonekUringUtildeWacute Wcircumflex WdieresisWgrave Ycircumflexuni1EF4Ygraveuni1EF6uni1EF8Zacute Zdotaccentabreveuni1EAFuni1EB7uni1EB1uni1EB3uni1EB5uni01CEuni1EA5uni1EADuni1EA7uni1EA9uni1EABuni1EA1uni1EA3amacronaogonek ccircumflex cdotaccentdcaronecaronuni1EBFuni1EC7uni1EC1uni1EC3uni1EC5 edotaccentuni1EB9uni1EBBemacroneogonekuni1EBD gcircumflexuni0123 gdotaccenthbar hcircumflexuni01D0 i.loclTRKuni1ECBuni1EC9imacroniogonekitildeuni0237 jcircumflexuni0137lacutelcaronuni013Cnacutencaronuni0146enguni01D2uni1ED1uni1ED9uni1ED3uni1ED5uni1ED7uni1ECDuni1ECFohornuni1EDBuni1EE3uni1EDDuni1EDFuni1EE1 ohungarumlautomacronracutercaronuni0157sacute scircumflexuni0219tbartcaronuni0163uni021Bubreveuni01D4uni01D8uni01DAuni01DCuni01D6uni1EE5uni1EE7uhornuni1EE9uni1EF1uni1EEBuni1EEDuni1EEF uhungarumlautumacronuogonekuringutildewacute wcircumflex wdieresiswgrave ycircumflexuni1EF5ygraveuni1EF7uni1EF9zacute zdotaccentuni2090uni2091uni2071uni207Funi2092uni2094uni2093uni0410uni0411uni0412uni0413uni0403uni0490uni0414uni0415uni0400uni0401uni0416uni0417uni0418uni0419uni040Duni041Auni040Cuni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni040Euni0424uni0425uni0427uni0426uni0428uni0429uni040Funi042Cuni042Auni042Buni0409uni040Auni0405uni0404uni042Duni0406uni0407uni0408uni040Buni042Euni042Funi0402uni0462uni046Auni0498uni04C0uni04C1uni04D0uni04D2uni04D4uni04D6uni04DCuni04DEuni04E2uni04E4uni04E6uni04ECuni04EEuni04F0uni04F2uni04F4uni04F8uni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0430uni0431uni0432uni0433uni0453uni0491uni0434uni0435uni0450uni0451uni0436uni0437uni0438uni0439uni045Duni043Auni045Cuni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni045Euni0444uni0445uni0447uni0446uni0448uni0449uni045Funi044Cuni044Auni044Buni0459uni045Auni0455uni0454uni044Duni0456uni0457uni0458uni045Buni044Euni044Funi0452uni0463uni046Buni0499uni04BBuni04C2uni04D1uni04D3uni04D5uni04D7uni04DDuni04DFuni04E3uni04E5uni04E7uni04EDuni04EFuni04F1uni04F3uni04F5uni04F9uni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni044E.loclBGRuni0431.loclSRBuni0433.loclSRBuni0434.loclSRBuni043F.loclSRBuni0442.loclSRBuni0448.loclSRBAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 Alphatonos EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos Omegatonos IotadieresisUpsilondieresisuni03CFalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhouni03C2sigmatauupsilonphichipsiomega iotatonos iotadieresisiotadieresistonos upsilontonosupsilondieresisupsilondieresistonos omicrontonos omegatonos alphatonos epsilontonosetatonosuni03D7uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209C zero.ss01uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089 zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numruni2070uni00B9uni00B2uni00B3uni2074uni2075uni2076uni2077uni2078uni2079uni215Funi2189uni2153uni2154uni2155uni2156uni2157uni2158uni2159uni215Auni2150 oneeighth threeeighths fiveeighths seveneighthsuni2151uni2152 exclamdbluni208Duni208Euni2308uni230Auni2309uni230Buni207Duni207Euni00ADuni2015hyphen_hyphen_greater.ligahyphen_bar.ligahyphen_greater.ligahyphen_greater_greater.ligahyphen_less.ligahyphen_less_less.ligahyphen_asciitilde.ligaperiod_hyphen.ligaperiod_equal.ligacolon_colon.ligacolon_equal.ligacolon_greater.ligacolon_less.ligasemicolon_semicolon.ligaexclam_equal.ligaexclam_equal_equal.ligaquestion_equal.liganumbersign_numbersign.liga%numbersign_numbersign_numbersign.liga0numbersign_numbersign_numbersign_numbersign.ligaslash_equal.ligaslash_equal_equal.ligaslash_greater.ligaslash_backslash.ligabackslash_slash.ligaunderscore_underscore.ligauni27E8uni27E9 anoteleiauni037Euni00A0Euroliraelementuni208Cuni207C equivalence existentialgradientuni208Buni207B notelement notsubsetuni2285emptyset logicaland logicalor intersectionunionuni00B5uni208Auni207A reflexsubsetreflexsuperset propersubsetpropersuperset universalarrowupuni2197 arrowrightuni2198 arrowdownuni2199 arrowleftuni2196 arrowboth arrowupdn arrowdblright arrowdblbothuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockupblockuni2594uni258Funi258Euni258Dlfblockuni258Buni258Auni2589rtblockuni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259Fltshadeshadedkshadeuni2566uni2557uni2554uni2550uni2569uni255Duni255Auni2551uni256Cuni2563uni2560uni2565uni2556uni2553uni2530uni2512uni2527uni250Euni251Funi2541uni252Funi2511uni2529uni250Duni2521uni2547uni2564uni2555uni2552uni254Duni254Funi257Buni2533uni2513uni250Funi2501uni2578uni257Euni2509uni250Buni257Auni2505uni2507uni2579uni253Buni251Buni257Funi2517uni2503uni254Buni252Buni2523uni2545uni252Duni2535uni253Duni2532uni253Auni254Auni2543uni256Euni256Duni256Funi2570uni2573uni2572uni2571uni254Cuni254Euni2577uni252Cuni2510uni250Cuni2500uni2574uni257Cuni2508uni250Auni2576uni2504uni2506uni2575uni257Duni2534uni2518uni2514uni2502uni253Cuni2524uni251Cuni2546uni252Euni2536uni253Euni2531uni2539uni2549uni2544uni2568uni255Cuni2559uni2540uni2538uni2526uni251Auni251Euni2516uni2548uni2537uni252Auni2519uni2522uni2515uni2567uni255Buni2558uni256Buni2562uni255Funi2542uni2528uni2520uni253Funi2525uni251Duni256Auni2561uni255Efemalemaleampersand_ampersand.ligabar_hyphen.ligabar_hyphen_greater.ligabar_hyphen_less.ligabar_equal.ligabar_equal_greater.ligabar_greater.ligadollar_greater.ligaplus_plus.ligaplus_plus_plus.ligaplus_greater.ligaequal_colon_equal.ligaequal_exclam_equal.ligaequal_equal.ligaequal_equal_equal.ligaequal_equal_greater.ligaequal_greater.ligaequal_greater_greater.ligaequal_less_less.ligaequal_slash_equal.ligagreater_hyphen.ligagreater_hyphen_bar.ligagreater_hyphen_greater.ligagreater_colon.ligagreater_equal.ligagreater_equal_greater.ligagreater_greater_hyphen.ligagreater_greater_equal.ligaless_hyphen.ligaless_hyphen_hyphen.ligaless_hyphen_bar.ligaless_hyphen_greater.ligaless_hyphen_less.ligaless_exclam_hyphen_hyphen.liga less_bar.ligaless_bar_greater.ligaless_dollar.ligaless_dollar_greater.ligaless_plus.ligaless_plus_greater.ligaless_equal.ligaless_equal_equal.ligaless_equal_greater.ligaless_equal_less.ligaless_greater.ligaless_less_hyphen.ligaless_less_equal.ligaless_asciitilde.ligaless_asciitilde_greater.ligaless_asciitilde_asciitilde.ligaless_slash.ligaless_slash_greater.ligaasciitilde_hyphen.ligaasciitilde_at.ligaasciitilde_greater.ligaasciitilde_asciitilde.liga"asciitilde_asciitilde_greater.ligauni0374uni0375uni02BCuni0308uni0307 gravecomb acutecombuni030Buni0302uni030Cuni0306uni030A tildecombuni0304 hookabovecombuni0312uni031B dotbelowcombuni0326uni0327uni0328 uni030A.casetonos tonos.case dieresistonos brevecombcy uni03060301 uni03060300 uni03060309 uni03060303 uni03020301 uni03020300 uni03020309 uni03020303uni03060301.caseuni03060300.caseuni03060309.caseuni03060303.caseuni03020301.caseuni03020300.caseuni03020309.caseuni03020303.caseuniE0A0uniE0A1uniE0A2uniE0B0uniE0B1uniE0B2uniE0B3LIGTTMM jJ.x<TTMM #jJ..xJTTMM//TTMM  jJ.^x<TTMM{//IIcCC[RqYq, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-,#!#!-, dBCC ``BCB%CCTx #CCadPxC`B!e!CCB C#BC`B#PXeYC`B-,+CX#!#!CC#PXeY d P&Z( CEcEEX!%YR[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY% CcRXK PX! CKPX!Kac CcbYYdaY+YY#PXeYY dC#BY-, E %ad CPX#B#B!!Y`-,#!#!+ dbB #BEX CEc C`Ec*! C +0%&QX`PaRYX#Y!Y @SX+!@Y#PXeY-, C+C`B-, #B# #Babfc`*- , E Ccb PX@`Yfc`D`- , CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`-, #B EPX!#!Y*!-,EdaD-,` CJPX #BYCJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B%B%B# %PXC`%B #a*!#a #a*!C`%B%a*!YCGCG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E#B #`B #B `aBBB` C`#B++"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-+,# bfc`KTX# .]!!Y-,,# bfc`KTX# .q!!Y--,# bfc&`KTX# .r!!Y- ,+ETX#B E#B #`B `aBB`++"Y-!, +-", +-#, +-$, +-%, +-&, +-', +-(, +-), +-*, +-., <`-/, `` C#`C%a`.*!-0,/+/*-1, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-2,ETXEB1*EX0Y"Y-3,+ETXEB1*EX0Y"Y-4, 5`-5,EBEcb PX@`Yfc+Ccb PX@`Yfc+D>#84*!-6, < G Ccb PX@`Yfc`Ca8-7,.<-8, < G Ccb PX@`Yfc`CaCc8-9,% . G#B%IG#G#a Xb!Y#B8*-:,#B%%G#G#a B C+e.# <8-;,#B%% .G#G#a #B B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8# CF% CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-<,#B & .G#G#a#<8-=,#B #B F#G+#a8->,#B%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-?,#B C .G#G#a ` `fb PX@`Yfc# <8-@,# .F%FCXPRYX +.0+-~,>+@+-,>+A+-,>+B+-,>+@+-,>+A+-,>+B+-,?+.0+-,?+@+-,?+A+-,?+B+-,?+@+-,?+A+-,?+B+-, EPXEX#!!YYB+e$PxEX0Y-KRXYcpB`P@4$*B@fUE9) *B@l]M?1" * B  *B@@@@@ *D$QX@XdD(QXXDY'QX@cTXDYYYYY@iWG;+*DdDDvedo-2025.5.3/vedo/grids.py000066400000000000000000002557731474667405700153730ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import time from weakref import ref as weak_ref_to from typing import Any from typing_extensions import Self import numpy as np import vedo.vtkclasses as vtki # a wrapper for lazy imports import vedo from vedo import utils from vedo.core import PointAlgorithms from vedo.mesh import Mesh from vedo.file_io import download from vedo.visual import MeshVisual from vedo.transformations import LinearTransform __docformat__ = "google" __doc__ = """ Work with tetrahedral meshes. ![](https://vedo.embl.es/images/volumetric/82767107-2631d500-9e25-11ea-967c-42558f98f721.jpg) """ __all__ = [ "UnstructuredGrid", "TetMesh", "RectilinearGrid", "StructuredGrid", ] ######################################################################### class UnstructuredGrid(PointAlgorithms, MeshVisual): """Support for UnstructuredGrid objects.""" def __init__(self, inputobj=None): """ Support for UnstructuredGrid objects. Arguments: inputobj : (list, vtkUnstructuredGrid, str) A list in the form `[points, cells, celltypes]`, or a vtkUnstructuredGrid object, or a filename Celltypes are identified by the following [convention](https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html). """ super().__init__() self.dataset = None self.mapper = vtki.new("PolyDataMapper") self._actor = vtki.vtkActor() self._actor.retrieve_object = weak_ref_to(self) self._actor.SetMapper(self.mapper) self.properties = self._actor.GetProperty() self.transform = LinearTransform() self.point_locator = None self.cell_locator = None self.line_locator = None self.name = "UnstructuredGrid" self.filename = "" self.file_size = "" self.info = {} self.time = time.time() self.rendered_at = set() ###################################### inputtype = str(type(inputobj)) if inputobj is None: self.dataset = vtki.vtkUnstructuredGrid() elif utils.is_sequence(inputobj): pts, cells, celltypes = inputobj assert len(cells) == len(celltypes) self.dataset = vtki.vtkUnstructuredGrid() if not utils.is_sequence(cells[0]): tets = [] nf = cells[0] + 1 for i, cl in enumerate(cells): if i in (nf, 0): k = i + 1 nf = cl + k cell = [cells[j + k] for j in range(cl)] tets.append(cell) cells = tets # This would fill the points and use those to define orientation vpts = utils.numpy2vtk(pts, dtype=np.float32) points = vtki.vtkPoints() points.SetData(vpts) self.dataset.SetPoints(points) # Fill cells # https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html for i, ct in enumerate(celltypes): if ct == vtki.cell_types["VERTEX"]: cell = vtki.vtkVertex() elif ct == vtki.cell_types["POLY_VERTEX"]: cell = vtki.vtkPolyVertex() elif ct == vtki.cell_types["TETRA"]: cell = vtki.vtkTetra() elif ct == vtki.cell_types["WEDGE"]: cell = vtki.vtkWedge() elif ct == vtki.cell_types["LINE"]: cell = vtki.vtkLine() elif ct == vtki.cell_types["POLY_LINE"]: cell = vtki.vtkPolyLine() elif ct == vtki.cell_types["TRIANGLE"]: cell = vtki.vtkTriangle() elif ct == vtki.cell_types["TRIANGLE_STRIP"]: cell = vtki.vtkTriangleStrip() elif ct == vtki.cell_types["POLYGON"]: cell = vtki.vtkPolygon() elif ct == vtki.cell_types["PIXEL"]: cell = vtki.vtkPixel() elif ct == vtki.cell_types["QUAD"]: cell = vtki.vtkQuad() elif ct == vtki.cell_types["VOXEL"]: cell = vtki.vtkVoxel() elif ct == vtki.cell_types["PYRAMID"]: cell = vtki.vtkPyramid() elif ct == vtki.cell_types["HEXAHEDRON"]: cell = vtki.vtkHexahedron() elif ct == vtki.cell_types["HEXAGONAL_PRISM"]: cell = vtki.vtkHexagonalPrism() elif ct == vtki.cell_types["PENTAGONAL_PRISM"]: cell = vtki.vtkPentagonalPrism() elif ct == vtki.cell_types["QUADRATIC_TETRA"]: from vtkmodules.vtkCommonDataModel import vtkQuadraticTetra cell = vtkQuadraticTetra() elif ct == vtki.cell_types["QUADRATIC_HEXAHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkQuadraticHexahedron cell = vtkQuadraticHexahedron() elif ct == vtki.cell_types["QUADRATIC_WEDGE"]: from vtkmodules.vtkCommonDataModel import vtkQuadraticWedge cell = vtkQuadraticWedge() elif ct == vtki.cell_types["QUADRATIC_PYRAMID"]: from vtkmodules.vtkCommonDataModel import vtkQuadraticPyramid cell = vtkQuadraticPyramid() elif ct == vtki.cell_types["QUADRATIC_LINEAR_QUAD"]: from vtkmodules.vtkCommonDataModel import vtkQuadraticLinearQuad cell = vtkQuadraticLinearQuad() elif ct == vtki.cell_types["QUADRATIC_LINEAR_WEDGE"]: from vtkmodules.vtkCommonDataModel import vtkQuadraticLinearWedge cell = vtkQuadraticLinearWedge() elif ct == vtki.cell_types["BIQUADRATIC_QUADRATIC_WEDGE"]: from vtkmodules.vtkCommonDataModel import vtkBiQuadraticQuadraticWedge cell = vtkBiQuadraticQuadraticWedge() elif ct == vtki.cell_types["BIQUADRATIC_QUADRATIC_HEXAHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkBiQuadraticQuadraticHexahedron cell = vtkBiQuadraticQuadraticHexahedron() elif ct == vtki.cell_types["BIQUADRATIC_TRIANGLE"]: from vtkmodules.vtkCommonDataModel import vtkBiQuadraticTriangle cell = vtkBiQuadraticTriangle() elif ct == vtki.cell_types["CUBIC_LINE"]: from vtkmodules.vtkCommonDataModel import vtkCubicLine cell = vtkCubicLine() elif ct == vtki.cell_types["CONVEX_POINT_SET"]: from vtkmodules.vtkCommonDataModel import vtkConvexPointSet cell = vtkConvexPointSet() elif ct == vtki.cell_types["POLYHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkPolyhedron cell = vtkPolyhedron() elif ct == vtki.cell_types["HIGHER_ORDER_TRIANGLE"]: from vtkmodules.vtkCommonDataModel import vtkHigherOrderTriangle cell = vtkHigherOrderTriangle() elif ct == vtki.cell_types["HIGHER_ORDER_QUAD"]: from vtkmodules.vtkCommonDataModel import vtkHigherOrderQuadrilateral cell = vtkHigherOrderQuadrilateral() elif ct == vtki.cell_types["HIGHER_ORDER_TETRAHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkHigherOrderTetra cell = vtkHigherOrderTetra() elif ct == vtki.cell_types["HIGHER_ORDER_WEDGE"]: from vtkmodules.vtkCommonDataModel import vtkHigherOrderWedge cell = vtkHigherOrderWedge() elif ct == vtki.cell_types["HIGHER_ORDER_HEXAHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkHigherOrderHexahedron cell = vtkHigherOrderHexahedron() elif ct == vtki.cell_types["LAGRANGE_CURVE"]: from vtkmodules.vtkCommonDataModel import vtkLagrangeCurve cell = vtkLagrangeCurve() elif ct == vtki.cell_types["LAGRANGE_TRIANGLE"]: from vtkmodules.vtkCommonDataModel import vtkLagrangeTriangle cell = vtkLagrangeTriangle() elif ct == vtki.cell_types["LAGRANGE_QUADRILATERAL"]: from vtkmodules.vtkCommonDataModel import vtkLagrangeQuadrilateral cell = vtkLagrangeQuadrilateral() elif ct == vtki.cell_types["LAGRANGE_TETRAHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkLagrangeTetra cell = vtkLagrangeTetra() elif ct == vtki.cell_types["LAGRANGE_HEXAHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkLagrangeHexahedron cell = vtkLagrangeHexahedron() elif ct == vtki.cell_types["LAGRANGE_WEDGE"]: from vtkmodules.vtkCommonDataModel import vtkLagrangeWedge cell = vtkLagrangeWedge() elif ct == vtki.cell_types["BEZIER_CURVE"]: from vtkmodules.vtkCommonDataModel import vtkBezierCurve cell = vtkBezierCurve() elif ct == vtki.cell_types["BEZIER_TRIANGLE"]: from vtkmodules.vtkCommonDataModel import vtkBezierTriangle cell = vtkBezierTriangle() elif ct == vtki.cell_types["BEZIER_QUADRILATERAL"]: from vtkmodules.vtkCommonDataModel import vtkBezierQuadrilateral cell = vtkBezierQuadrilateral() elif ct == vtki.cell_types["BEZIER_TETRAHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkBezierTetra cell = vtkBezierTetra() elif ct == vtki.cell_types["BEZIER_HEXAHEDRON"]: from vtkmodules.vtkCommonDataModel import vtkBezierHexahedron cell = vtkBezierHexahedron() elif ct == vtki.cell_types["BEZIER_WEDGE"]: from vtkmodules.vtkCommonDataModel import vtkBezierWedge cell = vtkBezierWedge() else: vedo.logger.error( f"UnstructuredGrid: cell type {ct} not supported. Skip.") continue cpids = cell.GetPointIds() cell_conn = cells[i] for j, pid in enumerate(cell_conn): cpids.SetId(j, pid) self.dataset.InsertNextCell(ct, cpids) elif "UnstructuredGrid" in inputtype: self.dataset = inputobj elif isinstance(inputobj, str): if "https://" in inputobj: inputobj = download(inputobj, verbose=False) self.filename = inputobj if inputobj.endswith(".vtu"): reader = vtki.new("XMLUnstructuredGridReader") else: reader = vtki.new("UnstructuredGridReader") self.filename = inputobj reader.SetFileName(inputobj) reader.Update() self.dataset = reader.GetOutput() else: # this converts other types of vtk objects to UnstructuredGrid apf = vtki.new("AppendFilter") try: apf.AddInputData(inputobj) except TypeError: apf.AddInputData(inputobj.dataset) apf.Update() self.dataset = apf.GetOutput() self.properties.SetColor(0.89, 0.455, 0.671) # pink7 self.pipeline = utils.OperationNode( self, comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#4cc9f0" ) # ------------------------------------------------------------------ def __str__(self): """Print a string summary of the `UnstructuredGrid` object.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), c="m", bold=True, invert=True, return_string=True, ) out += "\x1b[0m\u001b[35m" out += "nr. of verts".ljust(14) + ": " + str(self.npoints) + "\n" out += "nr. of cells".ljust(14) + ": " + str(self.ncells) + "\n" ct_arr = np.unique(self.cell_types_array) cnames = [k for k, v in vtki.cell_types.items() if v in ct_arr] out += "cell types".ljust(14) + ": " + str(cnames) + "\n" if self.npoints: out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) out+=", diagonal="+ utils.precision(self.diagonal_size(), 6)+ "\n" out+="center of mass".ljust(14) + ": " + utils.precision(self.center_of_mass(),6)+"\n" bnds = self.bounds() bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) out += "bounds".ljust(14) + ":" out += " x=(" + bx1 + ", " + bx2 + ")," out += " y=(" + by1 + ", " + by2 + ")," out += " z=(" + bz1 + ", " + bz2 + ")\n" for key in self.pointdata.keys(): arr = self.pointdata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "pointdata" a_scalars = self.dataset.GetPointData().GetScalars() a_vectors = self.dataset.GetPointData().GetVectors() a_tensors = self.dataset.GetPointData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" for key in self.celldata.keys(): arr = self.celldata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "celldata" a_scalars = self.dataset.GetCellData().GetScalars() a_vectors = self.dataset.GetCellData().GetVectors() a_tensors = self.dataset.GetCellData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" for key in self.metadata.keys(): arr = self.metadata[key] out += "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' return out.rstrip() + "\x1b[0m" def _repr_html_(self): """ HTML representation of the UnstructuredGrid object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.grids.UnstructuredGrid" help_url = "https://vedo.embl.es/docs/vedo/grids.html#UnstructuredGrid" arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '
' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self.dataset.GetPointData().GetScalars(): if self.dataset.GetPointData().GetScalars().GetName(): name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self.dataset.GetCellData().GetScalars(): if self.dataset.GetCellData().GetScalars().GetName(): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" pts = self.coordinates cm = np.mean(pts, axis=0) all = [ "", "", "", "
", image, "
", help_text, "", "", "", # "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
average size " + str(average_size) + "
nr. points / cells " + str(self.npoints) + " / " + str(self.ncells) + "
", "
", ] return "\n".join(all) @property def actor(self): """Return the `vtkActor` of the object.""" # print("building actor") gf = vtki.new("GeometryFilter") gf.SetInputData(self.dataset) gf.Update() out = gf.GetOutput() self.mapper.SetInputData(out) self.mapper.Modified() return self._actor @actor.setter def actor(self, _): pass def _update(self, data, reset_locators=False): self.dataset = data if reset_locators: self.cell_locator = None self.point_locator = None return self def merge(self, *others) -> Self: """ Merge multiple datasets into one single `UnstrcturedGrid`. """ apf = vtki.new("AppendFilter") for o in others: if isinstance(o, UnstructuredGrid): apf.AddInputData(o.dataset) elif isinstance(o, vtki.vtkUnstructuredGrid): apf.AddInputData(o) else: vedo.printc("Error: cannot merge type", type(o), c="r") apf.Update() self._update(apf.GetOutput()) self.pipeline = utils.OperationNode( "merge", parents=[self, *others], c="#9e2a2b" ) return self def copy(self, deep=True) -> "UnstructuredGrid": """Return a copy of the object. Alias of `clone()`.""" return self.clone(deep=deep) def clone(self, deep=True) -> "UnstructuredGrid": """Clone the UnstructuredGrid object to yield an exact copy.""" ug = vtki.vtkUnstructuredGrid() if deep: ug.DeepCopy(self.dataset) else: ug.ShallowCopy(self.dataset) if isinstance(self, vedo.UnstructuredGrid): cloned = vedo.UnstructuredGrid(ug) else: cloned = vedo.TetMesh(ug) cloned.copy_properties_from(self) cloned.pipeline = utils.OperationNode( "clone", parents=[self], shape="diamond", c="#bbe1ed" ) return cloned def bounds(self) -> np.ndarray: """ Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ # OVERRIDE CommonAlgorithms.bounds() which is too slow return np.array(self.dataset.GetBounds()) def threshold(self, name=None, above=None, below=None, on="cells") -> Self: """ Threshold the tetrahedral mesh by a cell scalar value. Reduce to only tets which satisfy the threshold limits. - if `above = below` will only select tets with that specific value. - if `above > below` selection range is flipped. Set keyword "on" to either "cells" or "points". """ th = vtki.new("Threshold") th.SetInputData(self.dataset) if name is None: if self.celldata.keys(): name = self.celldata.keys()[0] th.SetInputArrayToProcess(0, 0, 0, 1, name) elif self.pointdata.keys(): name = self.pointdata.keys()[0] th.SetInputArrayToProcess(0, 0, 0, 0, name) if name is None: vedo.logger.warning("cannot find active array. Skip.") return self else: if on.startswith("c"): th.SetInputArrayToProcess(0, 0, 0, 1, name) else: th.SetInputArrayToProcess(0, 0, 0, 0, name) if above is not None: th.SetLowerThreshold(above) if below is not None: th.SetUpperThreshold(below) th.Update() return self._update(th.GetOutput()) def isosurface(self, value=None, flying_edges=False) -> "vedo.mesh.Mesh": """ Return an `Mesh` isosurface extracted from the `Volume` object. Set `value` as single float or list of values to draw the isosurface(s). Use flying_edges for faster results (but sometimes can interfere with `smooth()`). Examples: - [isosurfaces1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces1.py) ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) """ scrange = self.dataset.GetScalarRange() if flying_edges: cf = vtki.new("FlyingEdges3D") cf.InterpolateAttributesOn() else: cf = vtki.new("ContourFilter") cf.UseScalarTreeOn() cf.SetInputData(self.dataset) cf.ComputeNormalsOn() if utils.is_sequence(value): cf.SetNumberOfContours(len(value)) for i, t in enumerate(value): cf.SetValue(i, t) else: if value is None: value = (2 * scrange[0] + scrange[1]) / 3.0 # print("automatic isosurface value =", value) cf.SetValue(0, value) cf.Update() poly = cf.GetOutput() out = vedo.mesh.Mesh(poly, c=None).flat() out.mapper.SetScalarRange(scrange[0], scrange[1]) out.pipeline = utils.OperationNode( "isosurface", parents=[self], comment=f"#pts {out.dataset.GetNumberOfPoints()}", c="#4cc9f0:#e9c46a", ) return out def shrink(self, fraction=0.8) -> Self: """ Shrink the individual cells. ![](https://vedo.embl.es/images/feats/shrink_hex.png) """ sf = vtki.new("ShrinkFilter") sf.SetInputData(self.dataset) sf.SetShrinkFactor(fraction) sf.Update() out = sf.GetOutput() self._update(out) self.pipeline = utils.OperationNode( "shrink", comment=f"by {fraction}", parents=[self], c="#9e2a2b" ) return self def tomesh(self, fill=False, shrink=1.0) -> "vedo.mesh.Mesh": """ Build a polygonal `Mesh` from the current object. If `fill=True`, the interior faces of all the cells are created. (setting a `shrink` value slightly smaller than the default 1.0 can avoid flickering due to internal adjacent faces). If `fill=False`, only the boundary faces will be generated. """ gf = vtki.new("GeometryFilter") if fill: sf = vtki.new("ShrinkFilter") sf.SetInputData(self.dataset) sf.SetShrinkFactor(shrink) sf.Update() gf.SetInputData(sf.GetOutput()) gf.Update() poly = gf.GetOutput() else: gf.SetInputData(self.dataset) gf.Update() poly = gf.GetOutput() msh = vedo.mesh.Mesh(poly) msh.copy_properties_from(self) msh.pipeline = utils.OperationNode( "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" ) return msh @property def cell_types_array(self): """Return the list of cell types in the dataset.""" uarr = self.dataset.GetCellTypesArray() return utils.vtk2numpy(uarr) def extract_cells_by_type(self, ctype) -> "UnstructuredGrid": """Extract a specific cell type and return a new `UnstructuredGrid`.""" if isinstance(ctype, str): try: ctype = vtki.cell_types[ctype.upper()] except KeyError: vedo.logger.error(f"extract_cells_by_type: cell type {ctype} does not exist. Skip.") return self uarr = self.dataset.GetCellTypesArray() ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") selection_node = vtki.new("SelectionNode") selection_node.SetFieldType(vtki.get_class("SelectionNode").CELL) selection_node.SetContentType(vtki.get_class("SelectionNode").INDICES) selection_node.SetSelectionList(uarrtyp) selection = vtki.new("Selection") selection.AddNode(selection_node) es = vtki.new("ExtractSelection") es.SetInputData(0, self.dataset) es.SetInputData(1, selection) es.Update() ug = UnstructuredGrid(es.GetOutput()) ug.pipeline = utils.OperationNode( "extract_cell_type", comment=f"type {ctype}", c="#edabab", parents=[self] ) return ug def extract_cells_by_id(self, idlist, use_point_ids=False) -> "UnstructuredGrid": """Return a new `UnstructuredGrid` composed of the specified subset of indices.""" selection_node = vtki.new("SelectionNode") if use_point_ids: selection_node.SetFieldType(vtki.get_class("SelectionNode").POINT) contcells = vtki.get_class("SelectionNode").CONTAINING_CELLS() selection_node.GetProperties().Set(contcells, 1) else: selection_node.SetFieldType(vtki.get_class("SelectionNode").CELL) selection_node.SetContentType(vtki.get_class("SelectionNode").INDICES) vidlist = utils.numpy2vtk(idlist, dtype="id") selection_node.SetSelectionList(vidlist) selection = vtki.new("Selection") selection.AddNode(selection_node) es = vtki.new("ExtractSelection") es.SetInputData(0, self) es.SetInputData(1, selection) es.Update() ug = UnstructuredGrid(es.GetOutput()) pr = vtki.vtkProperty() pr.DeepCopy(self.properties) ug.actor.SetProperty(pr) ug.properties = pr ug.mapper.SetLookupTable(utils.ctf2lut(self)) ug.pipeline = utils.OperationNode( "extract_cells_by_id", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) return ug def find_cell(self, p: list) -> int: """Locate the cell that contains a point and return the cell ID.""" if self.cell_locator is None: self.cell_locator = vtki.new("CellLocator") self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() cid = self.cell_locator.FindCell(p) return cid def clean(self) -> Self: """ Cleanup unused points and empty cells """ cl = vtki.new("StaticCleanUnstructuredGrid") cl.SetInputData(self.dataset) cl.RemoveUnusedPointsOn() cl.ProduceMergeMapOff() cl.AveragePointDataOff() cl.Update() self._update(cl.GetOutput()) self.pipeline = utils.OperationNode( "clean", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) return self def extract_cells_on_plane(self, origin: tuple, normal: tuple) -> Self: """ Extract cells that are lying of the specified surface. """ bf = vtki.new("3DLinearGridCrinkleExtractor") bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() plane = vtki.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) bf.SetImplicitFunction(plane) bf.Update() self._update(bf.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode( "extract_cells_on_plane", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) return self def extract_cells_on_sphere(self, center: tuple, radius: tuple) -> Self: """ Extract cells that are lying of the specified surface. """ bf = vtki.new("3DLinearGridCrinkleExtractor") bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() sph = vtki.new("Sphere") sph.SetRadius(radius) sph.SetCenter(center) bf.SetImplicitFunction(sph) bf.Update() self._update(bf.GetOutput()) self.pipeline = utils.OperationNode( "extract_cells_on_sphere", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) return self def extract_cells_on_cylinder(self, center: tuple, axis: tuple, radius: float) -> Self: """ Extract cells that are lying of the specified surface. """ bf = vtki.new("3DLinearGridCrinkleExtractor") bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() cyl = vtki.new("Cylinder") cyl.SetRadius(radius) cyl.SetCenter(center) cyl.SetAxis(axis) bf.SetImplicitFunction(cyl) bf.Update() self.pipeline = utils.OperationNode( "extract_cells_on_cylinder", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) self._update(bf.GetOutput()) return self def cut_with_plane(self, origin=(0, 0, 0), normal="x") -> "UnstructuredGrid": """ Cut the object with the plane defined by a point and a normal. Arguments: origin : (list) the cutting plane goes through this point normal : (list, str) normal vector to the cutting plane """ # if isinstance(self, vedo.Volume): # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") strn = str(normal) if strn == "x": normal = (1, 0, 0) elif strn == "y": normal = (0, 1, 0) elif strn == "z": normal = (0, 0, 1) elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) plane = vtki.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtki.new("ClipDataSet") clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() clipper.GenerateClippedOutputOff() clipper.SetValue(0) clipper.Update() cout = clipper.GetOutput() if isinstance(cout, vtki.vtkUnstructuredGrid): ug = vedo.UnstructuredGrid(cout) if isinstance(self, vedo.UnstructuredGrid): self._update(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return ug else: self._update(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self def cut_with_box(self, box: Any) -> "UnstructuredGrid": """ Cut the grid with the specified bounding box. Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. If an object is passed, its bounding box are used. This method always returns a TetMesh object. Example: ```python from vedo import * tmesh = TetMesh(dataurl+'limb_ugrid.vtk') tmesh.color('rainbow') cu = Cube(side=500).x(500) # any Mesh works tmesh.cut_with_box(cu).show(axes=1) ``` ![](https://vedo.embl.es/images/feats/tet_cut_box.png) """ bc = vtki.new("BoxClipDataSet") bc.SetInputData(self.dataset) try: boxb = box.bounds() except AttributeError: boxb = box bc.SetBoxClip(*boxb) bc.Update() cout = bc.GetOutput() # output of vtkBoxClipDataSet is always tetrahedrons tm = vedo.TetMesh(cout) tm.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") return tm def cut_with_mesh(self, mesh: Mesh, invert=False, whole_cells=False, on_boundary=False) -> "UnstructuredGrid": """ Cut a `UnstructuredGrid` or `TetMesh` with a `Mesh`. Use `invert` to return cut off part of the input object. """ ug = self.dataset ippd = vtki.new("ImplicitPolyDataDistance") ippd.SetInput(mesh.dataset) if whole_cells or on_boundary: clipper = vtki.new("ExtractGeometry") clipper.SetInputData(ug) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(False) if on_boundary: clipper.SetExtractBoundaryCells(True) clipper.SetExtractOnlyBoundaryCells(True) else: signed_dists = vtki.vtkFloatArray() signed_dists.SetNumberOfComponents(1) signed_dists.SetName("SignedDistance") for pointId in range(ug.GetNumberOfPoints()): p = ug.GetPoint(pointId) signed_dist = ippd.EvaluateFunction(p) signed_dists.InsertNextValue(signed_dist) ug.GetPointData().AddArray(signed_dists) ug.GetPointData().SetActiveScalars("SignedDistance") # NEEDED clipper = vtki.new("ClipDataSet") clipper.SetInputData(ug) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) clipper.Update() out = vedo.UnstructuredGrid(clipper.GetOutput()) out.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return out ########################################################################## class TetMesh(UnstructuredGrid): """The class describing tetrahedral meshes.""" def __init__(self, inputobj=None): """ Arguments: inputobj : (vtkUnstructuredGrid, list, str, tetgenpy.TetgenIO) list of points and tet indices, or filename """ super().__init__() self.dataset = None self.mapper = vtki.new("PolyDataMapper") self._actor = vtki.vtkActor() self._actor.retrieve_object = weak_ref_to(self) self._actor.SetMapper(self.mapper) self.properties = self._actor.GetProperty() self.name = "TetMesh" # print('TetMesh inputtype', type(inputobj)) ################### if inputobj is None: self.dataset = vtki.vtkUnstructuredGrid() elif isinstance(inputobj, vtki.vtkUnstructuredGrid): self.dataset = inputobj elif isinstance(inputobj, UnstructuredGrid): self.dataset = inputobj.dataset elif "TetgenIO" in str(type(inputobj)): # tetgenpy object inputobj = [inputobj.points(), inputobj.tetrahedra()] elif isinstance(inputobj, vtki.vtkRectilinearGrid): r2t = vtki.new("RectilinearGridToTetrahedra") r2t.SetInputData(inputobj) r2t.RememberVoxelIdOn() r2t.SetTetraPerCellTo6() r2t.Update() self.dataset = r2t.GetOutput() elif isinstance(inputobj, vtki.vtkDataSet): r2t = vtki.new("DataSetTriangleFilter") r2t.SetInputData(inputobj) r2t.TetrahedraOnlyOn() r2t.Update() self.dataset = r2t.GetOutput() elif isinstance(inputobj, str): if "https://" in inputobj: inputobj = download(inputobj, verbose=False) if inputobj.endswith(".vtu"): reader = vtki.new("XMLUnstructuredGridReader") else: reader = vtki.new("UnstructuredGridReader") if not os.path.isfile(inputobj): # for some reason vtk Reader does not complain vedo.logger.error(f"file {inputobj} not found") raise FileNotFoundError self.filename = inputobj reader.SetFileName(inputobj) reader.Update() ug = reader.GetOutput() tt = vtki.new("DataSetTriangleFilter") tt.SetInputData(ug) tt.SetTetrahedraOnly(True) tt.Update() self.dataset = tt.GetOutput() ############################### if utils.is_sequence(inputobj): self.dataset = vtki.vtkUnstructuredGrid() points, cells = inputobj if len(points) == 0: return if not utils.is_sequence(points[0]): return if len(cells) == 0: return if not utils.is_sequence(cells[0]): tets = [] nf = cells[0] + 1 for i, cl in enumerate(cells): if i in (nf, 0): k = i + 1 nf = cl + k cell = [cells[j + k] for j in range(cl)] tets.append(cell) cells = tets source_points = vtki.vtkPoints() varr = utils.numpy2vtk(points, dtype=np.float32) source_points.SetData(varr) self.dataset.SetPoints(source_points) source_tets = vtki.vtkCellArray() for f in cells: ele = vtki.vtkTetra() pid = ele.GetPointIds() for i, fi in enumerate(f): pid.SetId(i, fi) source_tets.InsertNextCell(ele) self.dataset.SetCells(vtki.cell_types["TETRA"], source_tets) if not self.dataset: vedo.logger.error(f"cannot understand input type {type(inputobj)}") return self.properties.SetColor(0.352, 0.612, 0.996) # blue7 self.pipeline = utils.OperationNode( self, comment=f"#tets {self.dataset.GetNumberOfCells()}", c="#9e2a2b" ) ################################################################## def __str__(self): """Print a string summary of the `TetMesh` object.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), c="c", bold=True, invert=True, return_string=True, ) out += "\x1b[0m\u001b[36m" out += "nr. of verts".ljust(14) + ": " + str(self.npoints) + "\n" out += "nr. of tetras".ljust(14) + ": " + str(self.ncells) + "\n" if self.npoints: out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) out+=", diagonal="+ utils.precision(self.diagonal_size(), 6)+ "\n" out+="center of mass".ljust(14) + ": " + utils.precision(self.center_of_mass(),6)+"\n" bnds = self.bounds() bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) out += "bounds".ljust(14) + ":" out += " x=(" + bx1 + ", " + bx2 + ")," out += " y=(" + by1 + ", " + by2 + ")," out += " z=(" + bz1 + ", " + bz2 + ")\n" for key in self.pointdata.keys(): arr = self.pointdata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "pointdata" a_scalars = self.dataset.GetPointData().GetScalars() a_vectors = self.dataset.GetPointData().GetVectors() a_tensors = self.dataset.GetPointData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" for key in self.celldata.keys(): arr = self.celldata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "celldata" a_scalars = self.dataset.GetCellData().GetScalars() a_vectors = self.dataset.GetCellData().GetVectors() a_tensors = self.dataset.GetCellData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" for key in self.metadata.keys(): arr = self.metadata[key] out += "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' return out.rstrip() + "\x1b[0m" def _repr_html_(self): """ HTML representation of the TetMesh object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.grids.TetMesh" help_url = "https://vedo.embl.es/docs/vedo/grids.html#TetMesh" arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self.dataset.GetPointData().GetScalars(): if self.dataset.GetPointData().GetScalars().GetName(): name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self.dataset.GetCellData().GetScalars(): if self.dataset.GetCellData().GetScalars().GetName(): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" pts = self.coordinates cm = np.mean(pts, axis=0) allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
nr. points / tets " + str(self.npoints) + " / " + str(self.ncells) + "
", "
", ] return "\n".join(allt) def compute_quality(self, metric=7) -> np.ndarray: """ Calculate functions of quality for the elements of a tetrahedral mesh. This method adds to the mesh a cell array named "Quality". Arguments: metric : (int) type of estimators: - EDGE RATIO, 0 - ASPECT RATIO, 1 - RADIUS RATIO, 2 - ASPECT FROBENIUS, 3 - MIN_ANGLE, 4 - COLLAPSE RATIO, 5 - ASPECT GAMMA, 6 - VOLUME, 7 - ... See class [vtkMeshQuality](https://vtk.org/doc/nightly/html/classvtkMeshQuality.html) for an explanation of the meaning of each metric.. """ qf = vtki.new("MeshQuality") qf.SetInputData(self.dataset) qf.SetTetQualityMeasure(metric) qf.SaveCellQualityOn() qf.Update() self._update(qf.GetOutput()) return utils.vtk2numpy(qf.GetOutput().GetCellData().GetArray("Quality")) def check_validity(self, tol=0) -> np.ndarray: """ Return an array of possible problematic tets following this convention: ```python Valid = 0 WrongNumberOfPoints = 01 IntersectingEdges = 02 IntersectingFaces = 04 NoncontiguousEdges = 08 Nonconvex = 10 OrientedIncorrectly = 20 ``` Arguments: tol : (float) This value is used as an epsilon for floating point equality checks throughout the cell checking process. """ vald = vtki.new("CellValidator") if tol: vald.SetTolerance(tol) vald.SetInputData(self.dataset) vald.Update() varr = vald.GetOutput().GetCellData().GetArray("ValidityState") return utils.vtk2numpy(varr) def decimate(self, scalars_name: str, fraction=0.5, n=0) -> Self: """ Downsample the number of tets in a TetMesh to a specified fraction. Either `fraction` or `n` must be set. Arguments: fraction : (float) the desired final fraction of the total. n : (int) the desired number of final tets .. note:: setting `fraction=0.1` leaves 10% of the original nr of tets. """ decimate = vtki.new("UnstructuredGridQuadricDecimation") decimate.SetInputData(self.dataset) decimate.SetScalarsName(scalars_name) if n: # n = desired number of points decimate.SetNumberOfTetsOutput(n) else: decimate.SetTargetReduction(1 - fraction) decimate.Update() self._update(decimate.GetOutput()) self.pipeline = utils.OperationNode( "decimate", comment=f"array: {scalars_name}", c="#edabab", parents=[self] ) return self def subdivide(self) -> Self: """ Increase the number of tetrahedrons of a `TetMesh`. Subdivides each tetrahedron into twelve smaller tetras. """ sd = vtki.new("SubdivideTetra") sd.SetInputData(self.dataset) sd.Update() self._update(sd.GetOutput()) self.pipeline = utils.OperationNode("subdivide", c="#edabab", parents=[self]) return self def generate_random_points(self, n, min_radius=0) -> "vedo.Points": """ Generate `n` uniformly distributed random points inside the tetrahedral mesh. A new point data array is added to the output points called "OriginalCellID" which contains the index of the cell ID in which the point was generated. Arguments: n : (int) number of points to generate. min_radius: (float) impose a minimum distance between points. If `min_radius` is set to 0, the points are generated uniformly at random inside the mesh. If `min_radius` is set to a positive value, the points are generated uniformly at random inside the mesh, but points closer than `min_radius` to any other point are discarded. Returns a `vedo.Points` object. Note: Consider using `points.probe(msh)` to interpolate any existing mesh data onto the points. Example: ```python from vedo import * tmesh = TetMesh(dataurl + "limb.vtu").alpha(0.2) pts = tmesh.generate_random_points(20000, min_radius=10) print(pts.pointdata["OriginalCellID"]) show(pts, tmesh, axes=1).close() ``` """ cmesh = self.compute_cell_size() tets = cmesh.cells verts = cmesh.coordinates cumul = np.cumsum(np.abs(cmesh.celldata["Volume"])) out_pts = [] orig_cell = [] for _ in range(n): random_area = np.random.random() * cumul[-1] it = np.searchsorted(cumul, random_area) A, B, C, D = verts[tets[it]] r1, r2, r3 = sorted(np.random.random(3)) p = r1 * A + (r2 - r1) * B + (r3 - r2) * C + (1 - r3) * D out_pts.append(p) orig_cell.append(it) orig_cellnp = np.array(orig_cell, dtype=np.uint32) vpts = vedo.pointcloud.Points(out_pts) vpts.pointdata["OriginalCellID"] = orig_cellnp if min_radius > 0: vpts.subsample(min_radius, absolute=True) vpts.point_size(5).color("k1") vpts.name = "RandomPoints" vpts.pipeline = utils.OperationNode( "generate_random_points", c="#edabab", parents=[self]) return vpts def isosurface(self, value=True, flying_edges=None) -> "vedo.Mesh": """ Return a `vedo.Mesh` isosurface. The "isosurface" is the surface of the region of points whose values equal to `value`. Set `value` to a single value or list of values to compute the isosurface(s). Note that flying_edges option is not available for `TetMesh`. """ if flying_edges is not None: vedo.logger.warning("flying_edges option is not available for TetMesh.") if not self.dataset.GetPointData().GetScalars(): vedo.logger.warning( "in isosurface() no scalar pointdata found. " "Mappping cells to points." ) self.map_cells_to_points() scrange = self.dataset.GetPointData().GetScalars().GetRange() cf = vtki.new("ContourFilter") # vtki.new("ContourGrid") cf.SetInputData(self.dataset) if utils.is_sequence(value): cf.SetNumberOfContours(len(value)) for i, t in enumerate(value): cf.SetValue(i, t) cf.Update() else: if value is True: value = (2 * scrange[0] + scrange[1]) / 3.0 cf.SetValue(0, value) cf.Update() msh = Mesh(cf.GetOutput(), c=None) msh.copy_properties_from(self) msh.pipeline = utils.OperationNode("isosurface", c="#edabab", parents=[self]) return msh def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)) -> "vedo.Mesh": """ Return a 2D slice of the mesh by a plane passing through origin and assigned normal. """ strn = str(normal) if strn == "x": normal = (1, 0, 0) elif strn == "y": normal = (0, 1, 0) elif strn == "z": normal = (0, 0, 1) elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) plane = vtki.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) cc = vtki.new("Cutter") cc.SetInputData(self.dataset) cc.SetCutFunction(plane) cc.Update() msh = Mesh(cc.GetOutput()).flat().lighting("ambient") msh.copy_properties_from(self) msh.pipeline = utils.OperationNode("slice", c="#edabab", parents=[self]) return msh ########################################################################## class RectilinearGrid(PointAlgorithms, MeshVisual): """ Build a rectilinear grid. """ def __init__(self, inputobj=None): """ A RectilinearGrid is a dataset where edges are parallel to the coordinate axes. It can be thought of as a tessellation of a box in 3D space, similar to a `Volume` except that the cells are not necessarily cubes, but they can have different lengths along each axis. This can be useful to describe a volume with variable resolution where one needs to represent a region with higher detail with respect to another region. Arguments: inputobj : (vtkRectilinearGrid, list, str) list of points and tet indices, or filename Example: ```python from vedo import RectilinearGrid, show xcoords = 7 + np.sqrt(np.arange(0,2500,25)) ycoords = np.arange(0, 20) zcoords = np.arange(0, 20) rgrid = RectilinearGrid([xcoords, ycoords, zcoords]) print(rgrid) print(rgrid.x_coordinates().shape) print(rgrid.compute_structured_coords([20,10,11])) msh = rgrid.tomesh().lw(1) show(msh, axes=1, viewup="z") ``` """ super().__init__() self.dataset = None self.mapper = vtki.new("PolyDataMapper") self._actor = vtki.vtkActor() self._actor.retrieve_object = weak_ref_to(self) self._actor.SetMapper(self.mapper) self.properties = self._actor.GetProperty() self.transform = LinearTransform() self.point_locator = None self.cell_locator = None self.line_locator = None self.name = "RectilinearGrid" self.filename = "" self.info = {} self.time = time.time() ############################### if inputobj is None: self.dataset = vtki.vtkRectilinearGrid() elif isinstance(inputobj, vtki.vtkRectilinearGrid): self.dataset = inputobj elif isinstance(inputobj, RectilinearGrid): self.dataset = inputobj.dataset elif isinstance(inputobj, str): if "https://" in inputobj: inputobj = download(inputobj, verbose=False) if inputobj.endswith(".vtr"): reader = vtki.new("XMLRectilinearGridReader") else: reader = vtki.new("RectilinearGridReader") self.filename = inputobj reader.SetFileName(inputobj) reader.Update() self.dataset = reader.GetOutput() elif utils.is_sequence(inputobj): self.dataset = vtki.vtkRectilinearGrid() xcoords, ycoords, zcoords = inputobj nx, ny, nz = len(xcoords), len(ycoords), len(zcoords) self.dataset.SetDimensions(nx, ny, nz) self.dataset.SetXCoordinates(utils.numpy2vtk(xcoords)) self.dataset.SetYCoordinates(utils.numpy2vtk(ycoords)) self.dataset.SetZCoordinates(utils.numpy2vtk(zcoords)) ############################### if not self.dataset: vedo.logger.error(f"RectilinearGrid: cannot understand input type {type(inputobj)}") return self.properties.SetColor(0.352, 0.612, 0.996) # blue7 self.pipeline = utils.OperationNode( self, comment=f"#tets {self.dataset.GetNumberOfCells()}", c="#9e2a2b" ) @property def actor(self): """Return the `vtkActor` of the object.""" gf = vtki.new("GeometryFilter") gf.SetInputData(self.dataset) gf.Update() self.mapper.SetInputData(gf.GetOutput()) self.mapper.Modified() return self._actor @actor.setter def actor(self, _): pass def _update(self, data, reset_locators=False): self.dataset = data if reset_locators: self.cell_locator = None self.point_locator = None return self ################################################################## def __str__(self): """Print a summary for the `RectilinearGrid` object.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), c="c", bold=True, invert=True, return_string=True, ) out += "\x1b[0m\x1b[36;1m" out += "name".ljust(14) + ": " + str(self.name) + "\n" if self.filename: out += "filename".ljust(14) + ": " + str(self.filename) + "\n" out += "dimensions".ljust(14) + ": " + str(self.dataset.GetDimensions()) + "\n" out += "center".ljust(14) + ": " out += utils.precision(self.dataset.GetCenter(), 6) + "\n" bnds = self.bounds() bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) out += "bounds".ljust(14) + ":" out += " x=(" + bx1 + ", " + bx2 + ")," out += " y=(" + by1 + ", " + by2 + ")," out += " z=(" + bz1 + ", " + bz2 + ")\n" out += "memory size".ljust(14) + ": " out += utils.precision(self.dataset.GetActualMemorySize() / 1024, 2) + " MB\n" for key in self.pointdata.keys(): arr = self.pointdata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "pointdata" a_scalars = self.dataset.GetPointData().GetScalars() a_vectors = self.dataset.GetPointData().GetVectors() a_tensors = self.dataset.GetPointData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" for key in self.celldata.keys(): arr = self.celldata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "celldata" a_scalars = self.dataset.GetCellData().GetScalars() a_vectors = self.dataset.GetCellData().GetVectors() a_tensors = self.dataset.GetCellData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" for key in self.metadata.keys(): arr = self.metadata[key] out += "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' return out.rstrip() + "\x1b[0m" def _repr_html_(self): """ HTML representation of the RectilinearGrid object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.grids.RectilinearGrid" help_url = "https://vedo.embl.es/docs/vedo/grids.html#RectilinearGrid" m = self.tomesh().linewidth(1).lighting("off") arr= m.thumbnail(zoom=1, elevation=-30, azimuth=-30) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self.dataset.GetPointData().GetScalars(): if self.dataset.GetPointData().GetScalars().GetName(): name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self.dataset.GetCellData().GetScalars(): if self.dataset.GetCellData().GetScalars().GetName(): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" pts = self.coordinates cm = np.mean(pts, axis=0) all = [ "", "", "", "
", image, "
", help_text, "", "", "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
nr. points / cells " + str(self.npoints) + " / " + str(self.ncells) + "
", "
", ] return "\n".join(all) def dimensions(self) -> np.ndarray: """Return the number of points in the x, y and z directions.""" return np.array(self.dataset.GetDimensions()) def x_coordinates(self) -> np.ndarray: """Return the x-coordinates of the grid.""" return utils.vtk2numpy(self.dataset.GetXCoordinates()) def y_coordinates(self) -> np.ndarray: """Return the y-coordinates of the grid.""" return utils.vtk2numpy(self.dataset.GetYCoordinates()) def z_coordinates(self) -> np.ndarray: """Return the z-coordinates of the grid.""" return utils.vtk2numpy(self.dataset.GetZCoordinates()) def is_point_visible(self, pid: int) -> bool: """Return True if point `pid` is visible.""" return self.dataset.IsPointVisible(pid) def is_cell_visible(self, cid: int) -> bool: """Return True if cell `cid` is visible.""" return self.dataset.IsCellVisible(cid) def has_blank_points(self) -> bool: """Return True if the grid has blank points.""" return self.dataset.HasAnyBlankPoints() def has_blank_cells(self) -> bool: """Return True if the grid has blank cells.""" return self.dataset.HasAnyBlankCells() def compute_structured_coords(self, x: list) -> dict: """ Convenience function computes the structured coordinates for a point `x`. This method returns a dictionary with keys `ijk`, `pcoords` and `inside`. The cell is specified by the array `ijk`. and the parametric coordinates in the cell are specified with `pcoords`. Value of `inside` is False if the point x is outside of the grid. """ ijk = [0, 0, 0] pcoords = [0., 0., 0.] inout = self.dataset.ComputeStructuredCoordinates(x, ijk, pcoords) return {"ijk": np.array(ijk), "pcoords": np.array(pcoords), "inside": bool(inout)} def compute_pointid(self, ijk: int) -> int: """Given a location in structured coordinates (i-j-k), return the point id.""" return self.dataset.ComputePointId(ijk) def compute_cellid(self, ijk: int) -> int: """Given a location in structured coordinates (i-j-k), return the cell id.""" return self.dataset.ComputeCellId(ijk) def find_point(self, x: list) -> int: """Given a position `x`, return the id of the closest point.""" return self.dataset.FindPoint(x) def find_cell(self, x: list) -> dict: """Given a position `x`, return the id of the closest cell.""" cell = vtki.vtkHexagonalPrism() cellid = vtki.mutable(0) tol2 = 0.001 # vtki.mutable(0) subid = vtki.mutable(0) pcoords = [0.0, 0.0, 0.0] weights = [0.0, 0.0, 0.0] res = self.dataset.FindCell(x, cell, cellid, tol2, subid, pcoords, weights) result = {} result["cellid"] = cellid result["subid"] = subid result["pcoords"] = pcoords result["weights"] = weights result["status"] = res return result def clone(self, deep=True) -> "RectilinearGrid": """Return a clone copy of the RectilinearGrid. Alias of `copy()`.""" if deep: newrg = vtki.vtkRectilinearGrid() newrg.CopyStructure(self.dataset) newrg.CopyAttributes(self.dataset) newvol = RectilinearGrid(newrg) else: newvol = RectilinearGrid(self.dataset) prop = vtki.vtkProperty() prop.DeepCopy(self.properties) newvol.actor.SetProperty(prop) newvol.properties = prop newvol.pipeline = utils.OperationNode("clone", parents=[self], c="#bbd0ff", shape="diamond") return newvol def bounds(self) -> np.ndarray: """ Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ # OVERRIDE CommonAlgorithms.bounds() which is too slow return np.array(self.dataset.GetBounds()) def isosurface(self, value=None) -> "vedo.Mesh": """ Return a `Mesh` isosurface extracted from the object. Set `value` as single float or list of values to draw the isosurface(s). """ scrange = self.dataset.GetScalarRange() cf = vtki.new("ContourFilter") cf.UseScalarTreeOn() cf.SetInputData(self.dataset) cf.ComputeNormalsOn() if value is None: value = (2 * scrange[0] + scrange[1]) / 3.0 # print("automatic isosurface value =", value) cf.SetValue(0, value) else: if utils.is_sequence(value): cf.SetNumberOfContours(len(value)) for i, t in enumerate(value): cf.SetValue(i, t) else: cf.SetValue(0, value) cf.Update() poly = cf.GetOutput() out = vedo.mesh.Mesh(poly, c=None).phong() out.mapper.SetScalarRange(scrange[0], scrange[1]) out.pipeline = utils.OperationNode( "isosurface", parents=[self], comment=f"#pts {out.dataset.GetNumberOfPoints()}", c="#4cc9f0:#e9c46a", ) return out def cut_with_plane(self, origin=(0, 0, 0), normal="x") -> "UnstructuredGrid": """ Cut the object with the plane defined by a point and a normal. Arguments: origin : (list) the cutting plane goes through this point normal : (list, str) normal vector to the cutting plane """ strn = str(normal) if strn == "x": normal = (1, 0, 0) elif strn == "y": normal = (0, 1, 0) elif strn == "z": normal = (0, 0, 1) elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) plane = vtki.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtki.new("ClipDataSet") clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() clipper.GenerateClippedOutputOff() clipper.SetValue(0) clipper.Update() cout = clipper.GetOutput() ug = vedo.UnstructuredGrid(cout) if isinstance(self, UnstructuredGrid): self._update(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return ug def cut_with_mesh(self, mesh, invert=False, whole_cells=False, on_boundary=False) -> "UnstructuredGrid": """ Cut a `RectilinearGrid` with a `Mesh`. Use `invert` to return cut off part of the input object. """ ug = self.dataset ippd = vtki.new("ImplicitPolyDataDistance") ippd.SetInput(mesh.dataset) if whole_cells or on_boundary: clipper = vtki.new("ExtractGeometry") clipper.SetInputData(ug) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(False) if on_boundary: clipper.SetExtractBoundaryCells(True) clipper.SetExtractOnlyBoundaryCells(True) else: signed_dists = vtki.vtkFloatArray() signed_dists.SetNumberOfComponents(1) signed_dists.SetName("SignedDistance") for pointId in range(ug.GetNumberOfPoints()): p = ug.GetPoint(pointId) signed_dist = ippd.EvaluateFunction(p) signed_dists.InsertNextValue(signed_dist) ug.GetPointData().AddArray(signed_dists) ug.GetPointData().SetActiveScalars("SignedDistance") # NEEDED clipper = vtki.new("ClipDataSet") clipper.SetInputData(ug) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) clipper.Update() out = UnstructuredGrid(clipper.GetOutput()) out.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return out ########################################################################## class StructuredGrid(PointAlgorithms, MeshVisual): """ Build a structured grid. """ def __init__(self, inputobj=None): """ A StructuredGrid is a dataset where edges of the hexahedrons are not necessarily parallel to the coordinate axes. It can be thought of as a tessellation of a block of 3D space, similar to a `RectilinearGrid` except that the cells are not necessarily cubes, they can have different orientations but are connected in the same way as a `RectilinearGrid`. Arguments: inputobj : (vtkStructuredGrid, list, str) list of points and tet indices, or filename Example: ```python from vedo import * sgrid = StructuredGrid(dataurl+"structgrid.vts") print(sgrid) msh = sgrid.tomesh().lw(1) show(msh, axes=1, viewup="z") ``` ```python from vedo import * cx = np.sqrt(np.linspace(100, 400, 10)) cy = np.linspace(30, 40, 20) cz = np.linspace(40, 50, 30) x, y, z = np.meshgrid(cx, cy, cz) sgrid1 = StructuredGrid([x, y, z]) sgrid1.cmap("viridis", sgrid1.coordinates[:, 0]) print(sgrid1) sgrid2 = sgrid1.clone().cut_with_plane(normal=(-1,1,1), origin=[14,34,44]) msh2 = sgrid2.tomesh(shrink=0.9).lw(1).cmap("viridis") show( [["StructuredGrid", sgrid1], ["Shrinked Mesh", msh2]], N=2, axes=1, viewup="z", ) ``` """ super().__init__() self.dataset = None self.mapper = vtki.new("PolyDataMapper") self._actor = vtki.vtkActor() self._actor.retrieve_object = weak_ref_to(self) self._actor.SetMapper(self.mapper) self.properties = self._actor.GetProperty() self.transform = LinearTransform() self.point_locator = None self.cell_locator = None self.line_locator = None self.name = "StructuredGrid" self.filename = "" self.info = {} self.time = time.time() ############################### if inputobj is None: self.dataset = vtki.vtkStructuredGrid() elif isinstance(inputobj, vtki.vtkStructuredGrid): self.dataset = inputobj elif isinstance(inputobj, StructuredGrid): self.dataset = inputobj.dataset elif isinstance(inputobj, str): if "https://" in inputobj: inputobj = download(inputobj, verbose=False) if inputobj.endswith(".vts"): reader = vtki.new("XMLStructuredGridReader") else: reader = vtki.new("StructuredGridReader") self.filename = inputobj reader.SetFileName(inputobj) reader.Update() self.dataset = reader.GetOutput() elif utils.is_sequence(inputobj): self.dataset = vtki.vtkStructuredGrid() x, y, z = inputobj xyz = np.vstack(( x.flatten(order="F"), y.flatten(order="F"), z.flatten(order="F")) ).T dims = x.shape self.dataset.SetDimensions(dims) # self.dataset.SetDimensions(dims[1], dims[0], dims[2]) vpoints = vtki.vtkPoints() vpoints.SetData(utils.numpy2vtk(xyz)) self.dataset.SetPoints(vpoints) ############################### if not self.dataset: vedo.logger.error(f"StructuredGrid: cannot understand input type {type(inputobj)}") return self.properties.SetColor(0.352, 0.612, 0.996) # blue7 self.pipeline = utils.OperationNode( self, comment=f"#tets {self.dataset.GetNumberOfCells()}", c="#9e2a2b" ) @property def actor(self): """Return the `vtkActor` of the object.""" gf = vtki.new("GeometryFilter") gf.SetInputData(self.dataset) gf.Update() self.mapper.SetInputData(gf.GetOutput()) self.mapper.Modified() return self._actor @actor.setter def actor(self, _): pass def _update(self, data, reset_locators=False): self.dataset = data if reset_locators: self.cell_locator = None self.point_locator = None return self ################################################################## def __str__(self): """Print a summary for the `StructuredGrid` object.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), c="c", bold=True, invert=True, return_string=True, ) out += "\x1b[0m\x1b[36;1m" out += "name".ljust(14) + ": " + str(self.name) + "\n" if self.filename: out += "filename".ljust(14) + ": " + str(self.filename) + "\n" out += "dimensions".ljust(14) + ": " + str(self.dataset.GetDimensions()) + "\n" out += "center".ljust(14) + ": " out += utils.precision(self.dataset.GetCenter(), 6) + "\n" bnds = self.bounds() bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) out += "bounds".ljust(14) + ":" out += " x=(" + bx1 + ", " + bx2 + ")," out += " y=(" + by1 + ", " + by2 + ")," out += " z=(" + bz1 + ", " + bz2 + ")\n" out += "memory size".ljust(14) + ": " out += utils.precision(self.dataset.GetActualMemorySize() / 1024, 2) + " MB\n" for key in self.pointdata.keys(): arr = self.pointdata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "pointdata" a_scalars = self.dataset.GetPointData().GetScalars() a_vectors = self.dataset.GetPointData().GetVectors() a_tensors = self.dataset.GetPointData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" for key in self.celldata.keys(): arr = self.celldata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "celldata" a_scalars = self.dataset.GetCellData().GetScalars() a_vectors = self.dataset.GetCellData().GetVectors() a_tensors = self.dataset.GetCellData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" for key in self.metadata.keys(): arr = self.metadata[key] out += "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' return out.rstrip() + "\x1b[0m" def _repr_html_(self): """ HTML representation of the StructuredGrid object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.grids.StructuredGrid" help_url = "https://vedo.embl.es/docs/vedo/grids.html#StructuredGrid" m = self.tomesh().linewidth(1).lighting("off") arr= m.thumbnail(zoom=1, elevation=-30, azimuth=-30) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self.dataset.GetPointData().GetScalars(): if self.dataset.GetPointData().GetScalars().GetName(): name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self.dataset.GetCellData().GetScalars(): if self.dataset.GetCellData().GetScalars().GetName(): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" pts = self.coordinates cm = np.mean(pts, axis=0) all = [ "", "", "", "
", image, "
", help_text, "", "", "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
nr. points / cells " + str(self.npoints) + " / " + str(self.ncells) + "
", "
", ] return "\n".join(all) def dimensions(self) -> np.ndarray: """Return the number of points in the x, y and z directions.""" return np.array(self.dataset.GetDimensions()) def clone(self, deep=True) -> "StructuredGrid": """Return a clone copy of the StructuredGrid. Alias of `copy()`.""" if deep: newrg = vtki.vtkStructuredGrid() newrg.CopyStructure(self.dataset) newrg.CopyAttributes(self.dataset) newvol = StructuredGrid(newrg) else: newvol = StructuredGrid(self.dataset) prop = vtki.vtkProperty() prop.DeepCopy(self.properties) newvol.actor.SetProperty(prop) newvol.properties = prop newvol.pipeline = utils.OperationNode("clone", parents=[self], c="#bbd0ff", shape="diamond") return newvol def find_point(self, x: list) -> int: """Given a position `x`, return the id of the closest point.""" return self.dataset.FindPoint(x) def find_cell(self, x: list) -> dict: """Given a position `x`, return the id of the closest cell.""" cell = vtki.vtkHexagonalPrism() cellid = vtki.mutable(0) tol2 = 0.001 # vtki.mutable(0) subid = vtki.mutable(0) pcoords = [0.0, 0.0, 0.0] weights = [0.0, 0.0, 0.0] res = self.dataset.FindCell(x, cell, cellid, tol2, subid, pcoords, weights) result = {} result["cellid"] = cellid result["subid"] = subid result["pcoords"] = pcoords result["weights"] = weights result["status"] = res return result def cut_with_plane(self, origin=(0, 0, 0), normal="x") -> "vedo.UnstructuredGrid": """ Cut the object with the plane defined by a point and a normal. Arguments: origin : (list) the cutting plane goes through this point normal : (list, str) normal vector to the cutting plane Returns an `UnstructuredGrid` object. """ strn = str(normal) if strn == "x": normal = (1, 0, 0) elif strn == "y": normal = (0, 1, 0) elif strn == "z": normal = (0, 0, 1) elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) plane = vtki.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtki.new("ClipDataSet") clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() clipper.GenerateClippedOutputOff() clipper.SetValue(0) clipper.Update() cout = clipper.GetOutput() ug = vedo.UnstructuredGrid(cout) if isinstance(self, vedo.UnstructuredGrid): self._update(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return ug def cut_with_mesh(self, mesh: Mesh, invert=False, whole_cells=False, on_boundary=False) -> "UnstructuredGrid": """ Cut a `RectilinearGrid` with a `Mesh`. Use `invert` to return cut off part of the input object. Returns an `UnstructuredGrid` object. """ ug = self.dataset ippd = vtki.new("ImplicitPolyDataDistance") ippd.SetInput(mesh.dataset) if whole_cells or on_boundary: clipper = vtki.new("ExtractGeometry") clipper.SetInputData(ug) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(False) if on_boundary: clipper.SetExtractBoundaryCells(True) clipper.SetExtractOnlyBoundaryCells(True) else: signed_dists = vtki.vtkFloatArray() signed_dists.SetNumberOfComponents(1) signed_dists.SetName("SignedDistance") for pointId in range(ug.GetNumberOfPoints()): p = ug.GetPoint(pointId) signed_dist = ippd.EvaluateFunction(p) signed_dists.InsertNextValue(signed_dist) ug.GetPointData().AddArray(signed_dists) ug.GetPointData().SetActiveScalars("SignedDistance") # NEEDED clipper = vtki.new("ClipDataSet") clipper.SetInputData(ug) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) clipper.Update() out = UnstructuredGrid(clipper.GetOutput()) out.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return out def isosurface(self, value=None) -> "vedo.Mesh": """ Return a `Mesh` isosurface extracted from the object. Set `value` as single float or list of values to draw the isosurface(s). """ scrange = self.dataset.GetScalarRange() cf = vtki.new("ContourFilter") cf.UseScalarTreeOn() cf.SetInputData(self.dataset) cf.ComputeNormalsOn() if value is None: value = (2 * scrange[0] + scrange[1]) / 3.0 # print("automatic isosurface value =", value) cf.SetValue(0, value) else: if utils.is_sequence(value): cf.SetNumberOfContours(len(value)) for i, t in enumerate(value): cf.SetValue(i, t) else: cf.SetValue(0, value) cf.Update() poly = cf.GetOutput() out = vedo.mesh.Mesh(poly, c=None).phong() out.mapper.SetScalarRange(scrange[0], scrange[1]) out.pipeline = utils.OperationNode( "isosurface", parents=[self], comment=f"#pts {out.dataset.GetNumberOfPoints()}", c="#4cc9f0:#e9c46a", ) return out vedo-2025.5.3/vedo/image.py000066400000000000000000001460641474667405700153350ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np from weakref import ref as weak_ref_to from typing import Tuple, List, Union, Any from typing_extensions import Self import vedo.vtkclasses as vtki import vedo from vedo import colors from vedo import utils __docformat__ = "google" __doc__ = """ Submodule to work with common format images. ![](https://vedo.embl.es/images/basic/rotateImage.png) """ __all__ = [ "Image", ] ################################################# def _get_img(obj: Union[np.ndarray, str], flip=False, translate=()) -> vtki.vtkImageData: # compute vtkImageData from numpy array or filename img = None if isinstance(obj, str): if "https://" in obj: obj = vedo.file_io.download(obj, verbose=False) fname = obj.lower() if fname.endswith(".png"): picr = vtki.new("PNGReader") elif fname.endswith(".jpg") or fname.endswith(".jpeg"): picr = vtki.new("JPEGReader") elif fname.endswith(".bmp"): picr = vtki.new("BMPReader") elif fname.endswith(".tif") or fname.endswith(".tiff"): picr = vtki.new("TIFFReader") picr.SetOrientationType(vedo.settings.tiff_orientation_type) else: colors.printc("Cannot understand image format", obj, c="r") return vtki.vtkImageData() picr.SetFileName(obj) picr.Update() img = picr.GetOutput() else: obj = np.asarray(obj) if obj.ndim == 3: # has shape (nx,ny, ncolor_alpha_chan) iac = vtki.new("ImageAppendComponents") nchan = obj.shape[2] # get number of channels in inputimage (L/LA/RGB/RGBA) for i in range(nchan): if flip: arr = np.flip(np.flip(obj[:, :, i], 0), 0).ravel() else: arr = np.flip(obj[:, :, i], 0).ravel() arr = np.clip(arr, 0, 255) varb = utils.numpy2vtk(arr, dtype=np.uint8, name="RGBA") imgb = vtki.vtkImageData() imgb.SetDimensions(obj.shape[1], obj.shape[0], 1) imgb.GetPointData().AddArray(varb) imgb.GetPointData().SetActiveScalars("RGBA") iac.AddInputData(imgb) iac.Update() img = iac.GetOutput() elif obj.ndim == 2: # black and white if flip: arr = np.flip(obj[:, :], 0).ravel() else: arr = obj.ravel() arr = np.clip(arr, 0, 255) varb = utils.numpy2vtk(arr, dtype=np.uint8, name="RGBA") img = vtki.vtkImageData() img.SetDimensions(obj.shape[1], obj.shape[0], 1) img.GetPointData().AddArray(varb) img.GetPointData().SetActiveScalars("RGBA") if len(translate) > 0: translate_extent = vtki.new("ImageTranslateExtent") translate_extent.SetTranslation(-translate[0], -translate[1], 0) translate_extent.SetInputData(img) translate_extent.Update() img.DeepCopy(translate_extent.GetOutput()) return img def _set_justification(img, pos): if not isinstance(pos, str): return img, pos sx, sy = img.GetDimensions()[:2] translate = () if "top" in pos: if "left" in pos: pos = (0, 1) translate = (0, sy) elif "right" in pos: pos = (1, 1) translate = (sx, sy) elif "mid" in pos or "cent" in pos: pos = (0.5, 1) translate = (sx / 2, sy) elif "bottom" in pos: if "left" in pos: pos = (0, 0) elif "right" in pos: pos = (1, 0) translate = (sx, 0) elif "mid" in pos or "cent" in pos: pos = (0.5, 0) translate = (sx / 2, 0) elif "mid" in pos or "cent" in pos: if "left" in pos: pos = (0, 0.5) translate = (0, sy / 2) elif "right" in pos: pos = (1, 0.5) translate = (sx, sy / 2) else: pos = (0.5, 0.5) translate = (sx / 2, sy / 2) if len(translate) > 0: translate = np.array(translate).astype(int) translate_extent = vtki.new("ImageTranslateExtent") translate_extent.SetTranslation(-translate[0], -translate[1], 0) translate_extent.SetInputData(img) translate_extent.Update() img = translate_extent.GetOutput() return img, pos class Image(vedo.visual.ImageVisual): """ Class used to represent 2D images in a 3D world. """ def __init__(self, obj=None, channels=3): """ Can be instantiated with a path file name or with a numpy array. Can also be instantiated with a matplotlib figure. By default the transparency channel is disabled. To enable it set `channels=4`. Use `Image.shape` to get the number of pixels in x and y. Arguments: channels : (int, list) only select these specific rgba channels (useful to remove alpha) """ self.name = "Image" self.filename = "" self.file_size = 0 self.pipeline = None self.time = 0 self.rendered_at = set() self.info = {} self.actor = vtki.vtkImageActor() self.actor.retrieve_object = weak_ref_to(self) self.properties = self.actor.GetProperty() self.transform = vedo.LinearTransform() if utils.is_sequence(obj) and len(obj) > 0: # passing array img = _get_img(obj, False) elif isinstance(obj, vtki.vtkImageData): img = obj elif isinstance(obj, str): img = _get_img(obj) self.filename = obj elif "matplotlib" in str(obj.__class__): fig = obj if hasattr(fig, "gcf"): fig = fig.gcf() fig.tight_layout(pad=1) fig.canvas.draw() # self.array = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) # self.array = self.array.reshape(fig.canvas.get_width_height()[::-1] + (3,)) width, height = fig.get_size_inches() * fig.get_dpi() self.array = np.frombuffer( fig.canvas.buffer_rgba(), dtype=np.uint8 ).reshape((int(height), int(width), 4)) self.array = self.array[:, :, :3] img = _get_img(self.array) else: img = vtki.vtkImageData() ############# select channels if isinstance(channels, int): channels = list(range(channels)) nchans = len(channels) n = img.GetPointData().GetScalars().GetNumberOfComponents() if nchans and n > nchans: pec = vtki.new("ImageExtractComponents") pec.SetInputData(img) if nchans == 4: pec.SetComponents(channels[0], channels[1], channels[2], channels[3]) elif nchans == 3: pec.SetComponents(channels[0], channels[1], channels[2]) elif nchans == 2: pec.SetComponents(channels[0], channels[1]) elif nchans == 1: pec.SetComponents(channels[0]) pec.Update() img = pec.GetOutput() self.dataset = img self.actor.SetInputData(img) self.mapper = self.actor.GetMapper() sx, sy, _ = self.dataset.GetDimensions() shape = np.array([sx, sy]) self.pipeline = utils.OperationNode("Image", comment=f"#shape {shape}", c="#f28482") ###################################################################### def __str__(self): """Print a description of the Image class.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(id(self))})".ljust(75), c="y", bold=True, invert=True, return_string=True, ) # if vedo.colors._terminal_has_colors: # thumb = "" # try: # to generate a terminal thumbnail # w = 75 # width, height = self.shape # h = int(height / width * (w - 1) * 0.5 + 0.5) # img_arr = self.clone().resize([w, h]).tonumpy() # h, w = img_arr.shape[:2] # for x in range(h): # for y in range(w): # pix = img_arr[x][y] # r, g, b = pix[:3] # thumb += f"\x1b[48;2;{r};{g};{b}m " # thumb += "\x1b[0m\n" # except: # pass # out += thumb out += "\x1b[0m\x1b[33;1m" out += "dimensions".ljust(14) + f": {self.shape}\n" out += "memory size".ljust(14) + ": " out += str(int(self.memory_size())) + " kB\n" bnds = self.bounds() bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) out += "position".ljust(14) + f": {self.pos()}\n" out += "bounds".ljust(14) + ":" out += " x=(" + bx1 + ", " + bx2 + ")," out += " y=(" + by1 + ", " + by2 + ")," out += " z=(" + bz1 + ", " + bz2 + ")\n" out += "intensty range".ljust(14) + f": {self.scalar_range()}\n" out += "level/window".ljust(14) + ": " out += str(self.level()) + " / " + str(self.window()) + "\n" return out.rstrip() + "\x1b[0m" def _repr_html_(self): """ HTML representation of the Image object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.image.Image" help_url = "https://vedo.embl.es/docs/vedo/image.html" arr = self.thumbnail(zoom=1.1) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self.dataset.GetPointData().GetScalars(): if self.dataset.GetPointData().GetScalars().GetName(): name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self.dataset.GetCellData().GetScalars(): if self.dataset.GetCellData().GetScalars().GetName(): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " voxel data array " + name + "" img = self.dataset allt = [ "", "", "", "
", image, "
", help_text, "", "", "", pdata, cdata, "", "", "
shape " + str(img.GetDimensions()[:2]) + "
in memory size " + str(int(img.GetActualMemorySize())) + " KB
intensity range " + str(img.GetScalarRange()) + "
level / window " + str(self.level()) + " / " + str(self.window()) + "
", "
", ] return "\n".join(allt) ###################################################################### def _update(self, data: vtki.vtkImageData) -> Self: self.dataset = data self.mapper.SetInputData(data) self.mapper.Modified() return self def dimensions(self) -> np.ndarray: """ Return the image dimension as number of pixels in x and y. Alias of property `shape`. """ nx, ny, _ = self.dataset.GetDimensions() return np.array([nx, ny]) @property def shape(self) -> np.ndarray: """Return the image shape as number of pixels in x and y""" return np.array(self.dimensions()) @property def channels(self) -> int: """Return the number of channels in image""" return self.dataset.GetPointData().GetScalars().GetNumberOfComponents() @property def extent(self) -> Tuple[int, int, int, int]: """Return the physical extent that the image spans.""" return self.dataset.GetExtent() @extent.setter def extent(self, ext: Tuple[int, int, int, int]): """Set the physical extent that the image spans.""" self.dataset.SetExtent(ext[0], ext[1], ext[2], ext[3], 0, 0) self.mapper.Modified() def copy(self) -> "Image": """Return a copy of the image. Alias of `clone()`.""" return self.clone() def clone(self) -> "Image": """Return an exact copy of the input Image. If transform is True, it is given the same scaling and position.""" img = vtki.vtkImageData() img.DeepCopy(self.dataset) pic = Image(img) pic.name = self.name pic.filename = self.filename pic.apply_transform(self.transform) pic.properties = vtki.vtkImageProperty() pic.properties.DeepCopy(self.properties) pic.actor.SetProperty(pic.properties) pic.pipeline = utils.OperationNode("clone", parents=[self], c="#f7dada", shape="diamond") return pic def clone2d(self, pos=(0, 0), size=1, justify="") -> "vedo.visual.Actor2D": """ Embed an image as a static 2D image in the canvas. Return a 2D (an `Actor2D`) copy of the input Image. Arguments: pos : (list, str) 2D (x,y) position in range [0,1], [0,0] being the bottom-left corner size : (float) apply a scaling factor to the image justify : (str) define the anchor point ("top-left", "top-center", ...) """ pic = vedo.visual.Actor2D() pic.name = self.name pic.filename = self.filename pic.file_size = self.file_size pic.dataset = self.dataset pic.properties = pic.GetProperty() pic.properties.SetDisplayLocationToBackground() if size != 1: newsize = np.array(self.dataset.GetDimensions()[:2]) * size newsize = newsize.astype(int) rsz = vtki.new("ImageResize") rsz.SetInputData(self.dataset) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize[0], newsize[1], 1) rsz.Update() pic.dataset = rsz.GetOutput() if justify: pic.dataset, pos = _set_justification(pic.dataset, justify) else: pic.dataset, pos = _set_justification(pic.dataset, pos) pic.mapper = vtki.new("ImageMapper") # pic.SetMapper(pic.mapper) pic.mapper.SetInputData(pic.dataset) pic.mapper.SetColorWindow(255) pic.mapper.SetColorLevel(127.5) pic.GetPositionCoordinate().SetCoordinateSystem(3) pic.SetPosition(pos) pic.pipeline = utils.OperationNode("clone2d", parents=[self], c="#f7dada", shape="diamond") return pic def crop(self, top=None, bottom=None, right=None, left=None, pixels=False) -> Self: """ Crop image. Arguments: top : (float) fraction to crop from the top margin bottom : (float) fraction to crop from the bottom margin left : (float) fraction to crop from the left margin right : (float) fraction to crop from the right margin pixels : (bool) units are pixels """ extractVOI = vtki.new("ExtractVOI") extractVOI.SetInputData(self.dataset) extractVOI.IncludeBoundaryOn() d = self.dataset.GetDimensions() if pixels: extractVOI.SetVOI(left, d[0] - right - 1, bottom, d[1] - top - 1, 0, 0) else: bx0, bx1, by0, by1 = 0, d[0]-1, 0, d[1]-1 if left is not None: bx0 = int((d[0]-1)*left) if right is not None: bx1 = int((d[0]-1)*(1-right)) if bottom is not None: by0 = int((d[1]-1)*bottom) if top is not None: by1 = int((d[1]-1)*(1-top)) extractVOI.SetVOI(bx0, bx1, by0, by1, 0, 0) extractVOI.Update() self._update(extractVOI.GetOutput()) self.pipeline = utils.OperationNode( "crop", comment=f"shape={tuple(self.shape)}", parents=[self], c="#f28482" ) return self def pad(self, pixels=10, value=255) -> Self: """ Add the specified number of pixels at the image borders. Pixels can be a list formatted as `[left, right, bottom, top]`. Arguments: pixels : (int, list) number of pixels to be added (or a list of length 4) value : (int) intensity value (gray-scale color) of the padding """ x0, x1, y0, y1, _z0, _z1 = self.dataset.GetExtent() pf = vtki.new("ImageConstantPad") pf.SetInputData(self.dataset) pf.SetConstant(value) if utils.is_sequence(pixels): pf.SetOutputWholeExtent( x0 - pixels[0], x1 + pixels[1], y0 - pixels[2], y1 + pixels[3], 0, 0 ) else: pf.SetOutputWholeExtent( x0 - pixels, x1 + pixels, y0 - pixels, y1 + pixels, 0, 0 ) pf.Update() self._update(pf.GetOutput()) self.pipeline = utils.OperationNode( "pad", comment=f"{pixels} pixels", parents=[self], c="#f28482" ) return self def tile(self, nx=4, ny=4, shift=(0, 0)) -> "Image": """ Generate a tiling from the current image by mirroring and repeating it. Arguments: nx : (float) number of repeats along x ny : (float) number of repeats along x shift : (list) shift in x and y in pixels """ x0, x1, y0, y1, z0, z1 = self.dataset.GetExtent() constant_pad = vtki.new("ImageMirrorPad") constant_pad.SetInputData(self.dataset) constant_pad.SetOutputWholeExtent( int(x0 + shift[0] + 0.5), int(x1 * nx + shift[0] + 0.5), int(y0 + shift[1] + 0.5), int(y1 * ny + shift[1] + 0.5), z0, z1, ) constant_pad.Update() img = Image(constant_pad.GetOutput()) img.pipeline = utils.OperationNode( "tile", comment=f"by {nx}x{ny}", parents=[self], c="#f28482" ) return img def append(self, images: list, axis="z", preserve_extents=False) -> Self: """ Append the input images to the current one along the specified axis. Except for the append axis, all inputs must have the same extent. All inputs must have the same number of scalar components. The output has the same origin and spacing as the first input. The origin and spacing of all other inputs are ignored. All inputs must have the same scalar type. Arguments: axis : (int, str) axis expanded to hold the multiple images preserve_extents : (bool) if True, the extent of the inputs is used to place the image in the output. The whole extent of the output is the union of the input whole extents. Any portion of the output not covered by the inputs is set to zero. The origin and spacing is taken from the first input. Example: ```python from vedo import Image, dataurl pic = Image(dataurl+'dog.jpg').pad() pic.append([pic, pic], axis='y') pic.append([pic, pic, pic], axis='x') pic.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/pict_append.png) """ ima = vtki.new("ImageAppend") ima.SetInputData(self.dataset) for p in images: if isinstance(p, vtki.vtkImageData): ima.AddInputData(p) else: ima.AddInputData(p.dataset) ima.SetPreserveExtents(preserve_extents) if axis == "x": axis = 0 elif axis == "y": axis = 1 ima.SetAppendAxis(axis) ima.Update() self._update(ima.GetOutput()) self.pipeline = utils.OperationNode( "append", comment=f"axis={axis}", parents=[self, *images], c="#f28482" ) return self def resize(self, newsize: Any) -> Self: """ Resize the image resolution by specifying the number of pixels in width and height. If left to zero, it will be automatically calculated to keep the original aspect ratio. `newsize` is the shape of image as [npx, npy], or it can be also expressed as a fraction. """ old_dims = np.array(self.dataset.GetDimensions()) if not utils.is_sequence(newsize): newsize = (old_dims * newsize + 0.5).astype(int) if not newsize[1]: ar = old_dims[1] / old_dims[0] newsize = [newsize[0], int(newsize[0] * ar + 0.5)] if not newsize[0]: ar = old_dims[0] / old_dims[1] newsize = [int(newsize[1] * ar + 0.5), newsize[1]] newsize = [newsize[0], newsize[1], old_dims[2]] rsz = vtki.new("ImageResize") rsz.SetInputData(self.dataset) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize) rsz.Update() out = rsz.GetOutput() out.SetSpacing(1, 1, 1) self._update(out) self.pipeline = utils.OperationNode( "resize", comment=f"shape={tuple(self.shape)}", parents=[self], c="#f28482" ) return self def mirror(self, axis="x") -> Self: """Mirror image along x or y axis. Same as `flip()`.""" ff = vtki.new("ImageFlip") ff.SetInputData(self.dataset) if axis.lower() == "x": ff.SetFilteredAxis(0) elif axis.lower() == "y": ff.SetFilteredAxis(1) else: colors.printc("Error in mirror(): mirror must be set to x or y.", c="r") raise RuntimeError() ff.Update() self._update(ff.GetOutput()) self.pipeline = utils.OperationNode(f"mirror {axis}", parents=[self], c="#f28482") return self def flip(self, axis="y") -> Self: """Mirror image along x or y axis. Same as `mirror()`.""" return self.mirror(axis=axis) def select(self, component: int) -> "Image": """Select one single component of the rgb image.""" ec = vtki.new("ImageExtractComponents") ec.SetInputData(self.dataset) ec.SetComponents(component) ec.Update() pic = Image(ec.GetOutput()) pic.pipeline = utils.OperationNode( "select", comment=f"component {component}", parents=[self], c="#f28482" ) return pic def bw(self) -> Self: """Make it black and white using luminance calibration.""" n = self.dataset.GetPointData().GetNumberOfComponents() if n == 4: ecr = vtki.new("ImageExtractComponents") ecr.SetInputData(self.dataset) ecr.SetComponents(0, 1, 2) ecr.Update() img = ecr.GetOutput() else: img = self.dataset ecr = vtki.new("ImageLuminance") ecr.SetInputData(img) ecr.Update() self._update(ecr.GetOutput()) self.pipeline = utils.OperationNode("black&white", parents=[self], c="#f28482") return self def smooth(self, sigma=3, radius=None) -> Self: """ Smooth a `Image` with Gaussian kernel. Arguments: sigma : (int) number of sigmas in pixel units radius : (float) how far out the gaussian kernel will go before being clamped to zero """ gsf = vtki.new("ImageGaussianSmooth") gsf.SetDimensionality(2) gsf.SetInputData(self.dataset) if radius is not None: if utils.is_sequence(radius): gsf.SetRadiusFactors(radius[0], radius[1]) else: gsf.SetRadiusFactor(radius) if utils.is_sequence(sigma): gsf.SetStandardDeviations(sigma[0], sigma[1]) else: gsf.SetStandardDeviation(sigma) gsf.Update() self._update(gsf.GetOutput()) self.pipeline = utils.OperationNode( "smooth", comment=f"sigma={sigma}", parents=[self], c="#f28482" ) return self def median(self) -> Self: """ Median filter that preserves thin lines and corners. It operates on a 5x5 pixel neighborhood. It computes two values initially: the median of the + neighbors and the median of the x neighbors. It then computes the median of these two values plus the center pixel. This result of this second median is the output pixel value. """ medf = vtki.new("ImageHybridMedian2D") medf.SetInputData(self.dataset) medf.Update() self._update(medf.GetOutput()) self.pipeline = utils.OperationNode("median", parents=[self], c="#f28482") return self def enhance(self) -> Self: """ Enhance a b&w image using the laplacian, enhancing high-freq edges. Example: ```python from vedo import * pic = Image(dataurl+'images/dog.jpg').bw() show(pic, pic.clone().enhance(), N=2, mode='image', zoom='tight') ``` ![](https://vedo.embl.es/images/feats/pict_enhance.png) """ img = self.dataset scalarRange = img.GetPointData().GetScalars().GetRange() cast = vtki.new("ImageCast") cast.SetInputData(img) cast.SetOutputScalarTypeToDouble() cast.Update() laplacian = vtki.new("ImageLaplacian") laplacian.SetInputData(cast.GetOutput()) laplacian.SetDimensionality(2) laplacian.Update() subtr = vtki.new("ImageMathematics") subtr.SetInputData(0, cast.GetOutput()) subtr.SetInputData(1, laplacian.GetOutput()) subtr.SetOperationToSubtract() subtr.Update() color_window = scalarRange[1] - scalarRange[0] color_level = color_window / 2 original_color = vtki.new("ImageMapToWindowLevelColors") original_color.SetWindow(color_window) original_color.SetLevel(color_level) original_color.SetInputData(subtr.GetOutput()) original_color.Update() self._update(original_color.GetOutput()) self.pipeline = utils.OperationNode("enhance", parents=[self], c="#f28482") return self def fft(self, mode="magnitude", logscale=12, center=True) -> "Image": """ Fast Fourier transform of a image. Arguments: logscale : (float) if non-zero, take the logarithm of the intensity and scale it by this factor. mode : (str) either [magnitude, real, imaginary, complex], compute the point array data accordingly. center : (bool) shift constant zero-frequency to the center of the image for display. (FFT converts spatial images into frequency space, but puts the zero frequency at the origin) """ ffti = vtki.new("ImageFFT") ffti.SetInputData(self.dataset) ffti.Update() if "mag" in mode: mag = vtki.new("ImageMagnitude") mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif "real" in mode: erf = vtki.new("ImageExtractComponents") erf.SetInputData(ffti.GetOutput()) erf.SetComponents(0) erf.Update() out = erf.GetOutput() elif "imaginary" in mode: eimf = vtki.new("ImageExtractComponents") eimf.SetInputData(ffti.GetOutput()) eimf.SetComponents(1) eimf.Update() out = eimf.GetOutput() elif "complex" in mode: out = ffti.GetOutput() else: colors.printc("Error in fft(): unknown mode", mode) raise RuntimeError() if center: center = vtki.new("ImageFourierCenter") center.SetInputData(out) center.Update() out = center.GetOutput() if "complex" not in mode: if logscale: ils = vtki.new("ImageLogarithmicScale") ils.SetInputData(out) ils.SetConstant(logscale) ils.Update() out = ils.GetOutput() pic = Image(out) pic.pipeline = utils.OperationNode("FFT", parents=[self], c="#f28482") return pic def rfft(self, mode="magnitude") -> "Image": """Reverse Fast Fourier transform of a image.""" ffti = vtki.new("ImageRFFT") ffti.SetInputData(self.dataset) ffti.Update() if "mag" in mode: mag = vtki.new("ImageMagnitude") mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif "real" in mode: erf = vtki.new("ImageExtractComponents") erf.SetInputData(ffti.GetOutput()) erf.SetComponents(0) erf.Update() out = erf.GetOutput() elif "imaginary" in mode: eimf = vtki.new("ImageExtractComponents") eimf.SetInputData(ffti.GetOutput()) eimf.SetComponents(1) eimf.Update() out = eimf.GetOutput() elif "complex" in mode: out = ffti.GetOutput() else: colors.printc("Error in rfft(): unknown mode", mode) raise RuntimeError() pic = Image(out) pic.pipeline = utils.OperationNode("rFFT", parents=[self], c="#f28482") return pic def filterpass(self, lowcutoff=None, highcutoff=None, order=3) -> Self: """ Low-pass and high-pass filtering become trivial in the frequency domain. A portion of the pixels/voxels are simply masked or attenuated. This function applies a high pass Butterworth filter that attenuates the frequency domain image with the function The gradual attenuation of the filter is important. A simple high-pass filter would simply mask a set of pixels in the frequency domain, but the abrupt transition would cause a ringing effect in the spatial domain. Arguments: lowcutoff : (list) the cutoff frequencies highcutoff : (list) the cutoff frequencies order : (int) order determines sharpness of the cutoff curve """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass fft = vtki.new("ImageFFT") fft.SetInputData(self.dataset) fft.Update() out = fft.GetOutput() if highcutoff: blp = vtki.new("ImageButterworthLowPass") blp.SetInputData(out) blp.SetCutOff(highcutoff) blp.SetOrder(order) blp.Update() out = blp.GetOutput() if lowcutoff: bhp = vtki.new("ImageButterworthHighPass") bhp.SetInputData(out) bhp.SetCutOff(lowcutoff) bhp.SetOrder(order) bhp.Update() out = bhp.GetOutput() rfft = vtki.new("ImageRFFT") rfft.SetInputData(out) rfft.Update() ecomp = vtki.new("ImageExtractComponents") ecomp.SetInputData(rfft.GetOutput()) ecomp.SetComponents(0) ecomp.Update() caster = vtki.new("ImageCast") caster.SetOutputScalarTypeToUnsignedChar() caster.SetInputData(ecomp.GetOutput()) caster.Update() self._update(caster.GetOutput()) self.pipeline = utils.OperationNode("filterpass", parents=[self], c="#f28482") return self def blend(self, pic, alpha1=0.5, alpha2=0.5) -> Self: """ Take L, LA, RGB, or RGBA images as input and blends them according to the alpha values and/or the opacity setting for each input. """ blf = vtki.new("ImageBlend") blf.AddInputData(self.dataset) blf.AddInputData(pic.dataset) blf.SetOpacity(0, alpha1) blf.SetOpacity(1, alpha2) blf.SetBlendModeToNormal() blf.Update() self._update(blf.GetOutput()) self.pipeline = utils.OperationNode("blend", parents=[self, pic], c="#f28482") return self def warp( self, source_pts=(), target_pts=(), transform=None, sigma=1, mirroring=False, bc="w", alpha=1, ) -> Self: """ Warp an image using thin-plate splines. Arguments: source_pts : (list) source points target_pts : (list) target points transform : (vtkTransform) a vtkTransform object can be supplied sigma : (float), optional stiffness of the interpolation mirroring : (bool) fill the margins with a reflection of the original image bc : (color) fill the margins with a solid color alpha : (float) opacity of the filled margins """ if transform is None: # source and target must be filled transform = vtki.vtkThinPlateSplineTransform() transform.SetBasisToR2LogR() parents = [self] if isinstance(source_pts, vedo.Points): parents.append(source_pts) source_pts = source_pts.coordinates if isinstance(target_pts, vedo.Points): parents.append(target_pts) target_pts = target_pts.coordinates ns = len(source_pts) nt = len(target_pts) if ns != nt: colors.printc("Error in image.warp(): #source != #target points", ns, nt, c="r") raise RuntimeError() ptsou = vtki.vtkPoints() ptsou.SetNumberOfPoints(ns) pttar = vtki.vtkPoints() pttar.SetNumberOfPoints(nt) for i in range(ns): p = source_pts[i] ptsou.SetPoint(i, [p[0], p[1], 0]) p = target_pts[i] pttar.SetPoint(i, [p[0], p[1], 0]) transform.SetSigma(sigma) transform.SetSourceLandmarks(pttar) transform.SetTargetLandmarks(ptsou) else: # ignore source and target pass reslice = vtki.new("ImageReslice") reslice.SetInputData(self.dataset) reslice.SetOutputDimensionality(2) reslice.SetResliceTransform(transform) reslice.SetInterpolationModeToCubic() reslice.SetMirror(mirroring) c = np.array(colors.get_color(bc)) * 255 reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) reslice.Update() self._update(reslice.GetOutput()) self.pipeline = utils.OperationNode("warp", parents=parents, c="#f28482") return self def invert(self) -> Self: """ Return an inverted image (inverted in each color channel). """ rgb = self.tonumpy() data = 255 - np.array(rgb) self._update(_get_img(data)) self.pipeline = utils.OperationNode("invert", parents=[self], c="#f28482") return self def binarize(self, threshold=None, invert=False) -> Self: """ Return a new Image where pixel above threshold are set to 255 and pixels below are set to 0. Arguments: threshold : (float) input threshold value invert : (bool) invert threshold direction Example: ```python from vedo import Image, show pic1 = Image("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") pic2 = pic1.clone().invert() pic3 = pic1.clone().binarize() show(pic1, pic2, pic3, N=3, bg="blue9").close() ``` ![](https://vedo.embl.es/images/feats/pict_binarize.png) """ rgb = self.tonumpy() if rgb.ndim == 3: intensity = np.sum(rgb, axis=2) / 3 else: intensity = rgb if threshold is None: vmin, vmax = np.min(intensity), np.max(intensity) threshold = (vmax + vmin) / 2 data = np.zeros_like(intensity).astype(np.uint8) mask = np.where(intensity > threshold) if invert: data += 255 data[mask] = 0 else: data[mask] = 255 self._update(_get_img(data, flip=True)) self.pipeline = utils.OperationNode( "binarize", comment=f"threshold={threshold}", parents=[self], c="#f28482" ) return self def threshold(self, value=None, flip=False) -> "vedo.Mesh": """ Create a polygonal Mesh from a Image by filling regions with pixels luminosity above a specified value. Arguments: value : (float) The default is None, e.i. 1/3 of the scalar range. flip: (bool) Flip polygon orientations Returns: A polygonal mesh. """ mgf = vtki.new("ImageMagnitude") mgf.SetInputData(self.dataset) mgf.Update() msq = vtki.new("MarchingSquares") msq.SetInputData(mgf.GetOutput()) if value is None: r0, r1 = self.dataset.GetScalarRange() value = r0 + (r1 - r0) / 3 msq.SetValue(0, value) msq.Update() if flip: rs = vtki.new("ReverseSense") rs.SetInputData(msq.GetOutput()) rs.ReverseCellsOn() rs.ReverseNormalsOff() rs.Update() output = rs.GetOutput() else: output = msq.GetOutput() ctr = vtki.new("ContourTriangulator") ctr.SetInputData(output) ctr.Update() out = vedo.Mesh(ctr.GetOutput(), c="k").bc("t").lighting("off") out.pipeline = utils.OperationNode( "threshold", comment=f"{value: .2f}", parents=[self], c="#f28482:#e9c46a" ) return out def cmap(self, name: str, vmin=None, vmax=None) -> Self: """Colorize a image with a colormap representing pixel intensity""" n = self.dataset.GetPointData().GetNumberOfComponents() if n > 1: ecr = vtki.new("ImageExtractComponents") ecr.SetInputData(self.dataset) ecr.SetComponents(0, 1, 2) ecr.Update() ilum = vtki.new("ImageMagnitude") ilum.SetInputData(self.dataset) ilum.Update() img = ilum.GetOutput() else: img = self.dataset lut = vtki.vtkLookupTable() _vmin, _vmax = img.GetScalarRange() if vmin is not None: _vmin = vmin if vmax is not None: _vmax = vmax lut.SetRange(_vmin, _vmax) ncols = 256 lut.SetNumberOfTableValues(ncols) cols = colors.color_map(range(ncols), name, 0, ncols) for i, c in enumerate(cols): lut.SetTableValue(i, *c) lut.Build() imap = vtki.new("ImageMapToColors") imap.SetLookupTable(lut) imap.SetInputData(img) imap.Update() self._update(imap.GetOutput()) self.pipeline = utils.OperationNode( "cmap", comment=f'"{name}"', parents=[self], c="#f28482" ) return self def rotate(self, angle: float, center=(), scale=1.0, mirroring=False, bc="w", alpha=1.0) -> Self: """ Rotate by the specified angle (anticlockwise). Arguments: angle : (float) rotation angle in degrees center : (list) center of rotation (x,y) in pixels """ bounds = self.bounds() pc = [0, 0, 0] if center: pc[0] = center[0] pc[1] = center[1] else: pc[0] = (bounds[1] + bounds[0]) / 2.0 pc[1] = (bounds[3] + bounds[2]) / 2.0 pc[2] = (bounds[5] + bounds[4]) / 2.0 transform = vtki.vtkTransform() transform.Translate(pc) transform.RotateWXYZ(-angle, 0, 0, 1) transform.Scale(1 / scale, 1 / scale, 1) transform.Translate(-pc[0], -pc[1], -pc[2]) reslice = vtki.new("ImageReslice") reslice.SetMirror(mirroring) c = np.array(colors.get_color(bc)) * 255 reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) reslice.SetInputData(self.dataset) reslice.SetResliceTransform(transform) reslice.SetOutputDimensionality(2) reslice.SetInterpolationModeToCubic() reslice.AutoCropOutputOn() reslice.Update() self._update(reslice.GetOutput()) self.pipeline = utils.OperationNode( "rotate", comment=f"angle={angle}", parents=[self], c="#f28482" ) return self def tomesh(self) -> "vedo.shapes.Grid": """ Convert an image to polygonal data (quads), with each polygon vertex assigned a RGBA value. """ dims = self.dataset.GetDimensions() gr = vedo.shapes.Grid(s=dims[:2], res=(dims[0] - 1, dims[1] - 1)) gr.pos(int(dims[0] / 2), int(dims[1] / 2)).pickable(True).wireframe(False).lw(0) self.dataset.GetPointData().GetScalars().SetName("RGBA") gr.dataset.GetPointData().AddArray(self.dataset.GetPointData().GetScalars()) gr.dataset.GetPointData().SetActiveScalars("RGBA") gr.mapper.SetArrayName("RGBA") gr.mapper.SetScalarModeToUsePointData() gr.mapper.ScalarVisibilityOn() gr.name = self.name gr.filename = self.filename gr.pipeline = utils.OperationNode("tomesh", parents=[self], c="#f28482:#e9c46a") return gr def tonumpy(self) -> np.ndarray: """ Get read-write access to pixels of a Image object as a numpy array. Note that the shape is (nrofchannels, nx, ny). When you set values in the output image, you don't want numpy to reallocate the array but instead set values in the existing array, so use the [:] operator. Example: arr[:] = arr - 15 If the array is modified call: `image.modified()` when all your modifications are completed. """ nx, ny, _ = self.dataset.GetDimensions() nchan = self.dataset.GetPointData().GetScalars().GetNumberOfComponents() narray = utils.vtk2numpy(self.dataset.GetPointData().GetScalars()).reshape(ny, nx, nchan) narray = np.flip(narray, axis=0).astype(np.uint8) return narray.squeeze() def add_rectangle(self, xspan: List[float], yspan: List[float], c="green5", alpha=1.0) -> Self: """Draw a rectangle box on top of current image. Units are pixels. Example: ```python import vedo pic = vedo.Image(vedo.dataurl+"images/dog.jpg") pic.add_rectangle([100,300], [100,200], c='green4', alpha=0.7) pic.add_line([100,100],[400,500], lw=2, alpha=1) pic.add_triangle([250,300], [100,300], [200,400], c='blue5') vedo.show(pic, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/pict_drawon.png) """ x1, x2 = xspan y1, y2 = yspan r, g, b = vedo.colors.get_color(c) c = np.array([r, g, b]) * 255 c = c.astype(np.uint8) alpha = min(alpha, 1) if alpha <= 0: return self alpha2 = alpha alpha1 = 1 - alpha nx, ny = self.dimensions() if x2 > nx: x2 = nx - 1 if y2 > ny: y2 = ny - 1 nchan = self.channels narrayA = self.tonumpy() canvas_source = vtki.new("ImageCanvasSource2D") canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillBox(x1, x2, y1, y2) canvas_source.Update() imagedataset = canvas_source.GetOutput() vscals = imagedataset.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) self._update(_get_img(narrayC)) self.pipeline = utils.OperationNode("rectangle", parents=[self], c="#f28482") return self def add_line(self, p1: List[float], p2: List[float], lw=2, c="k2", alpha=1.0) -> Self: """Draw a line on top of current image. Units are pixels.""" x1, x2 = p1 y1, y2 = p2 r, g, b = vedo.colors.get_color(c) c = np.array([r, g, b]) * 255 c = c.astype(np.uint8) alpha = min(alpha, 1) if alpha <= 0: return self alpha2 = alpha alpha1 = 1 - alpha nx, ny = self.dimensions() if x2 > nx: x2 = nx - 1 if y2 > ny: y2 = ny - 1 nchan = self.channels narrayA = self.tonumpy() canvas_source = vtki.new("ImageCanvasSource2D") canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillTube(x1, x2, y1, y2, lw) canvas_source.Update() imagedataset = canvas_source.GetOutput() vscals = imagedataset.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) self._update(_get_img(narrayC)) self.pipeline = utils.OperationNode("line", parents=[self], c="#f28482") return self def add_triangle(self, p1: List[float], p2: List[float], p3: List[float], c="red3", alpha=1.0) -> Self: """Draw a triangle on top of current image. Units are pixels.""" x1, y1 = p1 x2, y2 = p2 x3, y3 = p3 r, g, b = vedo.colors.get_color(c) c = np.array([r, g, b]) * 255 c = c.astype(np.uint8) alpha = min(alpha, 1) if alpha <= 0: return self alpha2 = alpha alpha1 = 1 - alpha nx, ny = self.dimensions() x1 = min(x1, nx) x2 = min(x2, nx) x3 = min(x3, nx) y1 = min(y1, ny) y2 = min(y2, ny) y3 = min(y3, ny) nchan = self.channels narrayA = self.tonumpy() canvas_source = vtki.new("ImageCanvasSource2D") canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillTriangle(x1, y1, x2, y2, x3, y3) canvas_source.Update() imagedataset = canvas_source.GetOutput() vscals = imagedataset.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) self._update(_get_img(narrayC)) self.pipeline = utils.OperationNode("triangle", parents=[self], c="#f28482") return self def add_text( self, txt: str, width=400, height=200, alpha=1, c="black", bg=None, alpha_bg=1, font="Theemim", dpi=200, justify="bottom-left", ) -> Self: """Add text to an image.""" tp = vtki.vtkTextProperty() tp.BoldOff() tp.FrameOff() tp.SetColor(colors.get_color(c)) tp.SetJustificationToLeft() if "top" in justify: tp.SetVerticalJustificationToTop() if "bottom" in justify: tp.SetVerticalJustificationToBottom() if "cent" in justify: tp.SetVerticalJustificationToCentered() tp.SetJustificationToCentered() if "left" in justify: tp.SetJustificationToLeft() if "right" in justify: tp.SetJustificationToRight() if font.lower() == "courier": tp.SetFontFamilyToCourier() elif font.lower() == "times": tp.SetFontFamilyToTimes() elif font.lower() == "arial": tp.SetFontFamilyToArial() else: tp.SetFontFamily(vtki.VTK_FONT_FILE) tp.SetFontFile(utils.get_font_path(font)) if bg: bgcol = colors.get_color(bg) tp.SetBackgroundColor(bgcol) tp.SetBackgroundOpacity(alpha_bg) tp.SetFrameColor(bgcol) tp.FrameOn() tr = vtki.new("TextRenderer") # GetConstrainedFontSize (const vtkUnicodeString &str, # vtkTextProperty(*tprop, int targetWidth, int targetHeight, int dpi) fs = tr.GetConstrainedFontSize(txt, tp, width, height, dpi) tp.SetFontSize(fs) img = vtki.vtkImageData() # img.SetOrigin(*pos,1) tr.RenderString(tp, txt, img, [width, height], dpi) # RenderString (vtkTextProperty *tprop, const vtkStdString &str, # vtkImageData *data, int textDims[2], int dpi, int backend=Default) blf = vtki.new("ImageBlend") blf.AddInputData(self.dataset) blf.AddInputData(img) blf.SetOpacity(0, 1) blf.SetOpacity(1, alpha) blf.SetBlendModeToNormal() blf.Update() self._update(blf.GetOutput()) self.pipeline = utils.OperationNode( "add_text", comment=f"{txt}", parents=[self], c="#f28482" ) return self def modified(self) -> Self: """Use this method in conjunction with `tonumpy()` to update any modifications to the image array.""" self.dataset.GetPointData().GetScalars().Modified() return self def write(self, filename: str) -> Self: """Write image to file as png or jpg.""" vedo.file_io.write(self, filename) self.pipeline = utils.OperationNode( "write", comment=filename[:15], parents=[self], c="#8a817c", shape="cylinder", ) return self vedo-2025.5.3/vedo/interactor_modes.py000066400000000000000000001524731474667405700176150ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from dataclasses import dataclass import numpy as np import vedo.vtkclasses as vtki __docformat__ = "google" __doc__ = """Submodule to customize interaction modes.""" class MousePan(vtki.vtkInteractorStyleUser): """ Interaction mode to pan the scene by dragging the mouse. Controls: - Left mouse button will pan the scene. - Mouse middle button up/down is elevation, and left and right is azimuth. - Right mouse button is rotate (left/right movement) and zoom in/out (up/down movement) - Mouse scroll wheel is zoom in/out """ def __init__(self): super().__init__() self.left = False self.middle = False self.right = False self.interactor = None self.renderer = None self.camera = None self.oldpickD = [] self.newpickD = [] self.oldpickW = np.array([0, 0, 0, 0], dtype=float) self.newpickW = np.array([0, 0, 0, 0], dtype=float) self.fpD = np.array([0, 0, 0], dtype=float) self.fpW = np.array([0, 0, 0], dtype=float) self.posW = np.array([0, 0, 0], dtype=float) self.motionD = np.array([0, 0], dtype=float) self.motionW = np.array([0, 0, 0], dtype=float) # print("MousePan: Left mouse button to pan the scene.") self.AddObserver("LeftButtonPressEvent", self._left_down) self.AddObserver("LeftButtonReleaseEvent", self._left_up) self.AddObserver("MiddleButtonPressEvent", self._middle_down) self.AddObserver("MiddleButtonReleaseEvent", self._middle_up) self.AddObserver("RightButtonPressEvent", self._right_down) self.AddObserver("RightButtonReleaseEvent", self._right_up) self.AddObserver("MouseWheelForwardEvent", self._wheel_forward) self.AddObserver("MouseWheelBackwardEvent", self._wheel_backward) self.AddObserver("MouseMoveEvent", self._mouse_move) def _get_motion(self): self.oldpickD = np.array(self.interactor.GetLastEventPosition()) self.newpickD = np.array(self.interactor.GetEventPosition()) self.motionD = (self.newpickD - self.oldpickD) / 4 self.camera = self.renderer.GetActiveCamera() self.fpW = self.camera.GetFocalPoint() self.posW = self.camera.GetPosition() self.ComputeWorldToDisplay(self.renderer, self.fpW[0], self.fpW[1], self.fpW[2], self.fpD) focaldepth = self.fpD[2] self.ComputeDisplayToWorld( self.renderer, self.oldpickD[0], self.oldpickD[1], focaldepth, self.oldpickW ) self.ComputeDisplayToWorld( self.renderer, self.newpickD[0], self.newpickD[1], focaldepth, self.newpickW ) self.motionW[:3] = self.oldpickW[:3] - self.newpickW[:3] def _mouse_left_move(self): self._get_motion() self.camera.SetFocalPoint(self.fpW[:3] + self.motionW[:3]) self.camera.SetPosition(self.posW[:3] + self.motionW[:3]) self.interactor.Render() def _mouse_middle_move(self): self._get_motion() if abs(self.motionD[0]) > abs(self.motionD[1]): self.camera.Azimuth(-2 * self.motionD[0]) else: self.camera.Elevation(-self.motionD[1]) self.interactor.Render() def _mouse_right_move(self): self._get_motion() if abs(self.motionD[0]) > abs(self.motionD[1]): self.camera.Azimuth(-2.0 * self.motionD[0]) else: self.camera.Zoom(1 + self.motionD[1] / 100) self.interactor.Render() def _mouse_wheel_forward(self): self.camera = self.renderer.GetActiveCamera() self.camera.Zoom(1.1) self.interactor.Render() def _mouse_wheel_backward(self): self.camera = self.renderer.GetActiveCamera() self.camera.Zoom(0.9) self.interactor.Render() def _left_down(self, w, e): self.left = True def _left_up(self, w, e): self.left = False def _middle_down(self, w, e): self.middle = True def _middle_up(self, w, e): self.middle = False def _right_down(self, w, e): self.right = True def _right_up(self, w, e): self.right = False def _wheel_forward(self, w, e): self._mouse_wheel_forward() def _wheel_backward(self, w, e): self._mouse_wheel_backward() def _mouse_move(self, w, e): if self.left: self._mouse_left_move() if self.middle: self._mouse_middle_move() if self.right: self._mouse_right_move() ############################################################################# class FlyOverSurface(vtki.vtkInteractorStyleUser): """ Interaction mode to fly over a surface. Controls: - Press arrows to move the camera in the plane of the surface. - "t" (or "PageUp") will move the camera upper in z. - "g" (or "PageDown") will move the camera lower in z. - "x" and "X" will reset the camera to the default position towards positive or negative x. - "y" and "Y" will reset the camera to the default position towards positive or negative y. - "." and "," will rotate azimuth to the right or left. - "r" will reset the camera to the default position. Left button: Select a point on the surface to focus the camera on it. """ def __init__(self, move_step=0.05, angle_step=1.5): """ Interaction mode to fly over a surface. Arguments: move_step: float, optional The step size for moving the camera in the plane of the surface. angle_step: float, optional The step size for rotating the camera. Example: [interaction_modes3.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/interaction_modes3.py) """ super().__init__() self.interactor = None # filled in plotter.py self.renderer = None # filled in plotter.py self.angle_step = angle_step self.move_step = move_step self.tleft = vtki.vtkTransform() self.tleft.RotateZ(self.angle_step) self.tright = vtki.vtkTransform() self.tright.RotateZ(-self.angle_step) self.AddObserver("KeyPressEvent", self._key) self.AddObserver("RightButtonPressEvent", self._right_button_press) self.AddObserver("MouseWheelForwardEvent", self._mouse_wheel_forward) self.AddObserver("MouseWheelBackwardEvent", self._mouse_wheel_backward) self.AddObserver("LeftButtonPressEvent", self._left_button_press) @property def camera(self): return self.renderer.GetActiveCamera() @property def position(self): return np.array(self.camera.GetPosition()) @position.setter def position(self, value): self.camera.SetPosition(value[:3]) self.camera.SetViewUp(0.00001, 0, 1) self.renderer.ResetCameraClippingRange() @property def focal_point(self): return np.array(self.camera.GetFocalPoint()) @focal_point.setter def focal_point(self, value): self.camera.SetFocalPoint(value[:3]) self.camera.SetViewUp(0.00001, 0, 1) self.renderer.ResetCameraClippingRange() def _right_button_press(self, obj, event): # print("Right button", event) self._key("Down", event) def _left_button_press(self, obj, event): # print("Left button", event) newPickPoint = [0, 0, 0, 0] focalDepth = 0 x, y = obj.interactor.GetEventPosition() self.ComputeDisplayToWorld(self.renderer, x, y, focalDepth, newPickPoint) self.focal_point = np.array(newPickPoint) self.interactor.Render() def _mouse_wheel_backward(self, obj, event): # print("mouse_wheel_backward ", event) self._key("Down", event) def _mouse_wheel_forward(self, obj, event): # print("mouse_wheel_forward ", event) self._key("Up", event) def _key(self, obj, event): if "Mouse" in event or "Button" in event: k = obj else: k = obj.GetKeySym() if obj.GetShiftKey(): k = k.upper() # print("FlyOverSurface. Key press", k) if k in ["r", "x"]: # print("r pressed, reset camera") self.bounds = self.renderer.ComputeVisiblePropBounds() x0, x1, y0, y1, z0, z1 = self.bounds dx = x1 - x0 z = max(z1 * 1, z0 + (y1 - y0) / 4, z0 + (x1 - x0) / 4) self.position = [x0 - dx, (y0 + y1) / 2, z] self.focal_point = [x0 + dx / 2, (y0 + y1) / 2, z] elif k in ["X"]: # print("X pressed, reset camera") self.bounds = self.renderer.ComputeVisiblePropBounds() x0, x1, y0, y1, z0, z1 = self.bounds dx = x1 - x0 z = max(z1 * 1, (y1 - y0) / 4, (x1 - x0) / 4) self.position = [x1 + dx, (y0 + y1) / 2, z] self.focal_point = [x0 - dx / 2, (y0 + y1) / 2, z] elif k in ["y"]: # print("y pressed, reset camera") self.bounds = self.renderer.ComputeVisiblePropBounds() x0, x1, y0, y1, z0, z1 = self.bounds dy = y1 - y0 z = max(z1 * 1, z0 + (y1 - y0) / 4, z0 + (x1 - x0) / 4) self.position = [(x0 + x1) / 2, y0 - dy, z] self.focal_point = [(x0 + x1) / 2, y1 + dy / 2, z] elif k in ["Y"]: # print("Y pressed, reset camera") self.bounds = self.renderer.ComputeVisiblePropBounds() x0, x1, y0, y1, z0, z1 = self.bounds dy = y1 - y0 z = max(z1 * 1, z0 + (y1 - y0) / 4, z0 + (x1 - x0) / 4) self.position = [(x0 + x1) / 2, y1 + dy, z] self.focal_point = [(x0 + x1) / 2, y0 - dy / 2, z] elif k in ["Up", "w"]: # print("Up pressed, move forward") self.bounds = self.renderer.ComputeVisiblePropBounds() diagonal = np.linalg.norm(np.array(self.bounds[1::2]) - np.array(self.bounds[::2])) dx = self.move_step * diagonal p = np.array(self.camera.GetPosition()) v = np.array(self.camera.GetDirectionOfProjection()) newp = p + dx * v self.position = [newp[0], newp[1], p[2]] self.focal_point = self.focal_point + dx * v elif k in ["Down", "s"]: # print("Down pressed, move backward") self.bounds = self.renderer.ComputeVisiblePropBounds() diagonal = np.linalg.norm(np.array(self.bounds[1::2]) - np.array(self.bounds[::2])) dx = self.move_step * diagonal p = np.array(self.camera.GetPosition()) v = np.array(self.camera.GetDirectionOfProjection()) newp = p - dx * v self.position = [newp[0], newp[1], p[2]] self.focal_point = self.focal_point - dx * v elif k in ["Left", "a"]: # print("Left pressed, rotate to the left") self.bounds = self.renderer.ComputeVisiblePropBounds() diagonal = np.linalg.norm(np.array(self.bounds[1::2]) - np.array(self.bounds[::2])) w = np.array(self.camera.GetDirectionOfProjection()) p = np.array(self.camera.GetPosition()) w2 = np.array(self.tleft.TransformFloatPoint(w)) self.focal_point = self.focal_point + np.linalg.norm(p-self.focal_point) * w2 elif k in ["Right", "d"]: # print("Right pressed, rotate to the right") self.bounds = self.renderer.ComputeVisiblePropBounds() diagonal = np.linalg.norm(np.array(self.bounds[1::2]) - np.array(self.bounds[::2])) w = np.array(self.camera.GetDirectionOfProjection()) p = np.array(self.camera.GetPosition()) w2 = np.array(self.tright.TransformFloatPoint(w)) self.focal_point = self.focal_point + np.linalg.norm(p-self.focal_point) * w2 elif k in ["t", "Prior"]: # print("t pressed, move z up") self.bounds = self.renderer.ComputeVisiblePropBounds() diagonal = np.linalg.norm(np.array(self.bounds[1::2]) - np.array(self.bounds[::2])) dx = self.move_step * diagonal p = self.position self.position = [p[0], p[1], p[2] + dx / 4] elif k in ["g", "Next"]: # print("g pressed, move z down") self.bounds = self.renderer.ComputeVisiblePropBounds() diagonal = np.linalg.norm(np.array(self.bounds[1::2]) - np.array(self.bounds[::2])) dx = self.move_step * diagonal p = self.position self.position = [p[0], p[1], p[2] - dx / 4] elif k in ["comma", "COMMA"]: # print("< pressed, rotate azimuth to the left") self.bounds = self.renderer.ComputeVisiblePropBounds() scene_center = [ self.bounds[0] + self.bounds[1], self.bounds[2] + self.bounds[3], self.bounds[4] + self.bounds[5], ] scene_center = np.array(scene_center) / 2 p = self.position v = p - scene_center newp = scene_center + self.tleft.TransformFloatPoint(v) self.position = [newp[0], newp[1], p[2]] elif k in ["period", "PERIOD"]: # print("< pressed, rotate azimuth to the right") self.bounds = self.renderer.ComputeVisiblePropBounds() scene_center = [ self.bounds[0] + self.bounds[1], self.bounds[2] + self.bounds[3], self.bounds[4] + self.bounds[5], ] scene_center = np.array(scene_center) / 2 p = self.position v = p - scene_center newp = scene_center + self.tright.TransformFloatPoint(v) self.position = [newp[0], newp[1], p[2]] elif k in ["q", "Return"]: self.interactor.ExitCallback() return else: return self.interactor.Render() ################################################################################### @dataclass class _BlenderStyleDragInfo: """Data structure containing the data required to execute dragging a node""" # Scene related dragged_node = None # Node # VTK related actors_dragging: list dragged_actors_original_positions: list # original VTK positions start_position_3d = np.array((0, 0, 0)) # start position of the cursor delta = np.array((0, 0, 0)) def __init__(self): self.actors_dragging = [] self.dragged_actors_original_positions = [] ############################################### class BlenderStyle(vtki.vtkInteractorStyleUser): """ Create an interaction style using the Blender default key-bindings. Camera action code is largely a translation of [this](https://github.com/Kitware/VTK/blob/master/Interaction/Style/vtkInteractorStyleTrackballCamera.cxx) Rubber band code [here](https://gitlab.kitware.com/updega2/vtk/-/blob/d324b2e898b0da080edee76159c2f92e6f71abe2/Rendering/vtkInteractorStyleRubberBandZoom.cxx) Interaction: Left button: Sections ---------------------- Left button: select Left button drag: rubber band select or line select, depends on the dragged distance Middle button: Navigation -------------------------- Middle button: rotate Middle button + shift : pan Middle button + ctrl : zoom Middle button + alt : center view on picked point OR Middle button + alt : zoom rubber band Mouse wheel : zoom Right button : context ----------------------- Right key click: reserved for context-menu Keys ---- 2 or 3 : toggle perspective view a : zoom all x,y,z : view direction (toggles positive and negative) left/right arrows: rotate 45 deg clockwise/ccw about z-axis, snaps to nearest 45 deg b : box zoom m : mouse middle lock (toggles) space : same as middle mouse button g : grab (move actors) enter : accept drag esc : cancel drag, call callbackEscape LAPTOP MODE ----------- Use space or `m` as replacement for middle button (`m` is sticky, space is not) callbacks / overriding keys: if `callback_any_key` is assigned then this function is called on every key press. If this function returns True then further processing of events is stopped. Moving actors -------------- Actors can be moved interactively by the user. To support custom groups of actors to be moved as a whole the following system is implemented: When 'g' is pressed (grab) then a `_BlenderStyleDragInfo` dataclass object is assigned to style to `style.draginfo`. `_BlenderStyleDragInfo` includes a list of all the actors that are being dragged. By default this is the selection, but this may be altered. Drag is accepted using enter, click, or g. Drag is cancelled by esc Events ------ `callback_start_drag` is called when initializing the drag. This is when to assign actors and other data to draginfo. `callback_end_drag` is called when the drag is accepted. Responding to other events -------------------------- `callback_camera_direction_changed` : executed when camera has rotated but before re-rendering .. note:: This class is based on R. de Bruin's [DAVE](https://github.com/RubendeBruin/DAVE/blob/master/src/DAVE/visual_helpers/vtkBlenderLikeInteractionStyle.py) implementation as discussed [in this issue](https://github.com/marcomusy/vedo/discussions/788). Example: [interaction_modes2.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/interaction_modes2.py) """ def __init__(self): super().__init__() self.interactor = None self.renderer = None # callback_select is called whenever one or mode props are selected. # callback will be called with a list of props of which the first entry # is prop closest to the camera. self.callback_select = None self.callback_start_drag = None self.callback_end_drag = None self.callback_escape_key = None self.callback_delete_key = None self.callback_focus_key = None self.callback_any_key = None self.callback_measure = None # callback with argument float (meters) self.callback_camera_direction_changed = None # active drag # assigned to a _BlenderStyleDragInfo object when dragging is active self.draginfo: _BlenderStyleDragInfo or None = None # picking self.picked_props = [] # will be filled by latest pick # settings self.mouse_motion_factor = 20 self.mouse_wheel_motion_factor = 0.1 self.zoom_motion_factor = 0.25 # internals self.start_x = 0 # start of a drag self.start_y = 0 self.end_x = 0 self.end_y = 0 self.middle_mouse_lock = False self.middle_mouse_lock_actor = None # will be created when required # Special Modes self._is_box_zooming = False # holds an image of the renderer output at the start of a drawing event self._pixel_array = vtki.vtkUnsignedCharArray() self._upside_down = False self._left_button_down = False self._middle_button_down = False self.AddObserver("RightButtonPressEvent", self.right_button_press) self.AddObserver("RightButtonReleaseEvent", self.right_button_release) self.AddObserver("MiddleButtonPressEvent", self.middle_button_press) self.AddObserver("MiddleButtonReleaseEvent", self.middle_button_release) self.AddObserver("MouseWheelForwardEvent", self.mouse_wheel_forward) self.AddObserver("MouseWheelBackwardEvent", self.mouse_wheel_backward) self.AddObserver("LeftButtonPressEvent", self.left_button_press) self.AddObserver("LeftButtonReleaseEvent", self.left_button_release) self.AddObserver("MouseMoveEvent", self.mouse_move) self.AddObserver("WindowResizeEvent", self.window_resized) # ^does not seem to fire! self.AddObserver("KeyPressEvent", self.key_press) self.AddObserver("KeyReleaseEvent", self.key_release) def right_button_press(self, obj, event): pass def right_button_release(self, obj, event): pass def middle_button_press(self, obj, event): self._middle_button_down = True def middle_button_release(self, obj, event): self._middle_button_down = False # perform middle button focus event if ALT is down if self.GetInteractor().GetAltKey(): # print("Middle button released while ALT is down") # try to pick an object at the current mouse position rwi = self.GetInteractor() self.start_x, self.start_y = rwi.GetEventPosition() props = self.perform_picking_on_selection() if props: self.focus_on(props[0]) def mouse_wheel_backward(self, obj, event): self.move_mouse_wheel(-1) def mouse_wheel_forward(self, obj, event): self.move_mouse_wheel(1) def mouse_move(self, obj, event): interactor = self.GetInteractor() # Find the renderer that is active below the current mouse position x, y = interactor.GetEventPosition() self.FindPokedRenderer(x, y) Shift = interactor.GetShiftKey() Ctrl = interactor.GetControlKey() Alt = interactor.GetAltKey() MiddleButton = self._middle_button_down or self.middle_mouse_lock # start with the special modes if self._is_box_zooming: self.draw_dragged_selection() elif MiddleButton and not Shift and not Ctrl and not Alt: self.rotate() elif MiddleButton and Shift and not Ctrl and not Alt: self.pan() elif MiddleButton and Ctrl and not Shift and not Alt: self.zoom() # Dolly elif self.draginfo is not None: self.execute_drag() elif self._left_button_down and Ctrl and Shift: self.draw_measurement() elif self._left_button_down: self.draw_dragged_selection() self.InvokeEvent("InteractionEvent", None) def move_mouse_wheel(self, direction): rwi = self.GetInteractor() # Find the renderer that is active below the current mouse position x, y = rwi.GetEventPosition() self.FindPokedRenderer(x, y) # The movement ren = self.GetCurrentRenderer() # // Calculate the focal depth since we'll be using it a lot camera = ren.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( ren, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() self.ComputeDisplayToWorld(ren, x, y, focalDepth, newPickPoint) # Has to recalc old mouse point since the viewport has moved, # so can't move it outside the loop oldPickPoint = [0, 0, 0, 0] # xp, yp = rwi.GetLastEventPosition() # find the center of the window size = rwi.GetRenderWindow().GetSize() xp = size[0] / 2 yp = size[1] / 2 self.ComputeDisplayToWorld(ren, xp, yp, focalDepth, oldPickPoint) # Camera motion is reversed move_factor = -1 * self.zoom_motion_factor * direction motionVector = ( move_factor * (oldPickPoint[0] - newPickPoint[0]), move_factor * (oldPickPoint[1] - newPickPoint[1]), move_factor * (oldPickPoint[2] - newPickPoint[2]), ) viewFocus = camera.GetFocalPoint() # do we need to do this again? Already did this viewPoint = camera.GetPosition() camera.SetFocalPoint( motionVector[0] + viewFocus[0], motionVector[1] + viewFocus[1], motionVector[2] + viewFocus[2], ) camera.SetPosition( motionVector[0] + viewPoint[0], motionVector[1] + viewPoint[1], motionVector[2] + viewPoint[2], ) # the zooming factor = self.mouse_motion_factor * self.mouse_wheel_motion_factor self.zoom_by_step(direction * factor) def zoom_by_step(self, step): if self.GetCurrentRenderer(): self.StartDolly() self.dolly(pow(1.1, step)) self.EndDolly() def left_button_press(self, obj, event): if self._is_box_zooming: return if self.draginfo: return self._left_button_down = True interactor = self.GetInteractor() Shift = interactor.GetShiftKey() Ctrl = interactor.GetControlKey() if Shift and Ctrl: if not self.GetCurrentRenderer().GetActiveCamera().GetParallelProjection(): self.toggle_parallel_projection() rwi = self.GetInteractor() self.start_x, self.start_y = rwi.GetEventPosition() self.end_x = self.start_x self.end_y = self.start_y self.initialize_screen_drawing() def left_button_release(self, obj, event): # print("LeftButtonRelease") if self._is_box_zooming: self._is_box_zooming = False self.zoom_box(self.start_x, self.start_y, self.end_x, self.end_y) return if self.draginfo: self.finish_drag() return self._left_button_down = False interactor = self.GetInteractor() Shift = interactor.GetShiftKey() Ctrl = interactor.GetControlKey() # Alt = interactor.GetAltKey() if Ctrl and Shift: pass # we were drawing the measurement else: if self.callback_select: props = self.perform_picking_on_selection() if props: # only call back if anything was selected self.picked_props = tuple(props) self.callback_select(props) # remove the selection rubber band / line self.GetInteractor().Render() def key_press(self, obj, event): key = obj.GetKeySym() KEY = key.upper() # logging.info(f"Key Press: {key}") if self.callback_any_key: if self.callback_any_key(key): return if KEY == "M": self.middle_mouse_lock = not self.middle_mouse_lock self._update_middle_mouse_button_lock_actor() elif KEY == "G": if self.draginfo is not None: self.finish_drag() else: if self.callback_start_drag: self.callback_start_drag() else: self.start_drag() # internally calls end-drag if drag is already active elif KEY == "ESCAPE": if self.callback_escape_key: self.callback_escape_key() if self.draginfo is not None: self.cancel_drag() elif KEY == "DELETE": if self.callback_delete_key: self.callback_delete_key() elif KEY == "RETURN": if self.draginfo: self.finish_drag() elif KEY == "SPACE": self.middle_mouse_lock = True # self._update_middle_mouse_button_lock_actor() # self.GrabFocus("MouseMoveEvent", self) # # TODO: grab and release focus; possible from python? elif KEY == "B": self._is_box_zooming = True rwi = self.GetInteractor() self.start_x, self.start_y = rwi.GetEventPosition() self.end_x = self.start_x self.end_y = self.start_y self.initialize_screen_drawing() elif KEY in ("2", "3"): self.toggle_parallel_projection() elif KEY == "A": self.zoom_fit() elif KEY == "X": self.set_view_x() elif KEY == "Y": self.set_view_y() elif KEY == "Z": self.set_view_z() elif KEY == "LEFT": self.rotate_discrete_step(1) elif KEY == "RIGHT": self.rotate_discrete_step(-1) elif KEY == "UP": self.rotate_turtable_by(0, 10) elif KEY == "DOWN": self.rotate_turtable_by(0, -10) elif KEY == "PLUS": self.zoom_by_step(2) elif KEY == "MINUS": self.zoom_by_step(-2) elif KEY == "F": if self.callback_focus_key: self.callback_focus_key() self.InvokeEvent("InteractionEvent", None) def key_release(self, obj, event): key = obj.GetKeySym() KEY = key.upper() # print(f"Key release: {key}") if KEY == "SPACE": if self.middle_mouse_lock: self.middle_mouse_lock = False self._update_middle_mouse_button_lock_actor() def window_resized(self): # print("window resized") self.initialize_screen_drawing() def rotate_discrete_step(self, movement_direction, step=22.5): """ Rotates CW or CCW to the nearest 45 deg angle - includes some fuzzyness to determine about which axis """ camera = self.GetCurrentRenderer().GetActiveCamera() step = np.deg2rad(step) direction = -np.array(camera.GetViewPlaneNormal()) # current camera direction if abs(direction[2]) < 0.7: # horizontal view, rotate camera position about Z-axis angle = np.arctan2(direction[1], direction[0]) # find the nearest angle that is an integer number of steps if movement_direction > 0: angle = step * np.floor((angle + 0.1 * step) / step) + step else: angle = -step * np.floor(-(angle - 0.1 * step) / step) - step dist = np.linalg.norm(direction[:2]) direction[0] = np.cos(angle) * dist direction[1] = np.sin(angle) * dist self.set_camera_direction(direction) else: # Top or bottom like view - rotate camera "up" direction up = np.array(camera.GetViewUp()) angle = np.arctan2(up[1], up[0]) # find the nearest angle that is an integer number of steps if movement_direction > 0: angle = step * np.floor((angle + 0.1 * step) / step) + step else: angle = -step * np.floor(-(angle - 0.1 * step) / step) - step dist = np.linalg.norm(up[:2]) up[0] = np.cos(angle) * dist up[1] = np.sin(angle) * dist camera.SetViewUp(up) camera.OrthogonalizeViewUp() self.GetInteractor().Render() def toggle_parallel_projection(self): renderer = self.GetCurrentRenderer() camera = renderer.GetActiveCamera() camera.SetParallelProjection(not bool(camera.GetParallelProjection())) self.GetInteractor().Render() def set_view_x(self): self.set_camera_plane_direction((1, 0, 0)) def set_view_y(self): self.set_camera_plane_direction((0, 1, 0)) def set_view_z(self): self.set_camera_plane_direction((0, 0, 1)) def zoom_fit(self): self.GetCurrentRenderer().ResetCamera() self.GetInteractor().Render() def set_camera_plane_direction(self, direction): """ Sets the camera to display a plane of which direction is the normal - includes logic to reverse the direction if benificial """ camera = self.GetCurrentRenderer().GetActiveCamera() direction = np.array(direction) normal = camera.GetViewPlaneNormal() # can not set the normal, need to change the position to do that current_alignment = np.dot(normal, -direction) if abs(current_alignment) > 0.9999: # print("toggling") direction = -np.array(normal) elif current_alignment > 0: # find the nearest plane # print("reversing to find nearest") direction = -direction self.set_camera_direction(-direction) def set_camera_direction(self, direction): """Sets the camera to this direction, sets view up if horizontal enough""" direction = np.array(direction) ren = self.GetCurrentRenderer() camera = ren.GetActiveCamera() rwi = self.GetInteractor() pos = np.array(camera.GetPosition()) focal = np.array(camera.GetFocalPoint()) dist = np.linalg.norm(pos - focal) pos = focal - dist * direction camera.SetPosition(pos) if abs(direction[2]) < 0.9: camera.SetViewUp(0, 0, 1) elif direction[2] > 0.9: camera.SetViewUp(0, -1, 0) else: camera.SetViewUp(0, 1, 0) camera.OrthogonalizeViewUp() if self.GetAutoAdjustCameraClippingRange(): ren.ResetCameraClippingRange() if rwi.GetLightFollowCamera(): ren.UpdateLightsGeometryToFollowCamera() if self.callback_camera_direction_changed: self.callback_camera_direction_changed() self.GetInteractor().Render() def perform_picking_on_selection(self): """ Performs 3d picking on the current dragged selection If the distance between the start and endpoints is less than the threshold then a SINGLE 3d prop is picked along the line. The selection area is drawn by the rubber band and is defined by `self.start_x, self.start_y, self.end_x, self.end_y` """ renderer = self.GetCurrentRenderer() if not renderer: return [] assemblyPath = renderer.PickProp(self.start_x, self.start_y, self.end_x, self.end_y) # re-pick in larger area if nothing is returned if not assemblyPath: self.start_x -= 2 self.end_x += 2 self.start_y -= 2 self.end_y += 2 assemblyPath = renderer.PickProp(self.start_x, self.start_y, self.end_x, self.end_y) # The nearest prop (by Z-value) if assemblyPath: assert ( assemblyPath.GetNumberOfItems() == 1 ), "Wrong assumption on number of returned nodes when picking" nearest_prop = assemblyPath.GetItemAsObject(0).GetViewProp() # all props collection = renderer.GetPickResultProps() props = [collection.GetItemAsObject(i) for i in range(collection.GetNumberOfItems())] props.remove(nearest_prop) props.insert(0, nearest_prop) return props else: return [] # ----------- actor dragging ------------ def start_drag(self): if self.callback_start_drag: # print("Calling callback_start_drag") self.callback_start_drag() return else: # grab the current selection if self.picked_props: self.start_drag_on_props(self.picked_props) else: pass # print('Can not start drag, # nothing selected and callback_start_drag not assigned') def finish_drag(self): # print('Finished drag') if self.callback_end_drag: # reset actor positions as actors positions will be controlled # by called functions for pos0, actor in zip( self.draginfo.dragged_actors_original_positions, self.draginfo.actors_dragging, ): actor.SetPosition(pos0) self.callback_end_drag(self.draginfo) self.draginfo = None def start_drag_on_props(self, props): """ Starts drag on the provided props (actors) by filling self.draginfo""" if self.draginfo is not None: self.finish_drag() return # create and fill drag-info draginfo = _BlenderStyleDragInfo() draginfo.actors_dragging = props # [*actors, *outlines] for a in draginfo.actors_dragging: draginfo.dragged_actors_original_positions.append(a.GetPosition()) # Get the start position of the drag in 3d rwi = self.GetInteractor() ren = self.GetCurrentRenderer() camera = ren.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( ren, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() self.ComputeDisplayToWorld(ren, x, y, focalDepth, newPickPoint) mouse_pos_3d = np.array(newPickPoint[:3]) draginfo.start_position_3d = mouse_pos_3d self.draginfo = draginfo def execute_drag(self): rwi = self.GetInteractor() ren = self.GetCurrentRenderer() camera = ren.GetActiveCamera() viewFocus = camera.GetFocalPoint() # Get the picked point in 3d temp_out = [0, 0, 0] self.ComputeWorldToDisplay( ren, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() self.ComputeDisplayToWorld(ren, x, y, focalDepth, newPickPoint) mouse_pos_3d = np.array(newPickPoint[:3]) # compute the delta and execute delta = np.array(mouse_pos_3d) - self.draginfo.start_position_3d # print(f'Delta = {delta}') view_normal = np.array(ren.GetActiveCamera().GetViewPlaneNormal()) delta_inplane = delta - view_normal * np.dot(delta, view_normal) # print(f'delta_inplane = {delta_inplane}') for pos0, actor in zip( self.draginfo.dragged_actors_original_positions, self.draginfo.actors_dragging, ): m = actor.GetUserMatrix() if m: print("UserMatrices/transforms not supported") # m.Invert() #inplace # rotated = m.MultiplyFloatPoint([*delta_inplane, 1]) # actor.SetPosition(pos0 + np.array(rotated[:3])) actor.SetPosition(pos0 + delta_inplane) # print(f'Set position to {pos0 + delta_inplane}') self.draginfo.delta = delta_inplane # store the current delta self.GetInteractor().Render() def cancel_drag(self): """Cancels the drag and restored the original positions of all dragged actors""" for pos0, actor in zip( self.draginfo.dragged_actors_original_positions, self.draginfo.actors_dragging, ): actor.SetPosition(pos0) self.draginfo = None self.GetInteractor().Render() # ----------- end dragging -------------- def zoom(self): rwi = self.GetInteractor() x, y = rwi.GetEventPosition() xp, yp = rwi.GetLastEventPosition() direction = y - yp self.move_mouse_wheel(direction / 10) def pan(self): ren = self.GetCurrentRenderer() if ren: rwi = self.GetInteractor() # // Calculate the focal depth since we'll be using it a lot camera = ren.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( ren, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() self.ComputeDisplayToWorld(ren, x, y, focalDepth, newPickPoint) # Has to recalc old mouse point since the viewport has moved, # so can't move it outside the loop oldPickPoint = [0, 0, 0, 0] xp, yp = rwi.GetLastEventPosition() self.ComputeDisplayToWorld(ren, xp, yp, focalDepth, oldPickPoint) # # Camera motion is reversed motionVector = ( oldPickPoint[0] - newPickPoint[0], oldPickPoint[1] - newPickPoint[1], oldPickPoint[2] - newPickPoint[2], ) viewFocus = camera.GetFocalPoint() # do we need to do this again? Already did this viewPoint = camera.GetPosition() camera.SetFocalPoint( motionVector[0] + viewFocus[0], motionVector[1] + viewFocus[1], motionVector[2] + viewFocus[2], ) camera.SetPosition( motionVector[0] + viewPoint[0], motionVector[1] + viewPoint[1], motionVector[2] + viewPoint[2], ) if rwi.GetLightFollowCamera(): ren.UpdateLightsGeometryToFollowCamera() self.GetInteractor().Render() def rotate(self): ren = self.GetCurrentRenderer() if ren: rwi = self.GetInteractor() dx = rwi.GetEventPosition()[0] - rwi.GetLastEventPosition()[0] dy = rwi.GetEventPosition()[1] - rwi.GetLastEventPosition()[1] size = ren.GetRenderWindow().GetSize() delta_elevation = -20.0 / size[1] delta_azimuth = -20.0 / size[0] rxf = dx * delta_azimuth * self.mouse_motion_factor ryf = dy * delta_elevation * self.mouse_motion_factor self.rotate_turtable_by(rxf, ryf) def rotate_turtable_by(self, rxf, ryf): ren = self.GetCurrentRenderer() rwi = self.GetInteractor() # rfx is rotation about the global Z vector (turn-table mode) # rfy is rotation about the side vector camera = ren.GetActiveCamera() campos = np.array(camera.GetPosition()) focal = np.array(camera.GetFocalPoint()) up = camera.GetViewUp() upside_down_factor = -1 if up[2] < 0 else 1 # rotate about focal point P = campos - focal # camera position # Rotate left/right about the global Z axis H = np.linalg.norm(P[:2]) # horizontal distance of camera to focal point elev = np.arctan2(P[2], H) # elevation # if the camera is near the poles, then derive the azimuth from the up-vector sin_elev = np.sin(elev) if abs(sin_elev) < 0.8: azi = np.arctan2(P[1], P[0]) # azimuth from camera position else: if sin_elev < -0.8: azi = np.arctan2(upside_down_factor * up[1], upside_down_factor * up[0]) else: azi = np.arctan2(-upside_down_factor * up[1], -upside_down_factor * up[0]) D = np.linalg.norm(P) # distance from focal point to camera # apply the change in azimuth and elevation azi_new = azi + rxf / 60 elev_new = elev + upside_down_factor * ryf / 60 # the changed elevation changes H (D stays the same) Hnew = D * np.cos(elev_new) # calculate new camera position relative to focal point Pnew = np.array((Hnew * np.cos(azi_new), Hnew * np.sin(azi_new), D * np.sin(elev_new))) # calculate the up-direction of the camera up_z = upside_down_factor * np.cos(elev_new) # z follows directly from elevation up_h = upside_down_factor * np.sin(elev_new) # horizontal component # # if upside_down: # up_z = -up_z # up_h = -up_h up = (-up_h * np.cos(azi_new), -up_h * np.sin(azi_new), up_z) new_pos = focal + Pnew camera.SetViewUp(up) camera.SetPosition(new_pos) camera.OrthogonalizeViewUp() # Update if self.GetAutoAdjustCameraClippingRange(): ren.ResetCameraClippingRange() if rwi.GetLightFollowCamera(): ren.UpdateLightsGeometryToFollowCamera() if self.callback_camera_direction_changed: self.callback_camera_direction_changed() self.GetInteractor().Render() def zoom_box(self, x1, y1, x2, y2): """Zooms to a box""" if x1 > x2: _ = x1 x1 = x2 x2 = _ if y1 > y2: _ = y1 y1 = y2 y2 = _ width = x2 - x1 height = y2 - y1 ren = self.GetCurrentRenderer() size = ren.GetSize() origin = ren.GetOrigin() camera = ren.GetActiveCamera() # Assuming we're drawing the band on the view-plane rbcenter = (x1 + width / 2, y1 + height / 2, 0) ren.SetDisplayPoint(rbcenter) ren.DisplayToView() ren.ViewToWorld() worldRBCenter = ren.GetWorldPoint() invw = 1.0 / worldRBCenter[3] worldRBCenter = [c * invw for c in worldRBCenter] winCenter = [origin[0] + 0.5 * size[0], origin[1] + 0.5 * size[1], 0] ren.SetDisplayPoint(winCenter) ren.DisplayToView() ren.ViewToWorld() worldWinCenter = ren.GetWorldPoint() invw = 1.0 / worldWinCenter[3] worldWinCenter = [c * invw for c in worldWinCenter] translation = [ worldRBCenter[0] - worldWinCenter[0], worldRBCenter[1] - worldWinCenter[1], worldRBCenter[2] - worldWinCenter[2], ] pos = camera.GetPosition() fp = camera.GetFocalPoint() # pos = [pos[i] + translation[i] for i in range(3)] fp = [fp[i] + translation[i] for i in range(3)] # camera.SetPosition(pos) camera.SetFocalPoint(fp) if width > height: if width: camera.Zoom(size[0] / width) else: if height: camera.Zoom(size[1] / height) self.GetInteractor().Render() def focus_on(self, prop3D): """Move the camera to focus on this particular prop3D""" position = prop3D.GetPosition() ren = self.GetCurrentRenderer() camera = ren.GetActiveCamera() fp = camera.GetFocalPoint() pos = camera.GetPosition() camera.SetFocalPoint(position) camera.SetPosition( position[0] - fp[0] + pos[0], position[1] - fp[1] + pos[1], position[2] - fp[2] + pos[2], ) if self.GetAutoAdjustCameraClippingRange(): ren.ResetCameraClippingRange() rwi = self.GetInteractor() if rwi.GetLightFollowCamera(): ren.UpdateLightsGeometryToFollowCamera() self.GetInteractor().Render() def dolly(self, factor): ren = self.GetCurrentRenderer() if ren: camera = ren.GetActiveCamera() if camera.GetParallelProjection(): camera.SetParallelScale(camera.GetParallelScale() / factor) else: camera.Dolly(factor) if self.GetAutoAdjustCameraClippingRange(): ren.ResetCameraClippingRange() # if not do_not_update: # rwi = self.GetInteractor() # if rwi.GetLightFollowCamera(): # ren.UpdateLightsGeometryToFollowCamera() # # rwi.Render() def draw_measurement(self): rwi = self.GetInteractor() self.end_x, self.end_y = rwi.GetEventPosition() self.draw_line(self.start_x, self.end_x, self.start_y, self.end_y) def draw_dragged_selection(self): rwi = self.GetInteractor() self.end_x, self.end_y = rwi.GetEventPosition() self.draw_rubber_band(self.start_x, self.end_x, self.start_y, self.end_y) def initialize_screen_drawing(self): # make an image of the currently rendered image rwi = self.GetInteractor() rwin = rwi.GetRenderWindow() size = rwin.GetSize() self._pixel_array.Initialize() self._pixel_array.SetNumberOfComponents(4) self._pixel_array.SetNumberOfTuples(size[0] * size[1]) front = 1 # what does this do? rwin.GetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, front, self._pixel_array) def draw_rubber_band(self, x1, x2, y1, y2): rwi = self.GetInteractor() rwin = rwi.GetRenderWindow() size = rwin.GetSize() tempPA = vtki.vtkUnsignedCharArray() tempPA.DeepCopy(self._pixel_array) # check size, viewport may have been resized in the mean-time if tempPA.GetNumberOfTuples() != size[0] * size[1]: # print( # "Starting new screen-image - viewport has resized without us knowing" # ) self.initialize_screen_drawing() self.draw_rubber_band(x1, x2, y1, y2) return x2 = min(x2, size[0] - 1) y2 = min(y2, size[1] - 1) x2 = max(x2, 0) y2 = max(y2, 0) # Modify the pixel array width = abs(x2 - x1) height = abs(y2 - y1) minx = min(x2, x1) miny = min(y2, y1) # draw top and bottom for i in range(width): # c = round((10*i % 254)/254) * 254 # find some alternating color c = 0 idx = (miny * size[0]) + minx + i tempPA.SetTuple(idx, (c, c, c, 1)) idx = ((miny + height) * size[0]) + minx + i tempPA.SetTuple(idx, (c, c, c, 1)) # draw left and right for i in range(height): # c = round((10 * i % 254) / 254) * 254 # find some alternating color c = 0 idx = ((miny + i) * size[0]) + minx tempPA.SetTuple(idx, (c, c, c, 1)) idx = idx + width tempPA.SetTuple(idx, (c, c, c, 1)) # and Copy back to the window rwin.SetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, tempPA, 0) rwin.Frame() def line2pixels(self, x1, x2, y1, y2): """Returns the x and y values of the pixels on a line between x1,y1 and x2,y2. If start and end are identical then a single point is returned""" dx = x2 - x1 dy = y2 - y1 if dx == 0 and dy == 0: return [x1], [y1] if abs(dx) > abs(dy): dhdw = dy / dx r = range(0, dx, int(dx / abs(dx))) x = [x1 + i for i in r] y = [round(y1 + dhdw * i) for i in r] else: dwdh = dx / dy r = range(0, dy, int(dy / abs(dy))) y = [y1 + i for i in r] x = [round(x1 + i * dwdh) for i in r] return x, y def draw_line(self, x1, x2, y1, y2): rwi = self.GetInteractor() rwin = rwi.GetRenderWindow() size = rwin.GetSize() x1 = min(max(x1, 0), size[0]) x2 = min(max(x2, 0), size[0]) y1 = min(max(y1, 0), size[1]) y2 = min(max(y2, 0), size[1]) tempPA = vtki.vtkUnsignedCharArray() tempPA.DeepCopy(self._pixel_array) xs, ys = self.line2pixels(x1, x2, y1, y2) for x, y in zip(xs, ys): idx = (y * size[0]) + x tempPA.SetTuple(idx, (0, 0, 0, 1)) # and Copy back to the window rwin.SetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, tempPA, 0) camera = self.GetCurrentRenderer().GetActiveCamera() scale = camera.GetParallelScale() # Set/Get the scaling used for a parallel projection, i.e. # # the half of the height of the viewport in world-coordinate distances. # The default is 1. Note that the "scale" parameter works as an "inverse scale" # larger numbers produce smaller images. # This method has no effect in perspective projection mode half_height = size[1] / 2 # half_height [px] = scale [world-coordinates] length = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5 meters_per_pixel = scale / half_height meters = length * meters_per_pixel if camera.GetParallelProjection(): print(f"Line length = {length} px = {meters} m") else: print("Need to be in non-perspective mode to measure. Press 2 or 3 to get there") if self.callback_measure: self.callback_measure(meters) # # can we add something to the window here? # freeType = vtk.FreeTypeTools.GetInstance() # textProperty = vtki.vtkTextProperty() # textProperty.SetJustificationToLeft() # textProperty.SetFontSize(24) # textProperty.SetOrientation(25) # # textImage = vtki.vtkImageData() # freeType.RenderString(textProperty, "a somewhat longer text", 72, textImage) # # this does not give an error, assume it works # # # textImage.GetDimensions() # textImage.GetExtent() # # # # Now put the textImage in the RenderWindow # rwin.SetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, textImage, 0) rwin.Frame() def _update_middle_mouse_button_lock_actor(self): if self.middle_mouse_lock_actor is None: # create the actor # Create a text on the top-rightcenter textMapper = vtki.new("TextMapper") textMapper.SetInput("Middle mouse lock [m or space] active") textProp = textMapper.GetTextProperty() textProp.SetFontSize(12) textProp.SetFontFamilyToTimes() textProp.BoldOff() textProp.ItalicOff() textProp.ShadowOff() textProp.SetVerticalJustificationToTop() textProp.SetJustificationToCentered() textProp.SetColor((0, 0, 0)) self.middle_mouse_lock_actor = vtki.vtkActor2D() self.middle_mouse_lock_actor.SetMapper(textMapper) self.middle_mouse_lock_actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() self.middle_mouse_lock_actor.GetPositionCoordinate().SetValue(0.5, 0.98) self.GetCurrentRenderer().AddActor(self.middle_mouse_lock_actor) self.middle_mouse_lock_actor.SetVisibility(self.middle_mouse_lock) self.GetInteractor().Render() vedo-2025.5.3/vedo/mesh.py000066400000000000000000003333621474667405700152060ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np from typing import List, Tuple, Union, MutableSequence, Any from typing_extensions import Self import vedo.vtkclasses as vtki # a wrapper for lazy imports import vedo from vedo.colors import get_color from vedo.pointcloud import Points from vedo.utils import buildPolyData, is_sequence, mag, precision from vedo.utils import numpy2vtk, vtk2numpy, OperationNode from vedo.visual import MeshVisual __docformat__ = "google" __doc__ = """ Submodule to work with polygonal meshes ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ __all__ = ["Mesh"] #################################################### class Mesh(MeshVisual, Points): """ Build an instance of object `Mesh` derived from `vedo.PointCloud`. """ def __init__(self, inputobj=None, c="gold", alpha=1): """ Initialize a ``Mesh`` object. Arguments: inputobj : (str, vtkPolyData, vtkActor, vedo.Mesh) If inputobj is `None` an empty mesh is created. If inputobj is a `str` then it is interpreted as the name of a file to load as mesh. If inputobj is an `vtkPolyData` or `vtkActor` or `vedo.Mesh` then a shallow copy of it is created. If inputobj is a `vedo.Mesh` then a shallow copy of it is created. Examples: - [buildmesh.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/buildmesh.py) (and many others!) ![](https://vedo.embl.es/images/basic/buildmesh.png) """ # print("INIT MESH", super()) super().__init__() self.name = "Mesh" if inputobj is None: # self.dataset = vtki.vtkPolyData() pass elif isinstance(inputobj, str): self.dataset = vedo.file_io.load(inputobj).dataset self.filename = inputobj elif isinstance(inputobj, vtki.vtkPolyData): # self.dataset.DeepCopy(inputobj) # NO self.dataset = inputobj if self.dataset.GetNumberOfCells() == 0: carr = vtki.vtkCellArray() for i in range(inputobj.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) self.dataset.SetVerts(carr) elif isinstance(inputobj, Mesh): self.dataset = inputobj.dataset elif is_sequence(inputobj): ninp = len(inputobj) if ninp == 4: # assume input is [vertices, faces, lines, strips] self.dataset = buildPolyData(inputobj[0], inputobj[1], inputobj[2], inputobj[3]) elif ninp == 3: # assume input is [vertices, faces, lines] self.dataset = buildPolyData(inputobj[0], inputobj[1], inputobj[2]) elif ninp == 2: # assume input is [vertices, faces] self.dataset = buildPolyData(inputobj[0], inputobj[1]) elif ninp == 1: # assume input is [vertices] self.dataset = buildPolyData(inputobj[0]) else: vedo.logger.error("input must be a list of max 4 elements.") raise ValueError() elif isinstance(inputobj, vtki.vtkActor): self.dataset.DeepCopy(inputobj.GetMapper().GetInput()) v = inputobj.GetMapper().GetScalarVisibility() self.mapper.SetScalarVisibility(v) pr = vtki.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) self.actor.SetProperty(pr) self.properties = pr elif isinstance(inputobj, (vtki.vtkStructuredGrid, vtki.vtkRectilinearGrid)): gf = vtki.new("GeometryFilter") gf.SetInputData(inputobj) gf.Update() self.dataset = gf.GetOutput() elif "meshlab" in str(type(inputobj)): self.dataset = vedo.utils.meshlab2vedo(inputobj).dataset elif "meshlib" in str(type(inputobj)): import meshlib.mrmeshnumpy as mrmeshnumpy self.dataset = buildPolyData( mrmeshnumpy.getNumpyVerts(inputobj), mrmeshnumpy.getNumpyFaces(inputobj.topology), ) elif "trimesh" in str(type(inputobj)): self.dataset = vedo.utils.trimesh2vedo(inputobj).dataset elif "meshio" in str(type(inputobj)): # self.dataset = vedo.utils.meshio2vedo(inputobj) ##TODO if len(inputobj.cells) > 0: mcells = [] for cellblock in inputobj.cells: if cellblock.type in ("triangle", "quad"): mcells += cellblock.data.tolist() self.dataset = buildPolyData(inputobj.points, mcells) else: self.dataset = buildPolyData(inputobj.points, None) # add arrays: try: if len(inputobj.point_data) > 0: for k in inputobj.point_data.keys(): vdata = numpy2vtk(inputobj.point_data[k]) vdata.SetName(str(k)) self.dataset.GetPointData().AddArray(vdata) except AssertionError: print("Could not add meshio point data, skip.") else: try: gf = vtki.new("GeometryFilter") gf.SetInputData(inputobj) gf.Update() self.dataset = gf.GetOutput() except: vedo.logger.error(f"cannot build mesh from type {type(inputobj)}") raise RuntimeError() self.mapper.SetInputData(self.dataset) self.actor.SetMapper(self.mapper) self.properties.SetInterpolationToPhong() self.properties.SetColor(get_color(c)) if alpha is not None: self.properties.SetOpacity(alpha) self.mapper.SetInterpolateScalarsBeforeMapping( vedo.settings.interpolate_scalars_before_mapping ) if vedo.settings.use_polygon_offset: self.mapper.SetResolveCoincidentTopologyToPolygonOffset() pof = vedo.settings.polygon_offset_factor pou = vedo.settings.polygon_offset_units self.mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) n = self.dataset.GetNumberOfPoints() self.pipeline = OperationNode(self, comment=f"#pts {n}") def _repr_html_(self): """ HTML representation of the Mesh object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.mesh.Mesh" help_url = "https://vedo.embl.es/docs/vedo/mesh.html#Mesh" arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ precision(min_x, 4) + " ... " + precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) average_size = "{size:.3f}".format(size=self.average_size()) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self.dataset.GetPointData().GetScalars(): if self.dataset.GetPointData().GetScalars().GetName(): name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self.dataset.GetCellData().GetScalars(): if self.dataset.GetCellData().GetScalars().GetName(): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + precision(self.center_of_mass(), 3) + "
average size " + str(average_size) + "
nr. points / faces " + str(self.npoints) + " / " + str(self.ncells) + "
", "
", ] return "\n".join(allt) def faces(self, ids=()): """DEPRECATED. Use property `mesh.cells` instead.""" vedo.printc("WARNING: use property mesh.cells instead of mesh.faces()",c='y') return self.cells @property def edges(self): """Return an array containing the edges connectivity.""" extractEdges = vtki.new("ExtractEdges") extractEdges.SetInputData(self.dataset) # eed.UseAllPointsOn() extractEdges.Update() lpoly = extractEdges.GetOutput() arr1d = vtk2numpy(lpoly.GetLines().GetData()) # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. i = 0 conn = [] n = len(arr1d) for _ in range(n): cell = [arr1d[i + k + 1] for k in range(arr1d[i])] conn.append(cell) i += arr1d[i] + 1 if i >= n: break return conn # cannot always make a numpy array of it! @property def cell_normals(self): """ Retrieve face normals as a numpy array. Check out also `compute_normals(cells=True)` and `compute_normals_with_pca()`. """ vtknormals = self.dataset.GetCellData().GetNormals() numpy_normals = vtk2numpy(vtknormals) if len(numpy_normals) == 0 and len(self.cells) != 0: vedo.logger.warning( "failed to return normal vectors.\n" "You may need to call `Mesh.compute_normals()` before accessing 'Mesh.cell_normals'." ) numpy_normals = np.zeros((self.ncells, 3)) + [0,0,1] return numpy_normals def compute_normals(self, points=True, cells=True, feature_angle=None, consistency=True) -> Self: """ Compute cell and vertex normals for the mesh. Arguments: points : (bool) do the computation for the vertices too cells : (bool) do the computation for the cells too feature_angle : (float) specify the angle that defines a sharp edge. If the difference in angle across neighboring polygons is greater than this value, the shared edge is considered "sharp" and it is split. consistency : (bool) turn on/off the enforcement of consistent polygon ordering. .. warning:: If `feature_angle` is set then the Mesh can be modified, and it can have a different nr. of vertices from the original. Note that the appearance of the mesh may change if the normals are computed, as shading is automatically enabled when such information is present. Use `mesh.flat()` to avoid smoothing effects. """ pdnorm = vtki.new("PolyDataNormals") pdnorm.SetInputData(self.dataset) pdnorm.SetComputePointNormals(points) pdnorm.SetComputeCellNormals(cells) pdnorm.SetConsistency(consistency) pdnorm.FlipNormalsOff() if feature_angle: pdnorm.SetSplitting(True) pdnorm.SetFeatureAngle(feature_angle) else: pdnorm.SetSplitting(False) pdnorm.Update() out = pdnorm.GetOutput() self._update(out, reset_locators=False) return self def reverse(self, cells=True, normals=False) -> Self: """ Reverse the order of polygonal cells and/or reverse the direction of point and cell normals. Two flags are used to control these operations: - `cells=True` reverses the order of the indices in the cell connectivity list. If cell is a list of IDs only those cells will be reversed. - `normals=True` reverses the normals by multiplying the normal vector by -1 (both point and cell normals, if present). """ poly = self.dataset if is_sequence(cells): for cell in cells: poly.ReverseCell(cell) poly.GetCellData().Modified() return self ############## rev = vtki.new("ReverseSense") if cells: rev.ReverseCellsOn() else: rev.ReverseCellsOff() if normals: rev.ReverseNormalsOn() else: rev.ReverseNormalsOff() rev.SetInputData(poly) rev.Update() self._update(rev.GetOutput(), reset_locators=False) self.pipeline = OperationNode("reverse", parents=[self]) return self def volume(self) -> float: """ Compute the volume occupied by mesh. The mesh must be triangular for this to work. To triangulate a mesh use `mesh.triangulate()`. """ mass = vtki.new("MassProperties") mass.SetGlobalWarningDisplay(0) mass.SetInputData(self.dataset) mass.Update() mass.SetGlobalWarningDisplay(1) return mass.GetVolume() def area(self) -> float: """ Compute the surface area of the mesh. The mesh must be triangular for this to work. To triangulate a mesh use `mesh.triangulate()`. """ mass = vtki.new("MassProperties") mass.SetGlobalWarningDisplay(0) mass.SetInputData(self.dataset) mass.Update() mass.SetGlobalWarningDisplay(1) return mass.GetSurfaceArea() def is_closed(self) -> bool: """ Return `True` if the mesh is watertight. Note that if the mesh contains coincident points the result may be flase. Use in this case `mesh.clean()` to merge coincident points. """ fe = vtki.new("FeatureEdges") fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() fe.SetInputData(self.dataset) fe.Update() ne = fe.GetOutput().GetNumberOfCells() return not bool(ne) def is_manifold(self) -> bool: """Return `True` if the mesh is manifold.""" fe = vtki.new("FeatureEdges") fe.BoundaryEdgesOff() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() fe.SetInputData(self.dataset) fe.Update() ne = fe.GetOutput().GetNumberOfCells() return not bool(ne) def non_manifold_faces(self, remove=True, tol="auto") -> Self: """ Detect and (try to) remove non-manifold faces of a triangular mesh: - set `remove` to `False` to mark cells without removing them. - set `tol=0` for zero-tolerance, the result will be manifold but with holes. - set `tol>0` to cut off non-manifold faces, and try to recover the good ones. - set `tol="auto"` to make an automatic choice of the tolerance. """ # mark original point and cell ids self.add_ids() toremove = self.boundaries( boundary_edges=False, non_manifold_edges=True, cell_edge=True, return_cell_ids=True, ) if len(toremove) == 0: # type: ignore return self points = self.coordinates faces = self.cells centers = self.cell_centers().coordinates copy = self.clone() copy.delete_cells(toremove).clean() copy.compute_normals(cells=False) normals = copy.vertex_normals deltas, deltas_i = [], [] for i in vedo.utils.progressbar(toremove, delay=3, title="recover faces"): pids = copy.closest_point(centers[i], n=3, return_point_id=True) norms = normals[pids] n = np.mean(norms, axis=0) dn = np.linalg.norm(n) if not dn: continue n = n / dn p0, p1, p2 = points[faces[i]][:3] v = np.cross(p1 - p0, p2 - p0) lv = np.linalg.norm(v) if not lv: continue v = v / lv cosa = 1 - np.dot(n, v) deltas.append(cosa) deltas_i.append(i) recover = [] if len(deltas) > 0: mean_delta = np.mean(deltas) err_delta = np.std(deltas) txt = "" if tol == "auto": # automatic choice tol = mean_delta / 5 txt = f"\n Automatic tol. : {tol: .4f}" for i, cosa in zip(deltas_i, deltas): if cosa < tol: recover.append(i) vedo.logger.info( f"\n --------- Non manifold faces ---------" f"\n Average tol. : {mean_delta: .4f} +- {err_delta: .4f}{txt}" f"\n Removed faces : {len(toremove)}" # type: ignore f"\n Recovered faces: {len(recover)}" ) toremove = list(set(toremove) - set(recover)) # type: ignore if not remove: mark = np.zeros(self.ncells, dtype=np.uint8) mark[recover] = 1 mark[toremove] = 2 self.celldata["NonManifoldCell"] = mark else: self.delete_cells(toremove) # type: ignore self.pipeline = OperationNode( "non_manifold_faces", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", ) return self def euler_characteristic(self) -> int: """ Compute the Euler characteristic of the mesh. The Euler characteristic is a topological invariant for surfaces. """ return self.npoints - len(self.edges) + self.ncells def genus(self) -> int: """ Compute the genus of the mesh. The genus is a topological invariant for surfaces. """ nb = len(self.boundaries().split()) - 1 return (2 - self.euler_characteristic() - nb ) / 2 def to_reeb_graph(self, field_id=0): """ Convert the mesh into a Reeb graph. The Reeb graph is a topological structure that captures the evolution of the level sets of a scalar field. Arguments: field_id : (int) the id of the scalar field to use. Example: ```python from vedo import * mesh = Mesh("https://discourse.paraview.org/uploads/short-url/qVuZ1fiRjwhE1qYtgGE2HGXybgo.stl") mesh.rotate_x(10).rotate_y(15).alpha(0.5) mesh.pointdata["scalars"] = mesh.coordinates[:, 2] printc("is_closed :", mesh.is_closed()) printc("is_manifold:", mesh.is_manifold()) printc("euler_char :", mesh.euler_characteristic()) printc("genus :", mesh.genus()) reeb = mesh.to_reeb_graph() ids = reeb[0].pointdata["Vertex Ids"] pts = Points(mesh.coordinates[ids], r=10) show([[mesh, pts], reeb], N=2, sharecam=False) ``` """ rg = vtki.new("PolyDataToReebGraphFilter") rg.SetInputData(self.dataset) rg.SetFieldId(field_id) rg.Update() gr = vedo.pyplot.DirectedGraph() gr.mdg = rg.GetOutput() gr.build() return gr def shrink(self, fraction=0.85) -> Self: """ Shrink the triangle polydata in the representation of the input mesh. Examples: - [shrink.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/shrink.py) ![](https://vedo.embl.es/images/basic/shrink.png) """ # Overriding base class method core.shrink() shrink = vtki.new("ShrinkPolyData") shrink.SetInputData(self.dataset) shrink.SetShrinkFactor(fraction) shrink.Update() self._update(shrink.GetOutput()) self.pipeline = OperationNode("shrink", parents=[self]) return self def cap(self, return_cap=False) -> Self: """ Generate a "cap" on a clipped mesh, or caps sharp edges. Examples: - [cut_and_cap.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/cut_and_cap.py) ![](https://vedo.embl.es/images/advanced/cutAndCap.png) See also: `join()`, `join_segments()`, `slice()`. """ fe = vtki.new("FeatureEdges") fe.SetInputData(self.dataset) fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOff() fe.ManifoldEdgesOff() fe.Update() stripper = vtki.new("Stripper") stripper.SetInputData(fe.GetOutput()) stripper.JoinContiguousSegmentsOn() stripper.Update() boundary_poly = vtki.vtkPolyData() boundary_poly.SetPoints(stripper.GetOutput().GetPoints()) boundary_poly.SetPolys(stripper.GetOutput().GetLines()) rev = vtki.new("ReverseSense") rev.ReverseCellsOn() rev.SetInputData(boundary_poly) rev.Update() tf = vtki.new("TriangleFilter") tf.SetInputData(rev.GetOutput()) tf.Update() if return_cap: m = Mesh(tf.GetOutput()) m.pipeline = OperationNode( "cap", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) m.name = "MeshCap" return m polyapp = vtki.new("AppendPolyData") polyapp.AddInputData(self.dataset) polyapp.AddInputData(tf.GetOutput()) polyapp.Update() self._update(polyapp.GetOutput()) self.clean() self.pipeline = OperationNode( "capped", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self def join(self, polys=True, reset=False) -> Self: """ Generate triangle strips and/or polylines from input polygons, triangle strips, and lines. Input polygons are assembled into triangle strips only if they are triangles; other types of polygons are passed through to the output and not stripped. Use mesh.triangulate() to triangulate non-triangular polygons prior to running this filter if you need to strip all the data. Also note that if triangle strips or polylines are present in the input they are passed through and not joined nor extended. If you wish to strip these use mesh.triangulate() to fragment the input into triangles and lines prior to applying join(). Arguments: polys : (bool) polygonal segments will be joined if they are contiguous reset : (bool) reset points ordering Warning: If triangle strips or polylines exist in the input data they will be passed through to the output data. This filter will only construct triangle strips if triangle polygons are available; and will only construct polylines if lines are available. Example: ```python from vedo import * c1 = Cylinder(pos=(0,0,0), r=2, height=3, axis=(1,.0,0), alpha=.1).triangulate() c2 = Cylinder(pos=(0,0,2), r=1, height=2, axis=(0,.3,1), alpha=.1).triangulate() intersect = c1.intersect_with(c2).join(reset=True) spline = Spline(intersect).c('blue').lw(5) show(c1, c2, spline, intersect.labels('id'), axes=1).close() ``` ![](https://vedo.embl.es/images/feats/line_join.png) """ sf = vtki.new("Stripper") sf.SetPassThroughCellIds(True) sf.SetPassThroughPointIds(True) sf.SetJoinContiguousSegments(polys) sf.SetInputData(self.dataset) sf.Update() if reset: poly = sf.GetOutput() cpd = vtki.new("CleanPolyData") cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() cpd.SetInputData(poly) cpd.Update() poly = cpd.GetOutput() vpts = poly.GetCell(0).GetPoints().GetData() poly.GetPoints().SetData(vpts) else: poly = sf.GetOutput() self._update(poly) self.pipeline = OperationNode( "join", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self def join_segments(self, closed=True, tol=1e-03) -> list: """ Join line segments into contiguous lines. Useful to call with `triangulate()` method. Returns: list of `shapes.Lines` Example: ```python from vedo import * msh = Torus().alpha(0.1).wireframe() intersection = msh.intersect_with_plane(normal=[1,1,1]).c('purple5') slices = [s.triangulate() for s in intersection.join_segments()] show(msh, intersection, merge(slices), axes=1, viewup='z') ``` ![](https://vedo.embl.es/images/feats/join_segments.jpg) """ vlines = [] for ipiece, outline in enumerate(self.split(must_share_edge=False)): # type: ignore outline.clean() pts = outline.coordinates if len(pts) < 3: continue avesize = outline.average_size() lines = outline.lines # print("---lines", lines, "in piece", ipiece) tol = avesize / pts.shape[0] * tol k = 0 joinedpts = [pts[k]] for _ in range(len(pts)): pk = pts[k] for j, line in enumerate(lines): id0, id1 = line[0], line[-1] p0, p1 = pts[id0], pts[id1] if np.linalg.norm(p0 - pk) < tol: n = len(line) for m in range(1, n): joinedpts.append(pts[line[m]]) # joinedpts.append(p1) k = id1 lines.pop(j) break elif np.linalg.norm(p1 - pk) < tol: n = len(line) for m in reversed(range(0, n - 1)): joinedpts.append(pts[line[m]]) # joinedpts.append(p0) k = id0 lines.pop(j) break if len(joinedpts) > 1: newline = vedo.shapes.Line(joinedpts, closed=closed) newline.clean() newline.actor.SetProperty(self.properties) newline.properties = self.properties newline.pipeline = OperationNode( "join_segments", parents=[self], comment=f"#pts {newline.dataset.GetNumberOfPoints()}", ) vlines.append(newline) return vlines def join_with_strips(self, b1, closed=True) -> Self: """ Join booundary lines by creating a triangle strip between them. Example: ```python from vedo import * m1 = Cylinder(cap=False).boundaries() m2 = Cylinder(cap=False).boundaries().pos(0.2,0,1) strips = m1.join_with_strips(m2) show(m1, m2, strips, axes=1).close() ``` """ b0 = self.clone().join() b1 = b1.clone().join() vertices0 = b0.vertices.tolist() vertices1 = b1.vertices.tolist() lines0 = b0.lines lines1 = b1.lines m = len(lines0) assert m == len(lines1), ( "lines must have the same number of points\n" f"line has {m} points in b0 and {len(lines1)} in b1" ) strips = [] points: List[Any] = [] for j in range(m): ids0j = list(lines0[j]) ids1j = list(lines1[j]) n = len(ids0j) assert n == len(ids1j), ( "lines must have the same number of points\n" f"line {j} has {n} points in b0 and {len(ids1j)} in b1" ) if closed: ids0j.append(ids0j[0]) ids1j.append(ids1j[0]) vertices0.append(vertices0[ids0j[0]]) vertices1.append(vertices1[ids1j[0]]) n = n + 1 strip = [] # create a triangle strip npt = len(points) for ipt in range(n): points.append(vertices0[ids0j[ipt]]) points.append(vertices1[ids1j[ipt]]) strip = list(range(npt, npt + 2*n)) strips.append(strip) return Mesh([points, [], [], strips], c="k6") def split_polylines(self) -> Self: """Split polylines into separate segments.""" tf = vtki.new("TriangleFilter") tf.SetPassLines(True) tf.SetPassVerts(False) tf.SetInputData(self.dataset) tf.Update() self._update(tf.GetOutput(), reset_locators=False) self.lw(0).lighting("default").pickable() self.pipeline = OperationNode( "split_polylines", parents=[self], comment=f"#lines {self.dataset.GetNumberOfLines()}" ) return self def remove_all_lines(self) -> Self: """Remove all line elements from the mesh.""" self.dataset.GetLines().Reset() return self def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)) -> Self: """ Slice a mesh with a plane and fill the contour. Example: ```python from vedo import * msh = Mesh(dataurl+"bunny.obj").alpha(0.1).wireframe() mslice = msh.slice(normal=[0,1,0.3], origin=[0,0.16,0]) mslice.c('purple5') show(msh, mslice, axes=1) ``` ![](https://vedo.embl.es/images/feats/mesh_slice.jpg) See also: `join()`, `join_segments()`, `cap()`, `cut_with_plane()`. """ intersection = self.intersect_with_plane(origin=origin, normal=normal) slices = [s.triangulate() for s in intersection.join_segments()] mslices = vedo.pointcloud.merge(slices) if mslices: mslices.name = "MeshSlice" mslices.pipeline = OperationNode("slice", parents=[self], comment=f"normal = {normal}") return mslices def triangulate(self, verts=True, lines=True) -> Self: """ Converts mesh polygons into triangles. If the input mesh is only made of 2D lines (no faces) the output will be a triangulation that fills the internal area. The contours may be concave, and may even contain holes, i.e. a contour may contain an internal contour winding in the opposite direction to indicate that it is a hole. Arguments: verts : (bool) if True, break input vertex cells into individual vertex cells (one point per cell). If False, the input vertex cells will be ignored. lines : (bool) if True, break input polylines into line segments. If False, input lines will be ignored and the output will have no lines. """ if self.dataset.GetNumberOfPolys() or self.dataset.GetNumberOfStrips(): # print("Using vtkTriangleFilter") tf = vtki.new("TriangleFilter") tf.SetPassLines(lines) tf.SetPassVerts(verts) elif self.dataset.GetNumberOfLines(): # print("Using vtkContourTriangulator") tf = vtki.new("ContourTriangulator") tf.TriangulationErrorDisplayOn() else: vedo.logger.debug("input in triangulate() seems to be void! Skip.") return self tf.SetInputData(self.dataset) tf.Update() self._update(tf.GetOutput(), reset_locators=False) self.lw(0).lighting("default").pickable() self.pipeline = OperationNode( "triangulate", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}" ) return self def compute_cell_vertex_count(self) -> Self: """ Add to this mesh a cell data array containing the nr of vertices that a polygonal face has. """ csf = vtki.new("CellSizeFilter") csf.SetInputData(self.dataset) csf.SetComputeArea(False) csf.SetComputeVolume(False) csf.SetComputeLength(False) csf.SetComputeVertexCount(True) csf.SetVertexCountArrayName("VertexCount") csf.Update() self.dataset.GetCellData().AddArray( csf.GetOutput().GetCellData().GetArray("VertexCount") ) return self def compute_quality(self, metric=6) -> Self: """ Calculate metrics of quality for the elements of a triangular mesh. This method adds to the mesh a cell array named "Quality". See class [vtkMeshQuality](https://vtk.org/doc/nightly/html/classvtkMeshQuality.html). Arguments: metric : (int) type of available estimators are: - EDGE RATIO, 0 - ASPECT RATIO, 1 - RADIUS RATIO, 2 - ASPECT FROBENIUS, 3 - MED ASPECT FROBENIUS, 4 - MAX ASPECT FROBENIUS, 5 - MIN_ANGLE, 6 - COLLAPSE RATIO, 7 - MAX ANGLE, 8 - CONDITION, 9 - SCALED JACOBIAN, 10 - SHEAR, 11 - RELATIVE SIZE SQUARED, 12 - SHAPE, 13 - SHAPE AND SIZE, 14 - DISTORTION, 15 - MAX EDGE RATIO, 16 - SKEW, 17 - TAPER, 18 - VOLUME, 19 - STRETCH, 20 - DIAGONAL, 21 - DIMENSION, 22 - ODDY, 23 - SHEAR AND SIZE, 24 - JACOBIAN, 25 - WARPAGE, 26 - ASPECT GAMMA, 27 - AREA, 28 - ASPECT BETA, 29 Examples: - [meshquality.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/meshquality.py) ![](https://vedo.embl.es/images/advanced/meshquality.png) """ qf = vtki.new("MeshQuality") qf.SetInputData(self.dataset) qf.SetTriangleQualityMeasure(metric) qf.SaveCellQualityOn() qf.Update() self._update(qf.GetOutput(), reset_locators=False) self.mapper.SetScalarModeToUseCellData() self.pipeline = OperationNode("compute_quality", parents=[self]) return self def count_vertices(self) -> np.ndarray: """Count the number of vertices each cell has and return it as a numpy array""" vc = vtki.new("CountVertices") vc.SetInputData(self.dataset) vc.SetOutputArrayName("VertexCount") vc.Update() varr = vc.GetOutput().GetCellData().GetArray("VertexCount") return vtk2numpy(varr) def check_validity(self, tol=0) -> np.ndarray: """ Return a numpy array of possible problematic faces following this convention: - Valid = 0 - WrongNumberOfPoints = 1 - IntersectingEdges = 2 - IntersectingFaces = 4 - NoncontiguousEdges = 8 - Nonconvex = 10 - OrientedIncorrectly = 20 Arguments: tol : (float) value is used as an epsilon for floating point equality checks throughout the cell checking process. """ vald = vtki.new("CellValidator") if tol: vald.SetTolerance(tol) vald.SetInputData(self.dataset) vald.Update() varr = vald.GetOutput().GetCellData().GetArray("ValidityState") return vtk2numpy(varr) def compute_curvature(self, method=0) -> Self: """ Add scalars to `Mesh` that contains the curvature calculated in three different ways. Variable `method` can be: - 0 = gaussian - 1 = mean curvature - 2 = max curvature - 3 = min curvature Example: ```python from vedo import Torus Torus().compute_curvature().add_scalarbar().show().close() ``` ![](https://vedo.embl.es/images/advanced/torus_curv.png) """ curve = vtki.new("Curvatures") curve.SetInputData(self.dataset) curve.SetCurvatureType(method) curve.Update() self._update(curve.GetOutput(), reset_locators=False) self.mapper.ScalarVisibilityOn() return self def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)) -> Self: """ Add to `Mesh` a scalar array that contains distance along a specified direction. Arguments: low : (list) one end of the line (small scalar values) high : (list) other end of the line (large scalar values) vrange : (list) set the range of the scalar Example: ```python from vedo import Sphere s = Sphere().compute_elevation(low=(0,0,0), high=(1,1,1)) s.add_scalarbar().show(axes=1).close() ``` ![](https://vedo.embl.es/images/basic/compute_elevation.png) """ ef = vtki.new("ElevationFilter") ef.SetInputData(self.dataset) ef.SetLowPoint(low) ef.SetHighPoint(high) ef.SetScalarRange(vrange) ef.Update() self._update(ef.GetOutput(), reset_locators=False) self.mapper.ScalarVisibilityOn() return self def laplacian_diffusion(self, array_name, dt, num_steps) -> Self: """ Apply a diffusion process to a scalar array defined on the points of a mesh. Arguments: array_name : (str) name of the array to diffuse. dt : (float) time step. num_steps : (int) number of iterations. """ try: import scipy.sparse import scipy.sparse.linalg except ImportError: vedo.logger.error("scipy not found. Cannot run laplacian_diffusion()") return self def build_laplacian(): rows = [] cols = [] data = [] n_points = points.shape[0] avg_area = np.mean(areas) * 10000 # print("avg_area", avg_area) for triangle in cells: for i in range(3): for j in range(i + 1, 3): u = triangle[i] v = triangle[j] rows.append(u) cols.append(v) rows.append(v) cols.append(u) data.append(-1/avg_area) data.append(-1/avg_area) L = scipy.sparse.coo_matrix( (data, (rows, cols)), shape=(n_points, n_points) ).tocsc() degree = -np.array(L.sum(axis=1)).flatten() # adjust the diagonal # print("degree", degree) L.setdiag(degree) return L def _diffuse(u0, L, dt, num_steps): # mean_area = np.mean(areas) * 10000 # print("mean_area", mean_area) mean_area = 1 I = scipy.sparse.eye(L.shape[0], format="csc") A = I - (dt/mean_area) * L u = u0 for _ in range(int(num_steps)): u = A.dot(u) return u self.compute_cell_size() areas = self.celldata["Area"] points = self.coordinates cells = self.cells u0 = self.pointdata[array_name] # Simulate diffusion L = build_laplacian() u = _diffuse(u0, L, dt, num_steps) self.pointdata[array_name] = u return self def subdivide(self, n=1, method=0, mel=None) -> Self: """ Increase the number of vertices of a surface mesh. Arguments: n : (int) number of subdivisions. method : (int) Loop(0), Linear(1), Adaptive(2), Butterfly(3), Centroid(4) mel : (float) Maximum Edge Length (applicable to Adaptive method only). """ triangles = vtki.new("TriangleFilter") triangles.SetInputData(self.dataset) triangles.Update() tri_mesh = triangles.GetOutput() if method == 0: sdf = vtki.new("LoopSubdivisionFilter") elif method == 1: sdf = vtki.new("LinearSubdivisionFilter") elif method == 2: sdf = vtki.new("AdaptiveSubdivisionFilter") if mel is None: mel = self.diagonal_size() / np.sqrt(self.dataset.GetNumberOfPoints()) / n sdf.SetMaximumEdgeLength(mel) elif method == 3: sdf = vtki.new("ButterflySubdivisionFilter") elif method == 4: sdf = vtki.new("DensifyPolyData") else: vedo.logger.error(f"in subdivide() unknown method {method}") raise RuntimeError() if method != 2: sdf.SetNumberOfSubdivisions(n) sdf.SetInputData(tri_mesh) sdf.Update() self._update(sdf.GetOutput()) self.pipeline = OperationNode( "subdivide", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self def decimate(self, fraction=0.5, n=None, preserve_volume=True, regularization=0.0) -> Self: """ Downsample the number of vertices in a mesh to `fraction`. This filter preserves the `pointdata` of the input dataset. In previous versions of vedo, this decimation algorithm was referred to as quadric decimation. Arguments: fraction : (float) the desired target of reduction. n : (int) the desired number of final points (`fraction` is recalculated based on it). preserve_volume : (bool) Decide whether to activate volume preservation which greatly reduces errors in triangle normal direction. regularization : (float) regularize the point finding algorithm so as to have better quality mesh elements at the cost of a slightly lower precision on the geometry potentially (mostly at sharp edges). Can be useful for decimating meshes that have been triangulated on noisy data. Note: Setting `fraction=0.1` leaves 10% of the original number of vertices. Internally the VTK class [vtkQuadricDecimation](https://vtk.org/doc/nightly/html/classvtkQuadricDecimation.html) is used for this operation. See also: `decimate_binned()` and `decimate_pro()`. """ poly = self.dataset if n: # N = desired number of points npt = poly.GetNumberOfPoints() fraction = n / npt if fraction >= 1: return self decimate = vtki.new("QuadricDecimation") decimate.SetVolumePreservation(preserve_volume) # decimate.AttributeErrorMetricOn() if regularization: decimate.SetRegularize(True) decimate.SetRegularization(regularization) try: decimate.MapPointDataOn() except AttributeError: pass decimate.SetTargetReduction(1 - fraction) decimate.SetInputData(poly) decimate.Update() self._update(decimate.GetOutput()) self.metadata["decimate_actual_fraction"] = 1 - decimate.GetActualReduction() self.pipeline = OperationNode( "decimate", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self def decimate_pro( self, fraction=0.5, n=None, preserve_topology=True, preserve_boundaries=True, splitting=False, splitting_angle=75, feature_angle=0, inflection_point_ratio=10, vertex_degree=0, ) -> Self: """ Downsample the number of vertices in a mesh to `fraction`. This filter preserves the `pointdata` of the input dataset. Arguments: fraction : (float) The desired target of reduction. Setting `fraction=0.1` leaves 10% of the original number of vertices. n : (int) the desired number of final points (`fraction` is recalculated based on it). preserve_topology : (bool) If on, mesh splitting and hole elimination will not occur. This may limit the maximum reduction that may be achieved. preserve_boundaries : (bool) Turn on/off the deletion of vertices on the boundary of a mesh. Control whether mesh boundaries are preserved during decimation. feature_angle : (float) Specify the angle that defines a feature. This angle is used to define what an edge is (i.e., if the surface normal between two adjacent triangles is >= FeatureAngle, an edge exists). splitting : (bool) Turn on/off the splitting of the mesh at corners, along edges, at non-manifold points, or anywhere else a split is required. Turning splitting off will better preserve the original topology of the mesh, but you may not obtain the requested reduction. splitting_angle : (float) Specify the angle that defines a sharp edge. This angle is used to control the splitting of the mesh. A split line exists when the surface normals between two edge connected triangles are >= `splitting_angle`. inflection_point_ratio : (float) An inflection point occurs when the ratio of reduction error between two iterations is greater than or equal to the `inflection_point_ratio` value. vertex_degree : (int) If the number of triangles connected to a vertex exceeds it then the vertex will be split. Note: Setting `fraction=0.1` leaves 10% of the original number of vertices See also: `decimate()` and `decimate_binned()`. """ poly = self.dataset if n: # N = desired number of points npt = poly.GetNumberOfPoints() fraction = n / npt if fraction >= 1: return self decimate = vtki.new("DecimatePro") decimate.SetPreserveTopology(preserve_topology) decimate.SetBoundaryVertexDeletion(preserve_boundaries) if feature_angle: decimate.SetFeatureAngle(feature_angle) decimate.SetSplitting(splitting) decimate.SetSplitAngle(splitting_angle) decimate.SetInflectionPointRatio(inflection_point_ratio) if vertex_degree: decimate.SetDegree(vertex_degree) decimate.SetTargetReduction(1 - fraction) decimate.SetInputData(poly) decimate.Update() self._update(decimate.GetOutput()) self.pipeline = OperationNode( "decimate_pro", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self def decimate_binned(self, divisions=(), use_clustering=False) -> Self: """ Downsample the number of vertices in a mesh. This filter preserves the `celldata` of the input dataset, if `use_clustering=True` also the `pointdata` will be preserved in the result. Arguments: divisions : (list) number of divisions along x, y and z axes. auto_adjust : (bool) if True, the number of divisions is automatically adjusted to create more uniform cells. use_clustering : (bool) use [vtkQuadricClustering](https://vtk.org/doc/nightly/html/classvtkQuadricClustering.html) instead of [vtkBinnedDecimation](https://vtk.org/doc/nightly/html/classvtkBinnedDecimation.html). See also: `decimate()` and `decimate_pro()`. """ if use_clustering: decimate = vtki.new("QuadricClustering") decimate.CopyCellDataOn() else: decimate = vtki.new("BinnedDecimation") decimate.ProducePointDataOn() decimate.ProduceCellDataOn() decimate.SetInputData(self.dataset) if len(divisions) == 0: decimate.SetAutoAdjustNumberOfDivisions(1) else: decimate.SetAutoAdjustNumberOfDivisions(0) decimate.SetNumberOfDivisions(divisions) decimate.Update() self._update(decimate.GetOutput()) self.metadata["decimate_binned_divisions"] = decimate.GetNumberOfDivisions() self.pipeline = OperationNode( "decimate_binned", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self def generate_random_points(self, n: int, min_radius=0.0) -> "Points": """ Generate `n` uniformly distributed random points inside the polygonal mesh. A new point data array is added to the output points called "OriginalCellID" which contains the index of the cell ID in which the point was generated. Arguments: n : (int) number of points to generate. min_radius: (float) impose a minimum distance between points. If `min_radius` is set to 0, the points are generated uniformly at random inside the mesh. If `min_radius` is set to a positive value, the points are generated uniformly at random inside the mesh, but points closer than `min_radius` to any other point are discarded. Returns a `vedo.Points` object. Note: Consider using `points.probe(msh)` or `points.interpolate_data_from(msh)` to interpolate existing mesh data onto the new points. Example: ```python from vedo import * msh = Mesh(dataurl + "panther.stl").lw(2) pts = msh.generate_random_points(20000, min_radius=0.5) print("Original cell ids:", pts.pointdata["OriginalCellID"]) show(pts, msh, axes=1).close() ``` """ cmesh = self.clone().clean().triangulate().compute_cell_size() triangles = cmesh.cells vertices = cmesh.vertices cumul = np.cumsum(cmesh.celldata["Area"]) out_pts = [] orig_cell = [] for _ in range(n): # choose a triangle based on area random_area = np.random.random() * cumul[-1] it = np.searchsorted(cumul, random_area) A, B, C = vertices[triangles[it]] # calculate the random point in the triangle r1, r2 = np.random.random(2) if r1 + r2 > 1: r1 = 1 - r1 r2 = 1 - r2 out_pts.append((1 - r1 - r2) * A + r1 * B + r2 * C) orig_cell.append(it) nporig_cell = np.array(orig_cell, dtype=np.uint32) vpts = Points(out_pts) vpts.pointdata["OriginalCellID"] = nporig_cell if min_radius > 0: vpts.subsample(min_radius, absolute=True) vpts.point_size(5).color("k1") vpts.name = "RandomPoints" vpts.pipeline = OperationNode( "generate_random_points", c="#edabab", parents=[self]) return vpts def delete_cells(self, ids: List[int]) -> Self: """ Remove cells from the mesh object by their ID. Points (vertices) are not removed (you may use `clean()` to remove those). """ self.dataset.BuildLinks() for cid in ids: self.dataset.DeleteCell(cid) self.dataset.RemoveDeletedCells() self.dataset.Modified() self.mapper.Modified() self.pipeline = OperationNode( "delete_cells", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", ) return self def delete_cells_by_point_index(self, indices: List[int]) -> Self: """ Delete a list of vertices identified by any of their vertex index. See also `delete_cells()`. Examples: - [delete_mesh_pts.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delete_mesh_pts.py) ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) """ cell_ids = vtki.vtkIdList() self.dataset.BuildLinks() n = 0 for i in np.unique(indices): self.dataset.GetPointCells(i, cell_ids) for j in range(cell_ids.GetNumberOfIds()): self.dataset.DeleteCell(cell_ids.GetId(j)) # flag cell n += 1 self.dataset.RemoveDeletedCells() self.dataset.Modified() self.pipeline = OperationNode("delete_cells_by_point_index", parents=[self]) return self def collapse_edges(self, distance: float, iterations=1) -> Self: """ Collapse mesh edges so that are all above `distance`. Example: ```python from vedo import * np.random.seed(2) grid1 = Grid().add_gaussian_noise(0.8).triangulate().lw(1) grid1.celldata['scalar'] = grid1.cell_centers().coordinates[:,1] grid2 = grid1.clone().collapse_edges(0.1) show(grid1, grid2, N=2, axes=1) ``` """ for _ in range(iterations): medges = self.edges pts = self.vertices newpts = np.array(pts) moved = [] for e in medges: if len(e) == 2: id0, id1 = e p0, p1 = pts[id0], pts[id1] if (np.linalg.norm(p1-p0) < distance and id0 not in moved and id1 not in moved ): p = (p0 + p1) / 2 newpts[id0] = p newpts[id1] = p moved += [id0, id1] self.vertices = newpts cpd = vtki.new("CleanPolyData") cpd.ConvertLinesToPointsOff() cpd.ConvertPolysToLinesOff() cpd.ConvertStripsToPolysOff() cpd.SetInputData(self.dataset) cpd.Update() self._update(cpd.GetOutput()) self.pipeline = OperationNode( "collapse_edges", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self def adjacency_list(self) -> List[set]: """ Computes the adjacency list for mesh edge-graph. Returns: a list with i-th entry being the set if indices of vertices connected by an edge to i-th vertex """ inc = [set()] * self.npoints for cell in self.cells: nc = len(cell) if nc > 1: for i in range(nc-1): ci = cell[i] inc[ci] = inc[ci].union({cell[i-1], cell[i+1]}) return inc def graph_ball(self, index, n: int) -> set: """ Computes the ball of radius `n` in the mesh' edge-graph metric centred in vertex `index`. Arguments: index : (int) index of the vertex n : (int) radius in the graph metric Returns: the set of indices of the vertices which are at most `n` edges from vertex `index`. """ if n == 0: return {index} else: al = self.adjacency_list() ball = {index} i = 0 while i < n and len(ball) < self.npoints: for v in ball: ball = ball.union(al[v]) i += 1 return ball def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, boundary=False) -> Self: """ Adjust mesh point positions using the so-called "Windowed Sinc" method. Arguments: niter : (int) number of iterations. pass_band : (float) set the pass_band value for the windowed sinc filter. edge_angle : (float) edge angle to control smoothing along edges (either interior or boundary). feature_angle : (float) specifies the feature angle for sharp edge identification. boundary : (bool) specify if boundary should also be smoothed or kept unmodified Examples: - [mesh_smoother1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/mesh_smoother1.py) ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ cl = vtki.new("CleanPolyData") cl.SetInputData(self.dataset) cl.Update() smf = vtki.new("WindowedSincPolyDataFilter") smf.SetInputData(cl.GetOutput()) smf.SetNumberOfIterations(niter) smf.SetEdgeAngle(edge_angle) smf.SetFeatureAngle(feature_angle) smf.SetPassBand(pass_band) smf.NormalizeCoordinatesOn() smf.NonManifoldSmoothingOn() smf.FeatureEdgeSmoothingOn() smf.SetBoundarySmoothing(boundary) smf.Update() self._update(smf.GetOutput()) self.pipeline = OperationNode( "smooth", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self def fill_holes(self, size=None) -> Self: """ Identifies and fills holes in the input mesh. Holes are identified by locating boundary edges, linking them together into loops, and then triangulating the resulting loops. Arguments: size : (float) Approximate limit to the size of the hole that can be filled. Examples: - [fillholes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/fillholes.py) """ fh = vtki.new("FillHolesFilter") if not size: mb = self.diagonal_size() size = mb / 10 fh.SetHoleSize(size) fh.SetInputData(self.dataset) fh.Update() self._update(fh.GetOutput()) self.pipeline = OperationNode( "fill_holes", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self def contains(self, point: tuple, tol=1e-05) -> bool: """ Return True if point is inside a polydata closed surface. Note: if you have many points to check use `inside_points()` instead. Example: ```python from vedo import * s = Sphere().c('green5').alpha(0.5) pt = [0.1, 0.2, 0.3] print("Sphere contains", pt, s.contains(pt)) show(s, Point(pt), axes=1).close() ``` """ points = vtki.vtkPoints() points.InsertNextPoint(point) poly = vtki.vtkPolyData() poly.SetPoints(points) sep = vtki.new("SelectEnclosedPoints") sep.SetTolerance(tol) sep.CheckSurfaceOff() sep.SetInputData(poly) sep.SetSurfaceData(self.dataset) sep.Update() return bool(sep.IsInside(0)) def inside_points(self, pts: Union["Points", list], invert=False, tol=1e-05, return_ids=False) -> Union["Points", np.ndarray]: """ Return the point cloud that is inside mesh surface as a new Points object. If return_ids is True a list of IDs is returned and in addition input points are marked by a pointdata array named "IsInside". Example: `print(pts.pointdata["IsInside"])` Examples: - [pca_ellipsoid.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/pca_ellipsoid.py) ![](https://vedo.embl.es/images/basic/pca.png) """ if isinstance(pts, Points): poly = pts.dataset ptsa = pts.coordinates else: ptsa = np.asarray(pts) vpoints = vtki.vtkPoints() vpoints.SetData(numpy2vtk(ptsa, dtype=np.float32)) poly = vtki.vtkPolyData() poly.SetPoints(vpoints) sep = vtki.new("SelectEnclosedPoints") # sep = vtki.new("ExtractEnclosedPoints() sep.SetTolerance(tol) sep.SetInputData(poly) sep.SetSurfaceData(self.dataset) sep.SetInsideOut(invert) sep.Update() varr = sep.GetOutput().GetPointData().GetArray("SelectedPoints") mask = vtk2numpy(varr).astype(bool) ids = np.array(range(len(ptsa)), dtype=int)[mask] if isinstance(pts, Points): varr.SetName("IsInside") pts.dataset.GetPointData().AddArray(varr) if return_ids: return ids pcl = Points(ptsa[ids]) pcl.name = "InsidePoints" pcl.pipeline = OperationNode( "inside_points", parents=[self, ptsa], comment=f"#pts {pcl.dataset.GetNumberOfPoints()}", ) return pcl def boundaries( self, boundary_edges=True, manifold_edges=False, non_manifold_edges=False, feature_angle=None, return_point_ids=False, return_cell_ids=False, cell_edge=False, ) -> Union[Self, np.ndarray]: """ Return the boundary lines of an input mesh. Check also `vedo.core.CommonAlgorithms.mark_boundaries()` method. Arguments: boundary_edges : (bool) Turn on/off the extraction of boundary edges. manifold_edges : (bool) Turn on/off the extraction of manifold edges. non_manifold_edges : (bool) Turn on/off the extraction of non-manifold edges. feature_angle : (bool) Specify the min angle btw 2 faces for extracting edges. return_point_ids : (bool) return a numpy array of point indices return_cell_ids : (bool) return a numpy array of cell indices cell_edge : (bool) set to `True` if a cell need to share an edge with the boundary line, or `False` if a single vertex is enough Examples: - [boundaries.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boundaries.py) ![](https://vedo.embl.es/images/basic/boundaries.png) """ fe = vtki.new("FeatureEdges") fe.SetBoundaryEdges(boundary_edges) fe.SetNonManifoldEdges(non_manifold_edges) fe.SetManifoldEdges(manifold_edges) try: fe.SetPassLines(True) # vtk9.2 except AttributeError: pass fe.ColoringOff() fe.SetFeatureEdges(False) if feature_angle is not None: fe.SetFeatureEdges(True) fe.SetFeatureAngle(feature_angle) if return_point_ids or return_cell_ids: idf = vtki.new("IdFilter") idf.SetInputData(self.dataset) idf.SetPointIdsArrayName("BoundaryIds") idf.SetPointIds(True) idf.Update() fe.SetInputData(idf.GetOutput()) fe.Update() vid = fe.GetOutput().GetPointData().GetArray("BoundaryIds") npid = vtk2numpy(vid).astype(int) if return_point_ids: return npid if return_cell_ids: n = 1 if cell_edge else 0 inface = [] for i, face in enumerate(self.cells): # isin = np.any([vtx in npid for vtx in face]) isin = 0 for vtx in face: isin += int(vtx in npid) if isin > n: break if isin > n: inface.append(i) return np.array(inface).astype(int) return self else: fe.SetInputData(self.dataset) fe.Update() msh = Mesh(fe.GetOutput(), c="p").lw(5).lighting("off") msh.name = "MeshBoundaries" msh.pipeline = OperationNode( "boundaries", parents=[self], shape="octagon", comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) return msh def imprint(self, loopline, tol=0.01) -> Self: """ Imprint the contact surface of one object onto another surface. Arguments: loopline : (vedo.Line) a Line object to be imprinted onto the mesh. tol : (float) projection tolerance which controls how close the imprint surface must be to the target. Example: ```python from vedo import * grid = Grid()#.triangulate() circle = Circle(r=0.3, res=24).pos(0.11,0.12) line = Line(circle, closed=True, lw=4, c='r4') grid.imprint(line) show(grid, line, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/imprint.png) """ loop = vtki.new("ContourLoopExtraction") loop.SetInputData(loopline.dataset) loop.Update() clean_loop = vtki.new("CleanPolyData") clean_loop.SetInputData(loop.GetOutput()) clean_loop.Update() imp = vtki.new("ImprintFilter") imp.SetTargetData(self.dataset) imp.SetImprintData(clean_loop.GetOutput()) imp.SetTolerance(tol) imp.BoundaryEdgeInsertionOn() imp.TriangulateOutputOn() imp.Update() self._update(imp.GetOutput()) self.pipeline = OperationNode( "imprint", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self def connected_vertices(self, index: int) -> List[int]: """Find all vertices connected to an input vertex specified by its index. Examples: - [connected_vtx.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/connected_vtx.py) ![](https://vedo.embl.es/images/basic/connVtx.png) """ poly = self.dataset cell_idlist = vtki.vtkIdList() poly.GetPointCells(index, cell_idlist) idxs = [] for i in range(cell_idlist.GetNumberOfIds()): point_idlist = vtki.vtkIdList() poly.GetCellPoints(cell_idlist.GetId(i), point_idlist) for j in range(point_idlist.GetNumberOfIds()): idj = point_idlist.GetId(j) if idj == index: continue if idj in idxs: continue idxs.append(idj) return idxs def extract_cells(self, ids: List[int]) -> Self: """ Extract a subset of cells from a mesh and return it as a new mesh. """ selectCells = vtki.new("SelectionNode") selectCells.SetFieldType(vtki.get_class("SelectionNode").CELL) selectCells.SetContentType(vtki.get_class("SelectionNode").INDICES) idarr = vtki.vtkIdTypeArray() idarr.SetNumberOfComponents(1) idarr.SetNumberOfValues(len(ids)) for i, v in enumerate(ids): idarr.SetValue(i, v) selectCells.SetSelectionList(idarr) selection = vtki.new("Selection") selection.AddNode(selectCells) extractSelection = vtki.new("ExtractSelection") extractSelection.SetInputData(0, self.dataset) extractSelection.SetInputData(1, selection) extractSelection.Update() gf = vtki.new("GeometryFilter") gf.SetInputData(extractSelection.GetOutput()) gf.Update() msh = Mesh(gf.GetOutput()) msh.copy_properties_from(self) return msh def connected_cells(self, index: int, return_ids=False) -> Union[Self, List[int]]: """Find all cellls connected to an input vertex specified by its index.""" # Find all cells connected to point index dpoly = self.dataset idlist = vtki.vtkIdList() dpoly.GetPointCells(index, idlist) ids = vtki.vtkIdTypeArray() ids.SetNumberOfComponents(1) rids = [] for k in range(idlist.GetNumberOfIds()): cid = idlist.GetId(k) ids.InsertNextValue(cid) rids.append(int(cid)) if return_ids: return rids selection_node = vtki.new("SelectionNode") selection_node.SetFieldType(vtki.get_class("SelectionNode").CELL) selection_node.SetContentType(vtki.get_class("SelectionNode").INDICES) selection_node.SetSelectionList(ids) selection = vtki.new("Selection") selection.AddNode(selection_node) extractSelection = vtki.new("ExtractSelection") extractSelection.SetInputData(0, dpoly) extractSelection.SetInputData(1, selection) extractSelection.Update() gf = vtki.new("GeometryFilter") gf.SetInputData(extractSelection.GetOutput()) gf.Update() return Mesh(gf.GetOutput()).lw(1) def silhouette(self, direction=None, border_edges=True, feature_angle=False) -> Self: """ Return a new line `Mesh` which corresponds to the outer `silhouette` of the input as seen along a specified `direction`, this can also be a `vtkCamera` object. Arguments: direction : (list) viewpoint direction vector. If `None` this is guessed by looking at the minimum of the sides of the bounding box. border_edges : (bool) enable or disable generation of border edges feature_angle : (float) minimal angle for sharp edges detection. If set to `False` the functionality is disabled. Examples: - [silhouette1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/silhouette1.py) ![](https://vedo.embl.es/images/basic/silhouette1.png) """ sil = vtki.new("PolyDataSilhouette") sil.SetInputData(self.dataset) sil.SetBorderEdges(border_edges) if feature_angle is False: sil.SetEnableFeatureAngle(0) else: sil.SetEnableFeatureAngle(1) sil.SetFeatureAngle(feature_angle) if direction is None and vedo.plotter_instance and vedo.plotter_instance.camera: sil.SetCamera(vedo.plotter_instance.camera) m = Mesh() m.mapper.SetInputConnection(sil.GetOutputPort()) elif isinstance(direction, vtki.vtkCamera): sil.SetCamera(direction) m = Mesh() m.mapper.SetInputConnection(sil.GetOutputPort()) elif direction == "2d": sil.SetVector(3.4, 4.5, 5.6) # random sil.SetDirectionToSpecifiedVector() sil.Update() m = Mesh(sil.GetOutput()) elif is_sequence(direction): sil.SetVector(direction) sil.SetDirectionToSpecifiedVector() sil.Update() m = Mesh(sil.GetOutput()) else: vedo.logger.error(f"in silhouette() unknown direction type {type(direction)}") vedo.logger.error("first render the scene with show() or specify camera/direction") return self m.lw(2).c((0, 0, 0)).lighting("off") m.mapper.SetResolveCoincidentTopologyToPolygonOffset() m.pipeline = OperationNode("silhouette", parents=[self]) m.name = "Silhouette" return m def isobands(self, n=10, vmin=None, vmax=None) -> Self: """ Return a new `Mesh` representing the isobands of the active scalars. This is a new mesh where the scalar is now associated to cell faces and used to colorize the mesh. Arguments: n : (int) number of isobands in the range vmin : (float) minimum of the range vmax : (float) maximum of the range Examples: - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/isolines.py) """ r0, r1 = self.dataset.GetScalarRange() if vmin is None: vmin = r0 if vmax is None: vmax = r1 # -------------------------------- bands = [] dx = (vmax - vmin) / float(n) b = [vmin, vmin + dx / 2.0, vmin + dx] i = 0 while i < n: bands.append(b) b = [b[0] + dx, b[1] + dx, b[2] + dx] i += 1 # annotate, use the midpoint of the band as the label lut = self.mapper.GetLookupTable() labels = [] for b in bands: labels.append("{:4.2f}".format(b[1])) values = vtki.vtkVariantArray() for la in labels: values.InsertNextValue(vtki.vtkVariant(la)) for i in range(values.GetNumberOfTuples()): lut.SetAnnotation(i, values.GetValue(i).ToString()) bcf = vtki.new("BandedPolyDataContourFilter") bcf.SetInputData(self.dataset) # Use either the minimum or maximum value for each band. for i, band in enumerate(bands): bcf.SetValue(i, band[2]) # We will use an indexed lookup table. bcf.SetScalarModeToIndex() bcf.GenerateContourEdgesOff() bcf.Update() bcf.GetOutput().GetCellData().GetScalars().SetName("IsoBands") m1 = Mesh(bcf.GetOutput()).compute_normals(cells=True) m1.mapper.SetLookupTable(lut) m1.mapper.SetScalarRange(lut.GetRange()) m1.pipeline = OperationNode("isobands", parents=[self]) m1.name = "IsoBands" return m1 def isolines(self, n=10, vmin=None, vmax=None) -> Self: """ Return a new `Mesh` representing the isolines of the active scalars. Arguments: n : (int, list) number of isolines in the range, a list of specific values can also be passed. vmin : (float) minimum of the range vmax : (float) maximum of the range Examples: - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/isolines.py) ![](https://vedo.embl.es/images/pyplot/isolines.png) """ bcf = vtki.new("ContourFilter") bcf.SetInputData(self.dataset) r0, r1 = self.dataset.GetScalarRange() if vmin is None: vmin = r0 if vmax is None: vmax = r1 if is_sequence(n): i=0 for j in range(len(n)): if vmin<=n[j]<=vmax: bcf.SetValue(i, n[i]) i += 1 else: #print("value out of range") continue else: bcf.GenerateValues(n, vmin, vmax) bcf.Update() sf = vtki.new("Stripper") sf.SetJoinContiguousSegments(True) sf.SetInputData(bcf.GetOutput()) sf.Update() cl = vtki.new("CleanPolyData") cl.SetInputData(sf.GetOutput()) cl.Update() msh = Mesh(cl.GetOutput(), c="k").lighting("off") msh.mapper.SetResolveCoincidentTopologyToPolygonOffset() msh.pipeline = OperationNode("isolines", parents=[self]) msh.name = "IsoLines" return msh def extrude(self, zshift=1.0, direction=(), rotation=0.0, dr=0.0, cap=True, res=1) -> Self: """ Sweep a polygonal data creating a "skirt" from free edges and lines, and lines from vertices. The input dataset is swept around the z-axis to create new polygonal primitives. For example, sweeping a line results in a cylindrical shell, and sweeping a circle creates a torus. You can control whether the sweep of a 2D object (i.e., polygon or triangle strip) is capped with the generating geometry. Also, you can control the angle of rotation, and whether translation along the z-axis is performed along with the rotation. (Translation is useful for creating "springs"). You also can adjust the radius of the generating geometry using the "dR" keyword. The skirt is generated by locating certain topological features. Free edges (edges of polygons or triangle strips only used by one polygon or triangle strips) generate surfaces. This is true also of lines or polylines. Vertices generate lines. This filter can be used to model axisymmetric objects like cylinders, bottles, and wine glasses; or translational/rotational symmetric objects like springs or corkscrews. Arguments: zshift : (float) shift along z axis. direction : (list) extrusion direction in the xy plane. note that zshift is forced to be the 3rd component of direction, which is therefore ignored. rotation : (float) set the angle of rotation. dr : (float) set the radius variation in absolute units. cap : (bool) enable or disable capping. res : (int) set the resolution of the generating geometry. Warning: Some polygonal objects have no free edges (e.g., sphere). When swept, this will result in two separate surfaces if capping is on, or no surface if capping is off. Examples: - [extrude.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/extrude.py) ![](https://vedo.embl.es/images/basic/extrude.png) """ rf = vtki.new("RotationalExtrusionFilter") # rf = vtki.new("LinearExtrusionFilter") rf.SetInputData(self.dataset) # must not be transformed rf.SetResolution(res) rf.SetCapping(cap) rf.SetAngle(rotation) rf.SetTranslation(zshift) rf.SetDeltaRadius(dr) rf.Update() # convert triangle strips to polygonal data tris = vtki.new("TriangleFilter") tris.SetInputData(rf.GetOutput()) tris.Update() m = Mesh(tris.GetOutput()) if len(direction) > 1: p = self.pos() LT = vedo.LinearTransform() LT.translate(-p) LT.concatenate([ [1, 0, direction[0]], [0, 1, direction[1]], [0, 0, 1] ]) LT.translate(p) m.apply_transform(LT) m.copy_properties_from(self).flat().lighting("default") m.pipeline = OperationNode( "extrude", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) m.name = "ExtrudedMesh" return m def extrude_and_trim_with( self, surface: "Mesh", direction=(), strategy="all", cap=True, cap_strategy="max", ) -> Self: """ Extrude a Mesh and trim it with an input surface mesh. Arguments: surface : (Mesh) the surface mesh to trim with. direction : (list) extrusion direction in the xy plane. strategy : (str) either "boundary_edges" or "all_edges". cap : (bool) enable or disable capping. cap_strategy : (str) either "intersection", "minimum_distance", "maximum_distance", "average_distance". The input Mesh is swept along a specified direction forming a "skirt" from the boundary edges 2D primitives (i.e., edges used by only one polygon); and/or from vertices and lines. The extent of the sweeping is limited by a second input: defined where the sweep intersects a user-specified surface. Capping of the extrusion can be enabled. In this case the input, generating primitive is copied inplace as well as to the end of the extrusion skirt. (See warnings below on what happens if the intersecting sweep does not intersect, or partially intersects the trim surface.) Note that this method operates in two fundamentally different modes based on the extrusion strategy. If the strategy is "boundary_edges", then only the boundary edges of the input's 2D primitives are extruded (verts and lines are extruded to generate lines and quads). However, if the extrusions strategy is "all_edges", then every edge of the 2D primitives is used to sweep out a quadrilateral polygon (again verts and lines are swept to produce lines and quads). Warning: The extrusion direction is assumed to define an infinite line. The intersection with the trim surface is along a ray from the - to + direction, however only the first intersection is taken. Some polygonal objects have no free edges (e.g., sphere). When swept, this will result in two separate surfaces if capping is on and "boundary_edges" enabled, or no surface if capping is off and "boundary_edges" is enabled. If all the extrusion lines emanating from an extruding primitive do not intersect the trim surface, then no output for that primitive will be generated. In extreme cases, it is possible that no output whatsoever will be generated. Example: ```python from vedo import * sphere = Sphere([-1,0,4]).rotate_x(25).wireframe().color('red5') circle = Circle([0,0,0], r=2, res=100).color('b6') extruded_circle = circle.extrude_and_trim_with( sphere, direction=[0,-0.2,1], strategy="bound", cap=True, cap_strategy="intersection", ) circle.lw(3).color("tomato").shift(dz=-0.1) show(circle, sphere, extruded_circle, axes=1).close() ``` """ trimmer = vtki.new("TrimmedExtrusionFilter") trimmer.SetInputData(self.dataset) trimmer.SetCapping(cap) trimmer.SetExtrusionDirection(direction) trimmer.SetTrimSurfaceData(surface.dataset) if "bound" in strategy: trimmer.SetExtrusionStrategyToBoundaryEdges() elif "all" in strategy: trimmer.SetExtrusionStrategyToAllEdges() else: vedo.logger.warning(f"extrude_and_trim(): unknown strategy {strategy}") # print (trimmer.GetExtrusionStrategy()) if "intersect" in cap_strategy: trimmer.SetCappingStrategyToIntersection() elif "min" in cap_strategy: trimmer.SetCappingStrategyToMinimumDistance() elif "max" in cap_strategy: trimmer.SetCappingStrategyToMaximumDistance() elif "ave" in cap_strategy: trimmer.SetCappingStrategyToAverageDistance() else: vedo.logger.warning(f"extrude_and_trim(): unknown cap_strategy {cap_strategy}") # print (trimmer.GetCappingStrategy()) trimmer.Update() m = Mesh(trimmer.GetOutput()) m.copy_properties_from(self).flat().lighting("default") m.pipeline = OperationNode( "extrude_and_trim", parents=[self, surface], comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) m.name = "ExtrudedAndTrimmedMesh" return m def split( self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=True ) -> List[Self]: """ Split a mesh by connectivity and order the pieces by increasing area. Arguments: maxdepth : (int) only consider this maximum number of mesh parts. flag : (bool) if set to True return the same single object, but add a "RegionId" array to flag the mesh subparts must_share_edge : (bool) if True, mesh regions that only share single points will be split. sort_by_area : (bool) if True, sort the mesh parts by decreasing area. Examples: - [splitmesh.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/splitmesh.py) ![](https://vedo.embl.es/images/advanced/splitmesh.png) """ pd = self.dataset if must_share_edge: if pd.GetNumberOfPolys() == 0: vedo.logger.warning("in split(): no polygons found. Skip.") return [self] cf = vtki.new("PolyDataEdgeConnectivityFilter") cf.BarrierEdgesOff() else: cf = vtki.new("PolyDataConnectivityFilter") cf.SetInputData(pd) cf.SetExtractionModeToAllRegions() cf.SetColorRegions(True) cf.Update() out = cf.GetOutput() if not out.GetNumberOfPoints(): return [self] if flag: self.pipeline = OperationNode("split mesh", parents=[self]) self._update(out) return [self] msh = Mesh(out) if must_share_edge: arr = msh.celldata["RegionId"] on = "cells" else: arr = msh.pointdata["RegionId"] on = "points" alist = [] for t in range(max(arr) + 1): if t == maxdepth: break suba = msh.clone().threshold("RegionId", t, t, on=on) if sort_by_area: area = suba.area() else: area = 0 # dummy suba.name = "MeshRegion" + str(t) alist.append([suba, area]) if sort_by_area: alist.sort(key=lambda x: x[1]) alist.reverse() blist = [] for i, l in enumerate(alist): l[0].color(i + 1).phong() l[0].mapper.ScalarVisibilityOff() blist.append(l[0]) if i < 10: l[0].pipeline = OperationNode( f"split mesh {i}", parents=[self], comment=f"#pts {l[0].dataset.GetNumberOfPoints()}", ) return blist def extract_largest_region(self) -> Self: """ Extract the largest connected part of a mesh and discard all the smaller pieces. Examples: - [largestregion.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/largestregion.py) """ conn = vtki.new("PolyDataConnectivityFilter") conn.SetExtractionModeToLargestRegion() conn.ScalarConnectivityOff() conn.SetInputData(self.dataset) conn.Update() m = Mesh(conn.GetOutput()) m.copy_properties_from(self) m.pipeline = OperationNode( "extract_largest_region", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}", ) m.name = "MeshLargestRegion" return m def boolean(self, operation: str, mesh2, method=0, tol=None) -> Self: """Volumetric union, intersection and subtraction of surfaces. Use `operation` for the allowed operations `['plus', 'intersect', 'minus']`. Two possible algorithms are available. Setting `method` to 0 (the default) uses the boolean operation algorithm written by Cory Quammen, Chris Weigle, and Russ Taylor (https://doi.org/10.54294/216g01); setting `method` to 1 will use the "loop" boolean algorithm written by Adam Updegrove (https://doi.org/10.1016/j.advengsoft.2016.01.015). Use `tol` to specify the absolute tolerance used to determine when the distance between two points is considered to be zero (defaults to 1e-6). Example: - [boolean.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boolean.py) ![](https://vedo.embl.es/images/basic/boolean.png) """ if method == 0: bf = vtki.new("BooleanOperationPolyDataFilter") elif method == 1: bf = vtki.new("LoopBooleanPolyDataFilter") else: raise ValueError(f"Unknown method={method}") poly1 = self.compute_normals().dataset poly2 = mesh2.compute_normals().dataset if operation.lower() in ("plus", "+"): bf.SetOperationToUnion() elif operation.lower() == "intersect": bf.SetOperationToIntersection() elif operation.lower() in ("minus", "-"): bf.SetOperationToDifference() if tol: bf.SetTolerance(tol) bf.SetInputData(0, poly1) bf.SetInputData(1, poly2) bf.Update() msh = Mesh(bf.GetOutput(), c=None) msh.flat() msh.pipeline = OperationNode( "boolean " + operation, parents=[self, mesh2], shape="cylinder", comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) msh.name = self.name + operation + mesh2.name return msh def intersect_with(self, mesh2, tol=1e-06) -> Self: """ Intersect this Mesh with the input surface to return a set of lines. Examples: - [surf_intersect.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/surf_intersect.py) ![](https://vedo.embl.es/images/basic/surfIntersect.png) """ bf = vtki.new("IntersectionPolyDataFilter") bf.SetGlobalWarningDisplay(0) bf.SetTolerance(tol) bf.SetInputData(0, self.dataset) bf.SetInputData(1, mesh2.dataset) bf.Update() msh = Mesh(bf.GetOutput(), c="k", alpha=1).lighting("off") msh.properties.SetLineWidth(3) msh.pipeline = OperationNode( "intersect_with", parents=[self, mesh2], comment=f"#pts {msh.npoints}" ) msh.name = "SurfaceIntersection" return msh def intersect_with_line(self, p0, p1=None, return_ids=False, tol=0) -> Union[np.ndarray, Tuple[np.ndarray, np.ndarray]]: """ Return the list of points intersecting the mesh along the segment defined by two points `p0` and `p1`. Use `return_ids` to return the cell ids along with point coords Example: ```python from vedo import * s = Spring() pts = s.intersect_with_line([0,0,0], [1,0.1,0]) ln = Line([0,0,0], [1,0.1,0], c='blue') ps = Points(pts, r=10, c='r') show(s, ln, ps, bg='white').close() ``` ![](https://user-images.githubusercontent.com/32848391/55967065-eee08300-5c79-11e9-8933-265e1bab9f7e.png) """ if isinstance(p0, Points): p0, p1 = p0.coordinates if not self.line_locator: self.line_locator = vtki.new("OBBTree") self.line_locator.SetDataSet(self.dataset) if not tol: tol = mag(np.asarray(p1) - np.asarray(p0)) / 10000 self.line_locator.SetTolerance(tol) self.line_locator.BuildLocator() vpts = vtki.vtkPoints() idlist = vtki.vtkIdList() self.line_locator.IntersectWithLine(p0, p1, vpts, idlist) pts = [] for i in range(vpts.GetNumberOfPoints()): intersection: MutableSequence[float] = [0, 0, 0] vpts.GetPoint(i, intersection) pts.append(intersection) pts2 = np.array(pts) if return_ids: pts_ids = [] for i in range(idlist.GetNumberOfIds()): cid = idlist.GetId(i) pts_ids.append(cid) return (pts2, np.array(pts_ids).astype(np.uint32)) return pts2 def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)) -> Self: """ Intersect this Mesh with a plane to return a set of lines. Example: ```python from vedo import * sph = Sphere() mi = sph.clone().intersect_with_plane().join() print(mi.lines) show(sph, mi, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/intersect_plane.png) """ plane = vtki.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) cutter = vtki.new("PolyDataPlaneCutter") cutter.SetInputData(self.dataset) cutter.SetPlane(plane) cutter.InterpolateAttributesOn() cutter.ComputeNormalsOff() cutter.Update() msh = Mesh(cutter.GetOutput()) msh.c('k').lw(3).lighting("off") msh.pipeline = OperationNode( "intersect_with_plan", parents=[self], comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) msh.name = "PlaneIntersection" return msh def cut_closed_surface(self, origins, normals, invert=False, return_assembly=False) -> Union[Self, "vedo.Assembly"]: """ Cut/clip a closed surface mesh with a collection of planes. This will produce a new closed surface by creating new polygonal faces where the input surface hits the planes. The orientation of the polygons that form the surface is important. Polygons have a front face and a back face, and it's the back face that defines the interior or "solid" region of the closed surface. When a plane cuts through a "solid" region, a new cut face is generated, but not when a clipping plane cuts through a hole or "empty" region. This distinction is crucial when dealing with complex surfaces. Note that if a simple surface has its back faces pointing outwards, then that surface defines a hole in a potentially infinite solid. Non-manifold surfaces should not be used with this method. Arguments: origins : (list) list of plane origins normals : (list) list of plane normals invert : (bool) invert the clipping. return_assembly : (bool) return the cap and the clipped surfaces as a `vedo.Assembly`. Example: ```python from vedo import * s = Sphere(res=50).linewidth(1) origins = [[-0.7, 0, 0], [0, -0.6, 0]] normals = [[-1, 0, 0], [0, -1, 0]] s.cut_closed_surface(origins, normals) show(s, axes=1).close() ``` """ planes = vtki.new("PlaneCollection") for p, s in zip(origins, normals): plane = vtki.vtkPlane() plane.SetOrigin(vedo.utils.make3d(p)) plane.SetNormal(vedo.utils.make3d(s)) planes.AddItem(plane) clipper = vtki.new("ClipClosedSurface") clipper.SetInputData(self.dataset) clipper.SetClippingPlanes(planes) clipper.PassPointDataOn() clipper.GenerateFacesOn() clipper.SetScalarModeToLabels() clipper.TriangulationErrorDisplayOn() clipper.SetInsideOut(not invert) if return_assembly: clipper.GenerateClipFaceOutputOn() clipper.Update() parts = [] for i in range(clipper.GetNumberOfOutputPorts()): msh = Mesh(clipper.GetOutput(i)) msh.copy_properties_from(self) msh.name = "CutClosedSurface" msh.pipeline = OperationNode( "cut_closed_surface", parents=[self], comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) parts.append(msh) asse = vedo.Assembly(parts) asse.name = "CutClosedSurface" return asse else: clipper.GenerateClipFaceOutputOff() clipper.Update() self._update(clipper.GetOutput()) self.flat() self.name = "CutClosedSurface" self.pipeline = OperationNode( "cut_closed_surface", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self def collide_with(self, mesh2, tol=0, return_bool=False) -> Union[Self, bool]: """ Collide this Mesh with the input surface. Information is stored in `ContactCells1` and `ContactCells2`. """ ipdf = vtki.new("CollisionDetectionFilter") # ipdf.SetGlobalWarningDisplay(0) transform0 = vtki.vtkTransform() transform1 = vtki.vtkTransform() # ipdf.SetBoxTolerance(tol) ipdf.SetCellTolerance(tol) ipdf.SetInputData(0, self.dataset) ipdf.SetInputData(1, mesh2.dataset) ipdf.SetTransform(0, transform0) ipdf.SetTransform(1, transform1) if return_bool: ipdf.SetCollisionModeToFirstContact() else: ipdf.SetCollisionModeToAllContacts() ipdf.Update() if return_bool: return bool(ipdf.GetNumberOfContacts()) msh = Mesh(ipdf.GetContactsOutput(), "k", 1).lighting("off") msh.metadata["ContactCells1"] = vtk2numpy( ipdf.GetOutput(0).GetFieldData().GetArray("ContactCells") ) msh.metadata["ContactCells2"] = vtk2numpy( ipdf.GetOutput(1).GetFieldData().GetArray("ContactCells") ) msh.properties.SetLineWidth(3) msh.pipeline = OperationNode( "collide_with", parents=[self, mesh2], comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) msh.name = "SurfaceCollision" return msh def geodesic(self, start, end) -> Self: """ Dijkstra algorithm to compute the geodesic line. Takes as input a polygonal mesh and performs a single source shortest path calculation. The output mesh contains the array "VertexIDs" that contains the ordered list of vertices traversed to get from the start vertex to the end vertex. Arguments: start : (int, list) start vertex index or close point `[x,y,z]` end : (int, list) end vertex index or close point `[x,y,z]` Examples: - [geodesic_curve.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/geodesic_curve.py) ![](https://vedo.embl.es/images/advanced/geodesic.png) """ if is_sequence(start): cc = self.coordinates pa = Points(cc) start = pa.closest_point(start, return_point_id=True) end = pa.closest_point(end, return_point_id=True) dijkstra = vtki.new("DijkstraGraphGeodesicPath") dijkstra.SetInputData(self.dataset) dijkstra.SetStartVertex(end) # inverted in vtk dijkstra.SetEndVertex(start) dijkstra.Update() weights = vtki.vtkDoubleArray() dijkstra.GetCumulativeWeights(weights) idlist = dijkstra.GetIdList() ids = [idlist.GetId(i) for i in range(idlist.GetNumberOfIds())] length = weights.GetMaxId() + 1 arr = np.zeros(length) for i in range(length): arr[i] = weights.GetTuple(i)[0] poly = dijkstra.GetOutput() vdata = numpy2vtk(arr) vdata.SetName("CumulativeWeights") poly.GetPointData().AddArray(vdata) vdata2 = numpy2vtk(ids, dtype=np.uint) vdata2.SetName("VertexIDs") poly.GetPointData().AddArray(vdata2) poly.GetPointData().Modified() dmesh = Mesh(poly).copy_properties_from(self) dmesh.lw(3).alpha(1).lighting("off") dmesh.name = "GeodesicLine" dmesh.pipeline = OperationNode( "GeodesicLine", parents=[self], comment=f"#steps {poly.GetNumberOfPoints()}", ) return dmesh ##################################################################### ### Stuff returning a Volume object ##################################################################### def binarize( self, values=(255, 0), spacing=None, dims=None, origin=None, ) -> "vedo.Volume": """ Convert a `Mesh` into a `Volume` where the interior voxels value is set to `values[0]` (255 by default), while the exterior voxels value is set to `values[1]` (0 by default). Arguments: values : (list) background and foreground values. spacing : (list) voxel spacing in x, y and z. dims : (list) dimensions (nr. of voxels) of the output volume. origin : (list) position in space of the (0,0,0) voxel. Examples: - [mesh2volume.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/mesh2volume.py) ![](https://vedo.embl.es/images/volumetric/mesh2volume.png) """ assert len(values) == 2, "values must be a list of 2 values" fg_value, bg_value = values bounds = self.bounds() if spacing is None: # compute spacing spacing = [0, 0, 0] diagonal = np.sqrt( (bounds[1] - bounds[0]) ** 2 + (bounds[3] - bounds[2]) ** 2 + (bounds[5] - bounds[4]) ** 2 ) spacing[0] = spacing[1] = spacing[2] = diagonal / 250.0 if dims is None: # compute dimensions dim = [0, 0, 0] for i in [0, 1, 2]: dim[i] = int(np.ceil((bounds[i*2+1] - bounds[i*2]) / spacing[i])) else: dim = dims white_img = vtki.vtkImageData() white_img.SetDimensions(dim) white_img.SetSpacing(spacing) white_img.SetExtent(0, dim[0]-1, 0, dim[1]-1, 0, dim[2]-1) if origin is None: origin = [0, 0, 0] origin[0] = bounds[0] + spacing[0] origin[1] = bounds[2] + spacing[1] origin[2] = bounds[4] + spacing[2] white_img.SetOrigin(origin) # if direction_matrix is not None: # white_img.SetDirectionMatrix(direction_matrix) white_img.AllocateScalars(vtki.VTK_UNSIGNED_CHAR, 1) # fill the image with foreground voxels: white_img.GetPointData().GetScalars().Fill(fg_value) # polygonal data --> image stencil: pol2stenc = vtki.new("PolyDataToImageStencil") pol2stenc.SetInputData(self.dataset) pol2stenc.SetOutputOrigin(white_img.GetOrigin()) pol2stenc.SetOutputSpacing(white_img.GetSpacing()) pol2stenc.SetOutputWholeExtent(white_img.GetExtent()) pol2stenc.Update() # cut the corresponding white image and set the background: imgstenc = vtki.new("ImageStencil") imgstenc.SetInputData(white_img) imgstenc.SetStencilConnection(pol2stenc.GetOutputPort()) # imgstenc.SetReverseStencil(True) imgstenc.SetBackgroundValue(bg_value) imgstenc.Update() vol = vedo.Volume(imgstenc.GetOutput()) vol.name = "BinarizedVolume" vol.pipeline = OperationNode( "binarize", parents=[self], comment=f"dims={tuple(vol.dimensions())}", c="#e9c46a:#0096c7", ) return vol def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradius=None) -> "vedo.Volume": """ Compute the `Volume` object whose voxels contains the signed distance from the mesh. Arguments: bounds : (list) bounds of the output volume dims : (list) dimensions (nr. of voxels) of the output volume invert : (bool) flip the sign Examples: - [volume_from_mesh.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/volume_from_mesh.py) """ if maxradius is not None: vedo.logger.warning( "in signedDistance(maxradius=...) is ignored. (Only valid for pointclouds)." ) if bounds is None: bounds = self.bounds() sx = (bounds[1] - bounds[0]) / dims[0] sy = (bounds[3] - bounds[2]) / dims[1] sz = (bounds[5] - bounds[4]) / dims[2] img = vtki.vtkImageData() img.SetDimensions(dims) img.SetSpacing(sx, sy, sz) img.SetOrigin(bounds[0], bounds[2], bounds[4]) img.AllocateScalars(vtki.VTK_FLOAT, 1) imp = vtki.new("ImplicitPolyDataDistance") imp.SetInput(self.dataset) b2 = bounds[2] b4 = bounds[4] d0, d1, d2 = dims for i in range(d0): x = i * sx + bounds[0] for j in range(d1): y = j * sy + b2 for k in range(d2): v = imp.EvaluateFunction((x, y, k * sz + b4)) if invert: v = -v img.SetScalarComponentFromFloat(i, j, k, 0, v) vol = vedo.Volume(img) vol.name = "SignedVolume" vol.pipeline = OperationNode( "signed_distance", parents=[self], comment=f"dims={tuple(vol.dimensions())}", c="#e9c46a:#0096c7", ) return vol def tetralize( self, side=0.02, nmax=300_000, gap=None, subsample=False, uniform=True, seed=0, debug=False, ) -> "vedo.TetMesh": """ Tetralize a closed polygonal mesh. Return a `TetMesh`. Arguments: side : (float) desired side of the single tetras as fraction of the bounding box diagonal. Typical values are in the range (0.01 - 0.03) nmax : (int) maximum random numbers to be sampled in the bounding box gap : (float) keep this minimum distance from the surface, if None an automatic choice is made. subsample : (bool) subsample input surface, the geometry might be affected (the number of original faces reduceed), but higher tet quality might be obtained. uniform : (bool) generate tets more uniformly packed in the interior of the mesh seed : (int) random number generator seed debug : (bool) show an intermediate plot with sampled points Examples: - [tetralize_surface.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/tetralize_surface.py) ![](https://vedo.embl.es/images/volumetric/tetralize_surface.jpg) """ surf = self.clone().clean().compute_normals() d = surf.diagonal_size() if gap is None: gap = side * d * np.sqrt(2 / 3) n = int(min((1 / side) ** 3, nmax)) # fill the space w/ points x0, x1, y0, y1, z0, z1 = surf.bounds() if uniform: pts = vedo.utils.pack_spheres([x0, x1, y0, y1, z0, z1], side * d * 1.42) pts += np.random.randn(len(pts), 3) * side * d * 1.42 / 100 # some small jitter else: disp = np.array([x0 + x1, y0 + y1, z0 + z1]) / 2 np.random.seed(seed) pts = (np.random.rand(n, 3) - 0.5) * np.array([x1 - x0, y1 - y0, z1 - z0]) + disp normals = surf.celldata["Normals"] cc = surf.cell_centers().coordinates subpts = cc - normals * gap * 1.05 pts = pts.tolist() + subpts.tolist() if debug: print(".. tetralize(): subsampling and cleaning") fillpts = surf.inside_points(pts) fillpts.subsample(side) if gap: fillpts.distance_to(surf) fillpts.threshold("Distance", above=gap) if subsample: surf.subsample(side) merged_fs = vedo.merge(fillpts, surf) tmesh = merged_fs.generate_delaunay3d() tcenters = tmesh.cell_centers().coordinates ids = surf.inside_points(tcenters, return_ids=True) ins = np.zeros(tmesh.ncells) ins[ids] = 1 if debug: # vedo.pyplot.histogram(fillpts.pointdata["Distance"], xtitle=f"gap={gap}").show().close() edges = self.edges points = self.coordinates elen = mag(points[edges][:, 0, :] - points[edges][:, 1, :]) histo = vedo.pyplot.histogram(elen, xtitle="edge length", xlim=(0, 3 * side * d)) print(".. edges min, max", elen.min(), elen.max()) fillpts.cmap("bone") vedo.show( [ [ f"This is a debug plot.\n\nGenerated points: {n}\ngap: {gap}", surf.wireframe().alpha(0.2), vedo.addons.Axes(surf), fillpts, Points(subpts).c("r4").ps(3), ], [f"Edges mean length: {np.mean(elen)}\n\nPress q to continue", histo], ], N=2, sharecam=False, new=True, ).close() print(".. thresholding") tmesh.celldata["inside"] = ins.astype(np.uint8) tmesh.threshold("inside", above=0.9) tmesh.celldata.remove("inside") if debug: print(f".. tetralize() completed, ntets = {tmesh.ncells}") tmesh.pipeline = OperationNode( "tetralize", parents=[self], comment=f"#tets = {tmesh.ncells}", c="#e9c46a:#9e2a2b", ) return tmesh vedo-2025.5.3/vedo/plotter.py000066400000000000000000005225721474667405700157460ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os.path import sys import time from typing import MutableSequence, Callable, Any, Union from typing_extensions import Self import numpy as np import vedo.vtkclasses as vtki # a wrapper for lazy imports import vedo from vedo import transformations from vedo import utils from vedo import backends from vedo import addons __docformat__ = "google" __doc__ = """ This module defines the main class Plotter to manage objects and 3D rendering. ![](https://vedo.embl.es/images/basic/multirenderers.png) """ __all__ = ["Plotter", "show", "close"] ######################################################################################## class Event: """ This class holds the info from an event in the window, works as dictionary too. """ __slots__ = [ "name", "title", "id", "timerid", "time", "priority", "at", "object", "actor", "picked3d", "keypress", "picked2d", "delta2d", "angle2d", "speed2d", "delta3d", "speed3d", "isPoints", "isMesh", "isAssembly", "isVolume", "isImage", "isActor2D", ] def __init__(self): self.name = "event" self.title = "" self.id = 0 self.timerid = 0 self.time = 0 self.priority = 0 self.at = 0 self.object = None self.actor = None self.picked3d = () self.keypress = "" self.picked2d = () self.delta2d = () self.angle2d = 0 self.speed2d = () self.delta3d = () self.speed3d = 0 self.isPoints = False self.isMesh = False self.isAssembly = False self.isVolume = False self.isImage = False self.isActor2D = False def __getitem__(self, key): return getattr(self, key) def __setitem__(self, key, value): setattr(self, key, value) def __str__(self): module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(id(self))})".ljust(75), bold=True, invert=True, return_string=True, ) out += "\x1b[0m" for n in self.__slots__: if n == "actor": continue out += f"{n}".ljust(11) + ": " val = str(self[n]).replace("\n", "")[:65].rstrip() if val == "True": out += "\x1b[32;1m" elif val == "False": out += "\x1b[31;1m" out += val + "\x1b[0m\n" return out.rstrip() def keys(self): return self.__slots__ ############################################################################################## def show( *objects, at=None, shape=(1, 1), N=None, pos=(0, 0), size="auto", screensize="auto", title="vedo", bg="white", bg2=None, axes=None, interactive=None, offscreen=False, sharecam=True, resetcam=True, zoom=None, viewup="", azimuth=0.0, elevation=0.0, roll=0.0, camera=None, mode=None, screenshot="", new=False, ) -> Union[Self, None]: """ Create on the fly an instance of class Plotter and show the object(s) provided. Arguments: at : (int) number of the renderer to plot to, in case of more than one exists shape : (list, str) Number of sub-render windows inside of the main window. E.g.: specify two across with shape=(2,1) and a two by two grid with shape=(2, 2). By default there is only one renderer. Can also accept a shape as string descriptor. E.g.: - shape="3|1" means 3 plots on the left and 1 on the right, - shape="4/2" means 4 plots on top of 2 at bottom. N : (int) number of desired sub-render windows arranged automatically in a grid pos : (list) position coordinates of the top-left corner of the rendering window on the screen size : (list) size of the rendering window screensize : (list) physical size of the monitor screen title : (str) window title bg : (color) background color or specify jpg image file name with path bg2 : (color) background color of a gradient towards the top axes : (int) set the type of axes to be shown: - 0, no axes - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the `vtkCubeAxesActor` object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane - 12, show polar axes - 13, draw a simple ruler at the bottom of the window - 14: draw a `CameraOrientationWidget` Axis type-1 can be fully customized by passing a dictionary. Check `vedo.addons.Axes()` for the full list of options. azimuth/elevation/roll : (float) move camera accordingly the specified value viewup : (str, list) either `['x', 'y', 'z']` or a vector to set vertical direction resetcam : (bool) re-adjust camera position to fit objects camera : (dict, vtkCamera) camera parameters can further be specified with a dictionary assigned to the `camera` keyword (E.g. `show(camera={'pos':(1,2,3), 'thickness':1000,})`): - **pos** (list), the position of the camera in world coordinates - **focal_point** (list), the focal point of the camera in world coordinates - **viewup** (list), the view up direction for the camera - **distance** (float), set the focal point to the specified distance from the camera position. - **clipping_range** (float), distance of the near and far clipping planes along the direction of projection. - **parallel_scale** (float), scaling used for a parallel projection, i.e. the height of the viewport in world-coordinate distances. The default is 1. Note that the "scale" parameter works as an "inverse scale", larger numbers produce smaller images. This method has no effect in perspective projection mode. - **thickness** (float), set the distance between clipping planes. This method adjusts the far clipping plane to be set a distance 'thickness' beyond the near clipping plane. - **view_angle** (float), the camera view angle, which is the angular height of the camera view measured in degrees. The default angle is 30 degrees. This method has no effect in parallel projection mode. The formula for setting the angle up for perfect perspective viewing is: angle = 2*atan((h/2)/d) where h is the height of the RenderWindow (measured by holding a ruler up to your screen) and d is the distance from your eyes to the screen. interactive : (bool) pause and interact with window (True) or continue execution (False) rate : (float) maximum rate of `show()` in Hertz mode : (int, str) set the type of interaction: - 0 = TrackballCamera [default] - 1 = TrackballActor - 2 = JoystickCamera - 3 = JoystickActor - 4 = Flight - 5 = RubberBand2D - 6 = RubberBand3D - 7 = RubberBandZoom - 8 = Terrain - 9 = Unicam - 10 = Image new : (bool) if set to `True`, a call to show will instantiate a new Plotter object (a new window) instead of reusing the first created. If new is `True`, but the existing plotter was instantiated with a different argument for `offscreen`, `new` is ignored and a new Plotter is created anyway. """ if len(objects) == 0: objects = None elif len(objects) == 1: objects = objects[0] else: objects = utils.flatten(objects) # If a plotter instance is already present, check if the offscreen argument # is the same as the one requested by the user. If not, create a new # plotter instance (see https://github.com/marcomusy/vedo/issues/1026) if vedo.plotter_instance and vedo.plotter_instance.offscreen != offscreen: new = True if vedo.plotter_instance and not new: # Plotter exists plt = vedo.plotter_instance else: # Plotter must be created if utils.is_sequence(at): # user passed a sequence for "at" if not utils.is_sequence(objects): vedo.logger.error("in show() input must be a list.") raise RuntimeError() if len(at) != len(objects): vedo.logger.error("in show() lists 'input' and 'at' must have equal lengths") raise RuntimeError() if shape == (1, 1) and N is None: N = max(at) + 1 elif at is None and (N or shape != (1, 1)): if not utils.is_sequence(objects): e = "in show(), N or shape is set, but input is not a sequence\n" e += " you may need to specify e.g. at=0" vedo.logger.error(e) raise RuntimeError() at = list(range(len(objects))) plt = Plotter( shape=shape, N=N, pos=pos, size=size, screensize=screensize, title=title, axes=axes, sharecam=sharecam, resetcam=resetcam, interactive=interactive, offscreen=offscreen, bg=bg, bg2=bg2, ) if vedo.settings.dry_run_mode >= 2: return plt # use _plt_to_return because plt.show() can return a k3d plot _plt_to_return = None if utils.is_sequence(at): for i, act in enumerate(objects): _plt_to_return = plt.show( act, at=i, zoom=zoom, resetcam=resetcam, viewup=viewup, azimuth=azimuth, elevation=elevation, roll=roll, camera=camera, interactive=False, mode=mode, screenshot=screenshot, bg=bg, bg2=bg2, axes=axes, ) if ( interactive or len(at) == N or (isinstance(shape[0], int) and len(at) == shape[0] * shape[1]) ): # note that shape can be a string if plt.interactor and not offscreen and (interactive is None or interactive): plt.interactor.Start() if plt._must_close_now: plt.interactor.GetRenderWindow().Finalize() plt.interactor.TerminateApp() plt.interactor = None plt.window = None plt.renderer = None plt.renderers = [] plt.camera = None else: _plt_to_return = plt.show( objects, at=at, zoom=zoom, resetcam=resetcam, viewup=viewup, azimuth=azimuth, elevation=elevation, roll=roll, camera=camera, interactive=interactive, mode=mode, screenshot=screenshot, bg=bg, bg2=bg2, axes=axes, ) return _plt_to_return def close() -> None: """Close the last created Plotter instance if it exists.""" if not vedo.plotter_instance: return vedo.plotter_instance.close() return ######################################################################## class Plotter: """Main class to manage objects.""" def __init__( self, shape=(1, 1), N=None, pos=(0, 0), size="auto", screensize="auto", title="vedo", bg="white", bg2=None, axes=None, sharecam=True, resetcam=True, interactive=None, offscreen=False, qt_widget=None, wx_widget=None, ): """ Arguments: shape : (str, list) shape of the grid of renderers in format (rows, columns). Ignored if N is specified. N : (int) number of desired renderers arranged in a grid automatically. pos : (list) (x,y) position in pixels of top-left corner of the rendering window on the screen size : (str, list) size of the rendering window. If 'auto', guess it based on screensize. screensize : (list) physical size of the monitor screen in pixels bg : (color, str) background color or specify jpg image file name with path bg2 : (color) background color of a gradient towards the top title : (str) window title axes : (int) Note that Axes type-1 can be fully customized by passing a dictionary `axes=dict()`. Check out `vedo.addons.Axes()` for the available options. - 0, no axes - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the VTK CubeAxesActor object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane (use with zoom=8) - 12, show polar axes - 13, draw a simple ruler at the bottom of the window - 14: draw a camera orientation widget sharecam : (bool) if False each renderer will have an independent camera interactive : (bool) if True will stop after show() to allow interaction with the 3d scene offscreen : (bool) if True will not show the rendering window qt_widget : (QVTKRenderWindowInteractor) render in a Qt-Widget using an QVTKRenderWindowInteractor. See examples `qt_windows[1,2,3].py` and `qt_cutter.py`. """ vedo.plotter_instance = self if interactive is None: interactive = bool(N in (0, 1, None) and shape == (1, 1)) self._interactive = interactive # print("interactive", interactive, N, shape) self.objects = [] # list of objects to be shown self.clicked_object = None # holds the object that has been clicked self.clicked_actor = None # holds the actor that has been clicked self.shape = shape # nr. of subwindows in grid self.axes = axes # show axes type nr. self.title = title # window title self.size = size # window size self.backgrcol = bg # used also by backend notebooks self.offscreen= offscreen self.resetcam = resetcam self.sharecam = sharecam # share the same camera if multiple renderers self.pos = pos # used by vedo.file_io self.picker = None # hold the vtkPicker object self.picked2d = None # 2d coords of a clicked point on the rendering window self.picked3d = None # 3d coords of a clicked point on an actor self.qt_widget = qt_widget # QVTKRenderWindowInteractor self.wx_widget = wx_widget # wxVTKRenderWindowInteractor self.interactor = None self.window = None self.renderer = None self.renderers = [] # list of renderers # mostly internal stuff: self.hover_legends = [] self.justremoved = None self.axes_instances = [] self.clock = 0 self.sliders = [] self.buttons = [] self.widgets = [] self.cutter_widget = None self.hint_widget = None self.background_renderer = None self.last_event = None self.skybox = None self._icol = 0 self._clockt0 = time.time() self._extralight = None self._cocoa_initialized = False self._cocoa_process_events = True # make one call in show() self._must_close_now = False ##################################################################### if vedo.settings.default_backend == "2d": self.offscreen = True if self.size == "auto": self.size = (800, 600) elif vedo.settings.default_backend == "k3d": if self.size == "auto": self.size = (1000, 1000) #################################### return ############################ #################################### ############################################################# if screensize == "auto": screensize = (2160, 1440) # TODO: get actual screen size # build the rendering window: self.window = vtki.vtkRenderWindow() self.window.GlobalWarningDisplayOff() if self.title == "vedo": # check if dev version if "dev" in vedo.__version__: self.title = f"vedo ({vedo.__version__})" self.window.SetWindowName(self.title) # more vedo.settings if vedo.settings.use_depth_peeling: self.window.SetAlphaBitPlanes(vedo.settings.alpha_bit_planes) self.window.SetMultiSamples(vedo.settings.multi_samples) self.window.SetPolygonSmoothing(vedo.settings.polygon_smoothing) self.window.SetLineSmoothing(vedo.settings.line_smoothing) self.window.SetPointSmoothing(vedo.settings.point_smoothing) ############################################################# if N: # N = number of renderers. Find out the best if shape != (1, 1): # arrangement based on minimum nr. of empty renderers vedo.logger.warning("having set N, shape is ignored.") x, y = screensize nx = int(np.sqrt(int(N * y / x) + 1)) ny = int(np.sqrt(int(N * x / y) + 1)) lm = [ (nx, ny), (nx, ny + 1), (nx - 1, ny), (nx + 1, ny), (nx, ny - 1), (nx - 1, ny + 1), (nx + 1, ny - 1), (nx + 1, ny + 1), (nx - 1, ny - 1), ] ind, minl = 0, 1000 for i, m in enumerate(lm): l = m[0] * m[1] if N <= l < minl: ind = i minl = l shape = lm[ind] ################################################## if isinstance(shape, str): if "|" in shape: if self.size == "auto": self.size = (800, 1200) n = int(shape.split("|")[0]) m = int(shape.split("|")[1]) rangen = reversed(range(n)) rangem = reversed(range(m)) else: if self.size == "auto": self.size = (1200, 800) m = int(shape.split("/")[0]) n = int(shape.split("/")[1]) rangen = range(n) rangem = range(m) if n >= m: xsplit = m / (n + m) else: xsplit = 1 - n / (n + m) if vedo.settings.window_splitting_position: xsplit = vedo.settings.window_splitting_position for i in rangen: arenderer = vtki.vtkRenderer() if "|" in shape: arenderer.SetViewport(0, i / n, xsplit, (i + 1) / n) else: arenderer.SetViewport(i / n, 0, (i + 1) / n, xsplit) self.renderers.append(arenderer) for i in rangem: arenderer = vtki.vtkRenderer() if "|" in shape: arenderer.SetViewport(xsplit, i / m, 1, (i + 1) / m) else: arenderer.SetViewport(i / m, xsplit, (i + 1) / m, 1) self.renderers.append(arenderer) for r in self.renderers: r.SetLightFollowCamera(vedo.settings.light_follows_camera) r.SetUseDepthPeeling(vedo.settings.use_depth_peeling) # r.SetUseDepthPeelingForVolumes(vedo.settings.use_depth_peeling) if vedo.settings.use_depth_peeling: r.SetMaximumNumberOfPeels(vedo.settings.max_number_of_peels) r.SetOcclusionRatio(vedo.settings.occlusion_ratio) r.SetUseFXAA(vedo.settings.use_fxaa) r.SetPreserveDepthBuffer(vedo.settings.preserve_depth_buffer) r.SetBackground(vedo.get_color(self.backgrcol)) self.axes_instances.append(None) self.shape = (n + m,) elif utils.is_sequence(shape) and isinstance(shape[0], dict): # passing a sequence of dicts for renderers specifications if self.size == "auto": self.size = (1000, 800) for rd in shape: x0, y0 = rd["bottomleft"] x1, y1 = rd["topright"] bg_ = rd.pop("bg", "white") bg2_ = rd.pop("bg2", None) arenderer = vtki.vtkRenderer() arenderer.SetLightFollowCamera(vedo.settings.light_follows_camera) arenderer.SetUseDepthPeeling(vedo.settings.use_depth_peeling) # arenderer.SetUseDepthPeelingForVolumes(vedo.settings.use_depth_peeling) if vedo.settings.use_depth_peeling: arenderer.SetMaximumNumberOfPeels(vedo.settings.max_number_of_peels) arenderer.SetOcclusionRatio(vedo.settings.occlusion_ratio) arenderer.SetUseFXAA(vedo.settings.use_fxaa) arenderer.SetPreserveDepthBuffer(vedo.settings.preserve_depth_buffer) arenderer.SetViewport(x0, y0, x1, y1) arenderer.SetBackground(vedo.get_color(bg_)) if bg2_: arenderer.GradientBackgroundOn() arenderer.SetBackground2(vedo.get_color(bg2_)) self.renderers.append(arenderer) self.axes_instances.append(None) self.shape = (len(shape),) else: if isinstance(self.size, str) and self.size == "auto": # figure out a reasonable window size f = 1.5 x, y = screensize xs = y / f * shape[1] # because y x / f: # shrink xs = x / f ys = xs / shape[1] * shape[0] if ys > y / f: ys = y / f xs = ys / shape[0] * shape[1] self.size = (int(xs), int(ys)) if shape == (1, 1): self.size = (int(y / f), int(y / f)) # because y 0: try: modes = [ vtki.vtkViewport.GradientModes.VTK_GRADIENT_VERTICAL, vtki.vtkViewport.GradientModes.VTK_GRADIENT_HORIZONTAL, vtki.vtkViewport.GradientModes.VTK_GRADIENT_RADIAL_VIEWPORT_FARTHEST_SIDE, vtki.vtkViewport.GradientModes.VTK_GRADIENT_RADIAL_VIEWPORT_FARTHEST_CORNER, ] r.SetGradientMode(modes[vedo.settings.background_gradient_orientation]) r.GradientBackgroundOn() except AttributeError: pass # Backend #################################################### if vedo.settings.default_backend in ["panel", "trame", "k3d"]: return ################ ######################## ######################################################### if self.qt_widget or self.wx_widget: self.interactor.SetRenderWindow(self.window) if vedo.settings.enable_default_keyboard_callbacks: self.interactor.AddObserver("KeyPressEvent", self._default_keypress) if vedo.settings.enable_default_mouse_callbacks: self.interactor.AddObserver("LeftButtonPressEvent", self._default_mouseleftclick) return ################ ######################## if self.size[0] == "f": # full screen self.size = "fullscreen" self.window.SetFullScreen(True) self.window.BordersOn() else: self.window.SetSize(int(self.size[0]), int(self.size[1])) if self.offscreen: if self.axes in (4, 5, 8, 12, 14): self.axes = 0 # does not work with those self.window.SetOffScreenRendering(True) self.interactor = None self._interactive = False return ################ ######################## self.window.SetPosition(pos) ######################################################### self.interactor = vtki.vtkRenderWindowInteractor() self.interactor.SetRenderWindow(self.window) vsty = vtki.new("InteractorStyleTrackballCamera") self.interactor.SetInteractorStyle(vsty) self.interactor.RemoveObservers("CharEvent") if vedo.settings.enable_default_keyboard_callbacks: self.interactor.AddObserver("KeyPressEvent", self._default_keypress) if vedo.settings.enable_default_mouse_callbacks: self.interactor.AddObserver("LeftButtonPressEvent", self._default_mouseleftclick) ##################################################################### ..init ends here. def __str__(self): """Return Plotter info.""" axtype = { 0: "(no axes)", 1: "(default customizable grid walls)", 2: "(cartesian axes from origin", 3: "(positive range of cartesian axes from origin", 4: "(axes triad at bottom left)", 5: "(oriented cube at bottom left)", 6: "(mark the corners of the bounding box)", 7: "(3D ruler at each side of the cartesian axes)", 8: "(the vtkCubeAxesActor object)", 9: "(the bounding box outline)", 10: "(circles of maximum bounding box range)", 11: "(show a large grid on the x-y plane)", 12: "(show polar axes)", 13: "(simple ruler at the bottom of the window)", 14: "(the vtkCameraOrientationWidget object)", } module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(id(self))})".ljust(75), bold=True, invert=True, return_string=True, ) out += "\x1b[0m" if self.interactor: out += "window title".ljust(14) + ": " + self.title + "\n" out += "window size".ljust(14) + f": {self.window.GetSize()}" out += f", full_screen={self.window.GetScreenSize()}\n" out += "activ renderer".ljust(14) + ": nr." + str(self.renderers.index(self.renderer)) out += f" (out of {len(self.renderers)} renderers)\n" bns, totpt = [], 0 for a in self.objects: try: b = a.bounds() bns.append(b) except (AttributeError, TypeError): pass try: totpt += a.npoints except AttributeError: pass out += "n. of objects".ljust(14) + f": {len(self.objects)}" out += f" ({totpt} vertices)\n" if totpt else "\n" if len(bns) > 0: min_bns = np.min(bns, axis=0) max_bns = np.max(bns, axis=0) bx1, bx2 = utils.precision(min_bns[0], 3), utils.precision(max_bns[1], 3) by1, by2 = utils.precision(min_bns[2], 3), utils.precision(max_bns[3], 3) bz1, bz2 = utils.precision(min_bns[4], 3), utils.precision(max_bns[5], 3) out += "bounds".ljust(14) + ":" out += " x=(" + bx1 + ", " + bx2 + ")," out += " y=(" + by1 + ", " + by2 + ")," out += " z=(" + bz1 + ", " + bz2 + ")\n" if utils.is_integer(self.axes): out += "axes style".ljust(14) + f": {self.axes} {axtype[self.axes]}\n" elif isinstance(self.axes, dict): out += "axes style".ljust(14) + f": 1 {axtype[1]}\n" else: out += "axes style".ljust(14) + f": {[self.axes]}\n" return out.rstrip() + "\x1b[0m" def print(self): """Print information about the current instance.""" print(self.__str__()) return self def __iadd__(self, objects): self.add(objects) return self def __isub__(self, objects): self.remove(objects) return self def __enter__(self): # context manager like in "with Plotter() as plt:" return self def __exit__(self, *args, **kwargs): # context manager like in "with Plotter() as plt:" self.close() def initialize_interactor(self) -> Self: """Initialize the interactor if not already initialized.""" if self.offscreen: return self if self.interactor: if not self.interactor.GetInitialized(): self.interactor.Initialize() self.interactor.RemoveObservers("CharEvent") return self def process_events(self) -> Self: """Process all pending events.""" self.initialize_interactor() if self.interactor: try: self.interactor.ProcessEvents() except AttributeError: pass return self def at(self, nren: int, yren=None) -> Self: """ Select the current renderer number as an int. Can also use the `[nx, ny]` format. """ if utils.is_sequence(nren): if len(nren) == 2: nren, yren = nren else: vedo.logger.error("at() argument must be a single number or a list of two numbers") raise RuntimeError if yren is not None: a, b = self.shape x, y = nren, yren nren = x * b + y # print("at (", x, y, ") -> ren", nren) if nren < 0 or nren > len(self.renderers) or x >= a or y >= b: vedo.logger.error(f"at({nren, yren}) is malformed!") raise RuntimeError self.renderer = self.renderers[nren] return self def add(self, *objs, at=None) -> Self: """ Append the input objects to the internal list of objects to be shown. Arguments: at : (int) add the object at the specified renderer """ if at is not None: ren = self.renderers[at] else: ren = self.renderer objs = utils.flatten(objs) for ob in objs: if ob and ob not in self.objects: self.objects.append(ob) acts = self._scan_input_return_acts(objs) for a in acts: if ren: if isinstance(a, vedo.addons.BaseCutter): a.add_to(self) # from cutters continue if isinstance(a, vtki.vtkLight): ren.AddLight(a) continue try: ren.AddActor(a) except TypeError: ren.AddActor(a.actor) try: ir = self.renderers.index(ren) a.rendered_at.add(ir) # might not have rendered_at except (AttributeError, ValueError): pass if isinstance(a, vtki.vtkFollower): a.SetCamera(self.camera) elif isinstance(a, vedo.visual.LightKit): a.lightkit.AddLightsToRenderer(ren) return self def remove(self, *objs, at=None) -> Self: """ Remove input object to the internal list of objects to be shown. Objects to be removed can be referenced by their assigned name, Arguments: at : (int) remove the object at the specified renderer """ # TODO and you can also use wildcards like `*` and `?`. if at is not None: ren = self.renderers[at] else: ren = self.renderer objs = [ob for ob in utils.flatten(objs) if ob] has_str = False for ob in objs: if isinstance(ob, str): has_str = True break has_actor = False for ob in objs: if hasattr(ob, "actor") and ob.actor: has_actor = True break if has_str or has_actor: # need to get the actors to search for for a in self.get_actors(include_non_pickables=True): # print("PARSING", [a]) try: if (a.name and a.name in objs) or a in objs: objs.append(a) # if a.name: # bools = [utils.parse_pattern(ob, a.name)[0] for ob in objs] # if any(bools) or a in objs: # objs.append(a) # print('a.name',a.name, objs,any(bools)) except AttributeError: # no .name # passing the actor so get back the object with .retrieve_object() try: vobj = a.retrieve_object() if (vobj.name and vobj.name in objs) or vobj in objs: # print('vobj.name', vobj.name) objs.append(vobj) except AttributeError: pass if ren is None: return self ir = self.renderers.index(ren) ids = [] for ob in set(objs): # will remove it from internal list if possible try: idx = self.objects.index(ob) ids.append(idx) except ValueError: pass if ren: ### remove it from the renderer if isinstance(ob, vedo.addons.BaseCutter): ob.remove_from(self) # from cutters continue try: ren.RemoveActor(ob) except TypeError: try: ren.RemoveActor(ob.actor) except AttributeError: pass if hasattr(ob, "rendered_at"): ob.rendered_at.discard(ir) if hasattr(ob, "scalarbar") and ob.scalarbar: ren.RemoveActor(ob.scalarbar) if hasattr(ob, "_caption") and ob._caption: ren.RemoveActor(ob._caption) if hasattr(ob, "shadows") and ob.shadows: for sha in ob.shadows: ren.RemoveActor(sha.actor) if hasattr(ob, "trail") and ob.trail: ren.RemoveActor(ob.trail.actor) ob.trail_points = [] if hasattr(ob.trail, "shadows") and ob.trail.shadows: for sha in ob.trail.shadows: ren.RemoveActor(sha.actor) elif isinstance(ob, vedo.visual.LightKit): ob.lightkit.RemoveLightsFromRenderer(ren) # for i in ids: # WRONG way of doing it! # del self.objects[i] # instead we do: self.objects = [ele for i, ele in enumerate(self.objects) if i not in ids] return self @property def actors(self): """Return the list of actors.""" return [ob.actor for ob in self.objects if hasattr(ob, "actor")] def remove_lights(self) -> Self: """Remove all the present lights in the current renderer.""" if self.renderer: self.renderer.RemoveAllLights() return self def pop(self, at=None) -> Self: """ Remove the last added object from the rendering window. This method is typically used in loops or callback functions. """ if at is not None and not isinstance(at, int): # wrong usage pitfall vedo.logger.error("argument of pop() must be an integer") raise RuntimeError() if self.objects: self.remove(self.objects[-1], at) return self def render(self, resetcam=False) -> Self: """Render the scene. This method is typically used in loops or callback functions.""" if vedo.settings.dry_run_mode >= 2: return self if not self.window: return self self.initialize_interactor() if resetcam: self.renderer.ResetCamera() self.window.Render() if self._cocoa_process_events and self.interactor and self.interactor.GetInitialized(): if "Darwin" in vedo.sys_platform and not self.offscreen: self.interactor.ProcessEvents() self._cocoa_process_events = False return self def interactive(self) -> Self: """ Start window interaction. Analogous to `show(..., interactive=True)`. """ if vedo.settings.dry_run_mode >= 1: return self self.initialize_interactor() if self.interactor: # print("self.interactor.Start()") self.interactor.Start() # print("self.interactor.Start() done") if self._must_close_now: # print("self.interactor.TerminateApp()") if self.interactor: self.interactor.GetRenderWindow().Finalize() self.interactor.TerminateApp() self.interactor = None self.window = None self.renderer = None self.renderers = [] self.camera = None return self def use_depth_peeling(self, at=None, value=True) -> Self: """ Specify whether use depth peeling algorithm at this specific renderer Call this method before the first rendering. """ if at is None: ren = self.renderer else: ren = self.renderers[at] ren.SetUseDepthPeeling(value) return self def background(self, c1=None, c2=None, at=None, mode=0) -> Union[Self, "np.ndarray"]: """Set the color of the background for the current renderer. A different renderer index can be specified by keyword `at`. Arguments: c1 : (list) background main color. c2 : (list) background color for the upper part of the window. at : (int) renderer index. mode : (int) background mode (needs vtk version >= 9.3) 0 = vertical, 1 = horizontal, 2 = radial farthest side, 3 = radia farthest corner. """ if not self.renderers: return self if at is None: r = self.renderer else: r = self.renderers[at] if c1 is None and c2 is None: return np.array(r.GetBackground()) if r: if c1 is not None: r.SetBackground(vedo.get_color(c1)) if c2 is not None: r.GradientBackgroundOn() r.SetBackground2(vedo.get_color(c2)) if mode: try: # only works with vtk>=9.3 modes = [ vtki.vtkViewport.GradientModes.VTK_GRADIENT_VERTICAL, vtki.vtkViewport.GradientModes.VTK_GRADIENT_HORIZONTAL, vtki.vtkViewport.GradientModes.VTK_GRADIENT_RADIAL_VIEWPORT_FARTHEST_SIDE, vtki.vtkViewport.GradientModes.VTK_GRADIENT_RADIAL_VIEWPORT_FARTHEST_CORNER, ] r.SetGradientMode(modes[mode]) except AttributeError: pass else: r.GradientBackgroundOff() return self ################################################################## def get_meshes(self, at=None, include_non_pickables=False, unpack_assemblies=True) -> list: """ Return a list of Meshes from the specified renderer. Arguments: at : (int) specify which renderer to look at. include_non_pickables : (bool) include non-pickable objects unpack_assemblies : (bool) unpack assemblies into their components """ if at is None: renderer = self.renderer at = self.renderers.index(renderer) elif isinstance(at, int): renderer = self.renderers[at] has_global_axes = False if isinstance(self.axes_instances[at], vedo.Assembly): has_global_axes = True if unpack_assemblies: acs = renderer.GetActors() else: acs = renderer.GetViewProps() objs = [] acs.InitTraversal() for _ in range(acs.GetNumberOfItems()): if unpack_assemblies: a = acs.GetNextItem() else: a = acs.GetNextProp() if isinstance(a, vtki.vtkVolume): continue if include_non_pickables or a.GetPickable(): if a == self.axes_instances[at]: continue if has_global_axes and a in self.axes_instances[at].actors: continue try: objs.append(a.retrieve_object()) except AttributeError: pass return objs def get_volumes(self, at=None, include_non_pickables=False) -> list: """ Return a list of Volumes from the specified renderer. Arguments: at : (int) specify which renderer to look at include_non_pickables : (bool) include non-pickable objects """ if at is None: renderer = self.renderer at = self.renderers.index(renderer) elif isinstance(at, int): renderer = self.renderers[at] vols = [] acs = renderer.GetVolumes() acs.InitTraversal() for _ in range(acs.GetNumberOfItems()): a = acs.GetNextItem() if include_non_pickables or a.GetPickable(): try: vols.append(a.retrieve_object()) except AttributeError: pass return vols def get_actors(self, at=None, include_non_pickables=False) -> list: """ Return a list of Volumes from the specified renderer. Arguments: at : (int) specify which renderer to look at include_non_pickables : (bool) include non-pickable objects """ if at is None: renderer = self.renderer if renderer is None: return [] at = self.renderers.index(renderer) elif isinstance(at, int): renderer = self.renderers[at] acts = [] acs = renderer.GetViewProps() acs.InitTraversal() for _ in range(acs.GetNumberOfItems()): a = acs.GetNextProp() if include_non_pickables or a.GetPickable(): acts.append(a) return acts def check_actors_trasform(self, at=None) -> Self: """ Reset the transformation matrix of all actors at specified renderer. This is only useful when actors have been moved/rotated/scaled manually in an already rendered scene using interactors like 'TrackballActor' or 'JoystickActor'. """ # see issue https://github.com/marcomusy/vedo/issues/1046 for a in self.get_actors(at=at, include_non_pickables=True): try: M = a.GetMatrix() except AttributeError: continue if M and not M.IsIdentity(): try: a.retrieve_object().apply_transform_from_actor() # vedo.logger.info( # f"object '{a.retrieve_object().name}' " # "was manually moved. Updated to its current position." # ) except AttributeError: pass return self def reset_camera(self, tight=None) -> Self: """ Reset the camera position and zooming. If tight (float) is specified the zooming reserves a padding space in the xy-plane expressed in percent of the average size. """ if tight is None: self.renderer.ResetCamera() else: x0, x1, y0, y1, z0, z1 = self.renderer.ComputeVisiblePropBounds() cam = self.camera self.renderer.ComputeAspect() aspect = self.renderer.GetAspect() angle = np.pi * cam.GetViewAngle() / 180.0 dx = x1 - x0 dy = y1 - y0 dist = max(dx / aspect[0], dy) / np.tan(angle / 2) / 2 cam.SetViewUp(0, 1, 0) cam.SetPosition(x0 + dx / 2, y0 + dy / 2, dist * (1 + tight)) cam.SetFocalPoint(x0 + dx / 2, y0 + dy / 2, 0) if cam.GetParallelProjection(): ps = max(dx / aspect[0], dy) / 2 cam.SetParallelScale(ps * (1 + tight)) self.renderer.ResetCameraClippingRange(x0, x1, y0, y1, z0, z1) return self def reset_clipping_range(self, bounds=None) -> Self: """ Reset the camera clipping range to include all visible actors. If bounds is given, it will be used instead of computing it. """ if bounds is None: self.renderer.ResetCameraClippingRange() else: self.renderer.ResetCameraClippingRange(bounds) return self def reset_viewup(self, smooth=True) -> Self: """ Reset the orientation of the camera to the closest orthogonal direction and view-up. """ vbb = addons.compute_visible_bounds()[0] x0, x1, y0, y1, z0, z1 = vbb mx, my, mz = (x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2 d = self.camera.GetDistance() viewups = np.array( [(0, 1, 0), (0, -1, 0), (0, 0, 1), (0, 0, -1), (1, 0, 0), (-1, 0, 0)] ) positions = np.array( [ (mx, my, mz + d), (mx, my, mz - d), (mx, my + d, mz), (mx, my - d, mz), (mx + d, my, mz), (mx - d, my, mz), ] ) vu = np.array(self.camera.GetViewUp()) vui = np.argmin(np.linalg.norm(viewups - vu, axis=1)) poc = np.array(self.camera.GetPosition()) foc = np.array(self.camera.GetFocalPoint()) a = poc - foc b = positions - foc a = a / np.linalg.norm(a) b = b.T * (1 / np.linalg.norm(b, axis=1)) pui = np.argmin(np.linalg.norm(b.T - a, axis=1)) if smooth: outtimes = np.linspace(0, 1, num=11, endpoint=True) for t in outtimes: vv = vu * (1 - t) + viewups[vui] * t pp = poc * (1 - t) + positions[pui] * t ff = foc * (1 - t) + np.array([mx, my, mz]) * t self.camera.SetViewUp(vv) self.camera.SetPosition(pp) self.camera.SetFocalPoint(ff) self.render() # interpolator does not respect parallel view...: # cam1 = dict( # pos=poc, # viewup=vu, # focal_point=(mx,my,mz), # clipping_range=self.camera.GetClippingRange() # ) # # cam1 = self.camera # cam2 = dict( # pos=positions[pui], # viewup=viewups[vui], # focal_point=(mx,my,mz), # clipping_range=self.camera.GetClippingRange() # ) # vcams = self.move_camera([cam1, cam2], output_times=outtimes, smooth=0) # for c in vcams: # self.renderer.SetActiveCamera(c) # self.render() else: self.camera.SetViewUp(viewups[vui]) self.camera.SetPosition(positions[pui]) self.camera.SetFocalPoint(mx, my, mz) self.renderer.ResetCameraClippingRange() # vbb, _, _, _ = addons.compute_visible_bounds() # x0,x1, y0,y1, z0,z1 = vbb # self.renderer.ResetCameraClippingRange(x0, x1, y0, y1, z0, z1) self.render() return self def move_camera(self, cameras, t=0, times=(), smooth=True, output_times=()) -> list: """ Takes as input two cameras set camera at an interpolated position: Cameras can be vtkCamera or dictionaries in format: `dict(pos=..., focal_point=..., viewup=..., distance=..., clipping_range=...)` Press `shift-C` key in interactive mode to dump a python snipplet of parameters for the current camera view. """ nc = len(cameras) if len(times) == 0: times = np.linspace(0, 1, num=nc, endpoint=True) assert len(times) == nc cin = vtki.new("CameraInterpolator") # cin.SetInterpolationTypeToLinear() # buggy? if nc > 2 and smooth: cin.SetInterpolationTypeToSpline() for i, cam in enumerate(cameras): vcam = cam if isinstance(cam, dict): vcam = utils.camera_from_dict(cam) cin.AddCamera(times[i], vcam) mint, maxt = cin.GetMinimumT(), cin.GetMaximumT() rng = maxt - mint if len(output_times) == 0: cin.InterpolateCamera(t * rng, self.camera) return [self.camera] else: vcams = [] for tt in output_times: c = vtki.vtkCamera() cin.InterpolateCamera(tt * rng, c) vcams.append(c) return vcams def fly_to(self, point) -> Self: """ Fly camera to the specified point. Arguments: point : (list) point in space to place camera. Example: ```python from vedo import * cone = Cone() plt = Plotter(axes=1) plt.show(cone) plt.fly_to([1,0,0]) plt.interactive().close() ``` """ if self.interactor: self.resetcam = False self.interactor.FlyTo(self.renderer, point) return self def look_at(self, plane="xy") -> Self: """Move the camera so that it looks at the specified cartesian plane""" cam = self.renderer.GetActiveCamera() fp = np.array(cam.GetFocalPoint()) p = np.array(cam.GetPosition()) dist = np.linalg.norm(fp - p) plane = plane.lower() if "x" in plane and "y" in plane: cam.SetPosition(fp[0], fp[1], fp[2] + dist) cam.SetViewUp(0.0, 1.0, 0.0) elif "x" in plane and "z" in plane: cam.SetPosition(fp[0], fp[1] - dist, fp[2]) cam.SetViewUp(0.0, 0.0, 1.0) elif "y" in plane and "z" in plane: cam.SetPosition(fp[0] + dist, fp[1], fp[2]) cam.SetViewUp(0.0, 0.0, 1.0) else: vedo.logger.error(f"in plotter.look() cannot understand argument {plane}") return self def record(self, filename="") -> str: """ Record camera, mouse, keystrokes and all other events. Recording can be toggled on/off by pressing key "R". Arguments: filename : (str) ascii file to store events. The default is `vedo.settings.cache_directory+"vedo/recorded_events.log"`. Returns: a string descriptor of events. Examples: - [record_play.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/record_play.py) """ if vedo.settings.dry_run_mode >= 1: return "" if not self.interactor: vedo.logger.warning("Cannot record events, no interactor defined.") return "" erec = vtki.new("InteractorEventRecorder") erec.SetInteractor(self.interactor) if not filename: if not os.path.exists(vedo.settings.cache_directory): os.makedirs(vedo.settings.cache_directory) home_dir = os.path.expanduser("~") filename = os.path.join( home_dir, vedo.settings.cache_directory, "vedo", "recorded_events.log") print("Events will be recorded in", filename) erec.SetFileName(filename) erec.SetKeyPressActivationValue("R") erec.EnabledOn() erec.Record() self.interactor.Start() erec.Stop() erec.EnabledOff() with open(filename, "r", encoding="UTF-8") as fl: events = fl.read() erec = None return events def play(self, recorded_events="", repeats=0) -> Self: """ Play camera, mouse, keystrokes and all other events. Arguments: events : (str) file o string of events. The default is `vedo.settings.cache_directory+"vedo/recorded_events.log"`. repeats : (int) number of extra repeats of the same events. The default is 0. Examples: - [record_play.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/record_play.py) """ if vedo.settings.dry_run_mode >= 1: return self if not self.interactor: vedo.logger.warning("Cannot play events, no interactor defined.") return self erec = vtki.new("InteractorEventRecorder") erec.SetInteractor(self.interactor) if not recorded_events: home_dir = os.path.expanduser("~") recorded_events = os.path.join( home_dir, vedo.settings.cache_directory, "vedo", "recorded_events.log") if recorded_events.endswith(".log"): erec.ReadFromInputStringOff() erec.SetFileName(recorded_events) else: erec.ReadFromInputStringOn() erec.SetInputString(recorded_events) erec.Play() for _ in range(repeats): erec.Rewind() erec.Play() erec.EnabledOff() erec = None return self def parallel_projection(self, value=True, at=None) -> Self: """ Use parallel projection `at` a specified renderer. Object is seen from "infinite" distance, e.i. remove any perspective effects. An input value equal to -1 will toggle it on/off. """ if at is not None: r = self.renderers[at] else: r = self.renderer if value == -1: val = r.GetActiveCamera().GetParallelProjection() value = not val r.GetActiveCamera().SetParallelProjection(value) r.Modified() return self def render_hidden_lines(self, value=True) -> Self: """Remove hidden lines when in wireframe mode.""" self.renderer.SetUseHiddenLineRemoval(not value) return self def fov(self, angle: float) -> Self: """ Set the field of view angle for the camera. This is the angle of the camera frustum in the horizontal direction. High values will result in a wide-angle lens (fish-eye effect), and low values will result in a telephoto lens. Default value is 30 degrees. """ self.renderer.GetActiveCamera().UseHorizontalViewAngleOn() self.renderer.GetActiveCamera().SetViewAngle(angle) return self def zoom(self, zoom: float) -> Self: """Apply a zooming factor for the current camera view""" self.renderer.GetActiveCamera().Zoom(zoom) return self def azimuth(self, angle: float) -> Self: """Rotate camera around the view up vector.""" self.renderer.GetActiveCamera().Azimuth(angle) return self def elevation(self, angle: float) -> Self: """Rotate the camera around the cross product of the negative of the direction of projection and the view up vector.""" self.renderer.GetActiveCamera().Elevation(angle) return self def roll(self, angle: float) -> Self: """Roll the camera about the direction of projection.""" self.renderer.GetActiveCamera().Roll(angle) return self def dolly(self, value: float) -> Self: """Move the camera towards (value>0) or away from (value<0) the focal point.""" self.renderer.GetActiveCamera().Dolly(value) return self ################################################################## def add_slider( self, sliderfunc, xmin, xmax, value=None, pos=4, title="", font="Calco", title_size=1, c=None, alpha=1, show_value=True, delayed=False, **options, ) -> "vedo.addons.Slider2D": """ Add a `vedo.addons.Slider2D` which can call an external custom function. Arguments: sliderfunc : (Callable) external function to be called by the widget xmin : (float) lower value of the slider xmax : (float) upper value value : (float) current value pos : (list, str) position corner number: horizontal [1-5] or vertical [11-15] it can also be specified by corners coordinates [(x1,y1), (x2,y2)] and also by a string descriptor (eg. "bottom-left") title : (str) title text font : (str) title font face. Check [available fonts here](https://vedo.embl.es/fonts). title_size : (float) title text scale [1.0] show_value : (bool) if True current value is shown delayed : (bool) if True the callback is delayed until when the mouse button is released alpha : (float) opacity of the scalar bar texts slider_length : (float) slider length slider_width : (float) slider width end_cap_length : (float) length of the end cap end_cap_width : (float) width of the end cap tube_width : (float) width of the tube title_height : (float) width of the title tformat : (str) format of the title Examples: - [sliders1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders1.py) - [sliders2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders2.py) ![](https://user-images.githubusercontent.com/32848391/50738848-be033480-11d8-11e9-9b1a-c13105423a79.jpg) """ if c is None: # automatic black or white c = (0.8, 0.8, 0.8) if np.sum(vedo.get_color(self.backgrcol)) > 1.5: c = (0.2, 0.2, 0.2) else: c = vedo.get_color(c) slider2d = addons.Slider2D( sliderfunc, xmin, xmax, value, pos, title, font, title_size, c, alpha, show_value, delayed, **options, ) if self.renderer: slider2d.renderer = self.renderer if self.interactor: slider2d.interactor = self.interactor slider2d.on() self.sliders.append([slider2d, sliderfunc]) return slider2d def add_slider3d( self, sliderfunc, pos1, pos2, xmin, xmax, value=None, s=0.03, t=1, title="", rotation=0.0, c=None, show_value=True, ) -> "vedo.addons.Slider3D": """ Add a 3D slider widget which can call an external custom function. Arguments: sliderfunc : (function) external function to be called by the widget pos1 : (list) first position 3D coordinates pos2 : (list) second position coordinates xmin : (float) lower value xmax : (float) upper value value : (float) initial value s : (float) label scaling factor t : (float) tube scaling factor title : (str) title text c : (color) slider color rotation : (float) title rotation around slider axis show_value : (bool) if True current value is shown Examples: - [sliders3d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders3d.py) ![](https://user-images.githubusercontent.com/32848391/52859555-4efcf200-312d-11e9-9290-6988c8295163.png) """ if c is None: # automatic black or white c = (0.8, 0.8, 0.8) if np.sum(vedo.get_color(self.backgrcol)) > 1.5: c = (0.2, 0.2, 0.2) else: c = vedo.get_color(c) slider3d = addons.Slider3D( sliderfunc, pos1, pos2, xmin, xmax, value, s, t, title, rotation, c, show_value, ) slider3d.renderer = self.renderer slider3d.interactor = self.interactor slider3d.on() self.sliders.append([slider3d, sliderfunc]) return slider3d def add_button( self, fnc=None, states=("On", "Off"), c=("w", "w"), bc=("green4", "red4"), pos=(0.7, 0.1), size=24, font="Courier", bold=True, italic=False, alpha=1, angle=0, ) -> Union["vedo.addons.Button", None]: """ Add a button to the renderer window. Arguments: states : (list) a list of possible states, e.g. ['On', 'Off'] c : (list) a list of colors for each state bc : (list) a list of background colors for each state pos : (list) 2D position from left-bottom corner size : (float) size of button font font : (str) font type. Check [available fonts here](https://vedo.embl.es/fonts). bold : (bool) bold font face (False) italic : (bool) italic font face (False) alpha : (float) opacity level angle : (float) anticlockwise rotation in degrees Returns: `vedo.addons.Button` object. Examples: - [buttons1.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/buttons1.py) - [buttons2.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/buttons2.py) ![](https://user-images.githubusercontent.com/32848391/50738870-c0fe2500-11d8-11e9-9b78-92754f5c5968.jpg) """ if self.interactor: bu = addons.Button(fnc, states, c, bc, pos, size, font, bold, italic, alpha, angle) self.renderer.AddActor2D(bu) self.buttons.append(bu) # bu.function_id = self.add_callback("LeftButtonPress", bu.function) # not good bu.function_id = bu.add_observer("pick", bu.function, priority=10) return bu return None def add_spline_tool( self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, alpha=1, closed=False, ontop=True, can_add_nodes=True, ) -> "vedo.addons.SplineTool": """ Add a spline tool to the current plotter. Nodes of the spline can be dragged in space with the mouse. Clicking on the line itself adds an extra point. Selecting a point and pressing del removes it. Arguments: points : (Mesh, Points, array) the set of coordinates forming the spline nodes. pc : (str) point color. The default is 'k'. ps : (str) point size. The default is 8. lc : (str) line color. The default is 'r4'. ac : (str) active point marker color. The default is 'g5'. lw : (int) line width. The default is 2. alpha : (float) line transparency. closed : (bool) spline is meant to be closed. The default is False. Returns: a `SplineTool` object. Examples: - [spline_tool.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/spline_tool.py) ![](https://vedo.embl.es/images/basic/spline_tool.png) """ sw = addons.SplineTool(points, pc, ps, lc, ac, lw, alpha, closed, ontop, can_add_nodes) sw.interactor = self.interactor sw.on() sw.Initialize(sw.points.dataset) sw.representation.SetRenderer(self.renderer) sw.representation.SetClosedLoop(closed) sw.representation.BuildRepresentation() self.widgets.append(sw) return sw def add_icon(self, icon, pos=3, size=0.08) -> "vedo.addons.Icon": """Add an inset icon mesh into the same renderer. Arguments: pos : (int, list) icon position in the range [1-4] indicating one of the 4 corners, or it can be a tuple (x,y) as a fraction of the renderer size. size : (float) size of the square inset. Examples: - [icon.py](https://github.com/marcomusy/vedo/tree/master/examples/other/icon.py) """ iconw = addons.Icon(icon, pos, size) iconw.SetInteractor(self.interactor) iconw.EnabledOn() iconw.InteractiveOff() self.widgets.append(iconw) return iconw def add_global_axes(self, axtype=None, c=None) -> Self: """Draw axes on scene. Available axes types: Arguments: axtype : (int) - 0, no axes, - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the vtkCubeAxesActor object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane - 12, show polar axes - 13, draw a simple ruler at the bottom of the window Axis type-1 can be fully customized by passing a dictionary axes=dict(). Example: ```python from vedo import Box, show b = Box(pos=(0, 0, 0), length=80, width=90, height=70).alpha(0.1) show( b, axes={ "xtitle": "Some long variable [a.u.]", "number_of_divisions": 4, # ... }, ) ``` Examples: - [custom_axes1.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/custom_axes1.py) - [custom_axes2.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/custom_axes2.py) - [custom_axes3.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/custom_axes3.py) - [custom_axes4.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/custom_axes4.py) """ addons.add_global_axes(axtype, c) return self def add_legend_box(self, **kwargs) -> "vedo.addons.LegendBox": """Add a legend to the top right. Examples: - [legendbox.py](https://github.com/marcomusy/vedo/blob/master/examples/examples/basic/legendbox.py), - [flag_labels1.py](https://github.com/marcomusy/vedo/blob/master/examples/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/blob/master/examples/examples/other/flag_labels2.py) """ acts = self.get_meshes() lb = addons.LegendBox(acts, **kwargs) self.add(lb) return lb def add_hint( self, obj, text="", c="k", bg="yellow9", font="Calco", size=18, justify=0, angle=0, delay=250, ) -> Union[vtki.vtkBalloonWidget, None]: """ Create a pop-up hint style message when hovering an object. Use `add_hint(obj, False)` to disable a hinting a specific object. Use `add_hint(None)` to disable all hints. Arguments: obj : (Mesh, Points) the object to associate the pop-up to text : (str) string description of the pop-up delay : (int) milliseconds to wait before pop-up occurs """ if self.offscreen or not self.interactor: return None if vedo.vtk_version[:2] == (9, 0) and "Linux" in vedo.sys_platform: # Linux vtk9.0 is bugged vedo.logger.warning( f"add_hint() is not available on Linux platforms for vtk{vedo.vtk_version}." ) return None if obj is None: self.hint_widget.EnabledOff() self.hint_widget.SetInteractor(None) self.hint_widget = None return self.hint_widget if text is False and self.hint_widget: self.hint_widget.RemoveBalloon(obj) return self.hint_widget if text == "": if obj.name: text = obj.name elif obj.filename: text = obj.filename else: return None if not self.hint_widget: self.hint_widget = vtki.vtkBalloonWidget() rep = self.hint_widget.GetRepresentation() rep.SetBalloonLayoutToImageRight() trep = rep.GetTextProperty() trep.SetFontFamily(vtki.VTK_FONT_FILE) trep.SetFontFile(utils.get_font_path(font)) trep.SetFontSize(size) trep.SetColor(vedo.get_color(c)) trep.SetBackgroundColor(vedo.get_color(bg)) trep.SetShadow(0) trep.SetJustification(justify) trep.UseTightBoundingBoxOn() self.hint_widget.ManagesCursorOff() self.hint_widget.SetTimerDuration(delay) self.hint_widget.SetInteractor(self.interactor) if angle: trep.SetOrientation(angle) trep.SetBackgroundOpacity(0) # else: # trep.SetBackgroundOpacity(0.5) # doesnt work well self.hint_widget.SetRepresentation(rep) self.widgets.append(self.hint_widget) self.hint_widget.EnabledOn() bst = self.hint_widget.GetBalloonString(obj.actor) if bst: self.hint_widget.UpdateBalloonString(obj.actor, text) else: self.hint_widget.AddBalloon(obj.actor, text) return self.hint_widget def add_shadows(self) -> Self: """Add shadows at the current renderer.""" if self.renderer: shadows = vtki.new("ShadowMapPass") seq = vtki.new("SequencePass") passes = vtki.new("RenderPassCollection") passes.AddItem(shadows.GetShadowMapBakerPass()) passes.AddItem(shadows) seq.SetPasses(passes) camerapass = vtki.new("CameraPass") camerapass.SetDelegatePass(seq) self.renderer.SetPass(camerapass) return self def add_ambient_occlusion(self, radius: float, bias=0.01, blur=True, samples=100) -> Self: """ Screen Space Ambient Occlusion. For every pixel on the screen, the pixel shader samples the depth values around the current pixel and tries to compute the amount of occlusion from each of the sampled points. Arguments: radius : (float) radius of influence in absolute units bias : (float) bias of the normals blur : (bool) add a blurring to the sampled positions samples : (int) number of samples to probe Examples: - [ssao.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/ssao.py) ![](https://vedo.embl.es/images/basic/ssao.jpg) """ lights = vtki.new("LightsPass") opaque = vtki.new("OpaquePass") ssaoCam = vtki.new("CameraPass") ssaoCam.SetDelegatePass(opaque) ssao = vtki.new("SSAOPass") ssao.SetRadius(radius) ssao.SetBias(bias) ssao.SetBlur(blur) ssao.SetKernelSize(samples) ssao.SetDelegatePass(ssaoCam) translucent = vtki.new("TranslucentPass") volpass = vtki.new("VolumetricPass") ddp = vtki.new("DualDepthPeelingPass") ddp.SetTranslucentPass(translucent) ddp.SetVolumetricPass(volpass) over = vtki.new("OverlayPass") collection = vtki.new("RenderPassCollection") collection.AddItem(lights) collection.AddItem(ssao) collection.AddItem(ddp) collection.AddItem(over) sequence = vtki.new("SequencePass") sequence.SetPasses(collection) cam = vtki.new("CameraPass") cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) return self def add_depth_of_field(self, autofocus=True) -> Self: """Add a depth of field effect in the scene.""" lights = vtki.new("LightsPass") opaque = vtki.new("OpaquePass") dofCam = vtki.new("CameraPass") dofCam.SetDelegatePass(opaque) dof = vtki.new("DepthOfFieldPass") dof.SetAutomaticFocalDistance(autofocus) dof.SetDelegatePass(dofCam) collection = vtki.new("RenderPassCollection") collection.AddItem(lights) collection.AddItem(dof) sequence = vtki.new("SequencePass") sequence.SetPasses(collection) cam = vtki.new("CameraPass") cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) return self def _add_skybox(self, hdrfile: str) -> Self: # many hdr files are at https://polyhaven.com/all reader = vtki.new("HDRReader") # Check the image can be read. if not reader.CanReadFile(hdrfile): vedo.logger.error(f"Cannot read HDR file {hdrfile}") return self reader.SetFileName(hdrfile) reader.Update() texture = vtki.vtkTexture() texture.SetColorModeToDirectScalars() texture.SetInputData(reader.GetOutput()) # Convert to a cube map tcm = vtki.new("EquirectangularToCubeMapTexture") tcm.SetInputTexture(texture) # Enable mipmapping to handle HDR image tcm.MipmapOn() tcm.InterpolateOn() self.renderer.SetEnvironmentTexture(tcm) self.renderer.UseImageBasedLightingOn() self.skybox = vtki.new("Skybox") self.skybox.SetTexture(tcm) self.renderer.AddActor(self.skybox) return self def add_renderer_frame(self, c=None, alpha=None, lw=None, padding=None) -> "vedo.addons.RendererFrame": """ Add a frame to the renderer subwindow. Arguments: c : (color) color name or index alpha : (float) opacity level lw : (int) line width in pixels. padding : (float) padding space in pixels. """ if c is None: # automatic black or white c = (0.9, 0.9, 0.9) if self.renderer: if np.sum(self.renderer.GetBackground()) > 1.5: c = (0.1, 0.1, 0.1) renf = addons.RendererFrame(c, alpha, lw, padding) if renf: self.renderer.AddActor(renf) return renf def add_hover_legend( self, at=None, c=None, pos="bottom-left", font="Calco", s=0.75, bg="auto", alpha=0.1, maxlength=24, use_info=False, ) -> int: """ Add a legend with 2D text which is triggered by hovering the mouse on an object. The created text object are stored in `plotter.hover_legends`. Returns: the id of the callback function. Arguments: c : (color) Text color. If None then black or white is chosen automatically pos : (str) text positioning font : (str) text font type. Check [available fonts here](https://vedo.embl.es/fonts). s : (float) text size scale bg : (color) background color of the 2D box containing the text alpha : (float) box transparency maxlength : (int) maximum number of characters per line use_info : (bool) visualize the content of the `obj.info` attribute Examples: - [hover_legend.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/hover_legend.py) - [earthquake_browser.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/earthquake_browser.py) ![](https://vedo.embl.es/images/pyplot/earthquake_browser.jpg) """ hoverlegend = vedo.shapes.Text2D(pos=pos, font=font, c=c, s=s, alpha=alpha, bg=bg) if at is None: at = self.renderers.index(self.renderer) def _legfunc(evt): if not evt.object or not self.renderer or at != evt.at: if hoverlegend.mapper.GetInput(): # clear and return hoverlegend.mapper.SetInput("") self.render() return if use_info: if hasattr(evt.object, "info"): t = str(evt.object.info) else: return else: t, tp = "", "" if evt.isMesh: tp = "Mesh " elif evt.isPoints: tp = "Points " elif evt.isVolume: tp = "Volume " elif evt.isImage: tp = "Image " elif evt.isAssembly: tp = "Assembly " else: return if evt.isAssembly: if not evt.object.name: t += f"Assembly object of {len(evt.object.unpack())} parts\n" else: t += f"Assembly name: {evt.object.name} ({len(evt.object.unpack())} parts)\n" else: if evt.object.name: t += f"{tp}name" if evt.isPoints: t += " " if evt.isMesh: t += " " t += f": {evt.object.name[:maxlength]}".ljust(maxlength) + "\n" if evt.object.filename: t += f"{tp}filename: " t += f"{os.path.basename(evt.object.filename[-maxlength:])}".ljust(maxlength) t += "\n" if not evt.object.file_size: evt.object.file_size, evt.object.created = vedo.file_io.file_info(evt.object.filename) if evt.object.file_size: t += " : " sz, created = evt.object.file_size, evt.object.created t += f"{created[4:-5]} ({sz})" + "\n" if evt.isPoints: indata = evt.object.dataset if indata.GetNumberOfPoints(): t += ( f"#points/cells: {indata.GetNumberOfPoints()}" f" / {indata.GetNumberOfCells()}" ) pdata = indata.GetPointData() cdata = indata.GetCellData() if pdata.GetScalars() and pdata.GetScalars().GetName(): t += f"\nPoint array : {pdata.GetScalars().GetName()}" if pdata.GetScalars().GetName() == evt.object.mapper.GetArrayName(): t += " *" if cdata.GetScalars() and cdata.GetScalars().GetName(): t += f"\nCell array : {cdata.GetScalars().GetName()}" if cdata.GetScalars().GetName() == evt.object.mapper.GetArrayName(): t += " *" if evt.isImage: t = f"{os.path.basename(evt.object.filename[:maxlength+10])}".ljust(maxlength+10) t += f"\nImage shape: {evt.object.shape}" pcol = self.color_picker(evt.picked2d) t += f"\nPixel color: {vedo.colors.rgb2hex(pcol/255)} {pcol}" # change box color if needed in 'auto' mode if evt.isPoints and "auto" in str(bg): actcol = evt.object.properties.GetColor() if hoverlegend.mapper.GetTextProperty().GetBackgroundColor() != actcol: hoverlegend.mapper.GetTextProperty().SetBackgroundColor(actcol) # adapt to changes in bg color bgcol = self.renderers[at].GetBackground() _bgcol = c if _bgcol is None: # automatic black or white _bgcol = (0.9, 0.9, 0.9) if sum(bgcol) > 1.5: _bgcol = (0.1, 0.1, 0.1) if len(set(_bgcol).intersection(bgcol)) < 3: hoverlegend.color(_bgcol) if hoverlegend.mapper.GetInput() != t: hoverlegend.mapper.SetInput(t) self.interactor.Render() # print("ABORT", idcall, hoverlegend.actor.GetCommand(idcall)) # hoverlegend.actor.GetCommand(idcall).AbortFlagOn() self.add(hoverlegend, at=at) self.hover_legends.append(hoverlegend) idcall = self.add_callback("MouseMove", _legfunc) return idcall def add_scale_indicator( self, pos=(0.7, 0.05), s=0.02, length=2, lw=4, c="k1", alpha=1, units="", gap=0.05, ) -> Union["vedo.visual.Actor2D", None]: """ Add a Scale Indicator. Only works in parallel mode (no perspective). Arguments: pos : (list) fractional (x,y) position on the screen. s : (float) size of the text. length : (float) length of the line. units : (str) string to show units. gap : (float) separation of line and text. Example: ```python from vedo import settings, Cube, Plotter settings.use_parallel_projection = True # or else it does not make sense! cube = Cube().alpha(0.2) plt = Plotter(size=(900,600), axes=dict(xtitle='x (um)')) plt.add_scale_indicator(units='um', c='blue4') plt.show(cube, "Scale indicator with units").close() ``` ![](https://vedo.embl.es/images/feats/scale_indicator.png) """ # Note that this cannot go in addons.py # because it needs callbacks and window size if not self.interactor: return None ppoints = vtki.vtkPoints() # Generate the polyline psqr = [[0.0, gap], [length / 10, gap]] dd = psqr[1][0] - psqr[0][0] for i, pt in enumerate(psqr): ppoints.InsertPoint(i, pt[0], pt[1], 0) lines = vtki.vtkCellArray() lines.InsertNextCell(len(psqr)) for i in range(len(psqr)): lines.InsertCellPoint(i) pd = vtki.vtkPolyData() pd.SetPoints(ppoints) pd.SetLines(lines) wsx, wsy = self.window.GetSize() if not self.camera.GetParallelProjection(): vedo.logger.warning("add_scale_indicator called with use_parallel_projection OFF. Skip.") return None rlabel = vtki.new("VectorText") rlabel.SetText("scale") tf = vtki.new("TransformPolyDataFilter") tf.SetInputConnection(rlabel.GetOutputPort()) t = vtki.vtkTransform() t.Scale(s * wsy / wsx, s, 1) tf.SetTransform(t) app = vtki.new("AppendPolyData") app.AddInputConnection(tf.GetOutputPort()) app.AddInputData(pd) mapper = vtki.new("PolyDataMapper2D") mapper.SetInputConnection(app.GetOutputPort()) cs = vtki.vtkCoordinate() cs.SetCoordinateSystem(1) mapper.SetTransformCoordinate(cs) fractor = vedo.visual.Actor2D() csys = fractor.GetPositionCoordinate() csys.SetCoordinateSystem(3) fractor.SetPosition(pos) fractor.SetMapper(mapper) fractor.GetProperty().SetColor(vedo.get_color(c)) fractor.GetProperty().SetOpacity(alpha) fractor.GetProperty().SetLineWidth(lw) fractor.GetProperty().SetDisplayLocationToForeground() def sifunc(iren, ev): wsx, wsy = self.window.GetSize() ps = self.camera.GetParallelScale() newtxt = utils.precision(ps / wsy * wsx * length * dd, 3) if units: newtxt += " " + units if rlabel.GetText() != newtxt: rlabel.SetText(newtxt) self.renderer.AddActor(fractor) self.interactor.AddObserver("MouseWheelBackwardEvent", sifunc) self.interactor.AddObserver("MouseWheelForwardEvent", sifunc) self.interactor.AddObserver("InteractionEvent", sifunc) sifunc(0, 0) return fractor def fill_event(self, ename="", pos=(), enable_picking=True) -> "Event": """ Create an Event object with information of what was clicked. If `enable_picking` is False, no picking will be performed. This can be useful to avoid double picking when using buttons. """ if not self.interactor: return Event() if len(pos) > 0: x, y = pos self.interactor.SetEventPosition(pos) else: x, y = self.interactor.GetEventPosition() self.renderer = self.interactor.FindPokedRenderer(x, y) self.picked2d = (x, y) key = self.interactor.GetKeySym() if key: if "_L" in key or "_R" in key: # skip things like Shift_R key = "" # better than None else: if self.interactor.GetShiftKey(): key = key.upper() if key == "MINUS": # fix: vtk9 is ignoring shift chars.. key = "underscore" elif key == "EQUAL": # fix: vtk9 is ignoring shift chars.. key = "plus" elif key == "SLASH": # fix: vtk9 is ignoring shift chars.. key = "?" if self.interactor.GetControlKey(): key = "Ctrl+" + key if self.interactor.GetAltKey(): key = "Alt+" + key if enable_picking: if not self.picker: self.picker = vtki.vtkPropPicker() self.picker.PickProp(x, y, self.renderer) actor = self.picker.GetProp3D() # Note that GetProp3D already picks Assembly xp, yp = self.interactor.GetLastEventPosition() dx, dy = x - xp, y - yp delta3d = np.array([0, 0, 0]) if actor: picked3d = np.array(self.picker.GetPickPosition()) try: vobj = actor.retrieve_object() old_pt = np.asarray(vobj.picked3d) vobj.picked3d = picked3d delta3d = picked3d - old_pt except (AttributeError, TypeError): pass else: picked3d = None if not actor: # try 2D actor = self.picker.GetActor2D() event = Event() event.name = ename event.title = self.title event.id = -1 # will be set by the timer wrapper function event.timerid = -1 # will be set by the timer wrapper function event.priority = -1 # will be set by the timer wrapper function event.time = time.time() event.at = self.renderers.index(self.renderer) event.keypress = key if enable_picking: try: event.object = actor.retrieve_object() except AttributeError: event.object = actor try: event.actor = actor.retrieve_object() # obsolete use object instead except AttributeError: event.actor = actor event.picked3d = picked3d event.picked2d = (x, y) event.delta2d = (dx, dy) event.angle2d = np.arctan2(dy, dx) event.speed2d = np.sqrt(dx * dx + dy * dy) event.delta3d = delta3d event.speed3d = np.sqrt(np.dot(delta3d, delta3d)) event.isPoints = isinstance(event.object, vedo.Points) event.isMesh = isinstance(event.object, vedo.Mesh) event.isAssembly = isinstance(event.object, vedo.Assembly) event.isVolume = isinstance(event.object, vedo.Volume) event.isImage = isinstance(event.object, vedo.Image) event.isActor2D = isinstance(event.object, vtki.vtkActor2D) return event def add_callback(self, event_name: str, func: Callable, priority=0.0, enable_picking=True) -> int: """ Add a function to be executed while show() is active. Return a unique id for the callback. The callback function (see example below) exposes a dictionary with the following information: - `name`: event name, - `id`: event unique identifier, - `priority`: event priority (float), - `interactor`: the interactor object, - `at`: renderer nr. where the event occurred - `keypress`: key pressed as string - `actor`: object picked by the mouse - `picked3d`: point picked in world coordinates - `picked2d`: screen coords of the mouse pointer - `delta2d`: shift wrt previous position (to calculate speed, direction) - `delta3d`: ...same but in 3D world coords - `angle2d`: angle of mouse movement on screen - `speed2d`: speed of mouse movement on screen - `speed3d`: speed of picked point in world coordinates - `isPoints`: True if of class - `isMesh`: True if of class - `isAssembly`: True if of class - `isVolume`: True if of class Volume - `isImage`: True if of class If `enable_picking` is False, no picking will be performed. This can be useful to avoid double picking when using buttons. Frequently used events are: - `KeyPress`, `KeyRelease`: listen to keyboard events - `LeftButtonPress`, `LeftButtonRelease`: listen to mouse clicks - `MiddleButtonPress`, `MiddleButtonRelease` - `RightButtonPress`, `RightButtonRelease` - `MouseMove`: listen to mouse pointer changing position - `MouseWheelForward`, `MouseWheelBackward` - `Enter`, `Leave`: listen to mouse entering or leaving the window - `Pick`, `StartPick`, `EndPick`: listen to object picking - `ResetCamera`, `ResetCameraClippingRange` - `Error`, `Warning` - `Char` - `Timer` Check the complete list of events [here](https://vtk.org/doc/nightly/html/classvtkCommand.html). Example: ```python from vedo import * def func(evt): # this function is called every time the mouse moves # (evt is a dotted dictionary) if not evt.object: return # no hit, return print("point coords =", evt.picked3d) # print(evt) # full event dump elli = Ellipsoid() plt = Plotter(axes=1) plt.add_callback('mouse hovering', func) plt.show(elli).close() ``` Examples: - [spline_draw1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/spline_draw1.py) - [colorlines.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/colorlines.py) ![](https://vedo.embl.es/images/advanced/spline_draw.png) - ..and many others! """ from vtkmodules.util.misc import calldata_type if not self.interactor: return 0 if vedo.settings.dry_run_mode >= 1: return 0 ######################################### @calldata_type(vtki.VTK_INT) def _func_wrap(iren, ename, timerid=None): event = self.fill_event(ename=ename, enable_picking=enable_picking) event.timerid = timerid event.id = cid event.priority = priority self.last_event = event func(event) ######################################### event_name = utils.get_vtk_name_event(event_name) cid = self.interactor.AddObserver(event_name, _func_wrap, priority) # print(f"Registering event: {event_name} with id={cid}") return cid def remove_callback(self, cid: Union[int, str]) -> Self: """ Remove a callback function by its id or a whole category of callbacks by their name. Arguments: cid : (int, str) Unique id of the callback. If an event name is passed all callbacks of that type are removed. """ if self.interactor: if isinstance(cid, str): cid = utils.get_vtk_name_event(cid) self.interactor.RemoveObservers(cid) else: self.interactor.RemoveObserver(cid) return self def remove_all_observers(self) -> Self: """ Remove all observers. Example: ```python from vedo import * def kfunc(event): print("Key pressed:", event.keypress) if event.keypress == 'q': plt.close() def rfunc(event): if event.isImage: printc("Right-clicked!", event) plt.render() img = Image(dataurl+"images/embryo.jpg") plt = Plotter(size=(1050, 600)) plt.parallel_projection(True) plt.remove_all_observers() plt.add_callback("key press", kfunc) plt.add_callback("mouse right click", rfunc) plt.show("Right-Click Me! Press q to exit.", img) plt.close() ``` """ if self.interactor: self.interactor.RemoveAllObservers() return self def timer_callback(self, action: str, timer_id=None, dt=1, one_shot=False) -> int: """ Start or stop an existing timer. Arguments: action : (str) Either "create"/"start" or "destroy"/"stop" timer_id : (int) When stopping the timer, the ID of the timer as returned when created dt : (int) time in milliseconds between each repeated call one_shot : (bool) create a one shot timer of prescribed duration instead of a repeating one Examples: - [timer_callback1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/timer_callback1.py) - [timer_callback2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/timer_callback2.py) ![](https://vedo.embl.es/images/advanced/timer_callback1.jpg) """ if action in ("create", "start"): if "Windows" in vedo.sys_platform: # otherwise on windows it gets stuck self.initialize_interactor() if timer_id is not None: vedo.logger.warning("you set a timer_id but it will be ignored.") if one_shot: timer_id = self.interactor.CreateOneShotTimer(dt) else: timer_id = self.interactor.CreateRepeatingTimer(dt) return timer_id elif action in ("destroy", "stop"): if timer_id is not None: self.interactor.DestroyTimer(timer_id) else: vedo.logger.warning("please set a timer_id. Cannot stop timer.") else: e = f"in timer_callback(). Cannot understand action: {action}\n" e += " allowed actions are: ['start', 'stop']. Skipped." vedo.logger.error(e) return timer_id def add_observer(self, event_name: str, func: Callable, priority=0.0) -> int: """ Add a callback function that will be called when an event occurs. Consider using `add_callback()` instead. """ if not self.interactor: return -1 event_name = utils.get_vtk_name_event(event_name) idd = self.interactor.AddObserver(event_name, func, priority) return idd def compute_world_coordinate( self, pos2d: MutableSequence[float], at=None, objs=(), bounds=(), offset=None, pixeltol=None, worldtol=None, ) -> np.ndarray: """ Transform a 2D point on the screen into a 3D point inside the rendering scene. If a set of meshes is passed then points are placed onto these. Arguments: pos2d : (list) 2D screen coordinates point. at : (int) renderer number. objs : (list) list of Mesh objects to project the point onto. bounds : (list) specify a bounding box as [xmin,xmax, ymin,ymax, zmin,zmax]. offset : (float) specify an offset value. pixeltol : (int) screen tolerance in pixels. worldtol : (float) world coordinates tolerance. Returns: numpy array, the point in 3D world coordinates. Examples: - [cut_freehand.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/cut_freehand.py) - [mousehover3.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mousehover3.py) ![](https://vedo.embl.es/images/basic/mousehover3.jpg) """ if at is not None: renderer = self.renderers[at] else: renderer = self.renderer if not objs: pp = vtki.vtkFocalPlanePointPlacer() else: pps = vtki.vtkPolygonalSurfacePointPlacer() for ob in objs: pps.AddProp(ob.actor) pp = pps # type: ignore if len(bounds) == 6: pp.SetPointBounds(bounds) if pixeltol: pp.SetPixelTolerance(pixeltol) if worldtol: pp.SetWorldTolerance(worldtol) if offset: pp.SetOffset(offset) worldPos: MutableSequence[float] = [0, 0, 0] worldOrient: MutableSequence[float] = [0, 0, 0, 0, 0, 0, 0, 0, 0] pp.ComputeWorldPosition(renderer, pos2d, worldPos, worldOrient) # validw = pp.ValidateWorldPosition(worldPos, worldOrient) # validd = pp.ValidateDisplayPosition(renderer, pos2d) return np.array(worldPos) def compute_screen_coordinates(self, obj, full_window=False) -> np.ndarray: """ Given a 3D points in the current renderer (or full window), find the screen pixel coordinates. Example: ```python from vedo import * elli = Ellipsoid().point_size(5) plt = Plotter() plt.show(elli, "Press q to continue and print the info") xyscreen = plt.compute_screen_coordinates(elli) print('xyscreen coords:', xyscreen) # simulate an event happening at one point event = plt.fill_event(pos=xyscreen[123]) print(event) ``` """ try: obj = obj.coordinates except AttributeError: pass if utils.is_sequence(obj): pts = obj p2d = [] cs = vtki.vtkCoordinate() cs.SetCoordinateSystemToWorld() cs.SetViewport(self.renderer) for p in pts: cs.SetValue(p) if full_window: p2d.append(cs.GetComputedDisplayValue(self.renderer)) else: p2d.append(cs.GetComputedViewportValue(self.renderer)) return np.array(p2d, dtype=int) def pick_area(self, pos1, pos2, at=None) -> "vedo.Mesh": """ Pick all objects within a box defined by two corner points in 2D screen coordinates. Returns a frustum Mesh that contains the visible field of view. This can be used to select objects in a scene or select vertices. Example: ```python from vedo import * settings.enable_default_mouse_callbacks = False def mode_select(objs): print("Selected objects:", objs) d0 = mode.start_x, mode.start_y # display coords d1 = mode.end_x, mode.end_y frustum = plt.pick_area(d0, d1) col = np.random.randint(0, 10) infru = frustum.inside_points(mesh) infru.point_size(10).color(col) plt.add(frustum, infru).render() mesh = Mesh(dataurl+"cow.vtk") mesh.color("k5").linewidth(1) mode = interactor_modes.BlenderStyle() mode.callback_select = mode_select plt = Plotter().user_mode(mode) plt.show(mesh, axes=1) ``` """ if at is not None: ren = self.renderers[at] else: ren = self.renderer area_picker = vtki.vtkAreaPicker() area_picker.AreaPick(pos1[0], pos1[1], pos2[0], pos2[1], ren) planes = area_picker.GetFrustum() fru = vtki.new("FrustumSource") fru.SetPlanes(planes) fru.ShowLinesOff() fru.Update() afru = vedo.Mesh(fru.GetOutput()) afru.alpha(0.1).lw(1).pickable(False) afru.name = "Frustum" return afru def _scan_input_return_acts(self, objs) -> Any: # scan the input and return a list of actors if not utils.is_sequence(objs): objs = [objs] ################# wannabe_acts = [] for a in objs: try: wannabe_acts.append(a.actor) except AttributeError: wannabe_acts.append(a) # already actor try: wannabe_acts.append(a.scalarbar) except AttributeError: pass try: for sh in a.shadows: wannabe_acts.append(sh.actor) except AttributeError: pass try: wannabe_acts.append(a.trail.actor) if a.trail.shadows: # trails may also have shadows for sh in a.trail.shadows: wannabe_acts.append(sh.actor) except AttributeError: pass ################# scanned_acts = [] for a in wannabe_acts: # scan content of list if a is None: pass elif isinstance(a, (vtki.vtkActor, vtki.vtkActor2D)): scanned_acts.append(a) elif isinstance(a, str): # assume a 2D comment was given changed = False # check if one already exists so to just update text if self.renderer: # might be jupyter acs = self.renderer.GetActors2D() acs.InitTraversal() for i in range(acs.GetNumberOfItems()): act = acs.GetNextItem() if isinstance(act, vedo.shapes.Text2D): aposx, aposy = act.GetPosition() if aposx < 0.01 and aposy > 0.99: # "top-left" act.text(a) # update content! no appending nada changed = True break if not changed: out = vedo.shapes.Text2D(a) # append a new one scanned_acts.append(out) # scanned_acts.append(vedo.shapes.Text2D(a)) # naive version elif isinstance(a, vtki.vtkPolyData): scanned_acts.append(vedo.Mesh(a).actor) elif isinstance(a, vtki.vtkImageData): scanned_acts.append(vedo.Volume(a).actor) elif isinstance(a, vedo.RectilinearGrid): scanned_acts.append(a.actor) elif isinstance(a, vedo.StructuredGrid): scanned_acts.append(a.actor) elif isinstance(a, vtki.vtkLight): scanned_acts.append(a) elif isinstance(a, vedo.visual.LightKit): a.lightkit.AddLightsToRenderer(self.renderer) elif isinstance(a, vtki.get_class("MultiBlockDataSet")): for i in range(a.GetNumberOfBlocks()): b = a.GetBlock(i) if isinstance(b, vtki.vtkPolyData): scanned_acts.append(vedo.Mesh(b).actor) elif isinstance(b, vtki.vtkImageData): scanned_acts.append(vedo.Volume(b).actor) elif isinstance(a, (vtki.vtkProp, vtki.vtkInteractorObserver)): scanned_acts.append(a) elif "trimesh" in str(type(a)): scanned_acts.append(utils.trimesh2vedo(a)) elif "meshlab" in str(type(a)): if "MeshSet" in str(type(a)): for i in range(a.number_meshes()): if a.mesh_id_exists(i): scanned_acts.append(utils.meshlab2vedo(a.mesh(i))) else: scanned_acts.append(utils.meshlab2vedo(a)) elif "dolfin" in str(type(a)): # assume a dolfin.Mesh object import vedo.dolfin as vdlf scanned_acts.append(vdlf.IMesh(a).actor) elif "madcad" in str(type(a)): scanned_acts.append(utils.madcad2vedo(a).actor) elif "TetgenIO" in str(type(a)): scanned_acts.append(vedo.TetMesh(a).shrink(0.9).c("pink7").actor) elif "matplotlib.figure.Figure" in str(type(a)): scanned_acts.append(vedo.Image(a).clone2d("top-right", 0.6)) else: vedo.logger.error(f"cannot understand input in show(): {type(a)}") return scanned_acts def show( self, *objects, at=None, axes=None, resetcam=None, zoom=False, interactive=None, viewup="", azimuth=0.0, elevation=0.0, roll=0.0, camera=None, mode=None, rate=None, bg=None, bg2=None, size=None, title=None, screenshot="", ) -> Any: """ Render a list of objects. Arguments: at : (int) number of the renderer to plot to, in case of more than one exists axes : (int) axis type-1 can be fully customized by passing a dictionary. Check `addons.Axes()` for the full list of options. set the type of axes to be shown: - 0, no axes - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the `vtkCubeAxesActor` object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane - 12, show polar axes - 13, draw a simple ruler at the bottom of the window azimuth/elevation/roll : (float) move camera accordingly the specified value viewup: str, list either `['x', 'y', 'z']` or a vector to set vertical direction resetcam : (bool) re-adjust camera position to fit objects camera : (dict, vtkCamera) camera parameters can further be specified with a dictionary assigned to the `camera` keyword (E.g. `show(camera={'pos':(1,2,3), 'thickness':1000,})`): - pos, `(list)`, the position of the camera in world coordinates - focal_point `(list)`, the focal point of the camera in world coordinates - viewup `(list)`, the view up direction for the camera - distance `(float)`, set the focal point to the specified distance from the camera position. - clipping_range `(float)`, distance of the near and far clipping planes along the direction of projection. - parallel_scale `(float)`, scaling used for a parallel projection, i.e. the height of the viewport in world-coordinate distances. The default is 1. Note that the "scale" parameter works as an "inverse scale", larger numbers produce smaller images. This method has no effect in perspective projection mode. - thickness `(float)`, set the distance between clipping planes. This method adjusts the far clipping plane to be set a distance 'thickness' beyond the near clipping plane. - view_angle `(float)`, the camera view angle, which is the angular height of the camera view measured in degrees. The default angle is 30 degrees. This method has no effect in parallel projection mode. The formula for setting the angle up for perfect perspective viewing is: angle = 2*atan((h/2)/d) where h is the height of the RenderWindow (measured by holding a ruler up to your screen) and d is the distance from your eyes to the screen. interactive : (bool) pause and interact with window (True) or continue execution (False) rate : (float) maximum rate of `show()` in Hertz mode : (int, str) set the type of interaction: - 0 = TrackballCamera [default] - 1 = TrackballActor - 2 = JoystickCamera - 3 = JoystickActor - 4 = Flight - 5 = RubberBand2D - 6 = RubberBand3D - 7 = RubberBandZoom - 8 = Terrain - 9 = Unicam - 10 = Image - Check out `vedo.interaction_modes` for more options. bg : (str, list) background color in RGB format, or string name bg2 : (str, list) second background color to create a gradient background size : (str, list) size of the window, e.g. size="fullscreen", or size=[600,400] title : (str) window title text screenshot : (str) save a screenshot of the window to file """ if vedo.settings.dry_run_mode >= 2: return self if self.wx_widget: return self if self.renderers: # in case of notebooks if at is None: at = self.renderers.index(self.renderer) else: if at >= len(self.renderers): t = f"trying to show(at={at}) but only {len(self.renderers)} renderers exist" vedo.logger.error(t) return self self.renderer = self.renderers[at] if title is not None: self.title = title if size is not None: self.size = size if self.size[0] == "f": # full screen self.size = "fullscreen" self.window.SetFullScreen(True) self.window.BordersOn() else: self.window.SetSize(int(self.size[0]), int(self.size[1])) if vedo.settings.default_backend == "vtk": if str(bg).endswith(".hdr"): self._add_skybox(bg) else: if bg is not None: self.backgrcol = vedo.get_color(bg) self.renderer.SetBackground(self.backgrcol) if bg2 is not None: self.renderer.GradientBackgroundOn() self.renderer.SetBackground2(vedo.get_color(bg2)) if axes is not None: if isinstance(axes, vedo.Assembly): # user passing show(..., axes=myaxes) objects = list(objects) objects.append(axes) # move it into the list of normal things to show axes = 0 self.axes = axes if interactive is not None: self._interactive = interactive if self.offscreen: self._interactive = False # camera stuff if resetcam is not None: self.resetcam = resetcam if camera is not None: self.resetcam = False viewup = "" if isinstance(camera, vtki.vtkCamera): cameracopy = vtki.vtkCamera() cameracopy.DeepCopy(camera) self.camera = cameracopy else: self.camera = utils.camera_from_dict(camera) self.add(objects) # Backend ############################################################### if vedo.settings.default_backend in ["k3d", "panel"]: return backends.get_notebook_backend(self.objects) ######################################################################### for ia in utils.flatten(objects): try: # fix gray color labels and title to white or black ltc = np.array(ia.scalarbar.GetLabelTextProperty().GetColor()) if np.linalg.norm(ltc - (0.5, 0.5, 0.5)) / 3 < 0.05: c = (0.9, 0.9, 0.9) if np.sum(self.renderer.GetBackground()) > 1.5: c = (0.1, 0.1, 0.1) ia.scalarbar.GetLabelTextProperty().SetColor(c) ia.scalarbar.GetTitleTextProperty().SetColor(c) except AttributeError: pass if self.sharecam: for r in self.renderers: r.SetActiveCamera(self.camera) if self.axes is not None: if viewup != "2d" or self.axes in [1, 8] or isinstance(self.axes, dict): bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(self.axes, bounds=bns) # Backend ############################################################### if vedo.settings.default_backend in ["ipyvtk", "trame"]: return backends.get_notebook_backend() ######################################################################### if self.resetcam: self.renderer.ResetCamera() if len(self.renderers) > 1: self.add_renderer_frame() if vedo.settings.default_backend == "2d" and not zoom: zoom = "tightest" if zoom: if zoom == "tight": self.reset_camera(tight=0.04) elif zoom == "tightest": self.reset_camera(tight=0.0001) else: self.camera.Zoom(zoom) if elevation: self.camera.Elevation(elevation) if azimuth: self.camera.Azimuth(azimuth) if roll: self.camera.Roll(roll) if len(viewup) > 0: b = self.renderer.ComputeVisiblePropBounds() cm = np.array([(b[1] + b[0])/2, (b[3] + b[2])/2, (b[5] + b[4])/2]) sz = np.array([(b[1] - b[0]), (b[3] - b[2]), (b[5] - b[4])]) if viewup == "x": sz = np.linalg.norm(sz) self.camera.SetViewUp([1, 0, 0]) self.camera.SetPosition(cm + sz) elif viewup == "y": sz = np.linalg.norm(sz) self.camera.SetViewUp([0, 1, 0]) self.camera.SetPosition(cm + sz) elif viewup == "z": sz = np.array([(b[1]-b[0])*0.7, -(b[3]-b[2])*1.0, (b[5]-b[4])*1.2]) self.camera.SetViewUp([0, 0, 1]) self.camera.SetPosition(cm + 2 * sz) elif utils.is_sequence(viewup): sz = np.linalg.norm(sz) self.camera.SetViewUp(viewup) cpos = np.cross([0, 1, 0], viewup) self.camera.SetPosition(cm - 2 * sz * cpos) self.renderer.ResetCameraClippingRange() self.initialize_interactor() if vedo.settings.immediate_rendering: self.window.Render() ##################### <-------------- Render if self.interactor: # can be offscreen or not the vtk backend.. self.window.SetWindowName(self.title) # pic = vedo.Image(vedo.dataurl+'images/vtk_logo.png') # pic = vedo.Image('/home/musy/Downloads/icons8-3d-96.png') # print(pic.dataset)# Array 0 name PNGImage # self.window.SetIcon(pic.dataset) try: # Needs "pip install pyobjc" on Mac OSX if ( self._cocoa_initialized is False and "Darwin" in vedo.sys_platform and not self.offscreen ): self._cocoa_initialized = True from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps # type: ignore pid = os.getpid() x = NSRunningApplication.runningApplicationWithProcessIdentifier_(int(pid)) x.activateWithOptions_(NSApplicationActivateIgnoringOtherApps) except: # vedo.logger.debug("On Mac OSX try: pip install pyobjc") pass # Set the interaction style if mode is not None: self.user_mode(mode) if self.qt_widget and mode is None: self.user_mode(0) if screenshot: self.screenshot(screenshot) if self._interactive: self.interactor.Start() if self._must_close_now: self.interactor.GetRenderWindow().Finalize() self.interactor.TerminateApp() self.camera = None self.renderer = None self.renderers = [] self.window = None self.interactor = None return self if rate: if self.clock is None: # set clock and limit rate self._clockt0 = time.time() self.clock = 0.0 else: t = time.time() - self._clockt0 elapsed = t - self.clock mint = 1.0 / rate if elapsed < mint: time.sleep(mint - elapsed) self.clock = time.time() - self._clockt0 # 2d #################################################################### if vedo.settings.default_backend in ["2d"]: return backends.get_notebook_backend() ######################################################################### return self def add_inset(self, *objects, **options) -> Union[vtki.vtkOrientationMarkerWidget, None]: """Add a draggable inset space into a renderer. Arguments: at : (int) specify the renderer number pos : (list) icon position in the range [1-4] indicating one of the 4 corners, or it can be a tuple (x,y) as a fraction of the renderer size. size : (float) size of the square inset draggable : (bool) if True the subrenderer space can be dragged around c : (color) color of the inset frame when dragged Examples: - [inset.py](https://github.com/marcomusy/vedo/tree/master/examples/other/inset.py) ![](https://user-images.githubusercontent.com/32848391/56758560-3c3f1300-6797-11e9-9b33-49f5a4876039.jpg) """ if not self.interactor: return None if not self.renderer: vedo.logger.warning("call add_inset() only after first rendering of the scene.") return None options = dict(options) pos = options.pop("pos", 0) size = options.pop("size", 0.1) c = options.pop("c", "lb") at = options.pop("at", None) draggable = options.pop("draggable", True) r, g, b = vedo.get_color(c) widget = vtki.vtkOrientationMarkerWidget() widget.SetOutlineColor(r, g, b) if len(objects) == 1: widget.SetOrientationMarker(objects[0].actor) else: widget.SetOrientationMarker(vedo.Assembly(objects)) widget.SetInteractor(self.interactor) if utils.is_sequence(pos): widget.SetViewport(pos[0] - size, pos[1] - size, pos[0] + size, pos[1] + size) else: if pos < 2: widget.SetViewport(0, 1 - 2 * size, size * 2, 1) elif pos == 2: widget.SetViewport(1 - 2 * size, 1 - 2 * size, 1, 1) elif pos == 3: widget.SetViewport(0, 0, size * 2, size * 2) elif pos == 4: widget.SetViewport(1 - 2 * size, 0, 1, size * 2) widget.EnabledOn() widget.SetInteractive(draggable) if at is not None and at < len(self.renderers): widget.SetCurrentRenderer(self.renderers[at]) else: widget.SetCurrentRenderer(self.renderer) self.widgets.append(widget) return widget def clear(self, at=None, deep=False) -> Self: """Clear the scene from all meshes and volumes.""" if at is not None: renderer = self.renderers[at] else: renderer = self.renderer if not renderer: return self if deep: renderer.RemoveAllViewProps() else: for ob in set( self.get_meshes() + self.get_volumes() + self.objects + self.axes_instances ): if isinstance(ob, vedo.shapes.Text2D): continue self.remove(ob) try: if ob.scalarbar: self.remove(ob.scalarbar) except AttributeError: pass return self def break_interaction(self) -> Self: """Break window interaction and return to the python execution flow""" if self.interactor: self.check_actors_trasform() self.interactor.ExitCallback() return self def freeze(self, value=True) -> Self: """Freeze the current renderer. Use this with `sharecam=False`.""" if not self.interactor: return self if not self.renderer: return self self.renderer.SetInteractive(not value) return self def user_mode(self, mode) -> Self: """ Modify the user interaction mode. Examples: ```python from vedo import * mode = interactor_modes.MousePan() mesh = Mesh(dataurl+"cow.vtk") plt = Plotter().user_mode(mode) plt.show(mesh, axes=1) ``` See also: [VTK interactor styles](https://vtk.org/doc/nightly/html/classvtkInteractorStyle.html) """ if not self.interactor: return self curr_style = self.interactor.GetInteractorStyle().GetClassName() # print("Current style:", curr_style) if curr_style.endswith("Actor"): self.check_actors_trasform() if isinstance(mode, (str, int)): # Set the style of interaction # see https://vtk.org/doc/nightly/html/classvtkInteractorStyle.html if mode in (0, "TrackballCamera"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleTrackballCamera")) self.interactor.RemoveObservers("CharEvent") elif mode in (1, "TrackballActor"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleTrackballActor")) elif mode in (2, "JoystickCamera"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleJoystickCamera")) elif mode in (3, "JoystickActor"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleJoystickActor")) elif mode in (4, "Flight"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleFlight")) elif mode in (5, "RubberBand2D"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleRubberBand2D")) elif mode in (6, "RubberBand3D"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleRubberBand3D")) elif mode in (7, "RubberBandZoom"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleRubberBandZoom")) elif mode in (8, "Terrain"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleTerrain")) elif mode in (9, "Unicam"): self.interactor.SetInteractorStyle(vtki.new("InteractorStyleUnicam")) elif mode in (10, "Image", "image", "2d"): astyle = vtki.new("InteractorStyleImage") astyle.SetInteractionModeToImage3D() self.interactor.SetInteractorStyle(astyle) else: vedo.logger.warning(f"Unknown interaction mode: {mode}") elif isinstance(mode, vtki.vtkInteractorStyleUser): # set a custom interactor style if hasattr(mode, "interactor"): mode.interactor = self.interactor mode.renderer = self.renderer # type: ignore mode.SetInteractor(self.interactor) mode.SetDefaultRenderer(self.renderer) self.interactor.SetInteractorStyle(mode) return self def close(self) -> Self: """Close the plotter.""" # https://examples.vtk.org/site/Cxx/Visualization/CloseWindow/ vedo.last_figure = None self.last_event = None self.sliders = [] self.buttons = [] self.widgets = [] self.hover_legends = [] self.background_renderer = None self._extralight = None self.hint_widget = None self.cutter_widget = None if vedo.settings.dry_run_mode >= 2: return self if not hasattr(self, "window"): return self if not self.window: return self if not hasattr(self, "interactor"): return self if not self.interactor: return self ################################################### try: if "Darwin" in vedo.sys_platform: self.interactor.ProcessEvents() except: pass self._must_close_now = True if vedo.plotter_instance == self: vedo.plotter_instance = None if self.interactor and self._interactive: self.break_interaction() elif self._must_close_now: # dont call ExitCallback here if self.interactor: self.break_interaction() self.interactor.GetRenderWindow().Finalize() self.interactor.TerminateApp() self.camera = None self.renderer = None self.renderers = [] self.window = None self.interactor = None return self @property def camera(self): """Return the current active camera.""" if self.renderer: return self.renderer.GetActiveCamera() @camera.setter def camera(self, cam): if self.renderer: if isinstance(cam, dict): cam = utils.camera_from_dict(cam) self.renderer.SetActiveCamera(cam) def screenshot(self, filename="screenshot.png", scale=1, asarray=False) -> Any: """ Take a screenshot of the Plotter window. Arguments: scale : (int) set image magnification as an integer multiplicating factor asarray : (bool) return a numpy array of the image instead of writing a file Warning: If you get black screenshots try to set `interactive=False` in `show()` then call `screenshot()` and `plt.interactive()` afterwards. Example: ```py from vedo import * sphere = Sphere().linewidth(1) plt = show(sphere, interactive=False) plt.screenshot('image.png') plt.interactive() plt.close() ``` Example: ```py from vedo import * sphere = Sphere().linewidth(1) plt = show(sphere, interactive=False) plt.screenshot('anotherimage.png') plt.interactive() plt.close() ``` """ return vedo.file_io.screenshot(filename, scale, asarray) def toimage(self, scale=1) -> "vedo.image.Image": """ Generate a `Image` object from the current rendering window. Arguments: scale : (int) set image magnification as an integer multiplicating factor """ if vedo.settings.screeshot_large_image: w2if = vtki.new("RenderLargeImage") w2if.SetInput(self.renderer) w2if.SetMagnification(scale) else: w2if = vtki.new("WindowToImageFilter") w2if.SetInput(self.window) if hasattr(w2if, "SetScale"): w2if.SetScale(scale, scale) if vedo.settings.screenshot_transparent_background: w2if.SetInputBufferTypeToRGBA() w2if.ReadFrontBufferOff() # read from the back buffer w2if.Update() return vedo.image.Image(w2if.GetOutput()) def export(self, filename="scene.npz", binary=False) -> Self: """ Export scene to file to HTML, X3D or Numpy file. Examples: - [export_x3d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/export_x3d.py) - [export_numpy.py](https://github.com/marcomusy/vedo/tree/master/examples/other/export_numpy.py) """ vedo.file_io.export_window(filename, binary=binary) return self def color_picker(self, xy, verbose=False): """Pick color of specific (x,y) pixel on the screen.""" w2if = vtki.new("WindowToImageFilter") w2if.SetInput(self.window) w2if.ReadFrontBufferOff() w2if.Update() nx, ny = self.window.GetSize() varr = w2if.GetOutput().GetPointData().GetScalars() arr = utils.vtk2numpy(varr).reshape(ny, nx, 3) x, y = int(xy[0]), int(xy[1]) if y < ny and x < nx: rgb = arr[y, x] if verbose: vedo.printc(":rainbow:Pixel", [x, y], "has RGB[", end="") vedo.printc("█", c=[rgb[0], 0, 0], end="") vedo.printc("█", c=[0, rgb[1], 0], end="") vedo.printc("█", c=[0, 0, rgb[2]], end="") vedo.printc("] = ", end="") cnm = vedo.get_color_name(rgb) if np.sum(rgb) < 150: vedo.printc( rgb.tolist(), vedo.colors.rgb2hex(np.array(rgb) / 255), c="w", bc=rgb, invert=1, end="", ) vedo.printc(" -> " + cnm, invert=1, c="w") else: vedo.printc( rgb.tolist(), vedo.colors.rgb2hex(np.array(rgb) / 255), c=rgb, end="", ) vedo.printc(" -> " + cnm, c=cnm) return rgb return None ####################################################################### def _default_mouseleftclick(self, iren, event) -> None: x, y = iren.GetEventPosition() renderer = iren.FindPokedRenderer(x, y) picker = vtki.vtkPropPicker() picker.PickProp(x, y, renderer) self.renderer = renderer clicked_actor = picker.GetActor() # clicked_actor2D = picker.GetActor2D() # print('_default_mouseleftclick mouse at', x, y) # print("picked Volume:", [picker.GetVolume()]) # print("picked Actor2D:", [picker.GetActor2D()]) # print("picked Assembly:", [picker.GetAssembly()]) # print("picked Prop3D:", [picker.GetProp3D()]) if not clicked_actor: clicked_actor = picker.GetAssembly() if not clicked_actor: clicked_actor = picker.GetProp3D() if not hasattr(clicked_actor, "GetPickable") or not clicked_actor.GetPickable(): return self.picked3d = picker.GetPickPosition() self.picked2d = np.array([x, y]) if not clicked_actor: return self.justremoved = None self.clicked_actor = clicked_actor try: # might not be a vedo obj self.clicked_object = clicked_actor.retrieve_object() # save this info in the object itself self.clicked_object.picked3d = self.picked3d self.clicked_object.picked2d = self.picked2d except AttributeError: pass # ----------- # if "Histogram1D" in picker.GetAssembly().__class__.__name__: # histo = picker.GetAssembly() # if histo.verbose: # x = self.picked3d[0] # idx = np.digitize(x, histo.edges) - 1 # f = histo.frequencies[idx] # cn = histo.centers[idx] # vedo.colors.printc(f"{histo.name}, bin={idx}, center={cn}, value={f}") ####################################################################### def _default_keypress(self, iren, event) -> None: # NB: qt creates and passes a vtkGenericRenderWindowInteractor key = iren.GetKeySym() if "_L" in key or "_R" in key: return if iren.GetShiftKey(): key = key.upper() if iren.GetControlKey(): key = "Ctrl+" + key if iren.GetAltKey(): key = "Alt+" + key ####################################################### # utils.vedo.printc('Pressed key:', key, c='y', box='-') # print(key, iren.GetShiftKey(), iren.GetAltKey(), iren.GetControlKey(), # iren.GetKeyCode(), iren.GetRepeatCount()) ####################################################### x, y = iren.GetEventPosition() renderer = iren.FindPokedRenderer(x, y) if key in ["q", "Return"]: self.break_interaction() return elif key in ["Ctrl+q", "Ctrl+w", "Escape"]: self.close() return elif key == "F1": vedo.logger.info("Execution aborted. Exiting python kernel now.") self.break_interaction() sys.exit(0) elif key == "Down": if self.clicked_object and self.clicked_object in self.get_meshes(): self.clicked_object.alpha(0.02) if hasattr(self.clicked_object, "properties_backface"): bfp = self.clicked_actor.GetBackfaceProperty() self.clicked_object.properties_backface = bfp # save it self.clicked_actor.SetBackfaceProperty(None) else: for obj in self.get_meshes(): if obj: obj.alpha(0.02) bfp = obj.actor.GetBackfaceProperty() if bfp and hasattr(obj, "properties_backface"): obj.properties_backface = bfp obj.actor.SetBackfaceProperty(None) elif key == "Left": if self.clicked_object and self.clicked_object in self.get_meshes(): ap = self.clicked_object.properties aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) bfp = self.clicked_actor.GetBackfaceProperty() if bfp and hasattr(self.clicked_object, "properties_backface"): self.clicked_object.properties_backface = bfp self.clicked_actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): if a: ap = a.properties aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) bfp = a.actor.GetBackfaceProperty() if bfp and hasattr(a, "properties_backface"): a.properties_backface = bfp a.actor.SetBackfaceProperty(None) elif key == "Right": if self.clicked_object and self.clicked_object in self.get_meshes(): ap = self.clicked_object.properties aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) if ( aal == 1 and hasattr(self.clicked_object, "properties_backface") and self.clicked_object.properties_backface ): # put back self.clicked_actor.SetBackfaceProperty( self.clicked_object.properties_backface) else: for a in self.get_meshes(): if a: ap = a.properties aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) if aal == 1 and hasattr(a, "properties_backface") and a.properties_backface: a.actor.SetBackfaceProperty(a.properties_backface) elif key == "Up": if self.clicked_object and self.clicked_object in self.get_meshes(): self.clicked_object.properties.SetOpacity(1) if hasattr(self.clicked_object, "properties_backface") and self.clicked_object.properties_backface: self.clicked_object.actor.SetBackfaceProperty(self.clicked_object.properties_backface) else: for a in self.get_meshes(): if a: a.properties.SetOpacity(1) if hasattr(a, "properties_backface") and a.properties_backface: a.actor.SetBackfaceProperty(a.properties_backface) elif key == "P": if self.clicked_object and self.clicked_object in self.get_meshes(): objs = [self.clicked_object] else: objs = self.get_meshes() for ia in objs: try: ps = ia.properties.GetPointSize() if ps > 1: ia.properties.SetPointSize(ps - 1) ia.properties.SetRepresentationToPoints() except AttributeError: pass elif key == "p": if self.clicked_object and self.clicked_object in self.get_meshes(): objs = [self.clicked_object] else: objs = self.get_meshes() for ia in objs: try: ps = ia.properties.GetPointSize() ia.properties.SetPointSize(ps + 2) ia.properties.SetRepresentationToPoints() except AttributeError: pass elif key == "U": pval = renderer.GetActiveCamera().GetParallelProjection() renderer.GetActiveCamera().SetParallelProjection(not pval) if pval: renderer.ResetCamera() elif key == "r": renderer.ResetCamera() elif key == "h": msg = f" vedo {vedo.__version__}" msg += f" | vtk {vtki.vtkVersion().GetVTKVersion()}" msg += f" | numpy {np.__version__}" msg += f" | python {sys.version_info[0]}.{sys.version_info[1]}, press: " vedo.printc(msg.ljust(75), invert=True) msg = ( " i print info about the last clicked object \n" " I print color of the pixel under the mouse \n" " Y show the pipeline for this object as a graph \n" " <- -> use arrows to reduce/increase opacity \n" " x toggle mesh visibility \n" " w toggle wireframe/surface style \n" " l toggle surface edges visibility \n" " p/P hide surface faces and show only points \n" " 1-3 cycle surface color (2=light, 3=dark) \n" " 4 cycle color map (press shift-4 to go back) \n" " 5-6 cycle point-cell arrays (shift to go back) \n" " 7-8 cycle background and gradient color \n" " 09+- cycle axes styles (on keypad, or press +/-) \n" " k cycle available lighting styles \n" " K toggle shading as flat or phong \n" " A toggle anti-aliasing \n" " D toggle depth-peeling (for transparencies) \n" " U toggle perspective/parallel projection \n" " o/O toggle extra light to scene and rotate it \n" " a toggle interaction to Actor Mode \n" " n toggle surface normals \n" " r reset camera position \n" " R reset camera to the closest orthogonal view \n" " . fly camera to the last clicked point \n" " C print the current camera parameters state \n" " X invoke a cutter widget tool \n" " S save a screenshot of the current scene \n" " E/F export 3D scene to numpy file or X3D \n" " q return control to python script \n" " Esc abort execution and exit python kernel " ) vedo.printc(msg, dim=True, italic=True, bold=True) vedo.printc( " Check out the documentation at: https://vedo.embl.es ".ljust(75), invert=True, bold=True, ) return elif key == "a": cur = iren.GetInteractorStyle() if isinstance(cur, vtki.get_class("InteractorStyleTrackballCamera")): msg = "Interactor style changed to TrackballActor\n" msg += " you can now move and rotate individual meshes:\n" msg += " press X twice to save the repositioned mesh\n" msg += " press 'a' to go back to normal style" vedo.printc(msg) iren.SetInteractorStyle(vtki.new("InteractorStyleTrackballActor")) else: iren.SetInteractorStyle(vtki.new("InteractorStyleTrackballCamera")) return elif key == "A": # toggle antialiasing msam = self.window.GetMultiSamples() if not msam: self.window.SetMultiSamples(16) else: self.window.SetMultiSamples(0) msam = self.window.GetMultiSamples() if msam: vedo.printc(f"Antialiasing set to {msam} samples", c=bool(msam)) else: vedo.printc("Antialiasing disabled", c=bool(msam)) elif key == "D": # toggle depthpeeling udp = not renderer.GetUseDepthPeeling() renderer.SetUseDepthPeeling(udp) # self.renderer.SetUseDepthPeelingForVolumes(udp) if udp: self.window.SetAlphaBitPlanes(1) renderer.SetMaximumNumberOfPeels(vedo.settings.max_number_of_peels) renderer.SetOcclusionRatio(vedo.settings.occlusion_ratio) self.interactor.Render() wasUsed = renderer.GetLastRenderingUsedDepthPeeling() rnr = self.renderers.index(renderer) vedo.printc(f"Depth peeling set to {udp} for renderer nr.{rnr}", c=udp) if not wasUsed and udp: vedo.printc("\t...but last rendering did not actually used it!", c=udp, invert=True) return elif key == "period": if self.picked3d: self.fly_to(self.picked3d) return elif key == "S": fname = "screenshot.png" i = 1 while os.path.isfile(fname): fname = f"screenshot{i}.png" i += 1 vedo.file_io.screenshot(fname) vedo.printc(rf":camera: Saved rendering window to {fname}", c="b") return elif key == "C": # Precision needs to be 7 (or even larger) to guarantee a consistent camera when # the model coordinates are not centered at (0, 0, 0) and the mode is large. # This could happen for plotting geological models with UTM coordinate systems cam = renderer.GetActiveCamera() vedo.printc("\n###################################################", c="y") vedo.printc("## Template python code to position this camera: ##", c="y") vedo.printc("cam = dict(", c="y") vedo.printc(" pos=" + utils.precision(cam.GetPosition(), 6) + ",", c="y") vedo.printc(" focal_point=" + utils.precision(cam.GetFocalPoint(), 6) + ",", c="y") vedo.printc(" viewup=" + utils.precision(cam.GetViewUp(), 6) + ",", c="y") vedo.printc(" roll=" + utils.precision(cam.GetRoll(), 6) + ",", c="y") if cam.GetParallelProjection(): vedo.printc(' parallel_scale='+utils.precision(cam.GetParallelScale(),6)+',', c='y') else: vedo.printc(' distance=' +utils.precision(cam.GetDistance(),6)+',', c='y') vedo.printc(' clipping_range='+utils.precision(cam.GetClippingRange(),6)+',', c='y') vedo.printc(')', c='y') vedo.printc('show(mymeshes, camera=cam)', c='y') vedo.printc('###################################################', c='y') return elif key == "R": self.reset_viewup() elif key == "w": try: if self.clicked_object.properties.GetRepresentation() == 1: # toggle self.clicked_object.properties.SetRepresentationToSurface() else: self.clicked_object.properties.SetRepresentationToWireframe() except AttributeError: pass elif key == "1": try: self._icol += 1 self.clicked_object.mapper.ScalarVisibilityOff() pal = vedo.colors.palettes[vedo.settings.palette % len(vedo.colors.palettes)] self.clicked_object.c(pal[(self._icol) % 10]) self.remove(self.clicked_object.scalarbar) except AttributeError: pass elif key == "2": # dark colors try: bsc = ["k1", "k2", "k3", "k4", "b1", "b2", "b3", "b4", "p1", "p2", "p3", "p4", "g1", "g2", "g3", "g4", "r1", "r2", "r3", "r4", "o1", "o2", "o3", "o4", "y1", "y2", "y3", "y4"] self._icol += 1 if self.clicked_object: self.clicked_object.mapper.ScalarVisibilityOff() newcol = vedo.get_color(bsc[(self._icol) % len(bsc)]) self.clicked_object.c(newcol) self.remove(self.clicked_object.scalarbar) except AttributeError: pass elif key == "3": # light colors try: bsc = ["k6", "k7", "k8", "k9", "b6", "b7", "b8", "b9", "p6", "p7", "p8", "p9", "g6", "g7", "g8", "g9", "r6", "r7", "r8", "r9", "o6", "o7", "o8", "o9", "y6", "y7", "y8", "y9"] self._icol += 1 if self.clicked_object: self.clicked_object.mapper.ScalarVisibilityOff() newcol = vedo.get_color(bsc[(self._icol) % len(bsc)]) self.clicked_object.c(newcol) self.remove(self.clicked_object.scalarbar) except AttributeError: pass elif key == "4": # cmap name cycle ob = self.clicked_object if not isinstance(ob, (vedo.Points, vedo.UnstructuredGrid)): return if not ob.mapper.GetScalarVisibility(): return onwhat = ob.mapper.GetScalarModeAsString() # UsePointData/UseCellData cmap_names = [ "Accent", "Paired", "rainbow", "rainbow_r", "Spectral", "Spectral_r", "gist_ncar", "gist_ncar_r", "viridis", "viridis_r", "hot", "hot_r", "terrain", "ocean", "coolwarm", "seismic", "PuOr", "RdYlGn", ] try: i = cmap_names.index(ob._cmap_name) if iren.GetShiftKey(): i -= 1 else: i += 1 if i >= len(cmap_names): i = 0 if i < 0: i = len(cmap_names) - 1 except ValueError: i = 0 ob._cmap_name = cmap_names[i] ob.cmap(ob._cmap_name, on=onwhat) if ob.scalarbar: if isinstance(ob.scalarbar, vtki.vtkActor2D): self.remove(ob.scalarbar) title = ob.scalarbar.GetTitle() ob.add_scalarbar(title=title) self.add(ob.scalarbar).render() elif isinstance(ob.scalarbar, vedo.Assembly): self.remove(ob.scalarbar) ob.add_scalarbar3d(title=ob._cmap_name) self.add(ob.scalarbar) vedo.printc( f"Name:'{ob.name}'," if ob.name else "", f"range:{utils.precision(ob.mapper.GetScalarRange(),3)},", f"colormap:'{ob._cmap_name}'", c="g", bold=False, ) elif key == "5": # cycle pointdata array ob = self.clicked_object if not isinstance(ob, (vedo.Points, vedo.UnstructuredGrid)): return arrnames = ob.pointdata.keys() arrnames = [a for a in arrnames if "normal" not in a.lower()] arrnames = [a for a in arrnames if "tcoord" not in a.lower()] arrnames = [a for a in arrnames if "textur" not in a.lower()] if len(arrnames) == 0: return ob.mapper.SetScalarVisibility(1) if not ob._cmap_name: ob._cmap_name = "rainbow" try: curr_name = ob.dataset.GetPointData().GetScalars().GetName() i = arrnames.index(curr_name) if "normals" in curr_name.lower(): return if iren.GetShiftKey(): i -= 1 else: i += 1 if i >= len(arrnames): i = 0 if i < 0: i = len(arrnames) - 1 except (ValueError, AttributeError): i = 0 ob.cmap(ob._cmap_name, arrnames[i], on="points") if ob.scalarbar: if isinstance(ob.scalarbar, vtki.vtkActor2D): self.remove(ob.scalarbar) title = ob.scalarbar.GetTitle() ob.scalarbar = None ob.add_scalarbar(title=arrnames[i]) self.add(ob.scalarbar) elif isinstance(ob.scalarbar, vedo.Assembly): self.remove(ob.scalarbar) ob.scalarbar = None ob.add_scalarbar3d(title=arrnames[i]) self.add(ob.scalarbar) else: vedo.printc( f"Name:'{ob.name}'," if ob.name else "", f"active pointdata array: '{arrnames[i]}'", c="g", bold=False, ) elif key == "6": # cycle celldata array ob = self.clicked_object if not isinstance(ob, (vedo.Points, vedo.UnstructuredGrid)): return arrnames = ob.celldata.keys() arrnames = [a for a in arrnames if "normal" not in a.lower()] arrnames = [a for a in arrnames if "tcoord" not in a.lower()] arrnames = [a for a in arrnames if "textur" not in a.lower()] if len(arrnames) == 0: return ob.mapper.SetScalarVisibility(1) if not ob._cmap_name: ob._cmap_name = "rainbow" try: curr_name = ob.dataset.GetCellData().GetScalars().GetName() i = arrnames.index(curr_name) if "normals" in curr_name.lower(): return if iren.GetShiftKey(): i -= 1 else: i += 1 if i >= len(arrnames): i = 0 if i < 0: i = len(arrnames) - 1 except (ValueError, AttributeError): i = 0 ob.cmap(ob._cmap_name, arrnames[i], on="cells") if ob.scalarbar: if isinstance(ob.scalarbar, vtki.vtkActor2D): self.remove(ob.scalarbar) title = ob.scalarbar.GetTitle() ob.scalarbar = None ob.add_scalarbar(title=arrnames[i]) self.add(ob.scalarbar) elif isinstance(ob.scalarbar, vedo.Assembly): self.remove(ob.scalarbar) ob.scalarbar = None ob.add_scalarbar3d(title=arrnames[i]) self.add(ob.scalarbar) else: vedo.printc( f"Name:'{ob.name}'," if ob.name else "", f"active celldata array: '{arrnames[i]}'", c="g", bold=False, ) elif key == "7": bgc = np.array(renderer.GetBackground()).sum() / 3 if bgc <= 0: bgc = 0.223 elif 0 < bgc < 1: bgc = 1 else: bgc = 0 renderer.SetBackground(bgc, bgc, bgc) elif key == "8": bg2cols = [ "lightyellow", "darkseagreen", "palegreen", "steelblue", "lightblue", "cadetblue", "lavender", "white", "blackboard", "black", ] bg2name = vedo.get_color_name(renderer.GetBackground2()) if bg2name in bg2cols: idx = bg2cols.index(bg2name) else: idx = 4 if idx is not None: bg2name_next = bg2cols[(idx + 1) % (len(bg2cols) - 1)] if not bg2name_next: renderer.GradientBackgroundOff() else: renderer.GradientBackgroundOn() renderer.SetBackground2(vedo.get_color(bg2name_next)) elif key in ["plus", "equal", "KP_Add", "minus", "KP_Subtract"]: # cycle axes style i = self.renderers.index(renderer) try: self.axes_instances[i].EnabledOff() self.axes_instances[i].SetInteractor(None) except AttributeError: # print("Cannot remove widget", [self.axes_instances[i]]) try: self.remove(self.axes_instances[i]) except: print("Cannot remove axes", [self.axes_instances[i]]) return self.axes_instances[i] = None if not self.axes: self.axes = 0 if isinstance(self.axes, dict): self.axes = 1 if key in ["minus", "KP_Subtract"]: if not self.camera.GetParallelProjection() and self.axes == 0: self.axes -= 1 # jump ruler doesnt make sense in perspective mode bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=(self.axes - 1) % 15, c=None, bounds=bns) else: if not self.camera.GetParallelProjection() and self.axes == 12: self.axes += 1 # jump ruler doesnt make sense in perspective mode bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=(self.axes + 1) % 15, c=None, bounds=bns) self.render() elif "KP_" in key or key in [ "Insert","End","Down","Next","Left","Begin","Right","Home","Up","Prior" ]: asso = { # change axes style "KP_Insert": 0, "KP_0": 0, "Insert": 0, "KP_End": 1, "KP_1": 1, "End": 1, "KP_Down": 2, "KP_2": 2, "Down": 2, "KP_Next": 3, "KP_3": 3, "Next": 3, "KP_Left": 4, "KP_4": 4, "Left": 4, "KP_Begin": 5, "KP_5": 5, "Begin": 5, "KP_Right": 6, "KP_6": 6, "Right": 6, "KP_Home": 7, "KP_7": 7, "Home": 7, "KP_Up": 8, "KP_8": 8, "Up": 8, "Prior": 9, # on windows OS } clickedr = self.renderers.index(renderer) if key in asso: if self.axes_instances[clickedr]: if hasattr(self.axes_instances[clickedr], "EnabledOff"): # widget self.axes_instances[clickedr].EnabledOff() else: try: renderer.RemoveActor(self.axes_instances[clickedr]) except: pass self.axes_instances[clickedr] = None bounds = renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=asso[key], c=None, bounds=bounds) self.interactor.Render() if key == "O": renderer.RemoveLight(self._extralight) self._extralight = None elif key == "o": vbb, sizes, _, _ = addons.compute_visible_bounds() cm = utils.vector((vbb[0] + vbb[1]) / 2, (vbb[2] + vbb[3]) / 2, (vbb[4] + vbb[5]) / 2) if not self._extralight: vup = renderer.GetActiveCamera().GetViewUp() pos = cm + utils.vector(vup) * utils.mag(sizes) self._extralight = addons.Light(pos, focal_point=cm, intensity=0.4) renderer.AddLight(self._extralight) vedo.printc("Press 'o' again to rotate light source, or 'O' to remove it.", c='y') else: cpos = utils.vector(self._extralight.GetPosition()) x, y, z = self._extralight.GetPosition() - cm r, th, ph = transformations.cart2spher(x, y, z) th += 0.2 if th > np.pi: th = np.random.random() * np.pi / 2 ph += 0.3 cpos = transformations.spher2cart(r, th, ph).T + cm self._extralight.SetPosition(cpos) elif key == "l": if self.clicked_object in self.get_meshes(): objs = [self.clicked_object] else: objs = self.get_meshes() for ia in objs: try: ev = ia.properties.GetEdgeVisibility() ia.properties.SetEdgeVisibility(not ev) ia.properties.SetRepresentationToSurface() ia.properties.SetLineWidth(0.1) except AttributeError: pass elif key == "k": # lightings if self.clicked_object in self.get_meshes(): objs = [self.clicked_object] else: objs = self.get_meshes() shds = ("default", "metallic", "plastic", "shiny", "glossy", "off") for ia in objs: try: lnr = (ia._ligthingnr + 1) % 6 ia.lighting(shds[lnr]) ia._ligthingnr = lnr except AttributeError: pass elif key == "K": # shading if self.clicked_object in self.get_meshes(): objs = [self.clicked_object] else: objs = self.get_meshes() for ia in objs: if isinstance(ia, vedo.Mesh): ia.compute_normals(cells=False) intrp = ia.properties.GetInterpolation() if intrp > 0: ia.properties.SetInterpolation(0) # flat else: ia.properties.SetInterpolation(2) # phong elif key == "n": # show normals to an actor self.remove("added_auto_normals") if self.clicked_object in self.get_meshes(): if self.clicked_actor.GetPickable(): norml = vedo.shapes.NormalLines(self.clicked_object) norml.name = "added_auto_normals" self.add(norml) elif key == "x": if self.justremoved is None: if self.clicked_object in self.get_meshes() or isinstance( self.clicked_object, vtki.vtkAssembly ): self.justremoved = self.clicked_actor self.renderer.RemoveActor(self.clicked_actor) else: self.renderer.AddActor(self.justremoved) self.justremoved = None elif key == "X": if self.clicked_object: if not self.cutter_widget: self.cutter_widget = addons.BoxCutter(self.clicked_object) self.add(self.cutter_widget) vedo.printc("Press i to toggle the cutter on/off", c='g', dim=1) vedo.printc(" u to flip selection", c='g', dim=1) vedo.printc(" r to reset cutting planes", c='g', dim=1) vedo.printc(" Shift+X to close the cutter box widget", c='g', dim=1) vedo.printc(" Ctrl+S to save the cut section to file.", c='g', dim=1) else: self.remove(self.cutter_widget) self.cutter_widget = None vedo.printc("Click object and press X to open the cutter box widget.", c='g') elif key == "E": vedo.printc(r":camera: Exporting 3D window to file scene.npz", c="b", end="") vedo.file_io.export_window("scene.npz") vedo.printc(", try:\n> vedo scene.npz # (this is experimental!)", c="b") return elif key == "F": vedo.file_io.export_window("scene.x3d") vedo.printc(r":camera: Exporting 3D window to file", c="b", end="") vedo.file_io.export_window("scene.npz") vedo.printc(". Try:\n> firefox scene.html", c="b") # elif key == "G": # not working with last version of k3d # vedo.file_io.export_window("scene.html") # vedo.printc(r":camera: Exporting K3D window to file", c="b", end="") # vedo.file_io.export_window("scene.html") # vedo.printc(". Try:\n> firefox scene.html", c="b") elif key == "i": # print info if self.clicked_object: print(self.clicked_object) else: print(self) elif key == "I": # print color under the mouse x, y = iren.GetEventPosition() self.color_picker([x, y], verbose=True) elif key == "Y": if self.clicked_object and self.clicked_object.pipeline: self.clicked_object.pipeline.show() if iren: iren.Render() vedo-2025.5.3/vedo/pointcloud.py000066400000000000000000004206531474667405700164320ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import time from typing import Union, List from typing_extensions import Self from weakref import ref as weak_ref_to import numpy as np import vedo.vtkclasses as vtki import vedo from vedo import colors from vedo import utils from vedo.transformations import LinearTransform, NonLinearTransform from vedo.core import PointAlgorithms from vedo.visual import PointsVisual __docformat__ = "google" __doc__ = """ Submodule to work with point clouds. ![](https://vedo.embl.es/images/basic/pca.png) """ __all__ = [ "Points", "Point", "merge", "fit_line", "fit_circle", "fit_plane", "fit_sphere", "pca_ellipse", "pca_ellipsoid", ] #################################################### def merge(*meshs, flag=False) -> Union["vedo.Mesh", "vedo.Points", None]: """ Build a new Mesh (or Points) formed by the fusion of the inputs. Similar to Assembly, but in this case the input objects become a single entity. To keep track of the original identities of the inputs you can set `flag=True`. In this case a `pointdata` array of ids is added to the output with name "OriginalMeshID". Examples: - [warp1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp1.py) ![](https://vedo.embl.es/images/advanced/warp1.png) - [value_iteration.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/value_iteration.py) """ objs = [a for a in utils.flatten(meshs) if a] if not objs: return None idarr = [] polyapp = vtki.new("AppendPolyData") for i, ob in enumerate(objs): polyapp.AddInputData(ob.dataset) if flag: idarr += [i] * ob.dataset.GetNumberOfPoints() polyapp.Update() mpoly = polyapp.GetOutput() if flag: varr = utils.numpy2vtk(idarr, dtype=np.uint16, name="OriginalMeshID") mpoly.GetPointData().AddArray(varr) has_mesh = False for ob in objs: if isinstance(ob, vedo.Mesh): has_mesh = True break if has_mesh: msh = vedo.Mesh(mpoly) else: msh = Points(mpoly) # type: ignore msh.copy_properties_from(objs[0]) msh.pipeline = utils.OperationNode( "merge", parents=objs, comment=f"#pts {msh.dataset.GetNumberOfPoints()}" ) return msh def _rotate_points(points, n0=None, n1=(0, 0, 1)) -> Union[np.ndarray, tuple]: # Rotate a set of 3D points from direction n0 to direction n1. # Return the rotated points and the normal to the fitting plane (if n0 is None). # The pointing direction of the normal in this case is arbitrary. points = np.asarray(points) if points.ndim == 1: points = points[np.newaxis, :] if len(points[0]) == 2: return points, (0, 0, 1) if n0 is None: # fit plane datamean = points.mean(axis=0) vv = np.linalg.svd(points - datamean)[2] n0 = np.cross(vv[0], vv[1]) n0 = n0 / np.linalg.norm(n0) n1 = n1 / np.linalg.norm(n1) k = np.cross(n0, n1) l = np.linalg.norm(k) if not l: k = n0 k /= np.linalg.norm(k) ct = np.dot(n0, n1) theta = np.arccos(ct) st = np.sin(theta) v = k * (1 - ct) rpoints = [] for p in points: a = p * ct b = np.cross(k, p) * st c = v * np.dot(k, p) rpoints.append(a + b + c) return np.array(rpoints), n0 def fit_line(points: Union[np.ndarray, "vedo.Points"]) -> "vedo.shapes.Line": """ Fits a line through points. Extra info is stored in `Line.slope`, `Line.center`, `Line.variances`. Examples: - [fitline.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/fitline.py) ![](https://vedo.embl.es/images/advanced/fitline.png) """ if isinstance(points, Points): points = points.coordinates data = np.asarray(points) datamean = data.mean(axis=0) _, dd, vv = np.linalg.svd(data - datamean) vv = vv[0] / np.linalg.norm(vv[0]) # vv contains the first principal component, i.e. the direction # vector of the best fit line in the least squares sense. xyz_min = data.min(axis=0) xyz_max = data.max(axis=0) a = np.linalg.norm(xyz_min - datamean) b = np.linalg.norm(xyz_max - datamean) p1 = datamean - a * vv p2 = datamean + b * vv line = vedo.shapes.Line(p1, p2, lw=1) line.slope = vv line.center = datamean line.variances = dd return line def fit_circle(points: Union[np.ndarray, "vedo.Points"]) -> tuple: """ Fits a circle through a set of 3D points, with a very fast non-iterative method. Returns the tuple `(center, radius, normal_to_circle)`. .. warning:: trying to fit s-shaped points will inevitably lead to instabilities and circles of small radius. References: *J.F. Crawford, Nucl. Instr. Meth. 211, 1983, 223-225.* """ if isinstance(points, Points): points = points.coordinates data = np.asarray(points) offs = data.mean(axis=0) data, n0 = _rotate_points(data - offs) xi = data[:, 0] yi = data[:, 1] x = sum(xi) xi2 = xi * xi xx = sum(xi2) xxx = sum(xi2 * xi) y = sum(yi) yi2 = yi * yi yy = sum(yi2) yyy = sum(yi2 * yi) xiyi = xi * yi xy = sum(xiyi) xyy = sum(xiyi * yi) xxy = sum(xi * xiyi) N = len(xi) k = (xx + yy) / N a1 = xx - x * x / N b1 = xy - x * y / N c1 = 0.5 * (xxx + xyy - x * k) a2 = xy - x * y / N b2 = yy - y * y / N c2 = 0.5 * (xxy + yyy - y * k) d = a2 * b1 - a1 * b2 if not d: return offs, 0, n0 x0 = (b1 * c2 - b2 * c1) / d y0 = (c1 - a1 * x0) / b1 R = np.sqrt(x0 * x0 + y0 * y0 - 1 / N * (2 * x0 * x + 2 * y0 * y - xx - yy)) c, _ = _rotate_points([x0, y0, 0], (0, 0, 1), n0) return c[0] + offs, R, n0 def fit_plane(points: Union[np.ndarray, "vedo.Points"], signed=False) -> "vedo.shapes.Plane": """ Fits a plane to a set of points. Extra info is stored in `Plane.normal`, `Plane.center`, `Plane.variance`. Arguments: signed : (bool) if True flip sign of the normal based on the ordering of the points Examples: - [fitline.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/fitline.py) ![](https://vedo.embl.es/images/advanced/fitline.png) """ if isinstance(points, Points): points = points.coordinates data = np.asarray(points) datamean = data.mean(axis=0) pts = data - datamean res = np.linalg.svd(pts) dd, vv = res[1], res[2] n = np.cross(vv[0], vv[1]) if signed: v = np.zeros_like(pts) for i in range(len(pts) - 1): vi = np.cross(pts[i], pts[i + 1]) v[i] = vi / np.linalg.norm(vi) ns = np.mean(v, axis=0) # normal to the points plane if np.dot(n, ns) < 0: n = -n xyz_min = data.min(axis=0) xyz_max = data.max(axis=0) s = np.linalg.norm(xyz_max - xyz_min) pla = vedo.shapes.Plane(datamean, n, s=[s, s]) pla.variance = dd[2] pla.name = "FitPlane" return pla def fit_sphere(coords: Union[np.ndarray, "vedo.Points"]) -> "vedo.shapes.Sphere": """ Fits a sphere to a set of points. Extra info is stored in `Sphere.radius`, `Sphere.center`, `Sphere.residue`. Examples: - [fitspheres1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/fitspheres1.py) ![](https://vedo.embl.es/images/advanced/fitspheres1.jpg) """ if isinstance(coords, Points): coords = coords.coordinates coords = np.array(coords) n = len(coords) A = np.zeros((n, 4)) A[:, :-1] = coords * 2 A[:, 3] = 1 f = np.zeros((n, 1)) x = coords[:, 0] y = coords[:, 1] z = coords[:, 2] f[:, 0] = x * x + y * y + z * z try: C, residue, rank, _ = np.linalg.lstsq(A, f, rcond=-1) # solve AC=f except: C, residue, rank, _ = np.linalg.lstsq(A, f) # solve AC=f if rank < 4: return None t = (C[0] * C[0]) + (C[1] * C[1]) + (C[2] * C[2]) + C[3] radius = np.sqrt(t)[0] center = np.array([C[0][0], C[1][0], C[2][0]]) if len(residue) > 0: residue = np.sqrt(residue[0]) / n else: residue = 0 sph = vedo.shapes.Sphere(center, radius, c=(1, 0, 0)).wireframe(1) sph.radius = radius sph.center = center sph.residue = residue sph.name = "FitSphere" return sph def pca_ellipse(points: Union[np.ndarray, "vedo.Points"], pvalue=0.673, res=60) -> Union["vedo.shapes.Circle", None]: """ Create the oriented 2D ellipse that contains the fraction `pvalue` of points. PCA (Principal Component Analysis) is used to compute the ellipse orientation. Parameter `pvalue` sets the specified fraction of points inside the ellipse. Normalized directions are stored in `ellipse.axis1`, `ellipse.axis2`. Axes sizes are stored in `ellipse.va`, `ellipse.vb` Arguments: pvalue : (float) ellipse will include this fraction of points res : (int) resolution of the ellipse Examples: - [pca_ellipse.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/pca_ellipse.py) - [histo_pca.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_pca.py) ![](https://vedo.embl.es/images/pyplot/histo_pca.png) """ from scipy.stats import f if isinstance(points, Points): coords = points.coordinates else: coords = points if len(coords) < 4: vedo.logger.warning("in pca_ellipse(), there are not enough points!") return None P = np.array(coords, dtype=float)[:, (0, 1)] cov = np.cov(P, rowvar=0) # type: ignore _, s, R = np.linalg.svd(cov) # singular value decomposition p, n = s.size, P.shape[0] fppf = f.ppf(pvalue, p, n - p) # f % point function u = np.sqrt(s * fppf / 2) * 2 # semi-axes (largest first) ua, ub = u center = utils.make3d(np.mean(P, axis=0)) # centroid of the ellipse t = LinearTransform(R.T * u).translate(center) elli = vedo.shapes.Circle(alpha=0.75, res=res) elli.apply_transform(t) elli.properties.LightingOff() elli.pvalue = pvalue elli.center = np.array([center[0], center[1], 0]) elli.nr_of_points = n elli.va = ua elli.vb = ub # we subtract center because it's in t elli.axis1 = t.move([1, 0, 0]) - center elli.axis2 = t.move([0, 1, 0]) - center elli.axis1 /= np.linalg.norm(elli.axis1) elli.axis2 /= np.linalg.norm(elli.axis2) elli.name = "PCAEllipse" return elli def pca_ellipsoid(points: Union[np.ndarray, "vedo.Points"], pvalue=0.673, res=24) -> Union["vedo.shapes.Ellipsoid", None]: """ Create the oriented ellipsoid that contains the fraction `pvalue` of points. PCA (Principal Component Analysis) is used to compute the ellipsoid orientation. Axes sizes can be accessed in `ellips.va`, `ellips.vb`, `ellips.vc`, normalized directions are stored in `ellips.axis1`, `ellips.axis2` and `ellips.axis3`. Center of mass is stored in `ellips.center`. Asphericity can be accessed in `ellips.asphericity()` and ellips.asphericity_error(). A value of 0 means a perfect sphere. Arguments: pvalue : (float) ellipsoid will include this fraction of points Examples: [pca_ellipsoid.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/pca_ellipsoid.py) ![](https://vedo.embl.es/images/basic/pca.png) See also: `pca_ellipse()` for a 2D ellipse. """ from scipy.stats import f if isinstance(points, Points): coords = points.coordinates else: coords = points if len(coords) < 4: vedo.logger.warning("in pca_ellipsoid(), not enough input points!") return None P = np.array(coords, ndmin=2, dtype=float) cov = np.cov(P, rowvar=0) # type: ignore _, s, R = np.linalg.svd(cov) # singular value decomposition p, n = s.size, P.shape[0] fppf = f.ppf(pvalue, p, n-p)*(n-1)*p*(n+1)/n/(n-p) # f % point function u = np.sqrt(s*fppf) ua, ub, uc = u # semi-axes (largest first) center = np.mean(P, axis=0) # centroid of the hyperellipsoid t = LinearTransform(R.T * u).translate(center) elli = vedo.shapes.Ellipsoid((0,0,0), (1,0,0), (0,1,0), (0,0,1), res=res) elli.apply_transform(t) elli.alpha(0.25) elli.properties.LightingOff() elli.pvalue = pvalue elli.nr_of_points = n elli.center = center elli.va = ua elli.vb = ub elli.vc = uc # we subtract center because it's in t elli.axis1 = np.array(t.move([1, 0, 0])) - center elli.axis2 = np.array(t.move([0, 1, 0])) - center elli.axis3 = np.array(t.move([0, 0, 1])) - center elli.axis1 /= np.linalg.norm(elli.axis1) elli.axis2 /= np.linalg.norm(elli.axis2) elli.axis3 /= np.linalg.norm(elli.axis3) elli.name = "PCAEllipsoid" return elli ################################################### def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0) -> Self: """ Create a simple point in space. .. note:: if you are creating many points you should use class `Points` instead! """ pt = Points([[0,0,0]], r, c, alpha).pos(pos) pt.name = "Point" return pt ################################################### class Points(PointsVisual, PointAlgorithms): """Work with point clouds.""" def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1): """ Build an object made of only vertex points for a list of 2D/3D points. Both shapes (N, 3) or (3, N) are accepted as input, if N>3. Arguments: inputobj : (list, tuple) r : (int) Point radius in units of pixels. c : (str, list) Color name or rgb tuple. alpha : (float) Transparency in range [0,1]. Example: ```python from vedo import * def fibonacci_sphere(n): s = np.linspace(0, n, num=n, endpoint=False) theta = s * 2.399963229728653 y = 1 - s * (2/(n-1)) r = np.sqrt(1 - y * y) x = np.cos(theta) * r z = np.sin(theta) * r return np._c[x,y,z] Points(fibonacci_sphere(1000)).show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/fibonacci.png) """ # print("INIT POINTS") super().__init__() self.name = "" self.filename = "" self.file_size = "" self.info = {} self.time = time.time() self.transform = LinearTransform() self.point_locator = None self.cell_locator = None self.line_locator = None self.actor = vtki.vtkActor() self.properties = self.actor.GetProperty() self.properties_backface = self.actor.GetBackfaceProperty() self.mapper = vtki.new("PolyDataMapper") self.dataset = vtki.vtkPolyData() # Create weakref so actor can access this object (eg to pick/remove): self.actor.retrieve_object = weak_ref_to(self) try: self.properties.RenderPointsAsSpheresOn() except AttributeError: pass if inputobj is None: #################### return ########################################## self.name = "Points" ###### if isinstance(inputobj, vtki.vtkActor): self.dataset.DeepCopy(inputobj.GetMapper().GetInput()) pr = vtki.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) self.actor.SetProperty(pr) self.properties = pr self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) elif isinstance(inputobj, vtki.vtkPolyData): self.dataset = inputobj if self.dataset.GetNumberOfCells() == 0: carr = vtki.vtkCellArray() for i in range(self.dataset.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) self.dataset.SetVerts(carr) elif isinstance(inputobj, Points): self.dataset = inputobj.dataset self.copy_properties_from(inputobj) elif utils.is_sequence(inputobj): # passing point coords self.dataset = utils.buildPolyData(utils.make3d(inputobj)) elif isinstance(inputobj, str): verts = vedo.file_io.load(inputobj) self.filename = inputobj self.dataset = verts.dataset elif "meshlib" in str(type(inputobj)): from meshlib import mrmeshnumpy as mn self.dataset = utils.buildPolyData(mn.toNumpyArray(inputobj.points)) else: # try to extract the points from a generic VTK input data object if hasattr(inputobj, "dataset"): inputobj = inputobj.dataset try: vvpts = inputobj.GetPoints() self.dataset = vtki.vtkPolyData() self.dataset.SetPoints(vvpts) for i in range(inputobj.GetPointData().GetNumberOfArrays()): arr = inputobj.GetPointData().GetArray(i) self.dataset.GetPointData().AddArray(arr) carr = vtki.vtkCellArray() for i in range(self.dataset.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) self.dataset.SetVerts(carr) except: vedo.logger.error(f"cannot build Points from type {type(inputobj)}") raise RuntimeError() self.actor.SetMapper(self.mapper) self.mapper.SetInputData(self.dataset) self.properties.SetColor(colors.get_color(c)) self.properties.SetOpacity(alpha) self.properties.SetRepresentationToPoints() self.properties.SetPointSize(r) self.properties.LightingOff() self.pipeline = utils.OperationNode( self, parents=[], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) def _update(self, polydata, reset_locators=True) -> Self: """Overwrite the polygonal dataset with a new vtkPolyData.""" self.dataset = polydata self.mapper.SetInputData(self.dataset) self.mapper.Modified() if reset_locators: self.point_locator = None self.line_locator = None self.cell_locator = None return self def __str__(self): """Print a description of the Points/Mesh.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), c="g", bold=True, invert=True, return_string=True, ) out += "\x1b[0m\x1b[32;1m" if self.name: out += "name".ljust(14) + ": " + self.name if "legend" in self.info.keys() and self.info["legend"]: out+= f", legend='{self.info['legend']}'" out += "\n" if self.filename: out+= "file name".ljust(14) + ": " + self.filename + "\n" if not self.mapper.GetScalarVisibility(): col = utils.precision(self.properties.GetColor(), 3) cname = vedo.colors.get_color_name(self.properties.GetColor()) out+= "color".ljust(14) + ": " + cname out+= f", rgb={col}, alpha={self.properties.GetOpacity()}\n" if self.actor.GetBackfaceProperty(): bcol = self.actor.GetBackfaceProperty().GetDiffuseColor() cname = vedo.colors.get_color_name(bcol) out+= "backface color".ljust(14) + ": " out+= f"{cname}, rgb={utils.precision(bcol,3)}\n" npt = self.dataset.GetNumberOfPoints() npo, nln = self.dataset.GetNumberOfPolys(), self.dataset.GetNumberOfLines() out+= "elements".ljust(14) + f": vertices={npt:,} polygons={npo:,} lines={nln:,}" if self.dataset.GetNumberOfStrips(): out+= f", strips={self.dataset.GetNumberOfStrips():,}" out+= "\n" if self.dataset.GetNumberOfPieces() > 1: out+= "pieces".ljust(14) + ": " + str(self.dataset.GetNumberOfPieces()) + "\n" out+= "position".ljust(14) + ": " + f"{utils.precision(self.pos(), 6)}\n" try: sc = self.transform.get_scale() out+= "scaling".ljust(14) + ": " out+= utils.precision(sc, 6) + "\n" except AttributeError: pass if self.npoints: out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) out+=", diagonal="+ utils.precision(self.diagonal_size(), 6)+ "\n" out+="center of mass".ljust(14) + ": " + utils.precision(self.center_of_mass(),6)+"\n" bnds = self.bounds() bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) out+= "bounds".ljust(14) + ":" out+= " x=(" + bx1 + ", " + bx2 + ")," out+= " y=(" + by1 + ", " + by2 + ")," out+= " z=(" + bz1 + ", " + bz2 + ")\n" for key in self.pointdata.keys(): arr = self.pointdata[key] dim = arr.shape[1] if arr.ndim > 1 else 1 mark_active = "pointdata" a_scalars = self.dataset.GetPointData().GetScalars() a_vectors = self.dataset.GetPointData().GetVectors() a_tensors = self.dataset.GetPointData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), dim={dim}' if dim == 1 and len(arr): rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) out += f", range=({rng})\n" else: out += "\n" for key in self.celldata.keys(): arr = self.celldata[key] dim = arr.shape[1] if arr.ndim > 1 else 1 mark_active = "celldata" a_scalars = self.dataset.GetCellData().GetScalars() a_vectors = self.dataset.GetCellData().GetVectors() a_tensors = self.dataset.GetCellData().GetTensors() if a_scalars and a_scalars.GetName() == key: mark_active += " *" elif a_vectors and a_vectors.GetName() == key: mark_active += " **" elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), dim={dim}' if dim == 1 and len(arr): rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) out += f", range=({rng})\n" else: out += "\n" for key in self.metadata.keys(): arr = self.metadata[key] if len(arr) > 3: out+= "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' else: out+= "metadata".ljust(14) + ": " + f'"{key}" = {arr}\n' if self.picked3d is not None: idp = self.closest_point(self.picked3d, return_point_id=True) idc = self.closest_point(self.picked3d, return_cell_id=True) out+= "clicked point".ljust(14) + ": " + utils.precision(self.picked3d, 6) out+= f", pointID={idp}, cellID={idc}\n" return out.rstrip() + "\x1b[0m" def _repr_html_(self): """ HTML representation of the Point cloud object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.pointcloud.Points" help_url = "https://vedo.embl.es/docs/vedo/pointcloud.html#Points" arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) average_size = "{size:.3f}".format(size=self.average_size()) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self.dataset.GetPointData().GetScalars(): if self.dataset.GetPointData().GetScalars().GetName(): name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self.dataset.GetCellData().GetScalars(): if self.dataset.GetCellData().GetScalars().GetName(): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(self.center_of_mass(), 3) + "
average size " + str(average_size) + "
nr. points " + str(self.npoints) + "
", "
", ] return "\n".join(allt) ################################################################################## def __add__(self, meshs): """ Add two meshes or a list of meshes together to form an `Assembly` object. """ if isinstance(meshs, list): alist = [self] for l in meshs: if isinstance(l, vedo.Assembly): alist += l.unpack() else: alist += l return vedo.assembly.Assembly(alist) if isinstance(meshs, vedo.Assembly): return meshs + self # use Assembly.__add__ return vedo.assembly.Assembly([self, meshs]) def polydata(self, **kwargs): """ Obsolete. Use property `.dataset` instead. Returns the underlying `vtkPolyData` object. """ colors.printc( "WARNING: call to .polydata() is obsolete, use property .dataset instead.", c="y") return self.dataset def __copy__(self): return self.clone(deep=False) def __deepcopy__(self, memo): return self.clone(deep=memo) def copy(self, deep=True) -> Self: """Return a copy of the object. Alias of `clone()`.""" return self.clone(deep=deep) def clone(self, deep=True) -> Self: """ Clone a `PointCloud` or `Mesh` object to make an exact copy of it. Alias of `copy()`. Arguments: deep : (bool) if False return a shallow copy of the mesh without copying the points array. Examples: - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) ![](https://vedo.embl.es/images/basic/mirror.png) """ poly = vtki.vtkPolyData() if deep or isinstance(deep, dict): # if a memo object is passed this checks as True poly.DeepCopy(self.dataset) else: poly.ShallowCopy(self.dataset) if isinstance(self, vedo.Mesh): cloned = vedo.Mesh(poly) else: cloned = Points(poly) # print([self], self.__class__) # cloned = self.__class__(poly) cloned.transform = self.transform.clone() cloned.copy_properties_from(self) cloned.name = str(self.name) cloned.filename = str(self.filename) cloned.info = dict(self.info) cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") if isinstance(deep, dict): deep[id(self)] = cloned return cloned def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False) -> Self: """ Generate point normals using PCA (principal component analysis). This algorithm estimates a local tangent plane around each sample point p by considering a small neighborhood of points around p, and fitting a plane to the neighborhood (via PCA). Arguments: n : (int) neighborhood size to calculate the normal orientation_point : (list) adjust the +/- sign of the normals so that the normals all point towards a specified point. If None, perform a traversal of the point cloud and flip neighboring normals so that they are mutually consistent. invert : (bool) flip all normals """ poly = self.dataset pcan = vtki.new("PCANormalEstimation") pcan.SetInputData(poly) pcan.SetSampleSize(n) if orientation_point is not None: pcan.SetNormalOrientationToPoint() pcan.SetOrientationPoint(orientation_point) else: pcan.SetNormalOrientationToGraphTraversal() if invert: pcan.FlipNormalsOn() pcan.Update() varr = pcan.GetOutput().GetPointData().GetNormals() varr.SetName("Normals") self.dataset.GetPointData().SetNormals(varr) self.dataset.GetPointData().Modified() return self def compute_acoplanarity(self, n=25, radius=None, on="points") -> Self: """ Compute acoplanarity which is a measure of how much a local region of the mesh differs from a plane. The information is stored in a `pointdata` or `celldata` array with name 'Acoplanarity'. Either `n` (number of neighbour points) or `radius` (radius of local search) can be specified. If a radius value is given and not enough points fall inside it, then a -1 is stored. Example: ```python from vedo import * msh = ParametricShape('RandomHills') msh.compute_acoplanarity(radius=0.1, on='cells') msh.cmap("coolwarm", on='cells').add_scalarbar() msh.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/acoplanarity.jpg) """ acoplanarities = [] if "point" in on: pts = self.coordinates elif "cell" in on: pts = self.cell_centers().coordinates else: raise ValueError(f"In compute_acoplanarity() set on to either 'cells' or 'points', not {on}") for p in utils.progressbar(pts, delay=5, width=15, title=f"{on} acoplanarity"): if n: data = self.closest_point(p, n=n) npts = n elif radius: data = self.closest_point(p, radius=radius) npts = len(data) try: center = data.mean(axis=0) res = np.linalg.svd(data - center) acoplanarities.append(res[1][2] / npts) except: acoplanarities.append(-1.0) if "point" in on: self.pointdata["Acoplanarity"] = np.array(acoplanarities, dtype=float) else: self.celldata["Acoplanarity"] = np.array(acoplanarities, dtype=float) return self def distance_to(self, pcloud, signed=False, invert=False, name="Distance") -> np.ndarray: """ Computes the distance from one point cloud or mesh to another point cloud or mesh. This new `pointdata` array is saved with default name "Distance". Keywords `signed` and `invert` are used to compute signed distance, but the mesh in that case must have polygonal faces (not a simple point cloud), and normals must also be computed. Examples: - [distance2mesh.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/distance2mesh.py) ![](https://vedo.embl.es/images/basic/distance2mesh.png) """ if pcloud.dataset.GetNumberOfPolys(): poly1 = self.dataset poly2 = pcloud.dataset df = vtki.new("DistancePolyDataFilter") df.ComputeSecondDistanceOff() df.SetInputData(0, poly1) df.SetInputData(1, poly2) df.SetSignedDistance(signed) df.SetNegateDistance(invert) df.Update() scals = df.GetOutput().GetPointData().GetScalars() dists = utils.vtk2numpy(scals) else: # has no polygons if signed: vedo.logger.warning("distance_to() called with signed=True but input object has no polygons") if not pcloud.point_locator: pcloud.point_locator = vtki.new("PointLocator") pcloud.point_locator.SetDataSet(pcloud.dataset) pcloud.point_locator.BuildLocator() ids = [] ps1 = self.coordinates ps2 = pcloud.coordinates for p in ps1: pid = pcloud.point_locator.FindClosestPoint(p) ids.append(pid) deltas = ps2[ids] - ps1 dists = np.linalg.norm(deltas, axis=1).astype(np.float32) scals = utils.numpy2vtk(dists) scals.SetName(name) self.dataset.GetPointData().AddArray(scals) self.dataset.GetPointData().SetActiveScalars(scals.GetName()) rng = scals.GetRange() self.mapper.SetScalarRange(rng[0], rng[1]) self.mapper.ScalarVisibilityOn() self.pipeline = utils.OperationNode( "distance_to", parents=[self, pcloud], shape="cylinder", comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return dists def clean(self) -> Self: """Clean pointcloud or mesh by removing coincident points.""" cpd = vtki.new("CleanPolyData") cpd.PointMergingOn() cpd.ConvertLinesToPointsOff() cpd.ConvertPolysToLinesOff() cpd.ConvertStripsToPolysOff() cpd.SetInputData(self.dataset) cpd.Update() self._update(cpd.GetOutput()) self.pipeline = utils.OperationNode( "clean", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self def subsample(self, fraction: float, absolute=False) -> Self: """ Subsample a point cloud by requiring that the points or vertices are far apart at least by the specified fraction of the object size. If a Mesh is passed the polygonal faces are not removed but holes can appear as their vertices are removed. Examples: - [moving_least_squares1D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares1D.py) ![](https://vedo.embl.es/images/advanced/moving_least_squares1D.png) - [recosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/recosurface.py) ![](https://vedo.embl.es/images/advanced/recosurface.png) """ if not absolute: if fraction > 1: vedo.logger.warning( f"subsample(fraction=...), fraction must be < 1, but is {fraction}" ) if fraction <= 0: return self cpd = vtki.new("CleanPolyData") cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() cpd.SetInputData(self.dataset) if absolute: cpd.SetTolerance(fraction / self.diagonal_size()) # cpd.SetToleranceIsAbsolute(absolute) else: cpd.SetTolerance(fraction) cpd.Update() ps = 2 if self.properties.GetRepresentation() == 0: ps = self.properties.GetPointSize() self._update(cpd.GetOutput()) self.ps(ps) self.pipeline = utils.OperationNode( "subsample", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self def threshold(self, scalars: str, above=None, below=None, on="points") -> Self: """ Extracts cells where scalar value satisfies threshold criterion. Arguments: scalars : (str) name of the scalars array. above : (float) minimum value of the scalar below : (float) maximum value of the scalar on : (str) if 'cells' assume array of scalars refers to cell data. Examples: - [mesh_threshold.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_threshold.py) """ thres = vtki.new("Threshold") thres.SetInputData(self.dataset) if on.startswith("c"): asso = vtki.vtkDataObject.FIELD_ASSOCIATION_CELLS else: asso = vtki.vtkDataObject.FIELD_ASSOCIATION_POINTS thres.SetInputArrayToProcess(0, 0, 0, asso, scalars) if above is None and below is not None: try: # vtk 9.2 thres.ThresholdByLower(below) except AttributeError: # vtk 9.3 thres.SetUpperThreshold(below) elif below is None and above is not None: try: thres.ThresholdByUpper(above) except AttributeError: thres.SetLowerThreshold(above) else: try: thres.ThresholdBetween(above, below) except AttributeError: thres.SetUpperThreshold(below) thres.SetLowerThreshold(above) thres.Update() gf = vtki.new("GeometryFilter") gf.SetInputData(thres.GetOutput()) gf.Update() self._update(gf.GetOutput()) self.pipeline = utils.OperationNode("threshold", parents=[self]) return self def quantize(self, value: float) -> Self: """ The user should input a value and all {x,y,z} coordinates will be quantized to that absolute grain size. """ qp = vtki.new("QuantizePolyDataPoints") qp.SetInputData(self.dataset) qp.SetQFactor(value) qp.Update() self._update(qp.GetOutput()) self.pipeline = utils.OperationNode("quantize", parents=[self]) return self @property def vertex_normals(self) -> np.ndarray: """ Retrieve vertex normals as a numpy array. Same as `point_normals`. Check out also `compute_normals()` and `compute_normals_with_pca()`. """ vtknormals = self.dataset.GetPointData().GetNormals() return utils.vtk2numpy(vtknormals) @property def point_normals(self) -> np.ndarray: """ Retrieve vertex normals as a numpy array. Same as `vertex_normals`. Check out also `compute_normals()` and `compute_normals_with_pca()`. """ vtknormals = self.dataset.GetPointData().GetNormals() return utils.vtk2numpy(vtknormals) def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=False) -> Self: """ Aligned to target mesh through the `Iterative Closest Point` algorithm. The core of the algorithm is to match each vertex in one surface with the closest surface point on the other, then apply the transformation that modify one surface to best match the other (in the least-square sense). Arguments: rigid : (bool) if True do not allow scaling invert : (bool) if True start by aligning the target to the source but invert the transformation finally. Useful when the target is smaller than the source. use_centroids : (bool) start by matching the centroids of the two objects. Examples: - [align1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align1.py) ![](https://vedo.embl.es/images/basic/align1.png) - [align2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align2.py) ![](https://vedo.embl.es/images/basic/align2.png) """ icp = vtki.new("IterativeClosestPointTransform") icp.SetSource(self.dataset) icp.SetTarget(target.dataset) if invert: icp.Inverse() icp.SetMaximumNumberOfIterations(iters) if rigid: icp.GetLandmarkTransform().SetModeToRigidBody() icp.SetStartByMatchingCentroids(use_centroids) icp.Update() self.apply_transform(icp.GetMatrix()) self.pipeline = utils.OperationNode( "align_to", parents=[self, target], comment=f"rigid = {rigid}" ) return self def align_to_bounding_box(self, msh, rigid=False) -> Self: """ Align the current object's bounding box to the bounding box of the input object. Use `rigid=True` to disable scaling. Example: [align6.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align6.py) """ lmt = vtki.vtkLandmarkTransform() ss = vtki.vtkPoints() xss0, xss1, yss0, yss1, zss0, zss1 = self.bounds() for p in [ [xss0, yss0, zss0], [xss1, yss0, zss0], [xss1, yss1, zss0], [xss0, yss1, zss0], [xss0, yss0, zss1], [xss1, yss0, zss1], [xss1, yss1, zss1], [xss0, yss1, zss1], ]: ss.InsertNextPoint(p) st = vtki.vtkPoints() xst0, xst1, yst0, yst1, zst0, zst1 = msh.bounds() for p in [ [xst0, yst0, zst0], [xst1, yst0, zst0], [xst1, yst1, zst0], [xst0, yst1, zst0], [xst0, yst0, zst1], [xst1, yst0, zst1], [xst1, yst1, zst1], [xst0, yst1, zst1], ]: st.InsertNextPoint(p) lmt.SetSourceLandmarks(ss) lmt.SetTargetLandmarks(st) lmt.SetModeToAffine() if rigid: lmt.SetModeToRigidBody() lmt.Update() LT = LinearTransform(lmt) self.apply_transform(LT) return self def align_with_landmarks( self, source_landmarks, target_landmarks, rigid=False, affine=False, least_squares=False, ) -> Self: """ Transform mesh orientation and position based on a set of landmarks points. The algorithm finds the best matching of source points to target points in the mean least square sense, in one single step. If `affine` is True the x, y and z axes can scale independently but stay collinear. With least_squares they can vary orientation. Examples: - [align5.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align5.py) ![](https://vedo.embl.es/images/basic/align5.png) """ if utils.is_sequence(source_landmarks): ss = vtki.vtkPoints() for p in source_landmarks: ss.InsertNextPoint(p) else: ss = source_landmarks.dataset.GetPoints() if least_squares: source_landmarks = source_landmarks.coordinates if utils.is_sequence(target_landmarks): st = vtki.vtkPoints() for p in target_landmarks: st.InsertNextPoint(p) else: st = target_landmarks.GetPoints() if least_squares: target_landmarks = target_landmarks.coordinates if ss.GetNumberOfPoints() != st.GetNumberOfPoints(): n1 = ss.GetNumberOfPoints() n2 = st.GetNumberOfPoints() vedo.logger.error(f"source and target have different nr of points {n1} vs {n2}") raise RuntimeError() if int(rigid) + int(affine) + int(least_squares) > 1: vedo.logger.error( "only one of rigid, affine, least_squares can be True at a time" ) raise RuntimeError() lmt = vtki.vtkLandmarkTransform() lmt.SetSourceLandmarks(ss) lmt.SetTargetLandmarks(st) lmt.SetModeToSimilarity() if rigid: lmt.SetModeToRigidBody() lmt.Update() elif affine: lmt.SetModeToAffine() lmt.Update() elif least_squares: cms = source_landmarks.mean(axis=0) cmt = target_landmarks.mean(axis=0) m = np.linalg.lstsq(source_landmarks - cms, target_landmarks - cmt, rcond=None)[0] M = vtki.vtkMatrix4x4() for i in range(3): for j in range(3): M.SetElement(j, i, m[i][j]) lmt = vtki.vtkTransform() lmt.Translate(cmt) lmt.Concatenate(M) lmt.Translate(-cms) else: lmt.Update() self.apply_transform(lmt) self.pipeline = utils.OperationNode("transform_with_landmarks", parents=[self]) return self def normalize(self) -> Self: """Scale average size to unit. The scaling is performed around the center of mass.""" coords = self.coordinates if not coords.shape[0]: return self cm = np.mean(coords, axis=0) pts = coords - cm xyz2 = np.sum(pts * pts, axis=0) scale = 1 / np.sqrt(np.sum(xyz2) / len(pts)) self.scale(scale, origin=cm) self.pipeline = utils.OperationNode("normalize", parents=[self]) return self def mirror(self, axis="x", origin=True) -> Self: """ Mirror reflect along one of the cartesian axes Arguments: axis : (str) axis to use for mirroring, must be set to `x, y, z`. Or any combination of those. origin : (list) use this point as the origin of the mirroring transformation. Examples: - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) ![](https://vedo.embl.es/images/basic/mirror.png) """ sx, sy, sz = 1, 1, 1 if "x" in axis.lower(): sx = -1 if "y" in axis.lower(): sy = -1 if "z" in axis.lower(): sz = -1 self.scale([sx, sy, sz], origin=origin) self.pipeline = utils.OperationNode( "mirror", comment=f"axis = {axis}", parents=[self]) if sx * sy * sz < 0: if hasattr(self, "reverse"): self.reverse() return self def flip_normals(self) -> Self: """Flip all normals orientation.""" rs = vtki.new("ReverseSense") rs.SetInputData(self.dataset) rs.ReverseCellsOff() rs.ReverseNormalsOn() rs.Update() self._update(rs.GetOutput()) self.pipeline = utils.OperationNode("flip_normals", parents=[self]) return self def add_gaussian_noise(self, sigma=1.0) -> Self: """ Add gaussian noise to point positions. An extra array is added named "GaussianNoise" with the displacements. Arguments: sigma : (float) nr. of standard deviations, expressed in percent of the diagonal size of mesh. Can also be a list `[sigma_x, sigma_y, sigma_z]`. Example: ```python from vedo import Sphere Sphere().add_gaussian_noise(1.0).point_size(8).show().close() ``` """ sz = self.diagonal_size() pts = self.coordinates n = len(pts) ns = (np.random.randn(n, 3) * sigma) * (sz / 100) vpts = vtki.vtkPoints() vpts.SetNumberOfPoints(n) vpts.SetData(utils.numpy2vtk(pts + ns, dtype=np.float32)) self.dataset.SetPoints(vpts) self.dataset.GetPoints().Modified() self.pointdata["GaussianNoise"] = -ns self.pipeline = utils.OperationNode( "gaussian_noise", parents=[self], shape="egg", comment=f"sigma = {sigma}" ) return self def closest_point( self, pt, n=1, radius=None, return_point_id=False, return_cell_id=False ) -> Union[List[int], int, np.ndarray]: """ Find the closest point(s) on a mesh given from the input point `pt`. Arguments: n : (int) if greater than 1, return a list of n ordered closest points radius : (float) if given, get all points within that radius. Then n is ignored. return_point_id : (bool) return point ID instead of coordinates return_cell_id : (bool) return cell ID in which the closest point sits Examples: - [align1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align1.py) - [fitplanes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/fitplanes.py) - [quadratic_morphing.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/quadratic_morphing.py) .. note:: The appropriate tree search locator is built on the fly and cached for speed. If you want to reset it use `mymesh.point_locator=None` and / or `mymesh.cell_locator=None`. """ if len(pt) != 3: pt = [pt[0], pt[1], 0] # NB: every time the mesh moves or is warped the locators are set to None if ((n > 1 or radius) or (n == 1 and return_point_id)) and not return_cell_id: poly = None if not self.point_locator: poly = self.dataset self.point_locator = vtki.new("StaticPointLocator") self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() ########## if radius: vtklist = vtki.vtkIdList() self.point_locator.FindPointsWithinRadius(radius, pt, vtklist) elif n > 1: vtklist = vtki.vtkIdList() self.point_locator.FindClosestNPoints(n, pt, vtklist) else: # n==1 hence return_point_id==True ######## return self.point_locator.FindClosestPoint(pt) ######## if return_point_id: ######## return utils.vtk2numpy(vtklist) ######## if not poly: poly = self.dataset trgp = [] for i in range(vtklist.GetNumberOfIds()): trgp_ = [0, 0, 0] vi = vtklist.GetId(i) poly.GetPoints().GetPoint(vi, trgp_) trgp.append(trgp_) ######## return np.array(trgp) ######## else: if not self.cell_locator: poly = self.dataset # As per Miquel example with limbs the vtkStaticCellLocator doesnt work !! # https://discourse.vtk.org/t/vtkstaticcelllocator-problem-vtk9-0-3/7854/4 if vedo.vtk_version[0] >= 9 and vedo.vtk_version[1] > 0: self.cell_locator = vtki.new("StaticCellLocator") else: self.cell_locator = vtki.new("CellLocator") self.cell_locator.SetDataSet(poly) self.cell_locator.BuildLocator() if radius is not None: vedo.printc("Warning: closest_point() with radius is not implemented for cells.", c='r') if n != 1: vedo.printc("Warning: closest_point() with n>1 is not implemented for cells.", c='r') trgp = [0, 0, 0] cid = vtki.mutable(0) dist2 = vtki.mutable(0) subid = vtki.mutable(0) self.cell_locator.FindClosestPoint(pt, trgp, cid, subid, dist2) if return_cell_id: return int(cid) return np.array(trgp) def auto_distance(self) -> np.ndarray: """ Calculate the distance to the closest point in the same cloud of points. The output is stored in a new pointdata array called "AutoDistance", and it is also returned by the function. """ points = self.coordinates if not self.point_locator: self.point_locator = vtki.new("StaticPointLocator") self.point_locator.SetDataSet(self.dataset) self.point_locator.BuildLocator() qs = [] vtklist = vtki.vtkIdList() vtkpoints = self.dataset.GetPoints() for p in points: self.point_locator.FindClosestNPoints(2, p, vtklist) q = [0, 0, 0] pid = vtklist.GetId(1) vtkpoints.GetPoint(pid, q) qs.append(q) dists = np.linalg.norm(points - np.array(qs), axis=1) self.pointdata["AutoDistance"] = dists return dists def hausdorff_distance(self, points) -> float: """ Compute the Hausdorff distance to the input point set. Returns a single `float`. Example: ```python from vedo import * t = np.linspace(0, 2*np.pi, 100) x = 4/3 * sin(t)**3 y = cos(t) - cos(2*t)/3 - cos(3*t)/6 - cos(4*t)/12 pol1 = Line(np.c_[x,y], closed=True).triangulate() pol2 = Polygon(nsides=5).pos(2,2) d12 = pol1.distance_to(pol2) d21 = pol2.distance_to(pol1) pol1.lw(0).cmap("viridis") pol2.lw(0).cmap("viridis") print("distance d12, d21 :", min(d12), min(d21)) print("hausdorff distance:", pol1.hausdorff_distance(pol2)) print("chamfer distance :", pol1.chamfer_distance(pol2)) show(pol1, pol2, axes=1) ``` ![](https://vedo.embl.es/images/feats/heart.png) """ hp = vtki.new("HausdorffDistancePointSetFilter") hp.SetInputData(0, self.dataset) hp.SetInputData(1, points.dataset) hp.SetTargetDistanceMethodToPointToCell() hp.Update() return hp.GetHausdorffDistance() def chamfer_distance(self, pcloud) -> float: """ Compute the Chamfer distance to the input point set. Example: ```python from vedo import * cloud1 = np.random.randn(1000, 3) cloud2 = np.random.randn(1000, 3) + [1, 2, 3] c1 = Points(cloud1, r=5, c="red") c2 = Points(cloud2, r=5, c="green") d = c1.chamfer_distance(c2) show(f"Chamfer distance = {d}", c1, c2, axes=1).close() ``` """ # Definition of Chamfer distance may vary, here we use the average if not pcloud.point_locator: pcloud.point_locator = vtki.new("PointLocator") pcloud.point_locator.SetDataSet(pcloud.dataset) pcloud.point_locator.BuildLocator() if not self.point_locator: self.point_locator = vtki.new("PointLocator") self.point_locator.SetDataSet(self.dataset) self.point_locator.BuildLocator() ps1 = self.coordinates ps2 = pcloud.coordinates ids12 = [] for p in ps1: pid12 = pcloud.point_locator.FindClosestPoint(p) ids12.append(pid12) deltav = ps2[ids12] - ps1 da = np.mean(np.linalg.norm(deltav, axis=1)) ids21 = [] for p in ps2: pid21 = self.point_locator.FindClosestPoint(p) ids21.append(pid21) deltav = ps1[ids21] - ps2 db = np.mean(np.linalg.norm(deltav, axis=1)) return (da + db) / 2 def remove_outliers(self, radius: float, neighbors=5) -> Self: """ Remove outliers from a cloud of points within the specified `radius` search. Arguments: radius : (float) Specify the local search radius. neighbors : (int) Specify the number of neighbors that a point must have, within the specified radius, for the point to not be considered isolated. Examples: - [clustering.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/clustering.py) ![](https://vedo.embl.es/images/basic/clustering.png) """ removal = vtki.new("RadiusOutlierRemoval") removal.SetInputData(self.dataset) removal.SetRadius(radius) removal.SetNumberOfNeighbors(neighbors) removal.GenerateOutliersOff() removal.Update() inputobj = removal.GetOutput() if inputobj.GetNumberOfCells() == 0: carr = vtki.vtkCellArray() for i in range(inputobj.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) self._update(removal.GetOutput()) self.pipeline = utils.OperationNode("remove_outliers", parents=[self]) return self def relax_point_positions( self, n=10, iters=10, sub_iters=10, packing_factor=1, max_step=0, constraints=(), ) -> Self: """ Smooth mesh or points with a [Laplacian algorithm](https://vtk.org/doc/nightly/html/classvtkPointSmoothingFilter.html) variant. This modifies the coordinates of the input points by adjusting their positions to create a smooth distribution (and thereby form a pleasing packing of the points). Smoothing is performed by considering the effects of neighboring points on one another it uses a cubic cutoff function to produce repulsive forces between close points and attractive forces that are a little further away. In general, the larger the neighborhood size, the greater the reduction in high frequency information. The memory and computational requirements of the algorithm may also significantly increase. The algorithm incrementally adjusts the point positions through an iterative process. Basically points are moved due to the influence of neighboring points. As points move, both the local connectivity and data attributes associated with each point must be updated. Rather than performing these expensive operations after every iteration, a number of sub-iterations can be specified. If so, then the neighborhood and attribute value updates occur only every sub iteration, which can improve performance significantly. Arguments: n : (int) neighborhood size to calculate the Laplacian. iters : (int) number of iterations. sub_iters : (int) number of sub-iterations, i.e. the number of times the neighborhood and attribute value updates occur during each iteration. packing_factor : (float) adjust convergence speed. max_step : (float) Specify the maximum smoothing step size for each smoothing iteration. This limits the the distance over which a point can move in each iteration. As in all iterative methods, the stability of the process is sensitive to this parameter. In general, small step size and large numbers of iterations are more stable than a larger step size and a smaller numbers of iterations. constraints : (dict) dictionary of constraints. Point constraints are used to prevent points from moving, or to move only on a plane. This can prevent shrinking or growing point clouds. If enabled, a local topological analysis is performed to determine whether a point should be marked as fixed" i.e., never moves, or the point only moves on a plane, or the point can move freely. If all points in the neighborhood surrounding a point are in the cone defined by `fixed_angle`, then the point is classified as fixed. If all points in the neighborhood surrounding a point are in the cone defined by `boundary_angle`, then the point is classified as lying on a plane. Angles are expressed in degrees. Example: ```py import numpy as np from vedo import Points, show from vedo.pyplot import histogram vpts1 = Points(np.random.rand(10_000, 3)) dists = vpts1.auto_distance() h1 = histogram(dists, xlim=(0,0.08)).clone2d() vpts2 = vpts1.clone().relax_point_positions(n=100, iters=20, sub_iters=10) dists = vpts2.auto_distance() h2 = histogram(dists, xlim=(0,0.08)).clone2d() show([[vpts1, h1], [vpts2, h2]], N=2).close() ``` """ smooth = vtki.new("PointSmoothingFilter") smooth.SetInputData(self.dataset) smooth.SetSmoothingModeToUniform() smooth.SetNumberOfIterations(iters) smooth.SetNumberOfSubIterations(sub_iters) smooth.SetPackingFactor(packing_factor) if self.point_locator: smooth.SetLocator(self.point_locator) if not max_step: max_step = self.diagonal_size() / 100 smooth.SetMaximumStepSize(max_step) smooth.SetNeighborhoodSize(n) if constraints: fixed_angle = constraints.get("fixed_angle", 45) boundary_angle = constraints.get("boundary_angle", 110) smooth.EnableConstraintsOn() smooth.SetFixedAngle(fixed_angle) smooth.SetBoundaryAngle(boundary_angle) smooth.GenerateConstraintScalarsOn() smooth.GenerateConstraintNormalsOn() smooth.Update() self._update(smooth.GetOutput()) self.metadata["PackingRadius"] = smooth.GetPackingRadius() self.pipeline = utils.OperationNode("relax_point_positions", parents=[self]) return self def smooth_mls_1d(self, f=0.2, radius=None, n=0) -> Self: """ Smooth mesh or points with a `Moving Least Squares` variant. The point data array "Variances" will contain the residue calculated for each point. Arguments: f : (float) smoothing factor - typical range is [0,2]. radius : (float) radius search in absolute units. If set then `f` is ignored. n : (int) number of neighbours to be used for the fit. If set then `f` and `radius` are ignored. Examples: - [moving_least_squares1D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares1D.py) - [skeletonize.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/skeletonize.py) ![](https://vedo.embl.es/images/advanced/moving_least_squares1D.png) """ coords = self.coordinates ncoords = len(coords) if n: Ncp = n elif radius: Ncp = 1 else: Ncp = int(ncoords * f / 10) if Ncp < 5: vedo.logger.warning(f"Please choose a fraction higher than {f}") Ncp = 5 variances, newline = [], [] for p in coords: points = self.closest_point(p, n=Ncp, radius=radius) if len(points) < 4: continue points = np.array(points) pointsmean = points.mean(axis=0) # plane center _, dd, vv = np.linalg.svd(points - pointsmean) newp = np.dot(p - pointsmean, vv[0]) * vv[0] + pointsmean variances.append(dd[1] + dd[2]) newline.append(newp) self.pointdata["Variances"] = np.array(variances).astype(np.float32) self.coordinates = newline self.pipeline = utils.OperationNode("smooth_mls_1d", parents=[self]) return self def smooth_mls_2d(self, f=0.2, radius=None, n=0) -> Self: """ Smooth mesh or points with a `Moving Least Squares` algorithm variant. The `mesh.pointdata['MLSVariance']` array will contain the residue calculated for each point. When a radius is specified, points that are isolated will not be moved and will get a 0 entry in array `mesh.pointdata['MLSValidPoint']`. Arguments: f : (float) smoothing factor - typical range is [0, 2]. radius : (float | array) radius search in absolute units. Can be single value (float) or sequence for adaptive smoothing. If set then `f` is ignored. n : (int) number of neighbours to be used for the fit. If set then `f` and `radius` are ignored. Examples: - [moving_least_squares2D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares2D.py) - [recosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/recosurface.py) ![](https://vedo.embl.es/images/advanced/recosurface.png) """ coords = self.coordinates ncoords = len(coords) if n: Ncp = n radius = None elif radius is not None: Ncp = 1 else: Ncp = int(ncoords * f / 100) if Ncp < 4: vedo.logger.error(f"please choose a f-value higher than {f}") Ncp = 4 variances, newpts, valid = [], [], [] radius_is_sequence = utils.is_sequence(radius) pb = None if ncoords > 10000: pb = utils.ProgressBar(0, ncoords, delay=3) for i, p in enumerate(coords): if pb: pb.print("smooth_mls_2d working ...") # if a radius was provided for each point if radius_is_sequence: pts = self.closest_point(p, n=Ncp, radius=radius[i]) else: pts = self.closest_point(p, n=Ncp, radius=radius) if len(pts) > 3: ptsmean = pts.mean(axis=0) # plane center _, dd, vv = np.linalg.svd(pts - ptsmean) cv = np.cross(vv[0], vv[1]) t = (np.dot(cv, ptsmean) - np.dot(cv, p)) / np.dot(cv, cv) newpts.append(p + cv * t) variances.append(dd[2]) if radius is not None: valid.append(1) else: newpts.append(p) variances.append(0) if radius is not None: valid.append(0) if radius is not None: self.pointdata["MLSValidPoint"] = np.array(valid).astype(np.uint8) self.pointdata["MLSVariance"] = np.array(variances).astype(np.float32) self.coordinates = newpts self.pipeline = utils.OperationNode("smooth_mls_2d", parents=[self]) return self def smooth_lloyd_2d(self, iterations=2, bounds=None, options="Qbb Qc Qx") -> Self: """ Lloyd relaxation of a 2D pointcloud. Arguments: iterations : (int) number of iterations. bounds : (list) bounding box of the domain. options : (str) options for the Qhull algorithm. """ # Credits: https://hatarilabs.com/ih-en/ # tutorial-to-create-a-geospatial-voronoi-sh-mesh-with-python-scipy-and-geopandas from scipy.spatial import Voronoi as scipy_voronoi def _constrain_points(points): # Update any points that have drifted beyond the boundaries of this space if bounds is not None: for point in points: if point[0] < bounds[0]: point[0] = bounds[0] if point[0] > bounds[1]: point[0] = bounds[1] if point[1] < bounds[2]: point[1] = bounds[2] if point[1] > bounds[3]: point[1] = bounds[3] return points def _find_centroid(vertices): # The equation for the method used here to find the centroid of a # 2D polygon is given here: https://en.wikipedia.org/wiki/Centroid#Of_a_polygon area = 0 centroid_x = 0 centroid_y = 0 for i in range(len(vertices) - 1): step = (vertices[i, 0] * vertices[i + 1, 1]) - (vertices[i + 1, 0] * vertices[i, 1]) centroid_x += (vertices[i, 0] + vertices[i + 1, 0]) * step centroid_y += (vertices[i, 1] + vertices[i + 1, 1]) * step area += step if area: centroid_x = (1.0 / (3.0 * area)) * centroid_x centroid_y = (1.0 / (3.0 * area)) * centroid_y # prevent centroids from escaping bounding box return _constrain_points([[centroid_x, centroid_y]])[0] def _relax(voron): # Moves each point to the centroid of its cell in the voronoi # map to "relax" the points (i.e. jitter the points so as # to spread them out within the space). centroids = [] for idx in voron.point_region: # the region is a series of indices into voronoi.vertices # remove point at infinity, designated by index -1 region = [i for i in voron.regions[idx] if i != -1] # enclose the polygon region = region + [region[0]] verts = voron.vertices[region] # find the centroid of those vertices centroids.append(_find_centroid(verts)) return _constrain_points(centroids) if bounds is None: bounds = self.bounds() pts = self.vertices[:, (0, 1)] for i in range(iterations): vor = scipy_voronoi(pts, qhull_options=options) _constrain_points(vor.vertices) pts = _relax(vor) out = Points(pts) out.name = "MeshSmoothLloyd2D" out.pipeline = utils.OperationNode("smooth_lloyd", parents=[self]) return out def project_on_plane(self, plane="z", point=None, direction=None) -> Self: """ Project the mesh on one of the Cartesian planes. Arguments: plane : (str, Plane) if plane is `str`, plane can be one of ['x', 'y', 'z'], represents x-plane, y-plane and z-plane, respectively. Otherwise, plane should be an instance of `vedo.shapes.Plane`. point : (float, array) if plane is `str`, point should be a float represents the intercept. Otherwise, point is the camera point of perspective projection direction : (array) direction of oblique projection Note: Parameters `point` and `direction` are only used if the given plane is an instance of `vedo.shapes.Plane`. And one of these two params should be left as `None` to specify the projection type. Example: ```python s.project_on_plane(plane='z') # project to z-plane plane = Plane(pos=(4, 8, -4), normal=(-1, 0, 1), s=(5,5)) s.project_on_plane(plane=plane) # orthogonal projection s.project_on_plane(plane=plane, point=(6, 6, 6)) # perspective projection s.project_on_plane(plane=plane, direction=(1, 2, -1)) # oblique projection ``` Examples: - [silhouette2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/silhouette2.py) ![](https://vedo.embl.es/images/basic/silhouette2.png) """ coords = self.coordinates if plane == "x": coords[:, 0] = self.transform.position[0] intercept = self.xbounds()[0] if point is None else point self.x(intercept) elif plane == "y": coords[:, 1] = self.transform.position[1] intercept = self.ybounds()[0] if point is None else point self.y(intercept) elif plane == "z": coords[:, 2] = self.transform.position[2] intercept = self.zbounds()[0] if point is None else point self.z(intercept) elif isinstance(plane, vedo.shapes.Plane): normal = plane.normal / np.linalg.norm(plane.normal) pl = np.hstack((normal, -np.dot(plane.pos(), normal))).reshape(4, 1) if direction is None and point is None: # orthogonal projection pt = np.hstack((normal, [0])).reshape(4, 1) # proj_mat = pt.T @ pl * np.eye(4) - pt @ pl.T # python3 only proj_mat = np.matmul(pt.T, pl) * np.eye(4) - np.matmul(pt, pl.T) elif direction is None: # perspective projection pt = np.hstack((np.array(point), [1])).reshape(4, 1) # proj_mat = pt.T @ pl * np.eye(4) - pt @ pl.T proj_mat = np.matmul(pt.T, pl) * np.eye(4) - np.matmul(pt, pl.T) elif point is None: # oblique projection pt = np.hstack((np.array(direction), [0])).reshape(4, 1) # proj_mat = pt.T @ pl * np.eye(4) - pt @ pl.T proj_mat = np.matmul(pt.T, pl) * np.eye(4) - np.matmul(pt, pl.T) coords = np.concatenate([coords, np.ones((coords.shape[:-1] + (1,)))], axis=-1) # coords = coords @ proj_mat.T coords = np.matmul(coords, proj_mat.T) coords = coords[:, :3] / coords[:, 3:] else: vedo.logger.error(f"unknown plane {plane}") raise RuntimeError() self.alpha(0.1) self.coordinates = coords return self def warp(self, source, target, sigma=1.0, mode="3d") -> Self: """ "Thin Plate Spline" transformations describe a nonlinear warp transform defined by a set of source and target landmarks. Any point on the mesh close to a source landmark will be moved to a place close to the corresponding target landmark. The points in between are interpolated smoothly using Bookstein's Thin Plate Spline algorithm. Transformation object can be accessed with `mesh.transform`. Arguments: sigma : (float) specify the 'stiffness' of the spline. mode : (str) set the basis function to either abs(R) (for 3d) or R2LogR (for 2d meshes) Examples: - [interpolate_field.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_field.py) - [warp1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp1.py) - [warp2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp2.py) - [warp3.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp3.py) - [warp4a.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp4a.py) - [warp4b.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp4b.py) - [warp6.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp6.py) ![](https://vedo.embl.es/images/advanced/warp2.png) """ parents = [self] try: source = source.coordinates parents.append(source) except AttributeError: source = utils.make3d(source) try: target = target.coordinates parents.append(target) except AttributeError: target = utils.make3d(target) ns = len(source) nt = len(target) if ns != nt: vedo.logger.error(f"#source {ns} != {nt} #target points") raise RuntimeError() NLT = NonLinearTransform() NLT.source_points = source NLT.target_points = target self.apply_transform(NLT) self.pipeline = utils.OperationNode("warp", parents=parents) return self def cut_with_plane( self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False, # generate_ids=False, ) -> Self: """ Cut the mesh with the plane defined by a point and a normal. Arguments: origin : (array) the cutting plane goes through this point normal : (array) normal of the cutting plane invert : (bool) select which side of the plane to keep Example: ```python from vedo import Cube cube = Cube().cut_with_plane(normal=(1,1,1)) cube.back_color('pink').show().close() ``` ![](https://vedo.embl.es/images/feats/cut_with_plane_cube.png) Examples: - [trail.py](https://github.com/marcomusy/vedo/blob/master/examples/simulations/trail.py) ![](https://vedo.embl.es/images/simulations/trail.gif) Check out also: `cut_with_box()`, `cut_with_cylinder()`, `cut_with_sphere()`. """ s = str(normal) if "x" in s: normal = (1, 0, 0) if "-" in s: normal = -np.array(normal) elif "y" in s: normal = (0, 1, 0) if "-" in s: normal = -np.array(normal) elif "z" in s: normal = (0, 0, 1) if "-" in s: normal = -np.array(normal) plane = vtki.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtki.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClippedOutputOff() clipper.SetGenerateClipScalars(0) clipper.SetInsideOut(invert) clipper.SetValue(0) clipper.Update() # if generate_ids: # saved_scalars = None # otherwise the scalars are lost # if self.dataset.GetPointData().GetScalars(): # saved_scalars = self.dataset.GetPointData().GetScalars() # varr = clipper.GetOutput().GetPointData().GetScalars() # if varr.GetName() is None: # varr.SetName("DistanceToCut") # arr = utils.vtk2numpy(varr) # # array of original ids # ids = np.arange(arr.shape[0]).astype(int) # ids[arr == 0] = -1 # ids_arr = utils.numpy2vtk(ids, dtype=int) # ids_arr.SetName("OriginalIds") # clipper.GetOutput().GetPointData().AddArray(ids_arr) # if saved_scalars: # clipper.GetOutput().GetPointData().AddArray(saved_scalars) self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self]) return self def cut_with_planes(self, origins, normals, invert=False) -> Self: """ Cut the mesh with a convex set of planes defined by points and normals. Arguments: origins : (array) each cutting plane goes through this point normals : (array) normal of each of the cutting planes invert : (bool) if True, cut outside instead of inside Check out also: `cut_with_box()`, `cut_with_cylinder()`, `cut_with_sphere()` """ vpoints = vtki.vtkPoints() for p in utils.make3d(origins): vpoints.InsertNextPoint(p) normals = utils.make3d(normals) planes = vtki.vtkPlanes() planes.SetPoints(vpoints) planes.SetNormals(utils.numpy2vtk(normals, dtype=float)) clipper = vtki.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetInsideOut(invert) clipper.SetClipFunction(planes) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_planes", parents=[self]) return self def cut_with_box(self, bounds, invert=False) -> Self: """ Cut the current mesh with a box or a set of boxes. This is much faster than `cut_with_mesh()`. Input `bounds` can be either: - a Mesh or Points object - a list of 6 number representing a bounding box `[xmin,xmax, ymin,ymax, zmin,zmax]` - a list of bounding boxes like the above: `[[xmin1,...], [xmin2,...], ...]` Example: ```python from vedo import Sphere, Cube, show mesh = Sphere(r=1, res=50) box = Cube(side=1.5).wireframe() mesh.cut_with_box(box) show(mesh, box, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_box_cube.png) Check out also: `cut_with_line()`, `cut_with_plane()`, `cut_with_cylinder()` """ if isinstance(bounds, Points): bounds = bounds.bounds() box = vtki.new("Box") if utils.is_sequence(bounds[0]): for bs in bounds: box.AddBounds(bs) else: box.SetBounds(bounds) clipper = vtki.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(box) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_box", parents=[self]) return self def cut_with_line(self, points, invert=False, closed=True) -> Self: """ Cut the current mesh with a line vertically in the z-axis direction like a cookie cutter. The polyline is defined by a set of points (z-coordinates are ignored). This is much faster than `cut_with_mesh()`. Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_sphere()` """ pplane = vtki.new("PolyPlane") if isinstance(points, Points): points = points.coordinates.tolist() if closed: if isinstance(points, np.ndarray): points = points.tolist() points.append(points[0]) vpoints = vtki.vtkPoints() for p in points: if len(p) == 2: p = [p[0], p[1], 0.0] vpoints.InsertNextPoint(p) n = len(points) polyline = vtki.new("PolyLine") polyline.Initialize(n, vpoints) polyline.GetPointIds().SetNumberOfIds(n) for i in range(n): polyline.GetPointIds().SetId(i, i) pplane.SetPolyLine(polyline) clipper = vtki.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(pplane) clipper.SetInsideOut(invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_line", parents=[self]) return self def cut_with_cookiecutter(self, lines) -> Self: """ Cut the current mesh with a single line or a set of lines. Input `lines` can be either: - a `Mesh` or `Points` object - a list of 3D points: `[(x1,y1,z1), (x2,y2,z2), ...]` - a list of 2D points: `[(x1,y1), (x2,y2), ...]` Example: ```python from vedo import * grid = Mesh(dataurl + "dolfin_fine.vtk") grid.compute_quality().cmap("Greens") pols = merge( Polygon(nsides=10, r=0.3).pos(0.7, 0.3), Polygon(nsides=10, r=0.2).pos(0.3, 0.7), ) lines = pols.boundaries() cgrid = grid.clone().cut_with_cookiecutter(lines) grid.alpha(0.1).wireframe() show(grid, cgrid, lines, axes=8, bg='blackboard').close() ``` ![](https://vedo.embl.es/images/feats/cookiecutter.png) Check out also: `cut_with_line()` and `cut_with_point_loop()` Note: In case of a warning message like: "Mesh and trim loop point data attributes are different" consider interpolating the mesh point data to the loop points, Eg. (in the above example): ```python lines = pols.boundaries().interpolate_data_from(grid, n=2) ``` Note: trying to invert the selection by reversing the loop order will have no effect in this method, hence it does not have the `invert` option. """ if utils.is_sequence(lines): lines = utils.make3d(lines) iline = list(range(len(lines))) + [0] poly = utils.buildPolyData(lines, lines=[iline]) else: poly = lines.dataset # if invert: # not working # rev = vtki.new("ReverseSense") # rev.ReverseCellsOn() # rev.SetInputData(poly) # rev.Update() # poly = rev.GetOutput() # Build loops from the polyline build_loops = vtki.new("ContourLoopExtraction") build_loops.SetGlobalWarningDisplay(0) build_loops.SetInputData(poly) build_loops.Update() boundary_poly = build_loops.GetOutput() ccut = vtki.new("CookieCutter") ccut.SetInputData(self.dataset) ccut.SetLoopsData(boundary_poly) ccut.SetPointInterpolationToMeshEdges() # ccut.SetPointInterpolationToLoopEdges() ccut.PassCellDataOn() ccut.PassPointDataOn() ccut.Update() self._update(ccut.GetOutput()) self.pipeline = utils.OperationNode("cut_with_cookiecutter", parents=[self]) return self def cut_with_cylinder(self, center=(0, 0, 0), axis=(0, 0, 1), r=1, invert=False) -> Self: """ Cut the current mesh with an infinite cylinder. This is much faster than `cut_with_mesh()`. Arguments: center : (array) the center of the cylinder normal : (array) direction of the cylinder axis r : (float) radius of the cylinder Example: ```python from vedo import Disc, show disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_cylinder([0,0,2], r=0.4, axis='y', invert=True) show(mesh, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_cylinder.png) Examples: - [optics_main1.py](https://github.com/marcomusy/vedo/blob/master/examples/simulations/optics_main1.py) Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_sphere()` """ s = str(axis) if "x" in s: axis = (1, 0, 0) elif "y" in s: axis = (0, 1, 0) elif "z" in s: axis = (0, 0, 1) cyl = vtki.new("Cylinder") cyl.SetCenter(center) cyl.SetAxis(axis[0], axis[1], axis[2]) cyl.SetRadius(r) clipper = vtki.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(cyl) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_cylinder", parents=[self]) return self def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False) -> Self: """ Cut the current mesh with an sphere. This is much faster than `cut_with_mesh()`. Arguments: center : (array) the center of the sphere r : (float) radius of the sphere Example: ```python from vedo import Disc, show disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_sphere([1,-0.7,2], r=1.5, invert=True) show(mesh, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_sphere.png) Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_cylinder()` """ sph = vtki.new("Sphere") sph.SetCenter(center) sph.SetRadius(r) clipper = vtki.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(sph) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_sphere", parents=[self]) return self def cut_with_mesh(self, mesh, invert=False, keep=False) -> Union[Self, "vedo.Assembly"]: """ Cut an `Mesh` mesh with another `Mesh`. Use `invert` to invert the selection. Use `keep` to keep the cutoff part, in this case an `Assembly` is returned: the "cut" object and the "discarded" part of the original object. You can access both via `assembly.unpack()` method. Example: ```python from vedo import * arr = np.random.randn(100000, 3)/2 pts = Points(arr).c('red3').pos(5,0,0) cube = Cube().pos(4,0.5,0) assem = pts.cut_with_mesh(cube, keep=True) show(assem.unpack(), axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_mesh.png) Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_cylinder()` """ polymesh = mesh.dataset poly = self.dataset # Create an array to hold distance information signed_distances = vtki.vtkFloatArray() signed_distances.SetNumberOfComponents(1) signed_distances.SetName("SignedDistances") # implicit function that will be used to slice the mesh ippd = vtki.new("ImplicitPolyDataDistance") ippd.SetInput(polymesh) # Evaluate the signed distance function at all of the grid points for pointId in range(poly.GetNumberOfPoints()): p = poly.GetPoint(pointId) signed_distance = ippd.EvaluateFunction(p) signed_distances.InsertNextValue(signed_distance) currentscals = poly.GetPointData().GetScalars() if currentscals: currentscals = currentscals.GetName() poly.GetPointData().AddArray(signed_distances) poly.GetPointData().SetActiveScalars("SignedDistances") clipper = vtki.new("ClipPolyData") clipper.SetInputData(poly) clipper.SetInsideOut(not invert) clipper.SetGenerateClippedOutput(keep) clipper.SetValue(0.0) clipper.Update() cpoly = clipper.GetOutput() if keep: kpoly = clipper.GetOutput(1) vis = False if currentscals: cpoly.GetPointData().SetActiveScalars(currentscals) vis = self.mapper.GetScalarVisibility() self._update(cpoly) self.pointdata.remove("SignedDistances") self.mapper.SetScalarVisibility(vis) if keep: if isinstance(self, vedo.Mesh): cutoff = vedo.Mesh(kpoly) else: cutoff = vedo.Points(kpoly) # cutoff = self.__class__(kpoly) # this does not work properly cutoff.properties = vtki.vtkProperty() cutoff.properties.DeepCopy(self.properties) cutoff.actor.SetProperty(cutoff.properties) cutoff.c("k5").alpha(0.2) return vedo.Assembly([self, cutoff]) self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh]) return self def cut_with_point_loop( self, points, invert=False, on="points", include_boundary=False ) -> Self: """ Cut an `Mesh` object with a set of points forming a closed loop. Arguments: invert : (bool) invert selection (inside-out) on : (str) if 'cells' will extract the whole cells lying inside (or outside) the point loop include_boundary : (bool) include cells lying exactly on the boundary line. Only relevant on 'cells' mode Examples: - [cut_with_points1.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/cut_with_points1.py) ![](https://vedo.embl.es/images/advanced/cutWithPoints1.png) - [cut_with_points2.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/cut_with_points2.py) ![](https://vedo.embl.es/images/advanced/cutWithPoints2.png) """ if isinstance(points, Points): parents = [points] vpts = points.dataset.GetPoints() points = points.coordinates else: parents = [self] vpts = vtki.vtkPoints() points = utils.make3d(points) for p in points: vpts.InsertNextPoint(p) if "cell" in on: ippd = vtki.new("ImplicitSelectionLoop") ippd.SetLoop(vpts) ippd.AutomaticNormalGenerationOn() clipper = vtki.new("ExtractPolyDataGeometry") clipper.SetInputData(self.dataset) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(include_boundary) else: spol = vtki.new("SelectPolyData") spol.SetLoop(vpts) spol.GenerateSelectionScalarsOn() spol.GenerateUnselectedOutputOff() spol.SetInputData(self.dataset) spol.Update() clipper = vtki.new("ClipPolyData") clipper.SetInputData(spol.GetOutput()) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_pointloop", parents=parents) return self def cut_with_scalar(self, value: float, name="", invert=False) -> Self: """ Cut a mesh or point cloud with some input scalar point-data. Arguments: value : (float) cutting value name : (str) array name of the scalars to be used invert : (bool) flip selection Example: ```python from vedo import * s = Sphere().lw(1) pts = s.points scalars = np.sin(3*pts[:,2]) + pts[:,0] s.pointdata["somevalues"] = scalars s.cut_with_scalar(0.3) s.cmap("Spectral", "somevalues").add_scalarbar() s.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_scalars.png) """ if name: self.pointdata.select(name) clipper = vtki.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetValue(value) clipper.GenerateClippedOutputOff() clipper.SetInsideOut(not invert) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_scalar", parents=[self]) return self def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=None, bounds=()) -> Self: """ Crop an `Mesh` object. Arguments: top : (float) fraction to crop from the top plane (positive z) bottom : (float) fraction to crop from the bottom plane (negative z) front : (float) fraction to crop from the front plane (positive y) back : (float) fraction to crop from the back plane (negative y) right : (float) fraction to crop from the right plane (positive x) left : (float) fraction to crop from the left plane (negative x) bounds : (list) bounding box of the crop region as `[x0,x1, y0,y1, z0,z1]` Example: ```python from vedo import Sphere Sphere().crop(right=0.3, left=0.1).show() ``` ![](https://user-images.githubusercontent.com/32848391/57081955-0ef1e800-6cf6-11e9-99de-b45220939bc9.png) """ if not len(bounds): pos = np.array(self.pos()) x0, x1, y0, y1, z0, z1 = self.bounds() x0, y0, z0 = [x0, y0, z0] - pos x1, y1, z1 = [x1, y1, z1] - pos dx, dy, dz = x1 - x0, y1 - y0, z1 - z0 if top: z1 = z1 - top * dz if bottom: z0 = z0 + bottom * dz if front: y1 = y1 - front * dy if back: y0 = y0 + back * dy if right: x1 = x1 - right * dx if left: x0 = x0 + left * dx bounds = (x0, x1, y0, y1, z0, z1) cu = vtki.new("Box") cu.SetBounds(bounds) clipper = vtki.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(cu) clipper.InsideOutOn() clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode( "crop", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self def generate_surface_halo( self, distance=0.05, res=(50, 50, 50), bounds=(), maxdist=None, ) -> "vedo.Mesh": """ Generate the surface halo which sits at the specified distance from the input one. Arguments: distance : (float) distance from the input surface res : (int) resolution of the surface bounds : (list) bounding box of the surface maxdist : (float) maximum distance to generate the surface """ if not bounds: bounds = self.bounds() if not maxdist: maxdist = self.diagonal_size() / 2 imp = vtki.new("ImplicitModeller") imp.SetInputData(self.dataset) imp.SetSampleDimensions(res) if maxdist: imp.SetMaximumDistance(maxdist) if len(bounds) == 6: imp.SetModelBounds(bounds) contour = vtki.new("ContourFilter") contour.SetInputConnection(imp.GetOutputPort()) contour.SetValue(0, distance) contour.Update() out = vedo.Mesh(contour.GetOutput()) out.c("lightblue").alpha(0.25).lighting("off") out.pipeline = utils.OperationNode("generate_surface_halo", parents=[self]) return out def generate_mesh( self, line_resolution=None, mesh_resolution=None, smooth=0.0, jitter=0.001, grid=None, quads=False, invert=False, ) -> Self: """ Generate a polygonal Mesh from a closed contour line. If line is not closed it will be closed with a straight segment. Check also `generate_delaunay2d()`. Arguments: line_resolution : (int) resolution of the contour line. The default is None, in this case the contour is not resampled. mesh_resolution : (int) resolution of the internal triangles not touching the boundary. smooth : (float) smoothing of the contour before meshing. jitter : (float) add a small noise to the internal points. grid : (Grid) manually pass a Grid object. The default is True. quads : (bool) generate a mesh of quads instead of triangles. invert : (bool) flip the line orientation. The default is False. Examples: - [line2mesh_tri.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/line2mesh_tri.py) ![](https://vedo.embl.es/images/advanced/line2mesh_tri.jpg) - [line2mesh_quads.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/line2mesh_quads.py) ![](https://vedo.embl.es/images/advanced/line2mesh_quads.png) """ if line_resolution is None: contour = vedo.shapes.Line(self.coordinates) else: contour = vedo.shapes.Spline(self.coordinates, smooth=smooth, res=line_resolution) contour.clean() length = contour.length() density = length / contour.npoints # print(f"tomesh():\n\tline length = {length}") # print(f"\tdensity = {density} length/pt_separation") x0, x1 = contour.xbounds() y0, y1 = contour.ybounds() if grid is None: if mesh_resolution is None: resx = int((x1 - x0) / density + 0.5) resy = int((y1 - y0) / density + 0.5) # print(f"tmesh_resolution = {[resx, resy]}") else: if utils.is_sequence(mesh_resolution): resx, resy = mesh_resolution else: resx, resy = mesh_resolution, mesh_resolution grid = vedo.shapes.Grid( [(x0 + x1) / 2, (y0 + y1) / 2, 0], s=((x1 - x0) * 1.025, (y1 - y0) * 1.025), res=(resx, resy), ) else: grid = grid.clone() cpts = contour.coordinates # make sure it's closed p0, p1 = cpts[0], cpts[-1] nj = max(2, int(utils.mag(p1 - p0) / density + 0.5)) joinline = vedo.shapes.Line(p1, p0, res=nj) contour = vedo.merge(contour, joinline).subsample(0.0001) ####################################### quads if quads: cmesh = grid.clone().cut_with_point_loop(contour, on="cells", invert=invert) cmesh.wireframe(False).lw(0.5) cmesh.pipeline = utils.OperationNode( "generate_mesh", parents=[self, contour], comment=f"#quads {cmesh.dataset.GetNumberOfCells()}", ) return cmesh ############################################# grid_tmp = grid.coordinates.copy() if jitter: np.random.seed(0) sigma = 1.0 / np.sqrt(grid.npoints) * grid.diagonal_size() * jitter # print(f"\tsigma jittering = {sigma}") grid_tmp += np.random.rand(grid.npoints, 3) * sigma grid_tmp[:, 2] = 0.0 todel = [] density /= np.sqrt(3) vgrid_tmp = Points(grid_tmp) for p in contour.coordinates: out = vgrid_tmp.closest_point(p, radius=density, return_point_id=True) todel += out.tolist() grid_tmp = grid_tmp.tolist() for index in sorted(list(set(todel)), reverse=True): del grid_tmp[index] points = contour.coordinates.tolist() + grid_tmp if invert: boundary = list(reversed(range(contour.npoints))) else: boundary = list(range(contour.npoints)) dln = Points(points).generate_delaunay2d(mode="xy", boundaries=[boundary]) dln.compute_normals(points=False) # fixes reversd faces dln.lw(1) dln.pipeline = utils.OperationNode( "generate_mesh", parents=[self, contour], comment=f"#cells {dln.dataset.GetNumberOfCells()}", ) return dln def reconstruct_surface( self, dims=(100, 100, 100), radius=None, sample_size=None, hole_filling=True, bounds=(), padding=0.05, ) -> "vedo.Mesh": """ Surface reconstruction from a scattered cloud of points. Arguments: dims : (int) number of voxels in x, y and z to control precision. radius : (float) radius of influence of each point. Smaller values generally improve performance markedly. Note that after the signed distance function is computed, any voxel taking on the value >= radius is presumed to be "unseen" or uninitialized. sample_size : (int) if normals are not present they will be calculated using this sample size per point. hole_filling : (bool) enables hole filling, this generates separating surfaces between the empty and unseen portions of the volume. bounds : (list) region in space in which to perform the sampling in format (xmin,xmax, ymin,ymax, zim, zmax) padding : (float) increase by this fraction the bounding box Examples: - [recosurface.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/recosurface.py) ![](https://vedo.embl.es/images/advanced/recosurface.png) """ if not utils.is_sequence(dims): dims = (dims, dims, dims) sdf = vtki.new("SignedDistance") if len(bounds) == 6: sdf.SetBounds(bounds) else: x0, x1, y0, y1, z0, z1 = self.bounds() sdf.SetBounds( x0 - (x1 - x0) * padding, x1 + (x1 - x0) * padding, y0 - (y1 - y0) * padding, y1 + (y1 - y0) * padding, z0 - (z1 - z0) * padding, z1 + (z1 - z0) * padding, ) bb = sdf.GetBounds() if bb[0]==bb[1]: vedo.logger.warning("reconstruct_surface(): zero x-range") if bb[2]==bb[3]: vedo.logger.warning("reconstruct_surface(): zero y-range") if bb[4]==bb[5]: vedo.logger.warning("reconstruct_surface(): zero z-range") pd = self.dataset if pd.GetPointData().GetNormals(): sdf.SetInputData(pd) else: normals = vtki.new("PCANormalEstimation") normals.SetInputData(pd) if not sample_size: sample_size = int(pd.GetNumberOfPoints() / 50) normals.SetSampleSize(sample_size) normals.SetNormalOrientationToGraphTraversal() sdf.SetInputConnection(normals.GetOutputPort()) # print("Recalculating normals with sample size =", sample_size) if radius is None: radius = self.diagonal_size() / (sum(dims) / 3) * 5 # print("Calculating mesh from points with radius =", radius) sdf.SetRadius(radius) sdf.SetDimensions(dims) sdf.Update() surface = vtki.new("ExtractSurface") surface.SetRadius(radius * 0.99) surface.SetHoleFilling(hole_filling) surface.ComputeNormalsOff() surface.ComputeGradientsOff() surface.SetInputConnection(sdf.GetOutputPort()) surface.Update() m = vedo.mesh.Mesh(surface.GetOutput(), c=self.color()) m.pipeline = utils.OperationNode( "reconstruct_surface", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}", ) return m def compute_clustering(self, radius: float) -> Self: """ Cluster points in space. The `radius` is the radius of local search. An array named "ClusterId" is added to `pointdata`. Examples: - [clustering.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/clustering.py) ![](https://vedo.embl.es/images/basic/clustering.png) """ cluster = vtki.new("EuclideanClusterExtraction") cluster.SetInputData(self.dataset) cluster.SetExtractionModeToAllClusters() cluster.SetRadius(radius) cluster.ColorClustersOn() cluster.Update() idsarr = cluster.GetOutput().GetPointData().GetArray("ClusterId") self.dataset.GetPointData().AddArray(idsarr) self.pipeline = utils.OperationNode( "compute_clustering", parents=[self], comment=f"radius = {radius}" ) return self def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=(), angle=0.0) -> Self: """ Extracts and/or segments points from a point cloud based on geometric distance measures (e.g., proximity, normal alignments, etc.) and optional measures such as scalar range. The default operation is to segment the points into "connected" regions where the connection is determined by an appropriate distance measure. Each region is given a region id. Optionally, the filter can output the largest connected region of points; a particular region (via id specification); those regions that are seeded using a list of input point ids; or the region of points closest to a specified position. The key parameter of this filter is the radius defining a sphere around each point which defines a local neighborhood: any other points in the local neighborhood are assumed connected to the point. Note that the radius is defined in absolute terms. Other parameters are used to further qualify what it means to be a neighboring point. For example, scalar range and/or point normals can be used to further constrain the neighborhood. Also the extraction mode defines how the filter operates. By default, all regions are extracted but it is possible to extract particular regions; the region closest to a seed point; seeded regions; or the largest region found while processing. By default, all regions are extracted. On output, all points are labeled with a region number. However note that the number of input and output points may not be the same: if not extracting all regions then the output size may be less than the input size. Arguments: radius : (float) variable specifying a local sphere used to define local point neighborhood mode : (int) - 0, Extract all regions - 1, Extract point seeded regions - 2, Extract largest region - 3, Test specified regions - 4, Extract all regions with scalar connectivity - 5, Extract point seeded regions regions : (list) a list of non-negative regions id to extract vrange : (list) scalar range to use to extract points based on scalar connectivity seeds : (list) a list of non-negative point seed ids angle : (list) points are connected if the angle between their normals is within this angle threshold (expressed in degrees). """ # https://vtk.org/doc/nightly/html/classvtkConnectedPointsFilter.html cpf = vtki.new("ConnectedPointsFilter") cpf.SetInputData(self.dataset) cpf.SetRadius(radius) if mode == 0: # Extract all regions pass elif mode == 1: # Extract point seeded regions cpf.SetExtractionModeToPointSeededRegions() for s in seeds: cpf.AddSeed(s) elif mode == 2: # Test largest region cpf.SetExtractionModeToLargestRegion() elif mode == 3: # Test specified regions cpf.SetExtractionModeToSpecifiedRegions() for r in regions: cpf.AddSpecifiedRegion(r) elif mode == 4: # Extract all regions with scalar connectivity cpf.SetExtractionModeToLargestRegion() cpf.ScalarConnectivityOn() cpf.SetScalarRange(vrange[0], vrange[1]) elif mode == 5: # Extract point seeded regions cpf.SetExtractionModeToLargestRegion() cpf.ScalarConnectivityOn() cpf.SetScalarRange(vrange[0], vrange[1]) cpf.AlignedNormalsOn() cpf.SetNormalAngle(angle) cpf.Update() self._update(cpf.GetOutput(), reset_locators=False) return self def compute_camera_distance(self) -> np.ndarray: """ Calculate the distance from points to the camera. A pointdata array is created with name 'DistanceToCamera' and returned. """ if vedo.plotter_instance and vedo.plotter_instance.renderer: poly = self.dataset dc = vtki.new("DistanceToCamera") dc.SetInputData(poly) dc.SetRenderer(vedo.plotter_instance.renderer) dc.Update() self._update(dc.GetOutput(), reset_locators=False) return self.pointdata["DistanceToCamera"] return np.array([]) def densify(self, target_distance=0.1, nclosest=6, radius=None, niter=1, nmax=None) -> Self: """ Return a copy of the cloud with new added points. The new points are created in such a way that all points in any local neighborhood are within a target distance of one another. For each input point, the distance to all points in its neighborhood is computed. If any of its neighbors is further than the target distance, the edge connecting the point and its neighbor is bisected and a new point is inserted at the bisection point. A single pass is completed once all the input points are visited. Then the process repeats to the number of iterations. Examples: - [densifycloud.py](https://github.com/marcomusy/vedo/blob/master/examples/volumetric/densifycloud.py) ![](https://vedo.embl.es/images/volumetric/densifycloud.png) .. note:: Points will be created in an iterative fashion until all points in their local neighborhood are the target distance apart or less. Note that the process may terminate early due to the number of iterations. By default the target distance is set to 0.5. Note that the target_distance should be less than the radius or nothing will change on output. .. warning:: This class can generate a lot of points very quickly. The maximum number of iterations is by default set to =1.0 for this reason. Increase the number of iterations very carefully. Also, `nmax` can be set to limit the explosion of points. It is also recommended that a N closest neighborhood is used. """ src = vtki.new("ProgrammableSource") opts = self.coordinates # zeros = np.zeros(3) def _read_points(): output = src.GetPolyDataOutput() points = vtki.vtkPoints() for p in opts: # print(p) # if not np.array_equal(p, zeros): points.InsertNextPoint(p) output.SetPoints(points) src.SetExecuteMethod(_read_points) dens = vtki.new("DensifyPointCloudFilter") dens.SetInputConnection(src.GetOutputPort()) # dens.SetInputData(self.dataset) # this does not work dens.InterpolateAttributeDataOn() dens.SetTargetDistance(target_distance) dens.SetMaximumNumberOfIterations(niter) if nmax: dens.SetMaximumNumberOfPoints(nmax) if radius: dens.SetNeighborhoodTypeToRadius() dens.SetRadius(radius) elif nclosest: dens.SetNeighborhoodTypeToNClosest() dens.SetNumberOfClosestPoints(nclosest) else: vedo.logger.error("set either radius or nclosest") raise RuntimeError() dens.Update() cld = Points(dens.GetOutput()) cld.copy_properties_from(self) cld.interpolate_data_from(self, n=nclosest, radius=radius) cld.name = "DensifiedCloud" cld.pipeline = utils.OperationNode( "densify", parents=[self], c="#e9c46a:", comment=f"#pts {cld.dataset.GetNumberOfPoints()}", ) return cld ############################################################################### ## stuff returning a Volume ############################################################################### def density( self, dims=(40, 40, 40), bounds=None, radius=None, compute_gradient=False, locator=None ) -> "vedo.Volume": """ Generate a density field from a point cloud. Input can also be a set of 3D coordinates. Output is a `Volume`. The local neighborhood is specified as the `radius` around each sample position (each voxel). If left to None, the radius is automatically computed as the diagonal of the bounding box and can be accessed via `vol.metadata["radius"]`. The density is expressed as the number of counts in the radius search. Arguments: dims : (int, list) number of voxels in x, y and z of the output Volume. compute_gradient : (bool) Turn on/off the generation of the gradient vector, gradient magnitude scalar, and function classification scalar. By default this is off. Note that this will increase execution time and the size of the output. (The names of these point data arrays are: "Gradient", "Gradient Magnitude", and "Classification") locator : (vtkPointLocator) can be assigned from a previous call for speed (access it via `object.point_locator`). Examples: - [plot_density3d.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/plot_density3d.py) ![](https://vedo.embl.es/images/pyplot/plot_density3d.png) """ pdf = vtki.new("PointDensityFilter") pdf.SetInputData(self.dataset) if not utils.is_sequence(dims): dims = [dims, dims, dims] if bounds is None: bounds = list(self.bounds()) elif len(bounds) == 4: bounds = [*bounds, 0, 0] if bounds[5] - bounds[4] == 0 or len(dims) == 2: # its 2D dims = list(dims) dims = [dims[0], dims[1], 2] diag = self.diagonal_size() bounds[5] = bounds[4] + diag / 1000 pdf.SetModelBounds(bounds) pdf.SetSampleDimensions(dims) if locator: pdf.SetLocator(locator) pdf.SetDensityEstimateToFixedRadius() if radius is None: radius = self.diagonal_size() / 20 pdf.SetRadius(radius) pdf.SetComputeGradient(compute_gradient) pdf.Update() vol = vedo.Volume(pdf.GetOutput()).mode(1) vol.name = "PointDensity" vol.metadata["radius"] = radius vol.locator = pdf.GetLocator() vol.pipeline = utils.OperationNode( "density", parents=[self], comment=f"dims={tuple(vol.dimensions())}" ) return vol def tovolume( self, kernel="shepard", radius=None, n=None, bounds=None, null_value=None, dims=(25, 25, 25), ) -> "vedo.Volume": """ Generate a `Volume` by interpolating a scalar or vector field which is only known on a scattered set of points or mesh. Available interpolation kernels are: shepard, gaussian, or linear. Arguments: kernel : (str) interpolation kernel type [shepard] radius : (float) radius of the local search n : (int) number of point to use for interpolation bounds : (list) bounding box of the output Volume object dims : (list) dimensions of the output Volume object null_value : (float) value to be assigned to invalid points Examples: - [interpolate_volume.py](https://github.com/marcomusy/vedo/blob/master/examples/volumetric/interpolate_volume.py) ![](https://vedo.embl.es/images/volumetric/59095175-1ec5a300-8918-11e9-8bc0-fd35c8981e2b.jpg) """ if radius is None and not n: vedo.logger.error("please set either radius or n") raise RuntimeError poly = self.dataset # Create a probe volume probe = vtki.vtkImageData() probe.SetDimensions(dims) if bounds is None: bounds = self.bounds() probe.SetOrigin(bounds[0], bounds[2], bounds[4]) probe.SetSpacing( (bounds[1] - bounds[0]) / dims[0], (bounds[3] - bounds[2]) / dims[1], (bounds[5] - bounds[4]) / dims[2], ) if not self.point_locator: self.point_locator = vtki.new("PointLocator") self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() if kernel == "shepard": kern = vtki.new("ShepardKernel") kern.SetPowerParameter(2) elif kernel == "gaussian": kern = vtki.new("GaussianKernel") elif kernel == "linear": kern = vtki.new("LinearKernel") else: vedo.logger.error("Error in tovolume(), available kernels are:") vedo.logger.error(" [shepard, gaussian, linear]") raise RuntimeError() if radius: kern.SetRadius(radius) interpolator = vtki.new("PointInterpolator") interpolator.SetInputData(probe) interpolator.SetSourceData(poly) interpolator.SetKernel(kern) interpolator.SetLocator(self.point_locator) if n: kern.SetNumberOfPoints(n) kern.SetKernelFootprintToNClosest() else: kern.SetRadius(radius) if null_value is not None: interpolator.SetNullValue(null_value) else: interpolator.SetNullPointsStrategyToClosestPoint() interpolator.Update() vol = vedo.Volume(interpolator.GetOutput()) vol.pipeline = utils.OperationNode( "signed_distance", parents=[self], comment=f"dims={tuple(vol.dimensions())}", c="#e9c46a:#0096c7", ) return vol ################################################################################# def generate_segments(self, istart=0, rmax=1e30, niter=3) -> "vedo.shapes.Lines": """ Generate a line segments from a set of points. The algorithm is based on the closest point search. Returns a `Line` object. This object contains the a metadata array of used vertex counts in "UsedVertexCount" and the sum of the length of the segments in "SegmentsLengthSum". Arguments: istart : (int) index of the starting point rmax : (float) maximum length of a segment niter : (int) number of iterations or passes through the points Examples: - [moving_least_squares1D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares1D.py) """ points = self.coordinates segments = [] dists = [] n = len(points) used = np.zeros(n, dtype=int) for _ in range(niter): i = istart for _ in range(n): p = points[i] ids = self.closest_point(p, n=4, return_point_id=True) j = ids[1] if used[j] > 1 or [j, i] in segments: j = ids[2] if used[j] > 1: j = ids[3] d = np.linalg.norm(p - points[j]) if used[j] > 1 or used[i] > 1 or d > rmax: i += 1 if i >= n: i = 0 continue used[i] += 1 used[j] += 1 segments.append([i, j]) dists.append(d) i = j segments = np.array(segments, dtype=int) lines = vedo.shapes.Lines(points[segments], c="k", lw=3) lines.metadata["UsedVertexCount"] = used lines.metadata["SegmentsLengthSum"] = np.sum(dists) lines.pipeline = utils.OperationNode("generate_segments", parents=[self]) lines.name = "Segments" return lines def generate_delaunay2d( self, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0.0, transform=None, ) -> "vedo.mesh.Mesh": """ Create a mesh from points in the XY plane. If `mode='fit'` then the filter computes a best fitting plane and projects the points onto it. Check also `generate_mesh()`. Arguments: tol : (float) specify a tolerance to control discarding of closely spaced points. This tolerance is specified as a fraction of the diagonal length of the bounding box of the points. alpha : (float) for a non-zero alpha value, only edges or triangles contained within a sphere centered at mesh vertices will be output. Otherwise, only triangles will be output. offset : (float) multiplier to control the size of the initial, bounding Delaunay triangulation. transform: (LinearTransform, NonLinearTransform) a transformation which is applied to points to generate a 2D problem. This maps a 3D dataset into a 2D dataset where triangulation can be done on the XY plane. The points are transformed and triangulated. The topology of triangulated points is used as the output topology. Examples: - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) ![](https://vedo.embl.es/images/basic/delaunay2d.png) """ plist = self.coordinates.copy() ######################################################### if mode == "scipy": from scipy.spatial import Delaunay as scipy_delaunay tri = scipy_delaunay(plist[:, 0:2]) return vedo.mesh.Mesh([plist, tri.simplices]) ########################################################## pd = vtki.vtkPolyData() vpts = vtki.vtkPoints() vpts.SetData(utils.numpy2vtk(plist, dtype=np.float32)) pd.SetPoints(vpts) delny = vtki.new("Delaunay2D") delny.SetInputData(pd) if tol: delny.SetTolerance(tol) delny.SetAlpha(alpha) delny.SetOffset(offset) if transform: delny.SetTransform(transform.T) elif mode == "fit": delny.SetProjectionPlaneMode(vtki.get_class("VTK_BEST_FITTING_PLANE")) elif mode == "xy" and boundaries: boundary = vtki.vtkPolyData() boundary.SetPoints(vpts) cell_array = vtki.vtkCellArray() for b in boundaries: cpolygon = vtki.vtkPolygon() for idd in b: cpolygon.GetPointIds().InsertNextId(idd) cell_array.InsertNextCell(cpolygon) boundary.SetPolys(cell_array) delny.SetSourceData(boundary) delny.Update() msh = vedo.mesh.Mesh(delny.GetOutput()) msh.name = "Delaunay2D" msh.clean().lighting("off") msh.pipeline = utils.OperationNode( "delaunay2d", parents=[self], comment=f"#cells {msh.dataset.GetNumberOfCells()}", ) return msh def generate_voronoi(self, padding=0.0, fit=False, method="vtk") -> "vedo.Mesh": """ Generate the 2D Voronoi convex tiling of the input points (z is ignored). The points are assumed to lie in a plane. The output is a Mesh. Each output cell is a convex polygon. A cell array named "VoronoiID" is added to the output Mesh. The 2D Voronoi tessellation is a tiling of space, where each Voronoi tile represents the region nearest to one of the input points. Voronoi tessellations are important in computational geometry (and many other fields), and are the dual of Delaunay triangulations. Thus the triangulation is constructed in the x-y plane, and the z coordinate is ignored (although carried through to the output). If you desire to triangulate in a different plane, you can use fit=True. A brief summary is as follows. Each (generating) input point is associated with an initial Voronoi tile, which is simply the bounding box of the point set. A locator is then used to identify nearby points: each neighbor in turn generates a clipping line positioned halfway between the generating point and the neighboring point, and orthogonal to the line connecting them. Clips are readily performed by evaluationg the vertices of the convex Voronoi tile as being on either side (inside,outside) of the clip line. If two intersections of the Voronoi tile are found, the portion of the tile "outside" the clip line is discarded, resulting in a new convex, Voronoi tile. As each clip occurs, the Voronoi "Flower" error metric (the union of error spheres) is compared to the extent of the region containing the neighboring clip points. The clip region (along with the points contained in it) is grown by careful expansion (e.g., outward spiraling iterator over all candidate clip points). When the Voronoi Flower is contained within the clip region, the algorithm terminates and the Voronoi tile is output. Once complete, it is possible to construct the Delaunay triangulation from the Voronoi tessellation. Note that topological and geometric information is used to generate a valid triangulation (e.g., merging points and validating topology). Arguments: pts : (list) list of input points. padding : (float) padding distance. The default is 0. fit : (bool) detect automatically the best fitting plane. The default is False. Examples: - [voronoi1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/voronoi1.py) ![](https://vedo.embl.es/images/basic/voronoi1.png) - [voronoi2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/voronoi2.py) ![](https://vedo.embl.es/images/advanced/voronoi2.png) """ pts = self.coordinates if method == "scipy": from scipy.spatial import Voronoi as scipy_voronoi pts = np.asarray(pts)[:, (0, 1)] vor = scipy_voronoi(pts) regs = [] # filter out invalid indices for r in vor.regions: flag = True for x in r: if x < 0: flag = False break if flag and len(r) > 0: regs.append(r) m = vedo.Mesh([vor.vertices, regs]) m.celldata["VoronoiID"] = np.array(list(range(len(regs)))).astype(int) elif method == "vtk": vor = vtki.new("Voronoi2D") if isinstance(pts, Points): vor.SetInputData(pts) else: pts = np.asarray(pts) if pts.shape[1] == 2: pts = np.c_[pts, np.zeros(len(pts))] pd = vtki.vtkPolyData() vpts = vtki.vtkPoints() vpts.SetData(utils.numpy2vtk(pts, dtype=np.float32)) pd.SetPoints(vpts) vor.SetInputData(pd) vor.SetPadding(padding) vor.SetGenerateScalarsToPointIds() if fit: vor.SetProjectionPlaneModeToBestFittingPlane() else: vor.SetProjectionPlaneModeToXYPlane() vor.Update() poly = vor.GetOutput() arr = poly.GetCellData().GetArray(0) if arr: arr.SetName("VoronoiID") m = vedo.Mesh(poly, c="orange5") else: vedo.logger.error(f"Unknown method {method} in voronoi()") raise RuntimeError m.lw(2).lighting("off").wireframe() m.name = "Voronoi" return m ########################################################################## def generate_delaunay3d(self, radius=0, tol=None) -> "vedo.TetMesh": """ Create 3D Delaunay triangulation of input points. Arguments: radius : (float) specify distance (or "alpha") value to control output. For a non-zero values, only tetra contained within the circumsphere will be output. tol : (float) Specify a tolerance to control discarding of closely spaced points. This tolerance is specified as a fraction of the diagonal length of the bounding box of the points. """ deln = vtki.new("Delaunay3D") deln.SetInputData(self.dataset) deln.SetAlpha(radius) deln.AlphaTetsOn() deln.AlphaTrisOff() deln.AlphaLinesOff() deln.AlphaVertsOff() deln.BoundingTriangulationOff() if tol: deln.SetTolerance(tol) deln.Update() m = vedo.TetMesh(deln.GetOutput()) m.pipeline = utils.OperationNode( "generate_delaunay3d", c="#e9c46a:#edabab", parents=[self], ) m.name = "Delaunay3D" return m #################################################### def visible_points(self, area=(), tol=None, invert=False) -> Union[Self, None]: """ Extract points based on whether they are visible or not. Visibility is determined by accessing the z-buffer of a rendering window. The position of each input point is converted into display coordinates, and then the z-value at that point is obtained. If within the user-specified tolerance, the point is considered visible. Associated data attributes are passed to the output as well. This filter also allows you to specify a rectangular window in display (pixel) coordinates in which the visible points must lie. Arguments: area : (list) specify a rectangular region as (xmin,xmax,ymin,ymax) tol : (float) a tolerance in normalized display coordinate system invert : (bool) select invisible points instead. Example: ```python from vedo import Ellipsoid, show s = Ellipsoid().rotate_y(30) # Camera options: pos, focal_point, viewup, distance camopts = dict(pos=(0,0,25), focal_point=(0,0,0)) show(s, camera=camopts, offscreen=True) m = s.visible_points() # print('visible pts:', m.vertices) # numpy array show(m, new=True, axes=1).close() # optionally draw result in a new window ``` ![](https://vedo.embl.es/images/feats/visible_points.png) """ svp = vtki.new("SelectVisiblePoints") svp.SetInputData(self.dataset) ren = None if vedo.plotter_instance: if vedo.plotter_instance.renderer: ren = vedo.plotter_instance.renderer svp.SetRenderer(ren) if not ren: vedo.logger.warning( "visible_points() can only be used after a rendering step" ) return None if len(area) == 2: area = utils.flatten(area) if len(area) == 4: # specify a rectangular region svp.SetSelection(area[0], area[1], area[2], area[3]) if tol is not None: svp.SetTolerance(tol) if invert: svp.SelectInvisibleOn() svp.Update() m = Points(svp.GetOutput()) m.name = "VisiblePoints" return m vedo-2025.5.3/vedo/pyplot.py000066400000000000000000004251001474667405700155710ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- from typing import Union from typing_extensions import Self import numpy as np import vedo.vtkclasses as vtki import vedo from vedo import settings from vedo.transformations import cart2spher, spher2cart from vedo import addons from vedo import colors from vedo import utils from vedo import shapes from vedo.pointcloud import merge from vedo.mesh import Mesh from vedo.assembly import Assembly __docformat__ = "google" __doc__ = """ Advanced plotting functionalities. ![](https://vedo.embl.es/images/pyplot/fitPolynomial2.png) """ __all__ = [ "Figure", "Histogram1D", "Histogram2D", "PlotXY", "PlotBars", "plot", "histogram", "fit", "pie_chart", "violin", "whisker", "streamplot", "matrix", "DirectedGraph", ] ########################################################################## class LabelData: """Helper internal class to hold label information.""" def __init__(self): """Helper internal class to hold label information.""" self.text = "dataset" self.tcolor = "black" self.marker = "s" self.mcolor = "black" ########################################################################## class Figure(Assembly): """Format class for figures.""" def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), **kwargs): """ Create an empty formatted figure for plotting. Arguments: xlim : (list) range of the x-axis as [x0, x1] ylim : (list) range of the y-axis as [y0, y1] aspect : (float, str) the desired aspect ratio of the histogram. Default is 4/3. Use `aspect="equal"` to force the same units in x and y. padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` axes : (dict) an extra dictionary of options for the `vedo.addons.Axes` object """ self.verbose = True # printing to stdout on every mouse click self.xlim = np.asarray(xlim) self.ylim = np.asarray(ylim) self.aspect = aspect self.padding = padding if not utils.is_sequence(self.padding): self.padding = [self.padding, self.padding, self.padding, self.padding] self.force_scaling_types = ( shapes.Glyph, shapes.Line, shapes.Rectangle, shapes.DashedLine, shapes.Tube, shapes.Ribbon, shapes.GeoCircle, shapes.Arc, shapes.Grid, # shapes.Arrows, # todo # shapes.Arrows2D, # todo shapes.Brace, # todo ) options = dict(kwargs) self.title = options.pop("title", "") self.xtitle = options.pop("xtitle", " ") self.ytitle = options.pop("ytitle", " ") number_of_divisions = 6 self.legend = None self.labels = [] self.label = options.pop("label", None) if self.label: self.labels = [self.label] self.axopts = options.pop("axes", {}) if isinstance(self.axopts, (bool, int, float)): if self.axopts: self.axopts = {} if self.axopts or isinstance(self.axopts, dict): number_of_divisions = self.axopts.pop("number_of_divisions", number_of_divisions) self.axopts["xtitle"] = self.xtitle self.axopts["ytitle"] = self.ytitle if "xygrid" not in self.axopts: ## modify the default self.axopts["xygrid"] = options.pop("grid", False) if "xygrid_transparent" not in self.axopts: ## modify the default self.axopts["xygrid_transparent"] = True if "xtitle_position" not in self.axopts: ## modify the default self.axopts["xtitle_position"] = 0.5 self.axopts["xtitle_justify"] = "top-center" if "ytitle_position" not in self.axopts: ## modify the default self.axopts["ytitle_position"] = 0.5 self.axopts["ytitle_justify"] = "bottom-center" if self.label: if "c" in self.axopts: self.label.tcolor = self.axopts["c"] x0, x1 = self.xlim y0, y1 = self.ylim dx = x1 - x0 dy = y1 - y0 x0lim, x1lim = (x0 - self.padding[0] * dx, x1 + self.padding[1] * dx) y0lim, y1lim = (y0 - self.padding[2] * dy, y1 + self.padding[3] * dy) dy = y1lim - y0lim self.axes = None if xlim[0] >= xlim[1] or ylim[0] >= ylim[1]: vedo.logger.warning(f"Null range for Figure {self.title}... returning an empty Assembly.") super().__init__() self.yscale = 0 return if aspect == "equal": self.aspect = dx / dy # so that yscale becomes 1 self.yscale = dx / dy / self.aspect y0lim *= self.yscale y1lim *= self.yscale self.x0lim = x0lim self.x1lim = x1lim self.y0lim = y0lim self.y1lim = y1lim self.ztolerance = options.pop("ztolerance", None) if self.ztolerance is None: self.ztolerance = dx / 5000 ############## create axes if self.axopts: axes_opts = self.axopts if self.axopts is True or self.axopts == 1: axes_opts = {} tp, ts = utils.make_ticks(y0lim / self.yscale, y1lim / self.yscale, number_of_divisions) labs = [] for i in range(1, len(tp) - 1): ynew = utils.lin_interpolate(tp[i], [0, 1], [y0lim, y1lim]) labs.append([ynew, ts[i]]) if self.title: axes_opts["htitle"] = self.title axes_opts["y_values_and_labels"] = labs axes_opts["xrange"] = (x0lim, x1lim) axes_opts["yrange"] = (y0lim, y1lim) axes_opts["zrange"] = (0, 0) axes_opts["y_use_bounds"] = True if "c" not in axes_opts and "ac" in options: axes_opts["c"] = options["ac"] self.axes = addons.Axes(**axes_opts) super().__init__([self.axes]) self.name = "Figure" vedo.last_figure = self if settings.remember_last_figure_format else None ################################################################## def _repr_html_(self): """ HTML representation of the Figure object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.pyplot.Figure" help_url = "https://vedo.embl.es/docs/vedo/pyplot.html#Figure" arr = self.thumbnail(zoom=1.1) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ vedo.utils.precision(min_x, 4) + " ... " + vedo.utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" all = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", "", "
nr. of parts " + str(self.GetNumberOfPaths()) + "
position " + str(self.GetPosition()) + "
x-limits " + utils.precision(self.xlim, 4) + "
y-limits " + utils.precision(self.ylim, 4) + "
world bounds
(x/y/z)
" + str(bounds) + "
", "
", ] return "\n".join(all) def __add__(self, *obj): # just to avoid confusion, supersede Assembly.__add__ return self.__iadd__(*obj) def __iadd__(self, *obj): if len(obj) == 1 and isinstance(obj[0], Figure): return self._check_unpack_and_insert(obj[0]) obj = utils.flatten(obj) return self.insert(*obj) def _check_unpack_and_insert(self, fig: "Figure") -> Self: if fig.label: self.labels.append(fig.label) if abs(self.yscale - fig.yscale) > 0.0001: colors.printc(":bomb:ERROR: adding incompatible Figure. Y-scales are different:", c='r', invert=True) colors.printc(" first figure:", self.yscale, c='r') colors.printc(" second figure:", fig.yscale, c='r') colors.printc("One or more of these parameters can be the cause:", c="r") if list(self.xlim) != list(fig.xlim): colors.printc("xlim --------------------------------------------\n", " first figure:", self.xlim, "\n", " second figure:", fig.xlim, c='r') if list(self.ylim) != list(fig.ylim): colors.printc("ylim --------------------------------------------\n", " first figure:", self.ylim, "\n", " second figure:", fig.ylim, c='r') if list(self.padding) != list(fig.padding): colors.printc("padding -----------------------------------------\n", " first figure:", self.padding, " second figure:", fig.padding, c='r') if self.aspect != fig.aspect: colors.printc("aspect ------------------------------------------\n", " first figure:", self.aspect, "\n", " second figure:", fig.aspect, c='r') colors.printc("\n:idea: Consider using fig2 = histogram(..., like=fig1)", c="r") colors.printc(" Or fig += histogram(..., like=fig)\n", c="r") return self offset = self.zbounds()[1] + self.ztolerance for ele in fig.unpack(): if "Axes" in ele.name: continue ele.z(offset) self.insert(ele, rescale=False) return self def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True) -> Self: """ Insert objects into a Figure. The recommended syntax is to use "+=", which calls `insert()` under the hood. If a whole Figure is added with "+=", it is unpacked and its objects are added one by one. Arguments: rescale : (bool) rescale the y axis position while inserting the object. as3d : (bool) if True keep the aspect ratio of the 3d object, otherwise stretch it in y. adjusted : (bool) adjust the scaling according to the shortest axis cut : (bool) cut off the parts of the object which go beyond the axes frame. """ for a in objs: if a in self.objects: # should not add twice the same object in plot continue if isinstance(a, vedo.Points): # hacky way to identify Points if a.ncells == a.npoints: poly = a.dataset if poly.GetNumberOfPolys() == 0 and poly.GetNumberOfLines() == 0: as3d = False rescale = True if isinstance(a, (shapes.Arrow, shapes.Arrow2D)): # discard input Arrow and substitute it with a brand new one # (because scaling would fatally distort the shape) py = a.base[1] a.top[1] = (a.top[1] - py) * self.yscale + py b = shapes.Arrow2D(a.base, a.top, s=a.s, fill=a.fill).z(a.z()) prop = a.properties prop.LightingOff() b.actor.SetProperty(prop) b.properties = prop b.y(py * self.yscale) a = b # elif isinstance(a, shapes.Rectangle) and a.radius is not None: # # discard input Rectangle and substitute it with a brand new one # # (because scaling would fatally distort the shape of the corners) # py = a.corner1[1] # rx1,ry1,rz1 = a.corner1 # rx2,ry2,rz2 = a.corner2 # ry2 = (ry2-py) * self.yscale + py # b = shapes.Rectangle([rx1,0,rz1], [rx2,ry2,rz2], radius=a.radius).z(a.z()) # b.SetProperty(a.properties) # b.y(py / self.yscale) # a = b else: if rescale: if not isinstance(a, Figure): if as3d and not isinstance(a, self.force_scaling_types): if adjusted: scl = np.min([1, self.yscale]) else: scl = self.yscale a.scale(scl) else: a.scale([1, self.yscale, 1]) # shift it in y a.y(a.y() * self.yscale) if cut: try: bx0, bx1, by0, by1, _, _ = a.bounds() if self.y0lim > by0: a.cut_with_plane([0, self.y0lim, 0], [0, 1, 0]) if self.y1lim < by1: a.cut_with_plane([0, self.y1lim, 0], [0, -1, 0]) if self.x0lim > bx0: a.cut_with_plane([self.x0lim, 0, 0], [1, 0, 0]) if self.x1lim < bx1: a.cut_with_plane([self.x1lim, 0, 0], [-1, 0, 0]) except: # print("insert(): cannot cut", [a]) pass self.AddPart(a.actor) self.objects.append(a) return self def add_label(self, text: str, c=None, marker="", mc="black") -> Self: """ Manually add en entry label to the legend. Arguments: text : (str) text string for the label. c : (str) color of the text marker : (str), Mesh a marker char or a Mesh object to be used as marker mc : (str) color for the marker """ newlabel = LabelData() newlabel.text = text.replace("\n", " ") newlabel.tcolor = c newlabel.marker = marker newlabel.mcolor = mc self.labels.append(newlabel) return self def add_legend( self, pos="top-right", relative=True, font=None, s=1, c=None, vspace=1.75, padding=0.1, radius=0, alpha=1, bc="k7", lw=1, lc="k4", z=0, ) -> Self: """ Add existing labels to form a legend box. Labels have been previously filled with eg: `plot(..., label="text")` Arguments: pos : (str, list) A string or 2D coordinates. The default is "top-right". relative : (bool) control whether `pos` is absolute or relative, e.i. normalized to the x and y ranges so that x and y in `pos=[x,y]` should be both in the range [0,1]. This flag is ignored if a string despcriptor is passed. Default is True. font : (str, int) font name or number. Check [available fonts here](https://vedo.embl.es/fonts). s : (float) global size of the legend c : (str) color of the text vspace : (float) vertical spacing of lines padding : (float) padding of the box as a fraction of the text size radius : (float) border radius of the box alpha : (float) opacity of the box. Values below 1 may cause poor rendering because of antialiasing. Use alpha = 0 to remove the box. bc : (str) box color lw : (int) border line width of the box in pixel units lc : (int) border line color of the box z : (float) set the zorder as z position (useful to avoid overlap) """ sx = self.x1lim - self.x0lim s = s * sx / 55 # so that input can be about 1 ds = 0 texts = [] mks = [] for i, t in enumerate(self.labels): label = self.labels[i] t = label.text if label.tcolor is not None: c = label.tcolor tx = vedo.shapes.Text3D(t, s=s, c=c, justify="center-left", font=font) y0, y1 = tx.ybounds() ds = max(y1 - y0, ds) texts.append(tx) mk = label.marker if isinstance(mk, vedo.Points): mk = mk.clone(deep=False).lighting("off") cm = mk.center_of_mass() ty0, ty1 = tx.ybounds() oby0, oby1 = mk.ybounds() mk.shift(-cm) mk.SetOrigin(cm) mk.scale((ty1 - ty0) / (oby1 - oby0)) mk.scale([1.1, 1.1, 0.01]) elif mk == "-": mk = vedo.shapes.Marker(mk, s=s * 2) mk.color(label.mcolor) else: mk = vedo.shapes.Marker(mk, s=s) mk.color(label.mcolor) mks.append(mk) for i, tx in enumerate(texts): tx.shift(0, -(i + 0) * ds * vspace) for i, mk in enumerate(mks): mk.shift(-ds * 1.75, -(i + 0) * ds * vspace, 0) acts = texts + mks aleg = Assembly(acts) # .show(axes=1).close() x0, x1, y0, y1, _, _ = aleg.GetBounds() if alpha: dx = x1 - x0 dy = y1 - y0 if not utils.is_sequence(padding): padding = [padding] * 4 padding = min(padding) padding = min(padding * dx, padding * dy) if len(self.labels) == 1: padding *= 4 x0 -= padding x1 += padding y0 -= padding y1 += padding box = shapes.Rectangle([x0, y0], [x1, y1], radius=radius, c=bc, alpha=alpha) box.shift(0, 0, -dy / 100).pickable(False) if lc: box.lc(lc).lw(lw) aleg.AddPart(box.actor) aleg.objects.append(box) xlim = self.xlim ylim = self.ylim if isinstance(pos, str): px, py = 0.0, 0.0 rx, ry = (xlim[1] + xlim[0]) / 2, (ylim[1] + ylim[0]) / 2 shx, shy = 0.0, 0.0 if "top" in pos: if "cent" in pos: px, py = rx, ylim[1] shx, shy = (x0 + x1) / 2, y1 elif "left" in pos: px, py = xlim[0], ylim[1] shx, shy = x0, y1 else: # "right" px, py = xlim[1], ylim[1] shx, shy = x1, y1 elif "bot" in pos: if "left" in pos: px, py = xlim[0], ylim[0] shx, shy = x0, y0 elif "right" in pos: px, py = xlim[1], ylim[0] shx, shy = x1, y0 else: # "cent" px, py = rx, ylim[0] shx, shy = (x0 + x1) / 2, y0 elif "cent" in pos: if "left" in pos: px, py = xlim[0], ry shx, shy = x0, (y0 + y1) / 2 elif "right" in pos: px, py = xlim[1], ry shx, shy = x1, (y0 + y1) / 2 else: vedo.logger.error(f"in add_legend(), cannot understand {pos}") raise RuntimeError else: if relative: rx, ry = pos[0], pos[1] px = (xlim[1] - xlim[0]) * rx + xlim[0] py = (ylim[1] - ylim[0]) * ry + ylim[0] z *= xlim[1] - xlim[0] else: px, py = pos[0], pos[1] shx, shy = x0, y1 zpos = aleg.pos()[2] aleg.pos(px - shx, py * self.yscale - shy, zpos + sx / 50 + z) self.insert(aleg, rescale=False, cut=False) self.legend = aleg aleg.name = "Legend" return self ######################################################################################### class Histogram1D(Figure): "1D histogramming." def __init__( self, data, weights=None, bins=None, errors=False, density=False, logscale=False, max_entries=None, fill=True, radius=0.075, c="olivedrab", gap=0.0, alpha=1, outline=False, lw=2, lc="k", texture="", marker="", ms=None, mc=None, ma=None, # Figure and axes options: like=None, xlim=None, ylim=(0, None), aspect=4 / 3, padding=(0.0, 0.0, 0.0, 0.05), title="", xtitle=" ", ytitle=" ", ac="k", grid=False, ztolerance=None, label="", **fig_kwargs, ): """ Creates a `Histogram1D(Figure)` object. Arguments: weights : (list) An array of weights, of the same shape as `data`. Each value in `data` only contributes its associated weight towards the bin count (instead of 1). bins : (int) number of bins density : (bool) normalize the area to 1 by dividing by the nr of entries and bin size logscale : (bool) use logscale on y-axis max_entries : (int) if `data` is larger than `max_entries`, a random sample of `max_entries` is used fill : (bool) fill bars with solid color `c` gap : (float) leave a small space btw bars radius : (float) border radius of the top of the histogram bar. Default value is 0.1. texture : (str) url or path to an image to be used as texture for the bin outline : (bool) show outline of the bins errors : (bool) show error bars xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` padding : (float), list keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. aspect : (float) the desired aspect ratio of the histogram. Default is 4/3. grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` ztolerance : (float) a tolerance factor to superimpose objects (along the z-axis). Examples: - [histo_1d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_a.py) - [histo_1d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_b.py) - [histo_1d_c.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_c.py) - [histo_1d_d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_d.py) ![](https://vedo.embl.es/images/pyplot/histo_1D.png) """ if max_entries and data.shape[0] > max_entries: data = np.random.choice(data, int(max_entries)) # purge NaN from data valid_ids = np.all(np.logical_not(np.isnan(data))) data = np.asarray(data[valid_ids]).ravel() # if data.dtype is integer try to center bins by default if like is None and bins is None and np.issubdtype(data.dtype, np.integer): if xlim is None and ylim == (0, None): x1, x0 = data.max(), data.min() if 0 < x1 - x0 <= 100: bins = x1 - x0 + 1 xlim = (x0 - 0.5, x1 + 0.5) if like is None and vedo.last_figure is not None: if xlim is None and ylim == (0, None): like = vedo.last_figure if like is not None: xlim = like.xlim ylim = like.ylim aspect = like.aspect padding = like.padding if bins is None: bins = like.bins if bins is None: bins = 20 if utils.is_sequence(xlim): # deal with user passing eg [x0, None] _x0, _x1 = xlim if _x0 is None: _x0 = data.min() if _x1 is None: _x1 = data.max() xlim = [_x0, _x1] fs, edges = np.histogram(data, bins=bins, weights=weights, range=xlim) binsize = edges[1] - edges[0] ntot = data.shape[0] fig_kwargs["title"] = title fig_kwargs["xtitle"] = xtitle fig_kwargs["ytitle"] = ytitle fig_kwargs["ac"] = ac fig_kwargs["ztolerance"] = ztolerance fig_kwargs["grid"] = grid unscaled_errors = np.sqrt(fs) if density: scaled_errors = unscaled_errors / (ntot * binsize) fs = fs / (ntot * binsize) if ytitle == " ": ytitle = f"counts / ({ntot} x {utils.precision(binsize,3)})" fig_kwargs["ytitle"] = ytitle elif logscale: se_up = np.log10(fs + unscaled_errors / 2 + 1) se_dw = np.log10(fs - unscaled_errors / 2 + 1) scaled_errors = np.c_[se_up, se_dw] fs = np.log10(fs + 1) if ytitle == " ": ytitle = "log_10 (counts+1)" fig_kwargs["ytitle"] = ytitle x0, x1 = np.min(edges), np.max(edges) y0, y1 = ylim[0], np.max(fs) _errors = [] if errors: if density: y1 += max(scaled_errors) / 2 _errors = scaled_errors elif logscale: y1 = max(scaled_errors[:, 0]) _errors = scaled_errors else: y1 += max(unscaled_errors) / 2 _errors = unscaled_errors if like is None: ylim = list(ylim) if xlim is None: xlim = [x0, x1] if ylim[1] is None: ylim[1] = y1 if ylim[0] != 0: ylim[0] = y0 self.title = title self.xtitle = xtitle self.ytitle = ytitle self.entries = ntot self.frequencies = fs self.errors = _errors self.edges = edges self.centers = (edges[0:-1] + edges[1:]) / 2 self.mean = data.mean() self.mode = self.centers[np.argmax(fs)] self.std = data.std() self.bins = edges # internally used by "like" ############################### stats legend as htitle addstats = False if not title: if "axes" not in fig_kwargs: addstats = True axes_opts = {} fig_kwargs["axes"] = axes_opts elif fig_kwargs["axes"] is False: pass else: axes_opts = fig_kwargs["axes"] if "htitle" not in axes_opts: addstats = True if addstats: htitle = f"Entries:~~{int(self.entries)} " htitle += f"Mean:~~{utils.precision(self.mean, 4)} " htitle += f"STD:~~{utils.precision(self.std, 4)} " axes_opts["htitle"] = htitle axes_opts["htitle_justify"] = "bottom-left" axes_opts["htitle_size"] = 0.016 # axes_opts["htitle_offset"] = [-0.49, 0.01, 0] if mc is None: mc = lc if ma is None: ma = alpha if label: nlab = LabelData() nlab.text = label nlab.tcolor = ac nlab.marker = marker nlab.mcolor = mc if not marker: nlab.marker = "s" nlab.mcolor = c fig_kwargs["label"] = nlab ############################################### Figure init super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return if utils.is_sequence(bins): myedges = np.array(bins) bins = len(bins) - 1 else: myedges = edges bin_centers = [] for i in range(bins): x = (myedges[i] + myedges[i + 1]) / 2 bin_centers.append([x, fs[i], 0]) rs = [] maxheigth = 0 if not fill and not outline and not errors and not marker: outline = True # otherwise it's empty.. if fill: ##################### if outline: gap = 0 for i in range(bins): F = fs[i] if not F: continue p0 = (myedges[i] + gap * binsize, 0, 0) p1 = (myedges[i + 1] - gap * binsize, F, 0) if radius: if gap: rds = np.array([0, 0, radius, radius]) else: rd1 = 0 if i < bins - 1 and fs[i + 1] >= F else radius / 2 rd2 = 0 if i > 0 and fs[i - 1] >= F else radius / 2 rds = np.array([0, 0, rd1, rd2]) p1_yscaled = [p1[0], p1[1] * self.yscale, 0] r = shapes.Rectangle(p0, p1_yscaled, radius=rds * binsize, res=6) r.scale([1, 1 / self.yscale, 1]) r.radius = None # so it doesnt get recreated and rescaled by insert() else: r = shapes.Rectangle(p0, p1) if texture: r.texture(texture) c = "w" r.actor.PickableOff() maxheigth = max(maxheigth, p1[1]) if c in colors.cmaps_names: col = colors.color_map((p0[0] + p1[0]) / 2, c, myedges[0], myedges[-1]) else: col = c r.color(col).alpha(alpha).lighting("off") r.z(self.ztolerance) rs.append(r) if outline: ##################### lns = [[myedges[0], 0, 0]] for i in range(bins): lns.append([myedges[i], fs[i], 0]) lns.append([myedges[i + 1], fs[i], 0]) maxheigth = max(maxheigth, fs[i]) lns.append([myedges[-1], 0, 0]) outl = shapes.Line(lns, c=lc, alpha=alpha, lw=lw) outl.z(self.ztolerance * 2) rs.append(outl) if errors: ##################### for i in range(bins): x = self.centers[i] f = fs[i] if not f: continue err = _errors[i] if utils.is_sequence(err): el = shapes.Line([x, err[0], 0], [x, err[1], 0], c=lc, alpha=alpha, lw=lw) else: el = shapes.Line( [x, f - err / 2, 0], [x, f + err / 2, 0], c=lc, alpha=alpha, lw=lw ) el.z(self.ztolerance * 3) rs.append(el) if marker: ##################### # remove empty bins (we dont want a marker there) bin_centers = np.array(bin_centers) bin_centers = bin_centers[bin_centers[:, 1] > 0] if utils.is_sequence(ms): ### variable point size mk = shapes.Marker(marker, s=1) mk.scale([1, 1 / self.yscale, 1]) msv = np.zeros_like(bin_centers) msv[:, 0] = ms marked = shapes.Glyph( bin_centers, mk, c=mc, orientation_array=msv, scale_by_vector_size=True ) else: ### fixed point size if ms is None: ms = (xlim[1] - xlim[0]) / 100.0 else: ms = (xlim[1] - xlim[0]) / 100.0 * ms if utils.is_sequence(mc): mk = shapes.Marker(marker, s=ms) mk.scale([1, 1 / self.yscale, 1]) msv = np.zeros_like(bin_centers) msv[:, 0] = 1 marked = shapes.Glyph( bin_centers, mk, c=mc, orientation_array=msv, scale_by_vector_size=True ) else: mk = shapes.Marker(marker, s=ms) mk.scale([1, 1 / self.yscale, 1]) marked = shapes.Glyph(bin_centers, mk, c=mc) marked.alpha(ma) marked.z(self.ztolerance * 4) rs.append(marked) self.insert(*rs, as3d=False) self.name = "Histogram1D" def print(self, **kwargs) -> None: """Print infos about this histogram""" txt = ( f"{self.name} {self.title}\n" f" xtitle = '{self.xtitle}'\n" f" ytitle = '{self.ytitle}'\n" f" entries = {self.entries}\n" f" mean = {self.mean}\n" f" std = {self.std}" ) colors.printc(txt, **kwargs) ######################################################################################### class Histogram2D(Figure): """2D histogramming.""" def __init__( self, xvalues, yvalues=None, bins=25, weights=None, cmap="cividis", alpha=1, gap=0, scalarbar=True, # Figure and axes options: like=None, xlim=None, ylim=(None, None), zlim=(None, None), aspect=1, title="", xtitle=" ", ytitle=" ", ztitle="", ac="k", **fig_kwargs, ): """ Input data formats `[(x1,x2,..), (y1,y2,..)] or [(x1,y1), (x2,y2),..]` are both valid. Use keyword `like=...` if you want to use the same format of a previously created Figure (useful when superimposing Figures) to make sure they are compatible and comparable. If they are not compatible you will receive an error message. Arguments: bins : (list) binning as (nx, ny) weights : (list) array of weights to assign to each entry cmap : (str, lookuptable) color map name or look up table alpha : (float) opacity of the histogram gap : (float) separation between adjacent bins as a fraction for their size scalarbar : (bool) add a scalarbar to right of the histogram like : (Figure) grab and use the same format of the given Figure (for superimposing) xlim : (list) [x0, x1] range of interest. If left to None will automatically choose the minimum or the maximum of the data range. Data outside the range are completely ignored. ylim : (list) [y0, y1] range of interest. If left to None will automatically choose the minimum or the maximum of the data range. Data outside the range are completely ignored. aspect : (float) the desired aspect ratio of the figure. title : (str) title of the plot to appear on top. If left blank some statistics will be shown. xtitle : (str) x axis title ytitle : (str) y axis title ztitle : (str) title for the scalar bar ac : (str) axes color, additional keyword for Axes can also be added using e.g. `axes=dict(xygrid=True)` Examples: - [histo_2d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_2d_a.py) - [histo_2d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_2d_b.py) ![](https://vedo.embl.es/images/pyplot/histo_2D.png) """ xvalues = np.asarray(xvalues) if yvalues is None: # assume [(x1,y1), (x2,y2) ...] format yvalues = xvalues[:, 1] xvalues = xvalues[:, 0] else: yvalues = np.asarray(yvalues) padding = [0, 0, 0, 0] if like is None and vedo.last_figure is not None: if xlim is None and ylim == (None, None) and zlim == (None, None): like = vedo.last_figure if like is not None: xlim = like.xlim ylim = like.ylim aspect = like.aspect padding = like.padding if bins is None: bins = like.bins if bins is None: bins = 20 if isinstance(bins, int): bins = (bins, bins) if utils.is_sequence(xlim): # deal with user passing eg [x0, None] _x0, _x1 = xlim if _x0 is None: _x0 = xvalues.min() if _x1 is None: _x1 = xvalues.max() xlim = [_x0, _x1] if utils.is_sequence(ylim): # deal with user passing eg [x0, None] _y0, _y1 = ylim if _y0 is None: _y0 = yvalues.min() if _y1 is None: _y1 = yvalues.max() ylim = [_y0, _y1] H, xedges, yedges = np.histogram2d( xvalues, yvalues, weights=weights, bins=bins, range=(xlim, ylim) ) xlim = np.min(xedges), np.max(xedges) ylim = np.min(yedges), np.max(yedges) dx, dy = xlim[1] - xlim[0], ylim[1] - ylim[0] fig_kwargs["title"] = title fig_kwargs["xtitle"] = xtitle fig_kwargs["ytitle"] = ytitle fig_kwargs["ac"] = ac self.entries = len(xvalues) self.frequencies = H self.edges = (xedges, yedges) self.mean = (xvalues.mean(), yvalues.mean()) self.std = (xvalues.std(), yvalues.std()) self.bins = bins # internally used by "like" ############################### stats legend as htitle addstats = False if not title: if "axes" not in fig_kwargs: addstats = True axes_opts = {} fig_kwargs["axes"] = axes_opts elif fig_kwargs["axes"] is False: pass else: axes_opts = fig_kwargs["axes"] if "htitle" not in fig_kwargs["axes"]: addstats = True if addstats: htitle = f"Entries:~~{int(self.entries)} " htitle += f"Mean:~~{utils.precision(self.mean, 3)} " htitle += f"STD:~~{utils.precision(self.std, 3)} " axes_opts["htitle"] = htitle axes_opts["htitle_justify"] = "bottom-left" axes_opts["htitle_size"] = 0.0175 ############################################### Figure init super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) if self.yscale: ##################### the grid acts = [] g = shapes.Grid( pos=[(xlim[0] + xlim[1]) / 2, (ylim[0] + ylim[1]) / 2, 0], s=(dx, dy), res=bins[:2] ) g.alpha(alpha).lw(0).wireframe(False).flat().lighting("off") g.cmap(cmap, np.ravel(H.T), on="cells", vmin=zlim[0], vmax=zlim[1]) if gap: g.shrink(abs(1 - gap)) if scalarbar: sc = g.add_scalarbar3d(ztitle, c=ac).scalarbar # print(" g.GetBounds()[0]", g.bounds()[:2]) # print("sc.GetBounds()[0]",sc.GetBounds()[:2]) delta = sc.GetBounds()[0] - g.bounds()[1] sc_size = sc.GetBounds()[1] - sc.GetBounds()[0] sc.SetOrigin(sc.GetBounds()[0], 0, 0) sc.scale([self.yscale, 1, 1]) ## prescale trick sc.shift(-delta + 0.25*sc_size*self.yscale) acts.append(sc) acts.append(g) self.insert(*acts, as3d=False) self.name = "Histogram2D" ######################################################################################### class PlotBars(Figure): """Creates a `PlotBars(Figure)` object.""" def __init__( self, data, errors=False, logscale=False, fill=True, gap=0.02, radius=0.05, c="olivedrab", alpha=1, texture="", outline=False, lw=2, lc="k", # Figure and axes options: like=None, xlim=(None, None), ylim=(0, None), aspect=4 / 3, padding=(0.025, 0.025, 0, 0.05), # title="", xtitle=" ", ytitle=" ", ac="k", grid=False, ztolerance=None, **fig_kwargs, ): """ Input must be in format `[counts, labels, colors, edges]`. Either or both `edges` and `colors` are optional and can be omitted. Use keyword `like=...` if you want to use the same format of a previously created Figure (useful when superimposing Figures) to make sure they are compatible and comparable. If they are not compatible you will receive an error message. Arguments: errors : (bool) show error bars logscale : (bool) use logscale on y-axis fill : (bool) fill bars with solid color `c` gap : (float) leave a small space btw bars radius : (float) border radius of the top of the histogram bar. Default value is 0.1. texture : (str) url or path to an image to be used as texture for the bin outline : (bool) show outline of the bins xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` ac : (str) axes color padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. aspect : (float) the desired aspect ratio of the figure. Default is 4/3. grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` Examples: - [plot_bars.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_bars.py) ![](https://vedo.embl.es/images/pyplot/plot_bars.png) """ ndata = len(data) if ndata == 4: counts, xlabs, cols, edges = data elif ndata == 3: counts, xlabs, cols = data edges = np.array(range(len(counts) + 1)) + 0.5 elif ndata == 2: counts, xlabs = data edges = np.array(range(len(counts) + 1)) + 0.5 cols = [c] * len(counts) else: m = "barplot error: data must be given as [counts, labels, colors, edges] not\n" vedo.logger.error(m + f" {data}\n bin edges and colors are optional.") raise RuntimeError() # sanity checks assert len(counts) == len(xlabs) assert len(counts) == len(cols) assert len(counts) == len(edges) - 1 counts = np.asarray(counts) edges = np.asarray(edges) if logscale: counts = np.log10(counts + 1) if ytitle == " ": ytitle = "log_10 (counts+1)" if like is None and vedo.last_figure is not None: if xlim == (None, None) and ylim == (0, None): like = vedo.last_figure if like is not None: xlim = like.xlim ylim = like.ylim aspect = like.aspect padding = like.padding if utils.is_sequence(xlim): # deal with user passing eg [x0, None] _x0, _x1 = xlim if _x0 is None: _x0 = np.min(edges) if _x1 is None: _x1 = np.max(edges) xlim = [_x0, _x1] x0, x1 = np.min(edges), np.max(edges) y0, y1 = ylim[0], np.max(counts) if like is None: ylim = list(ylim) if xlim is None: xlim = [x0, x1] if ylim[1] is None: ylim[1] = y1 if ylim[0] != 0: ylim[0] = y0 fig_kwargs["title"] = title fig_kwargs["xtitle"] = xtitle fig_kwargs["ytitle"] = ytitle fig_kwargs["ac"] = ac fig_kwargs["ztolerance"] = ztolerance fig_kwargs["grid"] = grid centers = (edges[0:-1] + edges[1:]) / 2 binsizes = (centers - edges[0:-1]) * 2 if "axes" not in fig_kwargs: fig_kwargs["axes"] = {} _xlabs = [] for center, xlb in zip(centers, xlabs): _xlabs.append([center, str(xlb)]) fig_kwargs["axes"]["x_values_and_labels"] = _xlabs ############################################### Figure self.statslegend = "" self.edges = edges self.centers = centers self.bins = edges # internal used by "like" super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return rs = [] maxheigth = 0 if fill: ##################### if outline: gap = 0 for i in range(len(centers)): binsize = binsizes[i] p0 = (edges[i] + gap * binsize, 0, 0) p1 = (edges[i + 1] - gap * binsize, counts[i], 0) if radius: rds = np.array([0, 0, radius, radius]) p1_yscaled = [p1[0], p1[1] * self.yscale, 0] r = shapes.Rectangle(p0, p1_yscaled, radius=rds * binsize, res=6) r.scale([1, 1 / self.yscale, 1]) r.radius = None # so it doesnt get recreated and rescaled by insert() else: r = shapes.Rectangle(p0, p1) if texture: r.texture(texture) c = "w" r.actor.PickableOff() maxheigth = max(maxheigth, p1[1]) if c in colors.cmaps_names: col = colors.color_map((p0[0] + p1[0]) / 2, c, edges[0], edges[-1]) else: col = cols[i] r.color(col).alpha(alpha).lighting("off") r.name = f"bar_{i}" r.z(self.ztolerance) rs.append(r) elif outline: ##################### lns = [[edges[0], 0, 0]] for i in range(len(centers)): lns.append([edges[i], counts[i], 0]) lns.append([edges[i + 1], counts[i], 0]) maxheigth = max(maxheigth, counts[i]) lns.append([edges[-1], 0, 0]) outl = shapes.Line(lns, c=lc, alpha=alpha, lw=lw).z(self.ztolerance) outl.name = f"bar_outline_{i}" rs.append(outl) if errors: ##################### for x, f in centers: err = np.sqrt(f) el = shapes.Line([x, f - err / 2, 0], [x, f + err / 2, 0], c=lc, alpha=alpha, lw=lw) el.z(self.ztolerance * 2) rs.append(el) self.insert(*rs, as3d=False) self.name = "PlotBars" ######################################################################################### class PlotXY(Figure): """Creates a `PlotXY(Figure)` object.""" def __init__( self, # data, xerrors=None, yerrors=None, # lw=2, lc=None, la=1, dashed=False, splined=False, # elw=2, # error line width ec=None, # error line or band color error_band=False, # errors in x are ignored # marker="", ms=None, mc=None, ma=None, # Figure and axes options: like=None, xlim=None, ylim=(None, None), aspect=4 / 3, padding=0.05, # title="", xtitle=" ", ytitle=" ", ac="k", grid=True, ztolerance=None, label="", **fig_kwargs, ): """ Arguments: xerrors : (bool) show error bars associated to each point in x yerrors : (bool) show error bars associated to each point in y lw : (int) width of the line connecting points in pixel units. Set it to 0 to remove the line. lc : (str) line color la : (float) line "alpha", opacity of the line dashed : (bool) draw a dashed line instead of a continuous line splined : (bool) spline the line joining the point as a countinous curve elw : (int) width of error bar lines in units of pixels ec : (color) color of error bar, by default the same as marker color error_band : (bool) represent errors on y as a filled error band. Use `ec` keyword to modify its color. marker : (str, int) use a marker for the data points ms : (float) marker size mc : (color) color of the marker ma : (float) opacity of the marker xlim : (list) set limits to the range for the x variable ylim : (list) set limits to the range for the y variable aspect : (float, str) Desired aspect ratio. Use `aspect="equal"` to force the same units in x and y. Scaling factor is saved in Figure.yscale. padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. title : (str) title to appear on the top of the frame, like a header. xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` ac : (str) axes color grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` ztolerance : (float) a tolerance factor to superimpose objects (along the z-axis). Example: ```python import numpy as np from vedo.pyplot import plot x = np.arange(0, np.pi, 0.1) fig = plot(x, np.sin(2*x), 'r0-', aspect='equal') fig+= plot(x, np.cos(2*x), 'blue4 o-', like=fig) fig.show().close() ``` ![](https://vedo.embl.es/images/feats/plotxy.png) Examples: - [plot_errbars.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_errbars.py) - [plot_errband.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_errband.py) - [plot_pip.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_pip.py) ![](https://vedo.embl.es/images/pyplot/plot_pip.png) - [scatter1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter1.py) - [scatter2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter2.py) ![](https://vedo.embl.es/images/pyplot/scatter2.png) """ line = False if lw > 0: line = True if marker == "" and not line and not splined: marker = "o" if like is None and vedo.last_figure is not None: if xlim is None and ylim == (None, None): like = vedo.last_figure if like is not None: xlim = like.xlim ylim = like.ylim aspect = like.aspect padding = like.padding if utils.is_sequence(xlim): # deal with user passing eg [x0, None] _x0, _x1 = xlim if _x0 is None: _x0 = data.min() if _x1 is None: _x1 = data.max() xlim = [_x0, _x1] # purge NaN from data data = data[~np.isnan(data).any(axis=1), :] fig_kwargs["title"] = title fig_kwargs["xtitle"] = xtitle fig_kwargs["ytitle"] = ytitle fig_kwargs["ac"] = ac fig_kwargs["ztolerance"] = ztolerance fig_kwargs["grid"] = grid x0, y0 = np.min(data, axis=0) x1, y1 = np.max(data, axis=0) if xerrors is not None and not error_band: x0 = min(data[:, 0] - xerrors) x1 = max(data[:, 0] + xerrors) if yerrors is not None: y0 = min(data[:, 1] - yerrors) y1 = max(data[:, 1] + yerrors) if like is None: if xlim is None: xlim = (None, None) xlim = list(xlim) if xlim[0] is None: xlim[0] = x0 if xlim[1] is None: xlim[1] = x1 ylim = list(ylim) if ylim[0] is None: ylim[0] = y0 if ylim[1] is None: ylim[1] = y1 self.entries = len(data) self.mean = data.mean() self.std = data.std() self.ztolerance = 0 ######### the PlotXY marker # fall back solutions logic for colors if "c" in fig_kwargs: if mc is None: mc = fig_kwargs["c"] if lc is None: lc = fig_kwargs["c"] if ec is None: ec = fig_kwargs["c"] if lc is None: lc = "k" if mc is None: mc = lc if ma is None: ma = la if ec is None: if mc is None: ec = lc else: ec = mc if label: nlab = LabelData() nlab.text = label nlab.tcolor = ac nlab.marker = marker if line and marker == "": nlab.marker = "-" nlab.mcolor = mc fig_kwargs["label"] = nlab ############################################### Figure init super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return acts = [] ######### the PlotXY Line or Spline if dashed: l = shapes.DashedLine(data, c=lc, alpha=la, lw=lw) acts.append(l) elif splined: l = shapes.KSpline(data).lw(lw).c(lc).alpha(la) acts.append(l) elif line: l = shapes.Line(data, c=lc, alpha=la).lw(lw) acts.append(l) if marker: pts = np.c_[data, np.zeros(len(data))] if utils.is_sequence(ms): ### variable point size mk = shapes.Marker(marker, s=1) mk.scale([1, 1 / self.yscale, 1]) msv = np.zeros_like(pts) msv[:, 0] = ms marked = shapes.Glyph( pts, mk, c=mc, orientation_array=msv, scale_by_vector_size=True ) else: ### fixed point size if ms is None: ms = (xlim[1] - xlim[0]) / 100.0 if utils.is_sequence(mc): fig_kwargs["marker_color"] = None # for labels mk = shapes.Marker(marker, s=ms) mk.scale([1, 1 / self.yscale, 1]) msv = np.zeros_like(pts) msv[:, 0] = 1 marked = shapes.Glyph( pts, mk, c=mc, orientation_array=msv, scale_by_vector_size=True ) else: mk = shapes.Marker(marker, s=ms) mk.scale([1, 1 / self.yscale, 1]) marked = shapes.Glyph(pts, mk, c=mc) marked.name = "Marker" marked.alpha(ma) marked.z(3 * self.ztolerance) acts.append(marked) ######### the PlotXY marker errors ztol = self.ztolerance if error_band: yerrors = np.abs(yerrors) du = np.array(data) dd = np.array(data) du[:, 1] += yerrors dd[:, 1] -= yerrors if splined: res = len(data) * 20 band1 = shapes.KSpline(du, res=res) band2 = shapes.KSpline(dd, res=res) band = shapes.Ribbon(band1, band2, res=(res, 2)) else: dd = list(reversed(dd.tolist())) band = shapes.Line(du.tolist() + dd, closed=True) band.triangulate().lw(0) if ec is None: band.c(lc) else: band.c(ec) band.lighting("off").alpha(la).z(ztol / 20) acts.append(band) else: ## xerrors if xerrors is not None: if len(xerrors) == len(data): errs = [] for i, val in enumerate(data): xval, yval = val xerr = xerrors[i] / 2 el = shapes.Line((xval - xerr, yval, ztol), (xval + xerr, yval, ztol)) el.lw(elw) errs.append(el) mxerrs = merge(errs).c(ec).lw(lw).alpha(ma).z(2 * ztol) acts.append(mxerrs) else: vedo.logger.error("in PlotXY(xerrors=...): mismatch in array length") ## yerrors if yerrors is not None: if len(yerrors) == len(data): errs = [] for i, val in enumerate(data): xval, yval = val yerr = yerrors[i] el = shapes.Line((xval, yval - yerr, ztol), (xval, yval + yerr, ztol)) el.lw(elw) errs.append(el) myerrs = merge(errs).c(ec).lw(lw).alpha(ma).z(2 * ztol) acts.append(myerrs) else: vedo.logger.error("in PlotXY(yerrors=...): mismatch in array length") self.insert(*acts, as3d=False) self.name = "PlotXY" def plot(*args, **kwargs): """ Draw a 2D line plot, or scatter plot, of variable x vs variable y. Input format can be either `[allx], [allx, ally] or [(x1,y1), (x2,y2), ...]` Use `like=...` if you want to use the same format of a previously created Figure (useful when superimposing Figures) to make sure they are compatible and comparable. If they are not compatible you will receive an error message. Arguments: xerrors : (bool) show error bars associated to each point in x yerrors : (bool) show error bars associated to each point in y lw : (int) width of the line connecting points in pixel units. Set it to 0 to remove the line. lc : (str) line color la : (float) line "alpha", opacity of the line dashed : (bool) draw a dashed line instead of a continuous line splined : (bool) spline the line joining the point as a countinous curve elw : (int) width of error bar lines in units of pixels ec : (color) color of error bar, by default the same as marker color error_band : (bool) represent errors on y as a filled error band. Use `ec` keyword to modify its color. marker : (str, int) use a marker for the data points ms : (float) marker size mc : (color) color of the marker ma : (float) opacity of the marker xlim : (list) set limits to the range for the x variable ylim : (list) set limits to the range for the y variable aspect : (float) Desired aspect ratio. If None, it is automatically calculated to get a reasonable aspect ratio. Scaling factor is saved in Figure.yscale padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. title : (str) title to appear on the top of the frame, like a header. xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` ac : (str) axes color grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` ztolerance : (float) a tolerance factor to superimpose objects (along the z-axis). Example: ```python import numpy as np from vedo.pyplot import plot from vedo import settings settings.remember_last_figure_format = True ############# x = np.linspace(0, 6.28, num=50) fig = plot(np.sin(x), 'r-') fig+= plot(np.cos(x), 'bo-') # no need to specify like=... fig.show().close() ``` Examples: - [plot_errbars.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_errbars.py) - [plot_errband.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_errband.py) - [plot_pip.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_pip.py) ![](https://vedo.embl.es/images/pyplot/plot_pip.png) - [scatter1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter1.py) - [scatter2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter2.py) ------------------------------------------------------------------------- .. note:: mode="bar" Creates a `PlotBars(Figure)` object. Input must be in format `[counts, labels, colors, edges]`. Either or both `edges` and `colors` are optional and can be omitted. Arguments: errors : (bool) show error bars logscale : (bool) use logscale on y-axis fill : (bool) fill bars with solid color `c` gap : (float) leave a small space btw bars radius : (float) border radius of the top of the histogram bar. Default value is 0.1. texture : (str) url or path to an image to be used as texture for the bin outline : (bool) show outline of the bins xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` ac : (str) axes color padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. aspect : (float) the desired aspect ratio of the figure. Default is 4/3. grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` Examples: - [histo_1d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_a.py) - [histo_1d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_b.py) - [histo_1d_c.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_c.py) - [histo_1d_d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_d.py) ![](https://vedo.embl.es/images/pyplot/histo_1D.png) ---------------------------------------------------------------------- .. note:: 2D functions If input is an external function or a formula, draw the surface representing the function `f(x,y)`. Arguments: x : (float) x range of values y : (float) y range of values zlimits : (float) limit the z range of the independent variable zlevels : (int) will draw the specified number of z-levels contour lines show_nan : (bool) show where the function does not exist as red points bins : (list) number of bins in x and y Examples: - [plot_fxy1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy1.py) ![](https://vedo.embl.es/images/pyplot/plot_fxy.png) - [plot_fxy2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy2.py) -------------------------------------------------------------------- .. note:: mode="complex" If `mode='complex'` draw the real value of the function and color map the imaginary part. Arguments: cmap : (str) diverging color map (white means `imag(z)=0`) lw : (float) line with of the binning bins : (list) binning in x and y Examples: - [plot_fxy.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy.py) ![](https://user-images.githubusercontent.com/32848391/73392962-1709a300-42db-11ea-9278-30c9d6e5eeaa.png) -------------------------------------------------------------------- .. note:: mode="polar" If `mode='polar'` input arrays are interpreted as a list of polar angles and radii. Build a polar (radar) plot by joining the set of points in polar coordinates. Arguments: title : (str) plot title tsize : (float) title size bins : (int) number of bins in phi r1 : (float) inner radius r2 : (float) outer radius lsize : (float) label size c : (color) color of the line ac : (color) color of the frame and labels alpha : (float) opacity of the frame ps : (int) point size in pixels, if ps=0 no point is drawn lw : (int) line width in pixels, if lw=0 no line is drawn deg : (bool) input array is in degrees vmax : (float) normalize radius to this maximum value fill : (bool) fill convex area with solid color splined : (bool) interpolate the set of input points show_disc : (bool) draw the outer ring axis nrays : (int) draw this number of axis rays (continuous and dashed) show_lines : (bool) draw lines to the origin show_angles : (bool) draw angle values Examples: - [histo_polar.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_polar.py) ![](https://user-images.githubusercontent.com/32848391/64992590-7fc82400-d8d4-11e9-9c10-795f4756a73f.png) -------------------------------------------------------------------- .. note:: mode="spheric" If `mode='spheric'` input must be an external function rho(theta, phi). A surface is created in spherical coordinates. Return an `Figure(Assembly)` of 2 objects: the unit sphere (in wireframe representation) and the surface `rho(theta, phi)`. Arguments: rfunc : function handle to a user defined function `rho(theta, phi)`. normalize : (bool) scale surface to fit inside the unit sphere res : (int) grid resolution of the unit sphere scalarbar : (bool) add a 3D scalarbar to the plot for radius c : (color) color of the unit sphere alpha : (float) opacity of the unit sphere cmap : (str) color map for the surface Examples: - [plot_spheric.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_spheric.py) ![](https://vedo.embl.es/images/pyplot/plot_spheric.png) """ mode = kwargs.pop("mode", "") if "spher" in mode: return _plot_spheric(args[0], **kwargs) if "bar" in mode: return PlotBars(args[0], **kwargs) if isinstance(args[0], str) or "function" in str(type(args[0])): if "complex" in mode: return _plot_fz(args[0], **kwargs) return _plot_fxy(args[0], **kwargs) # grab the matplotlib-like options optidx = None for i, a in enumerate(args): if i > 0 and isinstance(a, str): optidx = i break if optidx: opts = args[optidx].replace(" ", "") if "--" in opts: opts = opts.replace("--", "") kwargs["dashed"] = True elif "-" in opts: opts = opts.replace("-", "") else: kwargs["lw"] = 0 symbs = [".", "o", "O", "0", "p", "*", "h", "D", "d", "v", "^", ">", "<", "s", "x", "a"] allcols = list(colors.colors.keys()) + list(colors.color_nicks.keys()) for cc in allcols: if cc == "o": continue if cc in opts: opts = opts.replace(cc, "") kwargs["lc"] = cc kwargs["mc"] = cc break for ss in symbs: if ss in opts: opts = opts.replace(ss, "", 1) kwargs["marker"] = ss break opts.replace(" ", "") if opts: vedo.logger.error(f"in plot(), could not understand option(s): {opts}") if optidx == 1 or optidx is None: if utils.is_sequence(args[0][0]) and len(args[0][0]) > 1: # print('------------- case 1', 'plot([(x,y),..])') data = np.asarray(args[0]) # (x,y) x = np.asarray(data[:, 0]) y = np.asarray(data[:, 1]) elif len(args) == 1 or optidx == 1: # print('------------- case 2', 'plot(x)') if "pandas" in str(type(args[0])): if "ytitle" not in kwargs: kwargs.update({"ytitle": args[0].name.replace("_", "_ ")}) x = np.linspace(0, len(args[0]), num=len(args[0])) y = np.asarray(args[0]).ravel() elif utils.is_sequence(args[1]): # print('------------- case 3', 'plot(allx,ally)',str(type(args[0]))) if "pandas" in str(type(args[0])): if "xtitle" not in kwargs: kwargs.update({"xtitle": args[0].name.replace("_", "_ ")}) if "pandas" in str(type(args[1])): if "ytitle" not in kwargs: kwargs.update({"ytitle": args[1].name.replace("_", "_ ")}) x = np.asarray(args[0]).ravel() y = np.asarray(args[1]).ravel() elif utils.is_sequence(args[0]) and utils.is_sequence(args[0][0]): # print('------------- case 4', 'plot([allx,ally])') x = np.asarray(args[0][0]).ravel() y = np.asarray(args[0][1]).ravel() elif optidx == 2: # print('------------- case 5', 'plot(x,y)') x = np.asarray(args[0]).ravel() y = np.asarray(args[1]).ravel() else: vedo.logger.error(f"plot(): Could not understand input arguments {args}") return None if "polar" in mode: return _plot_polar(np.c_[x, y], **kwargs) return PlotXY(np.c_[x, y], **kwargs) def histogram(*args, **kwargs): """ Histogramming for 1D and 2D data arrays. This is meant as a convenience function that creates the appropriate object based on the shape of the provided input data. Use keyword `like=...` if you want to use the same format of a previously created Figure (useful when superimposing Figures) to make sure they are compatible and comparable. If they are not compatible you will receive an error message. ------------------------------------------------------------------------- .. note:: default mode, for 1D arrays Creates a `Histogram1D(Figure)` object. Arguments: weights : (list) An array of weights, of the same shape as `data`. Each value in `data` only contributes its associated weight towards the bin count (instead of 1). bins : (int) number of bins vrange : (list) restrict the range of the histogram density : (bool) normalize the area to 1 by dividing by the nr of entries and bin size logscale : (bool) use logscale on y-axis fill : (bool) fill bars with solid color `c` gap : (float) leave a small space btw bars radius : (float) border radius of the top of the histogram bar. Default value is 0.1. texture : (str) url or path to an image to be used as texture for the bin outline : (bool) show outline of the bins errors : (bool) show error bars xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. aspect : (float) the desired aspect ratio of the histogram. Default is 4/3. grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` ztolerance : (float) a tolerance factor to superimpose objects (along the z-axis). Examples: - [histo_1d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_a.py) - [histo_1d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_b.py) - [histo_1d_c.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_c.py) - [histo_1d_d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_d.py) ![](https://vedo.embl.es/images/pyplot/histo_1D.png) ------------------------------------------------------------------------- .. note:: default mode, for 2D arrays Input data formats `[(x1,x2,..), (y1,y2,..)] or [(x1,y1), (x2,y2),..]` are both valid. Arguments: bins : (list) binning as (nx, ny) weights : (list) array of weights to assign to each entry cmap : (str, lookuptable) color map name or look up table alpha : (float) opacity of the histogram gap : (float) separation between adjacent bins as a fraction for their size. Set gap=-1 to generate a quad surface. scalarbar : (bool) add a scalarbar to right of the histogram like : (Figure) grab and use the same format of the given Figure (for superimposing) xlim : (list) [x0, x1] range of interest. If left to None will automatically choose the minimum or the maximum of the data range. Data outside the range are completely ignored. ylim : (list) [y0, y1] range of interest. If left to None will automatically choose the minimum or the maximum of the data range. Data outside the range are completely ignored. aspect : (float) the desired aspect ratio of the figure. title : (str) title of the plot to appear on top. If left blank some statistics will be shown. xtitle : (str) x axis title ytitle : (str) y axis title ztitle : (str) title for the scalar bar ac : (str) axes color, additional keyword for Axes can also be added using e.g. `axes=dict(xygrid=True)` Examples: - [histo_2d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_2d_a.py) - [histo_2d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_2d_b.py) ![](https://vedo.embl.es/images/pyplot/histo_2D.png) ------------------------------------------------------------------------- .. note:: mode="3d" If `mode='3d'`, build a 2D histogram as 3D bars from a list of x and y values. Arguments: xtitle : (str) x axis title bins : (int) nr of bins for the smaller range in x or y vrange : (list) range in x and y in format `[(xmin,xmax), (ymin,ymax)]` norm : (float) sets a scaling factor for the z axis (frequency axis) fill : (bool) draw solid hexagons cmap : (str) color map name for elevation gap : (float) keep a internal empty gap between bins [0,1] zscale : (float) rescale the (already normalized) zaxis for visual convenience Examples: - [histo_2d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/histo_2d_b.py) ------------------------------------------------------------------------- .. note:: mode="hexbin" If `mode='hexbin'`, build a hexagonal histogram from a list of x and y values. Arguments: xtitle : (str) x axis title bins : (int) nr of bins for the smaller range in x or y vrange : (list) range in x and y in format `[(xmin,xmax), (ymin,ymax)]` norm : (float) sets a scaling factor for the z axis (frequency axis) fill : (bool) draw solid hexagons cmap : (str) color map name for elevation Examples: - [histo_hexagonal.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_hexagonal.py) ![](https://vedo.embl.es/images/pyplot/histo_hexagonal.png) ------------------------------------------------------------------------- .. note:: mode="polar" If `mode='polar'` assume input is polar coordinate system (rho, theta): Arguments: weights : (list) Array of weights, of the same shape as the input. Each value only contributes its associated weight towards the bin count (instead of 1). title : (str) histogram title tsize : (float) title size bins : (int) number of bins in phi r1 : (float) inner radius r2 : (float) outer radius phigap : (float) gap angle btw 2 radial bars, in degrees rgap : (float) gap factor along radius of numeric angle labels lpos : (float) label gap factor along radius lsize : (float) label size c : (color) color of the histogram bars, can be a list of length `bins` bc : (color) color of the frame and labels alpha : (float) opacity of the frame cmap : (str) color map name deg : (bool) input array is in degrees vmin : (float) minimum value of the radial axis vmax : (float) maximum value of the radial axis labels : (list) list of labels, must be of length `bins` show_disc : (bool) show the outer ring axis nrays : (int) draw this number of axis rays (continuous and dashed) show_lines : (bool) show lines to the origin show_angles : (bool) show angular values show_errors : (bool) show error bars Examples: - [histo_polar.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_polar.py) ![](https://vedo.embl.es/images/pyplot/histo_polar.png) ------------------------------------------------------------------------- .. note:: mode="spheric" If `mode='spheric'`, build a histogram from list of theta and phi values. Arguments: rmax : (float) maximum radial elevation of bin res : (int) sphere resolution cmap : (str) color map name lw : (int) line width of the bin edges Examples: - [histo_spheric.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_spheric.py) ![](https://vedo.embl.es/images/pyplot/histo_spheric.png) """ mode = kwargs.pop("mode", "") if len(args) == 2: # x, y if "spher" in mode: return _histogram_spheric(args[0], args[1], **kwargs) if "hex" in mode: return _histogram_hex_bin(args[0], args[1], **kwargs) if "3d" in mode.lower(): return _histogram_quad_bin(args[0], args[1], **kwargs) return Histogram2D(args[0], args[1], **kwargs) elif len(args) == 1: if isinstance(args[0], vedo.Volume): data = args[0].pointdata[0] elif isinstance(args[0], vedo.Points): pd0 = args[0].pointdata[0] if pd0 is not None: data = pd0.ravel() else: data = args[0].celldata[0].ravel() else: try: if "pandas" in str(type(args[0])): if "xtitle" not in kwargs: kwargs.update({"xtitle": args[0].name.replace("_", "_ ")}) except: pass data = np.asarray(args[0]) if "spher" in mode: return _histogram_spheric(args[0][:, 0], args[0][:, 1], **kwargs) if data.ndim == 1: if "polar" in mode: return _histogram_polar(data, **kwargs) return Histogram1D(data, **kwargs) if "hex" in mode: return _histogram_hex_bin(args[0][:, 0], args[0][:, 1], **kwargs) if "3d" in mode.lower(): return _histogram_quad_bin(args[0][:, 0], args[0][:, 1], **kwargs) return Histogram2D(args[0], **kwargs) vedo.logger.error(f"in histogram(): could not understand input {args[0]}") return None def fit( points, deg=1, niter=0, nstd=3, xerrors=None, yerrors=None, vrange=None, res=250, lw=3, c="red4" ) -> "vedo.shapes.Line": """ Polynomial fitting with parameter error and error bands calculation. Errors bars in both x and y are supported. Returns a `vedo.shapes.Line` object. Additional information about the fitting output can be accessed with: `fitd = fit(pts)` - `fitd.coefficients` will contain the coefficients of the polynomial fit - `fitd.coefficient_errors`, errors on the fitting coefficients - `fitd.monte_carlo_coefficients`, fitting coefficient set from MC generation - `fitd.covariance_matrix`, covariance matrix as a numpy array - `fitd.reduced_chi2`, reduced chi-square of the fitting - `fitd.ndof`, number of degrees of freedom - `fitd.data_sigma`, mean data dispersion from the central fit assuming `Chi2=1` - `fitd.error_lines`, a `vedo.shapes.Line` object for the upper and lower error band - `fitd.error_band`, the `vedo.mesh.Mesh` object representing the error band Errors on x and y can be specified. If left to `None` an estimate is made from the statistical spread of the dataset itself. Errors are always assumed gaussian. Arguments: deg : (int) degree of the polynomial to be fitted niter : (int) number of monte-carlo iterations to compute error bands. If set to 0, return the simple least-squares fit with naive error estimation on coefficients only. A reasonable non-zero value to set is about 500, in this case *error_lines*, *error_band* and the other class attributes are filled nstd : (float) nr. of standard deviation to use for error calculation xerrors : (list) array of the same length of points with the errors on x yerrors : (list) array of the same length of points with the errors on y vrange : (list) specify the domain range of the fitting line (only affects visualization, but can be used to extrapolate the fit outside the data range) res : (int) resolution of the output fitted line and error lines Examples: - [fit_polynomial1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/fit_polynomial1.py) ![](https://vedo.embl.es/images/pyplot/fitPolynomial1.png) """ if isinstance(points, vedo.pointcloud.Points): points = points.coordinates points = np.asarray(points) if len(points) == 2: # assume user is passing [x,y] points = np.c_[points[0], points[1]] x = points[:, 0] y = points[:, 1] # ignore z n = len(x) ndof = n - deg - 1 if vrange is not None: x0, x1 = vrange else: x0, x1 = np.min(x), np.max(x) if xerrors is not None: x0 -= xerrors[0] / 2 x1 += xerrors[-1] / 2 tol = (x1 - x0) / 10000 xr = np.linspace(x0, x1, res) # project x errs on y if xerrors is not None: xerrors = np.asarray(xerrors) if yerrors is not None: yerrors = np.asarray(yerrors) w = 1.0 / yerrors coeffs = np.polyfit(x, y, deg, w=w, rcond=None) else: coeffs = np.polyfit(x, y, deg, rcond=None) # update yerrors, 1 bootstrap iteration is enough p1d = np.poly1d(coeffs) der = (p1d(x + tol) - p1d(x)) / tol yerrors = np.sqrt(yerrors * yerrors + np.power(der * xerrors, 2)) if yerrors is not None: yerrors = np.asarray(yerrors) w = 1.0 / yerrors coeffs, V = np.polyfit(x, y, deg, w=w, rcond=None, cov=True) else: w = 1 coeffs, V = np.polyfit(x, y, deg, rcond=None, cov=True) p1d = np.poly1d(coeffs) theor = p1d(xr) fitl = shapes.Line(np.c_[xr, theor], lw=lw, c=c).z(tol * 2) fitl.coefficients = coeffs fitl.covariance_matrix = V residuals2_sum = np.sum(np.power(p1d(x) - y, 2)) / ndof sigma = np.sqrt(residuals2_sum) fitl.reduced_chi2 = np.sum(np.power((p1d(x) - y) * w, 2)) / ndof fitl.ndof = ndof fitl.data_sigma = sigma # worked out from data using chi2=1 hypo fitl.name = "LinearPolynomialFit" if not niter: fitl.coefficient_errors = np.sqrt(np.diag(V)) return fitl ################################ if yerrors is not None: sigma = yerrors else: w = None fitl.reduced_chi2 = 1 Theors, all_coeffs = [], [] for i in range(niter): noise = np.random.randn(n) * sigma coeffs = np.polyfit(x, y + noise, deg, w=w, rcond=None) all_coeffs.append(coeffs) P1d = np.poly1d(coeffs) Theor = P1d(xr) Theors.append(Theor) # all_coeffs = np.array(all_coeffs) fitl.monte_carlo_coefficients = np.array(all_coeffs) stds = np.std(Theors, axis=0) fitl.coefficient_errors = np.std(all_coeffs, axis=0) # check distributions on the fly # for i in range(deg+1): # histogram(all_coeffs[:,i],title='par'+str(i)).show(new=1) # histogram(all_coeffs[:,0], all_coeffs[:,1], # xtitle='param0', ytitle='param1',scalarbar=1).show(new=1) # histogram(all_coeffs[:,1], all_coeffs[:,2], # xtitle='param1', ytitle='param2').show(new=1) # histogram(all_coeffs[:,0], all_coeffs[:,2], # xtitle='param0', ytitle='param2').show(new=1) error_lines = [] for i in [nstd, -nstd]: pp = np.c_[xr, theor + stds * i] el = shapes.Line(pp, lw=1, alpha=0.2, c="k").z(tol) error_lines.append(el) el.name = "ErrorLine for sigma=" + str(i) fitl.error_lines = error_lines l1 = error_lines[0].coordinates.tolist() cband = l1 + list(reversed(error_lines[1].coordinates.tolist())) + [l1[0]] fitl.error_band = shapes.Line(cband).triangulate().lw(0).c("k", 0.15) fitl.error_band.name = "PolynomialFitErrorBand" return fitl def _plot_fxy( z, xlim=(0, 3), ylim=(0, 3), zlim=(None, None), show_nan=True, zlevels=10, c=None, bc="aqua", alpha=1, texture="", bins=(100, 100), axes=True, ): import warnings if c is not None: texture = None # disable ps = vtki.new("PlaneSource") ps.SetResolution(bins[0], bins[1]) ps.SetNormal([0, 0, 1]) ps.Update() poly = ps.GetOutput() dx = xlim[1] - xlim[0] dy = ylim[1] - ylim[0] todel, nans = [], [] for i in range(poly.GetNumberOfPoints()): px, py, _ = poly.GetPoint(i) xv = (px + 0.5) * dx + xlim[0] yv = (py + 0.5) * dy + ylim[0] try: with warnings.catch_warnings(): warnings.simplefilter("ignore") zv = z(xv, yv) if np.isnan(zv) or np.isinf(zv) or np.iscomplex(zv): zv = 0 todel.append(i) nans.append([xv, yv, 0]) except: zv = 0 todel.append(i) nans.append([xv, yv, 0]) poly.GetPoints().SetPoint(i, [xv, yv, zv]) if todel: cellIds = vtki.vtkIdList() poly.BuildLinks() for i in todel: poly.GetPointCells(i, cellIds) for j in range(cellIds.GetNumberOfIds()): poly.DeleteCell(cellIds.GetId(j)) # flag cell poly.RemoveDeletedCells() cl = vtki.new("CleanPolyData") cl.SetInputData(poly) cl.Update() poly = cl.GetOutput() if not poly.GetNumberOfPoints(): vedo.logger.error("function is not real in the domain") return None if zlim[0]: poly = Mesh(poly).cut_with_plane((0, 0, zlim[0]), (0, 0, 1)).dataset if zlim[1]: poly = Mesh(poly).cut_with_plane((0, 0, zlim[1]), (0, 0, -1)).dataset cmap = "" if c in colors.cmaps_names: cmap = c c = None bc = None mesh = Mesh(poly, c, alpha).compute_normals().lighting("plastic") if cmap: mesh.compute_elevation().cmap(cmap) if bc: mesh.bc(bc) if texture: mesh.texture(texture) acts = [mesh] if zlevels: elevation = vtki.new("ElevationFilter") elevation.SetInputData(poly) bounds = poly.GetBounds() elevation.SetLowPoint(0, 0, bounds[4]) elevation.SetHighPoint(0, 0, bounds[5]) elevation.Update() bcf = vtki.new("BandedPolyDataContourFilter") bcf.SetInputData(elevation.GetOutput()) bcf.SetScalarModeToValue() bcf.GenerateContourEdgesOn() bcf.GenerateValues(zlevels, elevation.GetScalarRange()) bcf.Update() zpoly = bcf.GetContourEdgesOutput() zbandsact = Mesh(zpoly, "k", alpha).lw(1).lighting("off") zbandsact.mapper.SetResolveCoincidentTopologyToPolygonOffset() acts.append(zbandsact) if show_nan and todel: bb = mesh.bounds() if bb[4] <= 0 and bb[5] >= 0: zm = 0.0 else: zm = (bb[4] + bb[5]) / 2 nans = np.array(nans) + [0, 0, zm] nansact = shapes.Points(nans, r=2, c="red5", alpha=alpha) nansact.properties.RenderPointsAsSpheresOff() acts.append(nansact) if isinstance(axes, dict): axs = addons.Axes(mesh, **axes) acts.append(axs) elif axes: axs = addons.Axes(mesh) acts.append(axs) assem = Assembly(acts) assem.name = "PlotFxy" return assem def _plot_fz( z, x=(-1, 1), y=(-1, 1), zlimits=(None, None), cmap="PiYG", alpha=1, lw=0.1, bins=(75, 75), axes=True, ): ps = vtki.new("PlaneSource") ps.SetResolution(bins[0], bins[1]) ps.SetNormal([0, 0, 1]) ps.Update() poly = ps.GetOutput() dx = x[1] - x[0] dy = y[1] - y[0] arrImg = [] for i in range(poly.GetNumberOfPoints()): px, py, _ = poly.GetPoint(i) xv = (px + 0.5) * dx + x[0] yv = (py + 0.5) * dy + y[0] try: zv = z(complex(xv), complex(yv)) except: zv = 0 poly.GetPoints().SetPoint(i, [xv, yv, np.real(zv)]) arrImg.append(np.imag(zv)) mesh = Mesh(poly, alpha).lighting("plastic") v = max(abs(np.min(arrImg)), abs(np.max(arrImg))) mesh.cmap(cmap, arrImg, vmin=-v, vmax=v) mesh.compute_normals().lw(lw) if zlimits[0]: mesh.cut_with_plane((0, 0, zlimits[0]), (0, 0, 1)) if zlimits[1]: mesh.cut_with_plane((0, 0, zlimits[1]), (0, 0, -1)) acts = [mesh] if axes: axs = addons.Axes(mesh, ztitle="Real part") acts.append(axs) asse = Assembly(acts) asse.name = "PlotFz" if isinstance(z, str): asse.name += " " + z return asse def _plot_polar( rphi, title="", tsize=0.1, lsize=0.05, r1=0, r2=1, c="blue", bc="k", alpha=1, ps=5, lw=3, deg=False, vmax=None, fill=False, splined=False, nrays=8, show_disc=True, show_lines=True, show_angles=True, ): if len(rphi) == 2: rphi = np.stack((rphi[0], rphi[1]), axis=1) rphi = np.array(rphi, dtype=float) thetas = rphi[:, 0] radii = rphi[:, 1] k = 180 / np.pi if deg: thetas = np.array(thetas, dtype=float) / k vals = [] for v in thetas: # normalize range t = np.arctan2(np.sin(v), np.cos(v)) if t < 0: t += 2 * np.pi vals.append(t) thetas = np.array(vals, dtype=float) if vmax is None: vmax = np.max(radii) angles = [] points = [] for t, r in zip(thetas, radii): r = r / vmax * r2 + r1 ct, st = np.cos(t), np.sin(t) points.append([r * ct, r * st, 0]) p0 = points[0] points.append(p0) r2e = r1 + r2 lines = None if splined: lines = shapes.KSpline(points, closed=True) lines.c(c).lw(lw).alpha(alpha) elif lw: lines = shapes.Line(points) lines.c(c).lw(lw).alpha(alpha) points.pop() ptsact = None if ps: ptsact = shapes.Points(points, r=ps, c=c, alpha=alpha) filling = None if fill and lw: faces = [] coords = [[0, 0, 0]] + lines.coordinates.tolist() for i in range(1, lines.npoints): faces.append([0, i, i + 1]) filling = Mesh([coords, faces]).c(c).alpha(alpha) back = None back2 = None if show_disc: back = shapes.Disc(r1=r2e, r2=r2e * 1.01, c=bc, res=(1, 360)) back.z(-0.01).lighting("off").alpha(alpha) back2 = shapes.Disc(r1=r2e / 2, r2=r2e / 2 * 1.005, c=bc, res=(1, 360)) back2.z(-0.01).lighting("off").alpha(alpha) ti = None if title: ti = shapes.Text3D(title, (0, 0, 0), s=tsize, depth=0, justify="top-center") ti.pos(0, -r2e * 1.15, 0.01) rays = [] if show_disc: rgap = 0.05 for t in np.linspace(0, 2 * np.pi, num=nrays, endpoint=False): ct, st = np.cos(t), np.sin(t) if show_lines: l = shapes.Line((0, 0, -0.01), (r2e * ct * 1.03, r2e * st * 1.03, -0.01)) rays.append(l) ct2, st2 = np.cos(t + np.pi / nrays), np.sin(t + np.pi / nrays) lm = shapes.DashedLine((0, 0, -0.01), (r2e * ct2, r2e * st2, -0.01), spacing=0.25) rays.append(lm) elif show_angles: # just the ticks l = shapes.Line( (r2e * ct * 0.98, r2e * st * 0.98, -0.01), (r2e * ct * 1.03, r2e * st * 1.03, -0.01), ) if show_angles: if 0 <= t < np.pi / 2: ju = "bottom-left" elif t == np.pi / 2: ju = "bottom-center" elif np.pi / 2 < t <= np.pi: ju = "bottom-right" elif np.pi < t < np.pi * 3 / 2: ju = "top-right" elif t == np.pi * 3 / 2: ju = "top-center" else: ju = "top-left" a = shapes.Text3D(int(t * k), pos=(0, 0, 0), s=lsize, depth=0, justify=ju) a.pos(r2e * ct * (1 + rgap), r2e * st * (1 + rgap), -0.01) angles.append(a) mrg = merge(back, back2, angles, rays, ti) if mrg: mrg.color(bc).alpha(alpha).lighting("off") rh = Assembly([lines, ptsact, filling] + [mrg]) rh.name = "PlotPolar" return rh def _plot_spheric(rfunc, normalize=True, res=33, scalarbar=True, c="grey", alpha=0.05, cmap="jet"): sg = shapes.Sphere(res=res, quads=True) sg.alpha(alpha).c(c).wireframe() cgpts = sg.coordinates r, theta, phi = cart2spher(*cgpts.T) newr, inans = [], [] for i in range(len(r)): try: ri = rfunc(theta[i], phi[i]) if np.isnan(ri): inans.append(i) newr.append(1) else: newr.append(ri) except: inans.append(i) newr.append(1) newr = np.array(newr, dtype=float) if normalize: newr = newr / np.max(newr) newr[inans] = 1 nanpts = [] if inans: redpts = spher2cart(newr[inans], theta[inans], phi[inans]).T nanpts.append(shapes.Points(redpts, r=4, c="r")) pts = spher2cart(newr, theta, phi).T ssurf = sg.clone() ssurf.coordinates = pts if inans: ssurf.delete_cells_by_point_index(inans) ssurf.alpha(1).wireframe(0).lw(0.1) ssurf.cmap(cmap, newr) ssurf.compute_normals() if scalarbar: xm = np.max([np.max(pts[0]), 1]) ym = np.max([np.abs(np.max(pts[1])), 1]) ssurf.mapper.SetScalarRange(np.min(newr), np.max(newr)) sb3d = ssurf.add_scalarbar3d(size=(xm * 0.07, ym), c="k").scalarbar sb3d.rotate_x(90).pos(xm * 1.1, 0, -0.5) else: sb3d = None sg.pickable(False) asse = Assembly([ssurf, sg] + nanpts + [sb3d]) asse.name = "PlotSpheric" return asse def _histogram_quad_bin(x, y, **kwargs): # generate a histogram with 3D bars # histo = Histogram2D(x, y, **kwargs) gap = kwargs.pop("gap", 0) zscale = kwargs.pop("zscale", 1) cmap = kwargs.pop("cmap", "Blues_r") gr = histo.objects[2] d = gr.diagonal_size() tol = d / 1_000_000 # tolerance if gap >= 0: gr.shrink(1 - gap - tol) gr.map_cells_to_points() faces = np.array(gr.cells) s = 1 / histo.entries * len(faces) * zscale zvals = gr.pointdata["Scalars"] * s pts1 = gr.coordinates pts2 = np.copy(pts1) pts2[:, 2] = zvals + tol newpts = np.vstack([pts1, pts2]) newzvals = np.hstack([zvals, zvals]) / s n = pts1.shape[0] newfaces = [] for f in faces: f0, f1, f2, f3 = f f0n, f1n, f2n, f3n = f + n newfaces.extend( [ [f0, f1, f2, f3], [f0n, f1n, f2n, f3n], [f0, f1, f1n, f0n], [f1, f2, f2n, f1n], [f2, f3, f3n, f2n], [f3, f0, f0n, f3n], ] ) msh = Mesh([newpts, newfaces]).pickable(False) msh.cmap(cmap, newzvals, name="Frequency") msh.lw(1).lighting("ambient") histo.objects[2] = msh histo.RemovePart(gr.actor) histo.AddPart(msh.actor) histo.objects.append(msh) return histo def _histogram_hex_bin( xvalues, yvalues, bins=12, norm=1, fill=True, c=None, cmap="terrain_r", alpha=1 ) -> "Assembly": xmin, xmax = np.min(xvalues), np.max(xvalues) ymin, ymax = np.min(yvalues), np.max(yvalues) dx, dy = xmax - xmin, ymax - ymin if utils.is_sequence(bins): n, m = bins else: if xmax - xmin < ymax - ymin: n = bins m = np.rint(dy / dx * n / 1.2 + 0.5).astype(int) else: m = bins n = np.rint(dx / dy * m * 1.2 + 0.5).astype(int) values = np.stack((xvalues, yvalues), axis=1) zs = [[0.0]] * len(values) values = np.append(values, zs, axis=1) cloud = vedo.Points(values) col = None if c is not None: col = colors.get_color(c) hexs, binmax = [], 0 ki, kj = 1.33, 1.12 r = 0.47 / n * 1.2 * dx for i in range(n + 3): for j in range(m + 2): cyl = vtki.new("CylinderSource") cyl.SetResolution(6) cyl.CappingOn() cyl.SetRadius(0.5) cyl.SetHeight(0.1) cyl.Update() t = vtki.vtkTransform() if not i % 2: p = (i / ki, j / kj, 0) else: p = (i / ki, j / kj + 0.45, 0) q = (p[0] / n * 1.2 * dx + xmin, p[1] / m * dy + ymin, 0) ne = len(cloud.closest_point(q, radius=r)) if fill: t.Translate(p[0], p[1], ne / 2) t.Scale(1, 1, ne * 10) else: t.Translate(p[0], p[1], ne) t.RotateX(90) # put it along Z tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(cyl.GetOutput()) tf.SetTransform(t) tf.Update() if c is None: col = i h = Mesh(tf.GetOutput(), c=col, alpha=alpha).flat() h.lighting("plastic") h.actor.PickableOff() hexs.append(h) if ne > binmax: binmax = ne if cmap is not None: for h in hexs: z = h.bounds()[5] col = colors.color_map(z, cmap, 0, binmax) h.color(col) asse = Assembly(hexs) asse.scale([1.2 / n * dx, 1 / m * dy, norm / binmax * (dx + dy) / 4]) asse.pos([xmin, ymin, 0]) asse.name = "HistogramHexBin" return asse def _histogram_polar( values, weights=None, title="", tsize=0.1, bins=16, r1=0.25, r2=1, phigap=0.5, rgap=0.05, lpos=1, lsize=0.04, c="grey", bc="k", alpha=1, cmap=None, deg=False, vmin=None, vmax=None, labels=(), show_disc=True, nrays=8, show_lines=True, show_angles=True, show_errors=False, ): k = 180 / np.pi if deg: values = np.array(values, dtype=float) / k else: values = np.array(values, dtype=float) vals = [] for v in values: # normalize range t = np.arctan2(np.sin(v), np.cos(v)) if t < 0: t += 2 * np.pi vals.append(t + 0.00001) histodata, edges = np.histogram(vals, weights=weights, bins=bins, range=(0, 2 * np.pi)) thetas = [] for i in range(bins): thetas.append((edges[i] + edges[i + 1]) / 2) if vmin is None: vmin = np.min(histodata) if vmax is None: vmax = np.max(histodata) errors = np.sqrt(histodata) r2e = r1 + r2 if show_errors: r2e += np.max(errors) / vmax * 1.5 back = None if show_disc: back = shapes.Disc(r1=r2e, r2=r2e * 1.01, c=bc, res=(1, 360)) back.z(-0.01) slices = [] lines = [] angles = [] errbars = [] for i, t in enumerate(thetas): r = histodata[i] / vmax * r2 d = shapes.Disc((0, 0, 0), r1, r1 + r, res=(1, 360)) delta = np.pi / bins - np.pi / 2 - phigap / k d.cut_with_plane(normal=(np.cos(t + delta), np.sin(t + delta), 0)) d.cut_with_plane(normal=(np.cos(t - delta), np.sin(t - delta), 0)) if cmap is not None: cslice = colors.color_map(histodata[i], cmap, vmin, vmax) d.color(cslice) else: if c is None: d.color(i) elif utils.is_sequence(c) and len(c) == bins: d.color(c[i]) else: d.color(c) d.alpha(alpha).lighting("off") slices.append(d) ct, st = np.cos(t), np.sin(t) if show_errors: err = np.sqrt(histodata[i]) / vmax * r2 errl = shapes.Line( ((r1 + r - err) * ct, (r1 + r - err) * st, 0.01), ((r1 + r + err) * ct, (r1 + r + err) * st, 0.01), ) errl.alpha(alpha).lw(3).color(bc) errbars.append(errl) labs = [] rays = [] if show_disc: outerdisc = shapes.Disc(r1=r2e, r2=r2e * 1.01, c=bc, res=(1, 360)) outerdisc.z(-0.01) innerdisc = shapes.Disc(r1=r2e / 2, r2=r2e / 2 * 1.005, c=bc, res=(1, 360)) innerdisc.z(-0.01) rays.append(outerdisc) rays.append(innerdisc) rgap = 0.05 for t in np.linspace(0, 2 * np.pi, num=nrays, endpoint=False): ct, st = np.cos(t), np.sin(t) if show_lines: l = shapes.Line((0, 0, -0.01), (r2e * ct * 1.03, r2e * st * 1.03, -0.01)) rays.append(l) ct2, st2 = np.cos(t + np.pi / nrays), np.sin(t + np.pi / nrays) lm = shapes.DashedLine((0, 0, -0.01), (r2e * ct2, r2e * st2, -0.01), spacing=0.25) rays.append(lm) elif show_angles: # just the ticks l = shapes.Line( (r2e * ct * 0.98, r2e * st * 0.98, -0.01), (r2e * ct * 1.03, r2e * st * 1.03, -0.01), ) if show_angles: if 0 <= t < np.pi / 2: ju = "bottom-left" elif t == np.pi / 2: ju = "bottom-center" elif np.pi / 2 < t <= np.pi: ju = "bottom-right" elif np.pi < t < np.pi * 3 / 2: ju = "top-right" elif t == np.pi * 3 / 2: ju = "top-center" else: ju = "top-left" a = shapes.Text3D(int(t * k), pos=(0, 0, 0), s=lsize, depth=0, justify=ju) a.pos(r2e * ct * (1 + rgap), r2e * st * (1 + rgap), -0.01) angles.append(a) ti = None if title: ti = shapes.Text3D(title, (0, 0, 0), s=tsize, depth=0, justify="top-center") ti.pos(0, -r2e * 1.15, 0.01) for i, t in enumerate(thetas): if i < len(labels): lab = shapes.Text3D( labels[i], (0, 0, 0), s=lsize, depth=0, justify="center" # font="VTK", ) lab.pos( r2e * np.cos(t) * (1 + rgap) * lpos / 2, r2e * np.sin(t) * (1 + rgap) * lpos / 2, 0.01, ) labs.append(lab) mrg = merge(lines, angles, rays, ti, labs) if mrg: mrg.color(bc).lighting("off") acts = slices + errbars + [mrg] asse = Assembly(acts) asse.frequencies = histodata asse.bins = edges asse.name = "HistogramPolar" return asse def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", gap=0.1): x, y, z = spher2cart(np.ones_like(thetavalues) * 1.1, thetavalues, phivalues) ptsvals = np.c_[x, y, z] sg = shapes.Sphere(res=res, quads=True).shrink(1 - gap) sgfaces = sg.cells sgpts = sg.coordinates cntrs = sg.cell_centers().coordinates counts = np.zeros(len(cntrs)) for p in ptsvals: cell = sg.closest_point(p, return_cell_id=True) counts[cell] += 1 acounts = np.array(counts, dtype=float) counts *= (rmax - 1) / np.max(counts) for cell, cn in enumerate(counts): if not cn: continue fs = sgfaces[cell] pts = sgpts[fs] _, t1, p1 = cart2spher(pts[:, 0], pts[:, 1], pts[:, 2]) x, y, z = spher2cart(1 + cn, t1, p1) sgpts[fs] = np.c_[x, y, z] sg.coordinates = sgpts sg.cmap(cmap, acounts, on="cells") vals = sg.celldata["Scalars"] faces = sg.cells points = sg.coordinates.tolist() + [[0.0, 0.0, 0.0]] lp = len(points) - 1 newfaces = [] newvals = [] for i, f in enumerate(faces): p0, p1, p2, p3 = f newfaces.append(f) newfaces.append([p0, lp, p1]) newfaces.append([p1, lp, p2]) newfaces.append([p2, lp, p3]) newfaces.append([p3, lp, p0]) for _ in range(5): newvals.append(vals[i]) newsg = Mesh([points, newfaces]).cmap(cmap, newvals, on="cells") newsg.compute_normals().flat() newsg.name = "HistogramSpheric" return newsg def pie_chart( fractions, title="", tsize=0.3, r1=1.7, r2=1, phigap=0, lpos=0.8, lsize=0.15, c=None, bc="k", alpha=1, labels=(), show_disc=False, ) -> "Assembly": """ Donut plot or pie chart. Arguments: title : (str) plot title tsize : (float) title size r1 : (float) inner radius r2 : (float) outer radius, starting from r1 phigap : (float) gap angle btw 2 radial bars, in degrees lpos : (float) label gap factor along radius lsize : (float) label size c : (color) color of the plot slices bc : (color) color of the disc frame alpha : (float) opacity of the disc frame labels : (list) list of labels show_disc : (bool) show the outer ring axis Examples: - [donut.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/donut.py) ![](https://vedo.embl.es/images/pyplot/donut.png) """ fractions = np.array(fractions, dtype=float) angles = np.add.accumulate(2 * np.pi * fractions) angles[-1] = 2 * np.pi if angles[-2] > 2 * np.pi: print("Error in donut(): fractions must sum to 1.") raise RuntimeError cols = [] for i, th in enumerate(np.linspace(0, 2 * np.pi, 360, endpoint=False)): for ia, a in enumerate(angles): if th < a: cols.append(c[ia]) break labs = [] if labels: angles = np.concatenate([[0], angles]) labs = [""] * 360 for i in range(len(labels)): a = (angles[i + 1] + angles[i]) / 2 j = int(a / np.pi * 180) labs[j] = labels[i] data = np.linspace(0, 2 * np.pi, 360, endpoint=False) + 0.005 dn = _histogram_polar( data, title=title, bins=360, r1=r1, r2=r2, phigap=phigap, lpos=lpos, lsize=lsize, tsize=tsize, c=cols, bc=bc, alpha=alpha, vmin=0, vmax=1, labels=labs, show_disc=show_disc, show_lines=0, show_angles=0, show_errors=0, ) dn.name = "Donut" return dn def violin( values, bins=10, vlim=None, x=0, width=3, splined=True, fill=True, c="violet", alpha=1, outline=True, centerline=True, lc="darkorchid", lw=3, ) -> "Assembly": """ Violin style histogram. Arguments: bins : (int) number of bins vlim : (list) input value limits. Crop values outside range x : (float) x-position of the violin axis width : (float) width factor of the normalized distribution splined : (bool) spline the outline fill : (bool) fill violin with solid color outline : (bool) add the distribution outline centerline : (bool) add the vertical centerline at x lc : (color) line color Examples: - [histo_violin.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/histo_violin.py) ![](https://vedo.embl.es/images/pyplot/histo_violin.png) """ fs, edges = np.histogram(values, bins=bins, range=vlim) mine, maxe = np.min(edges), np.max(edges) fs = fs.astype(float) / len(values) * width rs = [] if splined: lnl, lnr = [(0, edges[0], 0)], [(0, edges[0], 0)] for i in range(bins): xc = (edges[i] + edges[i + 1]) / 2 yc = fs[i] lnl.append([-yc, xc, 0]) lnr.append([yc, xc, 0]) lnl.append((0, edges[-1], 0)) lnr.append((0, edges[-1], 0)) spl = shapes.KSpline(lnl).x(x) spr = shapes.KSpline(lnr).x(x) spl.color(lc).alpha(alpha).lw(lw) spr.color(lc).alpha(alpha).lw(lw) if outline: rs.append(spl) rs.append(spr) if fill: rb = shapes.Ribbon(spl, spr, c=c, alpha=alpha).lighting("off") rs.append(rb) else: lns1 = [[0, mine, 0]] for i in range(bins): lns1.append([fs[i], edges[i], 0]) lns1.append([fs[i], edges[i + 1], 0]) lns1.append([0, maxe, 0]) lns2 = [[0, mine, 0]] for i in range(bins): lns2.append([-fs[i], edges[i], 0]) lns2.append([-fs[i], edges[i + 1], 0]) lns2.append([0, maxe, 0]) if outline: rs.append(shapes.Line(lns1, c=lc, alpha=alpha, lw=lw).x(x)) rs.append(shapes.Line(lns2, c=lc, alpha=alpha, lw=lw).x(x)) if fill: for i in range(bins): p0 = (-fs[i], edges[i], 0) p1 = (fs[i], edges[i + 1], 0) r = shapes.Rectangle(p0, p1).x(p0[0] + x) r.color(c).alpha(alpha).lighting("off") rs.append(r) if centerline: cl = shapes.Line([0, mine, 0.01], [0, maxe, 0.01], c=lc, alpha=alpha, lw=2).x(x) rs.append(cl) asse = Assembly(rs) asse.name = "Violin" return asse def whisker(data, s=0.25, c="k", lw=2, bc="blue", alpha=0.25, r=5, jitter=True, horizontal=False) -> "Assembly": """ Generate a "whisker" bar from a 1-dimensional dataset. Arguments: s : (float) size of the box c : (color) color of the lines lw : (float) line width bc : (color) color of the box alpha : (float) transparency of the box r : (float) point radius in pixels (use value 0 to disable) jitter : (bool) add some randomness to points to avoid overlap horizontal : (bool) set horizontal layout Examples: - [whiskers.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/whiskers.py) ![](https://vedo.embl.es/images/pyplot/whiskers.png) """ xvals = np.zeros_like(np.asarray(data)) if jitter: xjit = np.random.randn(len(xvals)) * s / 9 xjit = np.clip(xjit, -s / 2.1, s / 2.1) xvals += xjit dmean = np.mean(data) dq05 = np.quantile(data, 0.05) dq25 = np.quantile(data, 0.25) dq75 = np.quantile(data, 0.75) dq95 = np.quantile(data, 0.95) pts = None if r: pts = shapes.Points(np.array([xvals, data]).T, c=c, r=r) rec = shapes.Rectangle([-s / 2, dq25], [s / 2, dq75], c=bc, alpha=alpha) rec.properties.LightingOff() rl = shapes.Line([[-s / 2, dq25], [s / 2, dq25], [s / 2, dq75], [-s / 2, dq75]], closed=True) l1 = shapes.Line([0, dq05, 0], [0, dq25, 0], c=c, lw=lw) l2 = shapes.Line([0, dq75, 0], [0, dq95, 0], c=c, lw=lw) lm = shapes.Line([-s / 2, dmean], [s / 2, dmean]) lns = merge(l1, l2, lm, rl) asse = Assembly([lns, rec, pts]) if horizontal: asse.rotate_z(-90) asse.name = "Whisker" asse.info["mean"] = dmean asse.info["quantile_05"] = dq05 asse.info["quantile_25"] = dq25 asse.info["quantile_75"] = dq75 asse.info["quantile_95"] = dq95 return asse def streamplot( X, Y, U, V, direction="both", max_propagation=None, lw=2, cmap="viridis", probes=() ) -> Union["vedo.shapes.Lines", None]: """ Generate a streamline plot of a vectorial field (U,V) defined at positions (X,Y). Returns a `Mesh` object. Arguments: direction : (str) either "forward", "backward" or "both" max_propagation : (float) maximum physical length of the streamline lw : (float) line width in absolute units Examples: - [plot_stream.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/plot_stream.py) ![](https://vedo.embl.es/images/pyplot/plot_stream.png) """ n = len(X) m = len(Y[0]) if n != m: print("Limitation in streamplot(): only square grids are allowed.", n, m) raise RuntimeError() xmin, xmax = X[0][0], X[-1][-1] ymin, ymax = Y[0][0], Y[-1][-1] field = np.sqrt(U * U + V * V) vol = vedo.Volume(field, dims=(n, n, 1)) uf = np.ravel(U, order="F") vf = np.ravel(V, order="F") vects = np.c_[uf, vf, np.zeros_like(uf)] vol.pointdata["StreamPlotField"] = vects if len(probes) == 0: probe = shapes.Grid(pos=((n - 1) / 2, (n - 1) / 2, 0), s=(n - 1, n - 1), res=(n - 1, n - 1)) else: if isinstance(probes, vedo.Points): probes = probes.coordinates else: probes = np.array(probes, dtype=float) if len(probes[0]) == 2: probes = np.c_[probes[:, 0], probes[:, 1], np.zeros(len(probes))] sv = [(n - 1) / (xmax - xmin), (n - 1) / (ymax - ymin), 1] probes = probes - [xmin, ymin, 0] probes = np.multiply(probes, sv) probe = vedo.Points(probes) stream = vol.compute_streamlines(probe, direction=direction, max_propagation=max_propagation) if stream: stream.lw(lw).cmap(cmap).lighting("off") stream.scale([1 / (n - 1) * (xmax - xmin), 1 / (n - 1) * (ymax - ymin), 1]) stream.shift(xmin, ymin) return stream def matrix( M, title="Matrix", xtitle="", ytitle="", xlabels=(), ylabels=(), xrotation=0, cmap="Reds", vmin=None, vmax=None, precision=2, font="Theemim", scale=0, scalarbar=True, lc="white", lw=0, c="black", alpha=1, ) -> "Assembly": """ Generate a matrix, or a 2D color-coded plot with bin labels. Returns an `Assembly` object. Arguments: M : (list, numpy array) the input array to visualize title : (str) title of the plot xtitle : (str) title of the horizontal colmuns ytitle : (str) title of the vertical rows xlabels : (list) individual string labels for each column. Must be of length m ylabels : (list) individual string labels for each row. Must be of length n xrotation : (float) rotation of the horizontal labels cmap : (str) color map name vmin : (float) minimum value of the colormap range vmax : (float) maximum value of the colormap range precision : (int) number of digits for the matrix entries or bins font : (str) font name. Check [available fonts here](https://vedo.embl.es/fonts). scale : (float) size of the numeric entries or bin values scalarbar : (bool) add a scalar bar to the right of the plot lc : (str) color of the line separating the bins lw : (float) Width of the line separating the bins c : (str) text color alpha : (float) plot transparency Examples: - [np_matrix.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/np_matrix.py) ![](https://vedo.embl.es/images/pyplot/np_matrix.png) """ M = np.asarray(M) n, m = M.shape gr = shapes.Grid(res=(m, n), s=(m / (m + n) * 2, n / (m + n) * 2), c=c, alpha=alpha) gr.wireframe(False).lc(lc).lw(lw) matr = np.flip(np.flip(M), axis=1).ravel(order="C") gr.cmap(cmap, matr, on="cells", vmin=vmin, vmax=vmax) sbar = None if scalarbar: gr.add_scalarbar3d(title_font=font, label_font=font) sbar = gr.scalarbar labs = None if scale != 0: gr.compute_normals(points=False) labs = gr.labels( on="cells", scale=scale / max(m, n), precision=precision, font=font, justify="center", c=c, ) labs.z(0.001) t = None if title: if title == "Matrix": title += " " + str(n) + "x" + str(m) t = shapes.Text3D(title, font=font, s=0.04, justify="bottom-center", c=c) t.shift(0, n / (m + n) * 1.05) xlabs = None if len(xlabels) == m: xlabs = [] jus = "top-center" if xrotation > 44: jus = "right-center" for i in range(m): xl = shapes.Text3D(xlabels[i], font=font, s=0.02, justify=jus, c=c).rotate_z(xrotation) xl.shift((2 * i - m + 1) / (m + n), -n / (m + n) * 1.05) xlabs.append(xl) ylabs = None if len(ylabels) == n: ylabels = list(reversed(ylabels)) ylabs = [] for i in range(n): yl = shapes.Text3D(ylabels[i], font=font, s=0.02, justify="right-center", c=c) yl.shift(-m / (m + n) * 1.05, (2 * i - n + 1) / (m + n)) ylabs.append(yl) xt = None if xtitle: xt = shapes.Text3D(xtitle, font=font, s=0.035, justify="top-center", c=c) xt.shift(0, -n / (m + n) * 1.05) if xlabs is not None: y0, y1 = xlabs[0].ybounds() xt.shift(0, -(y1 - y0) - 0.55 / (m + n)) yt = None if ytitle: yt = shapes.Text3D(ytitle, font=font, s=0.035, justify="bottom-center", c=c).rotate_z(90) yt.shift(-m / (m + n) * 1.05, 0) if ylabs is not None: x0, x1 = ylabs[0].xbounds() yt.shift(-(x1 - x0) - 0.55 / (m + n), 0) asse = Assembly(gr, sbar, labs, t, xt, yt, xlabs, ylabs) asse.name = "Matrix" return asse def CornerPlot(points, pos=1, s=0.2, title="", c="b", bg="k", lines=True, dots=True): """ Return a `vtkXYPlotActor` that is a plot of `x` versus `y`, where `points` is a list of `(x,y)` points. Assign position following this convention: - 1, topleft, - 2, topright, - 3, bottomleft, - 4, bottomright. """ if len(points) == 2: # passing [allx, ally] points = np.stack((points[0], points[1]), axis=1) c = colors.get_color(c) # allow different codings array_x = vtki.vtkFloatArray() array_y = vtki.vtkFloatArray() array_x.SetNumberOfTuples(len(points)) array_y.SetNumberOfTuples(len(points)) for i, p in enumerate(points): array_x.InsertValue(i, p[0]) array_y.InsertValue(i, p[1]) field = vtki.vtkFieldData() field.AddArray(array_x) field.AddArray(array_y) data = vtki.vtkDataObject() data.SetFieldData(field) xyplot = vtki.new("XYPlotActor") xyplot.AddDataObjectInput(data) xyplot.SetDataObjectXComponent(0, 0) xyplot.SetDataObjectYComponent(0, 1) xyplot.SetXValuesToValue() xyplot.SetAdjustXLabels(0) xyplot.SetAdjustYLabels(0) xyplot.SetNumberOfXLabels(3) xyplot.GetProperty().SetPointSize(5) xyplot.GetProperty().SetLineWidth(2) xyplot.GetProperty().SetColor(colors.get_color(bg)) xyplot.SetPlotColor(0, c[0], c[1], c[2]) xyplot.SetXTitle(title) xyplot.SetYTitle("") xyplot.ExchangeAxesOff() xyplot.SetPlotPoints(dots) if not lines: xyplot.PlotLinesOff() if isinstance(pos, str): spos = 2 if "top" in pos: if "left" in pos: spos = 1 elif "right" in pos: spos = 2 elif "bottom" in pos: if "left" in pos: spos = 3 elif "right" in pos: spos = 4 pos = spos if pos == 1: xyplot.GetPositionCoordinate().SetValue(0.0, 0.8, 0) elif pos == 2: xyplot.GetPositionCoordinate().SetValue(0.76, 0.8, 0) elif pos == 3: xyplot.GetPositionCoordinate().SetValue(0.0, 0.0, 0) elif pos == 4: xyplot.GetPositionCoordinate().SetValue(0.76, 0.0, 0) else: xyplot.GetPositionCoordinate().SetValue(pos[0], pos[1], 0) xyplot.GetPosition2Coordinate().SetValue(s, s, 0) return xyplot def CornerHistogram( values, bins=20, vrange=None, minbin=0, logscale=False, title="", c="g", bg="k", alpha=1, pos="bottom-left", s=0.175, lines=True, dots=False, nmax=None, ): """ Build a histogram from a list of values in n bins. The resulting object is a 2D actor. Use `vrange` to restrict the range of the histogram. Use `nmax` to limit the sampling to this max nr of entries Use `pos` to assign its position: - 1, topleft, - 2, topright, - 3, bottomleft, - 4, bottomright, - (x, y), as fraction of the rendering window """ if hasattr(values, "dataset"): values = utils.vtk2numpy(values.dataset.GetPointData().GetScalars()) n = values.shape[0] if nmax and nmax < n: # subsample: idxs = np.linspace(0, n, num=int(nmax), endpoint=False).astype(int) values = values[idxs] fs, edges = np.histogram(values, bins=bins, range=vrange) if minbin: fs = fs[minbin:-1] if logscale: fs = np.log10(fs + 1) pts = [] for i in range(len(fs)): pts.append([(edges[i] + edges[i + 1]) / 2, fs[i]]) cplot = CornerPlot(pts, pos, s, title, c, bg, lines, dots) cplot.SetNumberOfYLabels(2) cplot.SetNumberOfXLabels(3) tprop = vtki.vtkTextProperty() tprop.SetColor(colors.get_color(bg)) tprop.SetFontFamily(vtki.VTK_FONT_FILE) tprop.SetFontFile(utils.get_font_path("Calco")) tprop.SetOpacity(alpha) cplot.SetAxisTitleTextProperty(tprop) cplot.GetProperty().SetOpacity(alpha) cplot.GetXAxisActor2D().SetLabelTextProperty(tprop) cplot.GetXAxisActor2D().SetTitleTextProperty(tprop) cplot.GetXAxisActor2D().SetFontFactor(0.55) cplot.GetYAxisActor2D().SetLabelFactor(0.0) cplot.GetYAxisActor2D().LabelVisibilityOff() return cplot class DirectedGraph(Assembly): """ Support for Directed Graphs. """ def __init__(self, **kargs): """ A graph consists of a collection of nodes (without postional information) and a collection of edges connecting pairs of nodes. The task is to determine the node positions only based on their connections. This class is derived from class `Assembly`, and it assembles 4 Mesh objects representing the graph, the node labels, edge labels and edge arrows. Arguments: c : (color) Color of the Graph n : (int) number of the initial set of nodes layout : (int, str) layout in `['2d', 'fast2d', 'clustering2d', 'circular', 'circular3d', 'cone', 'force', 'tree']`. Each of these layouts has different available options. --------------------------------------------------------------- .. note:: Options for layouts '2d', 'fast2d' and 'clustering2d' Arguments: seed : (int) seed of the random number generator used to jitter point positions rest_distance : (float) manually set the resting distance nmax : (int) the maximum number of iterations to be used zrange : (list) expand 2d graph along z axis. --------------------------------------------------------------- .. note:: Options for layouts 'circular', and 'circular3d': Arguments: radius : (float) set the radius of the circles height : (float) set the vertical (local z) distance between the circles zrange : (float) expand 2d graph along z axis --------------------------------------------------------------- .. note:: Options for layout 'cone' Arguments: compactness : (float) ratio between the average width of a cone in the tree, and the height of the cone. compression : (bool) put children closer together, possibly allowing sub-trees to overlap. This is useful if the tree is actually the spanning tree of a graph. spacing : (float) space between layers of the tree --------------------------------------------------------------- .. note:: Options for layout 'force' Arguments: seed : (int) seed the random number generator used to jitter point positions bounds : (list) set the region in space in which to place the final graph nmax : (int) the maximum number of iterations to be used three_dimensional : (bool) allow optimization in the 3rd dimension too random_initial_points : (bool) use random positions within the graph bounds as initial points Examples: - [lineage_graph.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/lineage_graph.py) ![](https://vedo.embl.es/images/pyplot/graph_lineage.png) - [graph_network.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/graph_network.py) ![](https://vedo.embl.es/images/pyplot/graph_network.png) """ super().__init__() self.nodes = [] self.edges = [] self._node_labels = [] # holds strings self._edge_labels = [] self.edge_orientations = [] self.edge_glyph_position = 0.6 self.zrange = 0.0 self.rotX = 0 self.rotY = 0 self.rotZ = 0 self.arrow_scale = 0.15 self.node_label_scale = None self.node_label_justify = "bottom-left" self.edge_label_scale = None self.mdg = vtki.new("MutableDirectedGraph") n = kargs.pop("n", 0) for _ in range(n): self.add_node() self._c = kargs.pop("c", (0.3, 0.3, 0.3)) self.gl = vtki.new("GraphLayout") self.font = kargs.pop("font", "") s = kargs.pop("layout", "2d") if isinstance(s, int): ss = ["2d", "fast2d", "clustering2d", "circular", "circular3d", "cone", "force", "tree"] s = ss[s] self.layout = s if "2d" in s: if "clustering" in s: self.strategy = vtki.new("Clustering2DLayoutStrategy") elif "fast" in s: self.strategy = vtki.new("Fast2DLayoutStrategy") else: self.strategy = vtki.new("Simple2DLayoutStrategy") self.rotX = 180 opt = kargs.pop("rest_distance", None) if opt is not None: self.strategy.SetRestDistance(opt) opt = kargs.pop("seed", None) if opt is not None: self.strategy.SetRandomSeed(opt) opt = kargs.pop("nmax", None) if opt is not None: self.strategy.SetMaxNumberOfIterations(opt) self.zrange = kargs.pop("zrange", 0) elif "circ" in s: if "3d" in s: self.strategy = vtki.new("Simple3DCirclesStrategy") self.strategy.SetDirection(0, 0, -1) self.strategy.SetAutoHeight(True) self.strategy.SetMethod(1) self.rotX = -90 opt = kargs.pop("radius", None) # float if opt is not None: self.strategy.SetMethod(0) self.strategy.SetRadius(opt) # float opt = kargs.pop("height", None) if opt is not None: self.strategy.SetAutoHeight(False) self.strategy.SetHeight(opt) # float else: self.strategy = vtki.new("CircularLayoutStrategy") self.zrange = kargs.pop("zrange", 0) elif "cone" in s: self.strategy = vtki.new("ConeLayoutStrategy") self.rotX = 180 opt = kargs.pop("compactness", None) if opt is not None: self.strategy.SetCompactness(opt) opt = kargs.pop("compression", None) if opt is not None: self.strategy.SetCompression(opt) opt = kargs.pop("spacing", None) if opt is not None: self.strategy.SetSpacing(opt) elif "force" in s: self.strategy = vtki.new("ForceDirectedLayoutStrategy") opt = kargs.pop("seed", None) if opt is not None: self.strategy.SetRandomSeed(opt) opt = kargs.pop("bounds", None) if opt is not None: self.strategy.SetAutomaticBoundsComputation(False) self.strategy.SetGraphBounds(opt) # list opt = kargs.pop("nmax", None) if opt is not None: self.strategy.SetMaxNumberOfIterations(opt) # int opt = kargs.pop("three_dimensional", True) if opt is not None: self.strategy.SetThreeDimensionalLayout(opt) # bool opt = kargs.pop("random_initial_points", None) if opt is not None: self.strategy.SetRandomInitialPoints(opt) # bool elif "tree" in s: self.strategy = vtki.new("SpanTreeLayoutStrategy") self.rotX = 180 else: vedo.logger.error(f"Cannot understand layout {s}. Available layouts:") vedo.logger.error("[2d,fast2d,clustering2d,circular,circular3d,cone,force,tree]") raise RuntimeError() self.gl.SetLayoutStrategy(self.strategy) if len(kargs) > 0: vedo.logger.error(f"Cannot understand options: {kargs}") def add_node(self, label="id") -> int: """Add a new node to the `Graph`.""" v = self.mdg.AddVertex() # vtk calls it vertex.. self.nodes.append(v) if label == "id": label = int(v) self._node_labels.append(str(label)) return v def add_edge(self, v1, v2, label="") -> int: """Add a new edge between to nodes. An extra node is created automatically if needed.""" nv = len(self.nodes) if v1 >= nv: for _ in range(nv, v1 + 1): self.add_node() nv = len(self.nodes) if v2 >= nv: for _ in range(nv, v2 + 1): self.add_node() e = self.mdg.AddEdge(v1, v2) self.edges.append(e) self._edge_labels.append(str(label)) return e def add_child(self, v, node_label="id", edge_label="") -> int: """Add a new edge to a new node as its child. The extra node is created automatically if needed.""" nv = len(self.nodes) if v >= nv: for _ in range(nv, v + 1): self.add_node() child = self.mdg.AddChild(v) self.edges.append((v, child)) self.nodes.append(child) if node_label == "id": node_label = int(child) self._node_labels.append(str(node_label)) self._edge_labels.append(str(edge_label)) return child def build(self): """ Build the `DirectedGraph(Assembly)`. Accessory objects are also created for labels and arrows. """ self.gl.SetZRange(self.zrange) self.gl.SetInputData(self.mdg) self.gl.Update() gr2poly = vtki.new("GraphToPolyData") gr2poly.EdgeGlyphOutputOn() gr2poly.SetEdgeGlyphPosition(self.edge_glyph_position) gr2poly.SetInputData(self.gl.GetOutput()) gr2poly.Update() dgraph = Mesh(gr2poly.GetOutput(0)) # dgraph.clean() # WRONG!!! dont uncomment dgraph.flat().color(self._c).lw(2) dgraph.name = "DirectedGraph" diagsz = self.diagonal_size() / 1.42 if not diagsz: return None dgraph.scale(1 / diagsz) if self.rotX: dgraph.rotate_x(self.rotX) if self.rotY: dgraph.rotate_y(self.rotY) if self.rotZ: dgraph.rotate_z(self.rotZ) vecs = gr2poly.GetOutput(1).GetPointData().GetVectors() self.edge_orientations = utils.vtk2numpy(vecs) # Use Glyph3D to repeat the glyph on all edges. arrows = None if self.arrow_scale: arrow_source = vtki.new("GlyphSource2D") arrow_source.SetGlyphTypeToEdgeArrow() arrow_source.SetScale(self.arrow_scale) arrow_source.Update() arrow_glyph = vtki.vtkGlyph3D() arrow_glyph.SetInputData(0, gr2poly.GetOutput(1)) arrow_glyph.SetInputData(1, arrow_source.GetOutput()) arrow_glyph.Update() arrows = Mesh(arrow_glyph.GetOutput()) arrows.scale(1 / diagsz) arrows.lighting("off").color(self._c) if self.rotX: arrows.rotate_x(self.rotX) if self.rotY: arrows.rotate_y(self.rotY) if self.rotZ: arrows.rotate_z(self.rotZ) arrows.name = "DirectedGraphArrows" node_labels = None if self._node_labels: node_labels = dgraph.labels( self._node_labels, scale=self.node_label_scale, precision=0, font=self.font, justify=self.node_label_justify, ) node_labels.color(self._c).pickable(True) node_labels.name = "DirectedGraphNodeLabels" edge_labels = None if self._edge_labels: edge_labels = dgraph.labels( self._edge_labels, on="cells", scale=self.edge_label_scale, precision=0, font=self.font ) edge_labels.color(self._c).pickable(True) edge_labels.name = "DirectedGraphEdgeLabels" super().__init__([dgraph, node_labels, edge_labels, arrows]) self.name = "DirectedGraphAssembly" return self vedo-2025.5.3/vedo/settings.py000066400000000000000000000570741474667405700161150ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os __docformat__ = "google" class Settings: """ General settings to modify the global behavior and style. Example: ```python from vedo import settings, Cube settings.use_parallel_projection = True # settings["use_parallel_projection"] = True # this is equivalent! Cube().color('g').show().close() ``` List of available properties: ```python # Set the default font to be used for axes, comments etc. # Check out the available fonts at http://vedo.embl.es/fonts # For example: default_font = 'Normografo' # To customize the font parameters use: settings.font_parameters["Normografo"] = dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=True, ) # Where # mono : if True all letters occupy the same space slot horizontally # fscale : sets the general scaling factor for the size of the font # hspacing: horizontal stretching factor (affects both letters and words) # lspacing: horizontal spacing inbetween letters (not words) # dotsep : a string of characters to be interpreted as dot separator # islocal : if locally stored in /fonts, otherwise it's on vedo.embl.es/fonts # # To run a demo try: # vedo --run fonts # Use this local folder to store downloaded files (default is ~/.cache/vedo) cache_directory = ".cache" # Palette number when using an integer to choose a color palette = 0 # Options for saving window screenshots: screenshot_transparent_background = False screeshot_large_image = False # sometimes setting this to True gives better results # Enable tracking pipeline functionality: # allows to show a graph with the pipeline of action which let to a final object # this is achieved by calling "myobj.pipeline.show()" (a new window will pop up) self.enable_pipeline = True # Remember the last format used when creating new figures in vedo.pyplot # this is useful when creating multiple figures of the same kind # and avoid to specify the format each time in plot(..., like=...) remember_last_figure_format = False # Set up default mouse and keyboard callbacks enable_default_mouse_callbacks = True enable_default_keyboard_callbacks = True # Force single precsion of points coordinates. # Useful for very large point clouds and meshes. Default is True. force_single_precision_points = True # Progress bar delay before showing up [sec] progressbar_delay = 0.5 # If False, when multiple renderers are present, render only once at the end immediate_rendering = True # In multirendering mode, show a grey frame margin (set width=0 to disable) renderer_frame_color = None renderer_frame_alpha = 0.5 renderer_frame_width = 0.5 renderer_frame_padding = 0.0001 # In multirendering mode, set the position of the horizontal of vertical splitting [0,1] window_splitting_position = None # Gradient orientation mode for background window color # 0 = Vertical # 1 = Horizontal # 2 = Radial viewport farthest side # 3 = Radial viewport farthest corner background_gradient_orientation = 0 # Enable / disable color printing by printc() enable_print_color = True # Smoothing options for points, lines and polygons point_smoothing = False line_smoothing = False polygon_smoothing = False # Turn on/off the automatic repositioning of lights as the camera moves light_follows_camera = False two_sided_lighting = True # Turn on/off rendering of translucent material with depth peeling technique use_depth_peeling = False alpha_bit_planes = True # options only active if useDepthPeeling=True multi_samples = 8 # antialiasing multisample buffer max_number_of_peels= 4 # maximum number of rendering passes occlusion_ratio = 0.0 # occlusion ratio, 0 = exact image. # Turn on/off nvidia FXAA post-process anti-aliasing, if supported use_fxaa = False # either True or False # By default, the depth buffer is reset for each renderer # If True, use the existing depth buffer preserve_depth_buffer = False # Use a polygon/edges offset to possibly resolve conflicts in rendering use_polygon_offset = False polygon_offset_factor = 0.1 polygon_offset_units = 0.1 # Interpolate scalars to render them smoothly interpolate_scalars_before_mapping = True # Set parallel projection On or Off (place camera to infinity, no perspective effects) use_parallel_projection = False # Set orientation type when reading TIFF files: # TOPLEFT 1 (row 0 top, col 0 lhs) TOPRIGHT 2 (row 0 top, col 0 rhs) # BOTRIGHT 3 (row 0 bottom, col 0 rhs) BOTLEFT 4 (row 0 bottom, col 0 lhs) # LEFTTOP 5 (row 0 lhs, col 0 top) RIGHTTOP 6 (row 0 rhs, col 0 top) # RIGHTBOT 7 (row 0 rhs, col 0 bottom) LEFTBOT 8 (row 0 lhs, col 0 bottom) tiff_orientation_type = 1 # Annotated cube axis type nr. 5 options: annotated_cube_color = (0.75, 0.75, 0.75) annotated_cube_text_color = None # use default, otherwise specify a single color annotated_cube_text_scale = 0.2 annotated_cube_texts = ["right","left ", "front","back ", " top ", "bttom"] # Set the default backend for plotting in jupyter notebooks. # If a jupyter environment is detected, the default is automatically switched to "2d" default_backend = "vtk" # Automatically close the Plotter instance after show() in jupyter sessions # setting it to False will keep the current Plotter instance active backend_autoclose = True # Settings specific to the K3D backend in jupyter notebooks k3d_menu_visibility = True k3d_plot_height = 512 k3d_antialias = True k3d_lighting = 1.5 k3d_camera_autofit= True k3d_grid_autofit = True k3d_axes_color = "gray4" k3d_axes_helper = 1.0 # size of the small triad of axes on the bottom right k3d_point_shader = "mesh" # others are '3d', '3dSpecular', 'dot', 'flat' k3d_line_shader = "thick" # others are 'flat', 'mesh' ``` """ # Restrict the attributes so accidental typos will generate an AttributeError exception __slots__ = [ "default_font", "default_backend", "cache_directory", "palette", "remember_last_figure_format", "screenshot_transparent_background", "screeshot_large_image", "enable_default_mouse_callbacks", "enable_default_keyboard_callbacks", "enable_pipeline", "progressbar_delay", "immediate_rendering", "renderer_frame_color", "renderer_frame_alpha", "renderer_frame_width", "renderer_frame_padding", "force_single_precision_points", "point_smoothing", "line_smoothing", "polygon_smoothing", "light_follows_camera", "two_sided_lighting", "use_depth_peeling", "multi_samples", "alpha_bit_planes", "max_number_of_peels", "occlusion_ratio", "use_fxaa", "preserve_depth_buffer", "use_polygon_offset", "polygon_offset_factor", "polygon_offset_units", "interpolate_scalars_before_mapping", "use_parallel_projection", "background_gradient_orientation", "window_splitting_position", "tiff_orientation_type", "annotated_cube_color", "annotated_cube_text_color", "annotated_cube_text_scale", "annotated_cube_texts", "enable_print_color", "backend_autoclose", "k3d_menu_visibility", "k3d_plot_height", "k3d_antialias", "k3d_lighting", "k3d_camera_autofit", "k3d_grid_autofit", "k3d_axes_color", "k3d_axes_helper", "k3d_point_shader", "k3d_line_shader", "font_parameters", ] ############################################################ # Dry run mode (for test purposes only) # 0 = normal # 1 = do not hold execution # 2 = do not hold execution and do not show any window dry_run_mode = 0 ############################################################ def __init__(self) -> None: self.default_backend = "vtk" try: # adapted from: https://stackoverflow.com/a/39662359/2912349 shell = get_ipython().__class__.__name__ if shell == 'ZMQInteractiveShell': self.default_backend = "2d" except NameError: pass self.default_font = "Normografo" self.enable_pipeline = True self.progressbar_delay = 0.5 self.palette = 0 self.remember_last_figure_format = False self.force_single_precision_points = True self.cache_directory = ".cache" # "/vedo" is added automatically self.screenshot_transparent_background = False self.screeshot_large_image = False self.enable_default_mouse_callbacks = True self.enable_default_keyboard_callbacks = True self.immediate_rendering = True self.renderer_frame_color = None self.renderer_frame_alpha = 0.5 self.renderer_frame_width = 0.5 self.renderer_frame_padding = 0.0001 self.background_gradient_orientation = 0 self.point_smoothing = False self.line_smoothing = False self.polygon_smoothing = False self.light_follows_camera = False self.two_sided_lighting = True self.use_depth_peeling = False self.multi_samples = 8 self.alpha_bit_planes = 1 self.max_number_of_peels = 4 self.occlusion_ratio = 0.1 self.use_fxaa = False self.preserve_depth_buffer = False self.use_polygon_offset = True self.polygon_offset_factor = 0.1 self.polygon_offset_units = 0.1 self.interpolate_scalars_before_mapping = True self.use_parallel_projection = False self.window_splitting_position = None self.tiff_orientation_type = 1 self.annotated_cube_color = (0.75, 0.75, 0.75) self.annotated_cube_text_color = None self.annotated_cube_text_scale = 0.2 self.annotated_cube_texts = ["right", "left ", "front", "back ", " top ", "bttom"] self.enable_print_color = True self.backend_autoclose = True self.k3d_menu_visibility = True self.k3d_plot_height = 512 self.k3d_antialias = True self.k3d_lighting = 1.5 self.k3d_camera_autofit = True self.k3d_grid_autofit= True self.k3d_axes_color = "k4" self.k3d_axes_helper = 1.0 self.k3d_point_shader= "mesh" self.k3d_line_shader = "thick" self.font_parameters = dict( Normografo=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=True, ), Bongas=dict( mono=False, fscale=0.875, hspacing=0.52, lspacing=0.25, dotsep="·", islocal=True, ), Calco=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="×", islocal=True, ), Comae=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=True, ), ComicMono=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="x", islocal=False, ), Edo=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~x ", islocal=False, ), FiraMonoMedium=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), FiraMonoBold=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Glasgo=dict( mono=True, fscale=0.75, lspacing=0.1, hspacing=1, dotsep="~×", islocal=True, ), Kanopus=dict( mono=False, fscale=0.75, lspacing=0.15, hspacing=0.75, dotsep="~×", islocal=True, ), LogoType=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=False, ), Quikhand=dict( mono=False, fscale=0.8, hspacing=0.6, lspacing=0.15, dotsep="~~×~", islocal=True, ), SmartCouric=dict( mono=True, fscale=0.8, hspacing=1.05, lspacing=0.1, dotsep="×", islocal=True, ), Spears=dict( mono=False, fscale=0.8, hspacing=0.5, lspacing=0.2, dotsep="~×", islocal=False, ), Theemim=dict( mono=False, fscale=0.825, hspacing=0.52, lspacing=0.3, dotsep="~~×", islocal=True, ), VictorMono=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="×", islocal=True, ), Justino1=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Justino2=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Justino3=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Calibri=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=False, ), Capsmall=dict( mono=False, fscale=0.8, hspacing=0.75, lspacing=0.15, dotsep="~×", islocal=False, ), Cartoons123=dict( mono=False, fscale=0.8, hspacing=0.75, lspacing=0.15, dotsep="x", islocal=False, ), Darwin=dict( mono=False, fscale=0.8, hspacing=0.75, lspacing=0.15, dotsep="x", islocal=False, ), Vega=dict( mono=False, fscale=0.8, hspacing=0.75, lspacing=0.15, dotsep="×", islocal=False, ), Meson=dict( mono=False, fscale=0.8, hspacing=0.9, lspacing=0.225, dotsep="~×", islocal=False, ), Komika=dict( mono=False, fscale=0.7, hspacing=0.75, lspacing=0.225, dotsep="~×", islocal=False, ), Brachium=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="x", islocal=False, ), Dalim=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Miro=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Ubuntu=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Mizar=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=0.75, dotsep="~×", islocal=False, ), LiberationSans=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), DejavuSansMono=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="~×", islocal=False, ), SunflowerHighway=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Swansea=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Housekeeper=dict( # supports chinese glyphs mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=False, ), Wananti=dict( # supports chinese glyphs mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~x", islocal=False, ), AnimeAce=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~x", islocal=False, ), Antares=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Archistico=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=0.75, dotsep="~×", islocal=False, ), KazyCase=dict( mono=True, fscale=0.8, hspacing=1.2, lspacing=0.1, dotsep="×", islocal=False, ), Roboto=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), ) #################################################################################### def __getitem__(self, key): """Make the class work like a dictionary too""" return getattr(self, key) def __setitem__(self, key, value): """Make the class work like a dictionary too""" setattr(self, key, value) def __str__(self) -> str: """Return a string representation of the object""" s = Settings.__doc__.replace(" ", "") s = s.replace(".. code-block:: python\n", "") s = s.replace("```python\n", "") s = s.replace("```\n", "") s = s.replace("\n\n", "\n #------------------------------------------------------\n") s = s.replace("\n ", "\n") s = s.replace("\n ", "\n") s = s.replace(" from", "from") try: from pygments import highlight from pygments.lexers import Python3Lexer from pygments.formatters import Terminal256Formatter s = highlight(s, Python3Lexer(), Terminal256Formatter(style="zenburn")) except (ModuleNotFoundError, ImportError): pass module = self.__class__.__module__ name = self.__class__.__name__ header = f"{module}.{name} at ({hex(id(self))})".ljust(75) s = f"\x1b[1m\x1b[7m{header}\x1b[0m\n" + s return s.strip() ############################################################ def keys(self) -> list: """Return all keys""" return self.__slots__ def values(self) -> list: """Return all values""" return [getattr(self, key) for key in self.__slots__] def items(self) -> list: """Return all items""" return [(key, getattr(self, key)) for key in self.__slots__] def reset(self) -> None: """Reset all settings to their default status.""" self.__init__() ############################################################ def init_colab(self, enable_k3d=True) -> None: """ Initialize colab environment """ print("setting up colab environment (can take a minute) ...", end="") res = os.system("which Xvfb") if res: os.system("apt-get install xvfb") os.system("pip install pyvirtualdisplay") from pyvirtualdisplay import Display Display(visible=0).start() if enable_k3d: os.system("pip install k3d") from google.colab import output output.enable_custom_widget_manager() if enable_k3d: import k3d try: print("installing k3d...", end="") os.system("jupyter nbextension install --py --user k3d") os.system("jupyter nbextension enable --py --user k3d") k3d.switch_to_text_protocol() self.default_backend = "k3d" self.backend_autoclose = False except: print("(FAILED) ... ", end="") print(" setup completed.") ############################################################ def start_xvfb(self) -> None: """ Start xvfb. Xvfb or X virtual framebuffer is a display server implementing the X11 display server protocol. In contrast to other display servers, Xvfb performs all graphical operations in virtual memory without showing any screen output. """ print("starting xvfb (can take a minute) ...", end="") res = os.system("which Xvfb") if res: os.system("apt-get install xvfb") os.system("set -x") os.system("export DISPLAY=:99.0") os.system("Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &") os.system("sleep 3") os.system("set +x") os.system('exec "$@"') print(" xvfb started.") vedo-2025.5.3/vedo/shapes.py000066400000000000000000004750171474667405700155410ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os from typing import List, Union, Any from functools import lru_cache from weakref import ref as weak_ref_to import numpy as np import vedo.vtkclasses as vtki import vedo from vedo import settings from vedo.transformations import LinearTransform, pol2cart, cart2spher, spher2cart from vedo.colors import cmaps_names, get_color, printc from vedo import utils from vedo.pointcloud import Points, merge from vedo.mesh import Mesh from vedo.image import Image __docformat__ = "google" __doc__ = """ Submodule to generate simple and complex geometric shapes ![](https://vedo.embl.es/images/basic/extrude.png) """ __all__ = [ "Marker", "Line", "DashedLine", "RoundedLine", "Tube", "Tubes", "ThickTube", "Lines", "Spline", "KSpline", "CSpline", "Bezier", "Brace", "NormalLines", "Ribbon", "Arrow", "Arrows", "Arrow2D", "Arrows2D", "FlatArrow", "Polygon", "Triangle", "Rectangle", "Disc", "Circle", "GeoCircle", "Arc", "Star", "Star3D", "Cross3D", "IcoSphere", "Sphere", "Spheres", "Earth", "Ellipsoid", "Grid", "TessellatedBox", "Plane", "Box", "Cube", "Spring", "Cylinder", "Cone", "Pyramid", "Torus", "Paraboloid", "Hyperboloid", "TextBase", "Text3D", "Text2D", "CornerAnnotation", "Latex", "Glyph", "Tensors", "ParametricShape", "ConvexHull", "VedoLogo", ] ############################################## _reps = ( (":nabla", "∇"), (":inf", "∞"), (":rightarrow", "→"), (":leftarrow", "←"), (":partial", "∂"), (":sqrt", "√"), (":approx", "≈"), (":neq", "≠"), (":leq", "≤"), (":geq", "≥"), (":foreach", "∀"), (":permille", "‰"), (":euro", "€"), (":dot", "·"), (":int", "∫"), (":pm", "±"), (":times", "×"), (":Gamma", "Γ"), (":Delta", "Δ"), (":Theta", "Θ"), (":Lambda", "Λ"), (":Pi", "Π"), (":Sigma", "Σ"), (":Phi", "Φ"), (":Chi", "X"), (":Xi", "Ξ"), (":Psi", "Ψ"), (":Omega", "Ω"), (":alpha", "α"), (":beta", "β"), (":gamma", "γ"), (":delta", "δ"), (":epsilon", "ε"), (":zeta", "ζ"), (":eta", "η"), (":theta", "θ"), (":kappa", "κ"), (":lambda", "λ"), (":mu", "μ"), (":lowerxi", "ξ"), (":nu", "ν"), (":pi", "π"), (":rho", "ρ"), (":sigma", "σ"), (":tau", "τ"), (":varphi", "φ"), (":phi", "φ"), (":chi", "χ"), (":psi", "ψ"), (":omega", "ω"), (":circ", "°"), (":onehalf", "½"), (":onefourth", "¼"), (":threefourths", "¾"), (":^1", "¹"), (":^2", "²"), (":^3", "³"), (":,", "~"), ) ######################################################################## class Glyph(Mesh): """ At each vertex of a mesh, another mesh, i.e. a "glyph", is shown with various orientation options and coloring. The input can also be a simple list of 2D or 3D coordinates. Color can be specified as a colormap which maps the size of the orientation vectors in `orientation_array`. """ def __init__( self, mesh, glyph, orientation_array=None, scale_by_scalar=False, scale_by_vector_size=False, scale_by_vector_components=False, color_by_scalar=False, color_by_vector_size=False, c="k8", alpha=1.0, ) -> None: """ Arguments: orientation_array: (list, str, vtkArray) list of vectors, `vtkArray` or name of an already existing pointdata array scale_by_scalar : (bool) glyph mesh is scaled by the active scalars scale_by_vector_size : (bool) glyph mesh is scaled by the size of the vectors scale_by_vector_components : (bool) glyph mesh is scaled by the 3 vectors components color_by_scalar : (bool) glyph mesh is colored based on the scalar value color_by_vector_size : (bool) glyph mesh is colored based on the vector size Examples: - [glyphs1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs1.py) - [glyphs2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs2.py) ![](https://vedo.embl.es/images/basic/glyphs.png) """ if utils.is_sequence(mesh): # create a cloud of points poly = utils.buildPolyData(mesh) else: poly = mesh.dataset cmap = "" if isinstance(c, str) and c in cmaps_names: cmap = c c = None elif utils.is_sequence(c): # user passing an array of point colors ucols = vtki.vtkUnsignedCharArray() ucols.SetNumberOfComponents(3) ucols.SetName("GlyphRGB") for col in c: cl = get_color(col) ucols.InsertNextTuple3(cl[0] * 255, cl[1] * 255, cl[2] * 255) poly.GetPointData().AddArray(ucols) poly.GetPointData().SetActiveScalars("GlyphRGB") c = None gly = vtki.vtkGlyph3D() gly.GeneratePointIdsOn() gly.SetInputData(poly) try: gly.SetSourceData(glyph) except TypeError: gly.SetSourceData(glyph.dataset) if scale_by_scalar: gly.SetScaleModeToScaleByScalar() elif scale_by_vector_size: gly.SetScaleModeToScaleByVector() elif scale_by_vector_components: gly.SetScaleModeToScaleByVectorComponents() else: gly.SetScaleModeToDataScalingOff() if color_by_vector_size: gly.SetVectorModeToUseVector() gly.SetColorModeToColorByVector() elif color_by_scalar: gly.SetColorModeToColorByScalar() else: gly.SetColorModeToColorByScale() if orientation_array is not None: gly.OrientOn() if isinstance(orientation_array, str): if orientation_array.lower() == "normals": gly.SetVectorModeToUseNormal() else: # passing a name poly.GetPointData().SetActiveVectors(orientation_array) gly.SetInputArrayToProcess(0, 0, 0, 0, orientation_array) gly.SetVectorModeToUseVector() elif utils.is_sequence(orientation_array): # passing a list varr = vtki.vtkFloatArray() varr.SetNumberOfComponents(3) varr.SetName("glyph_vectors") for v in orientation_array: varr.InsertNextTuple(v) poly.GetPointData().AddArray(varr) poly.GetPointData().SetActiveVectors("glyph_vectors") gly.SetInputArrayToProcess(0, 0, 0, 0, "glyph_vectors") gly.SetVectorModeToUseVector() gly.Update() super().__init__(gly.GetOutput(), c, alpha) self.flat() if cmap: self.cmap(cmap, "VectorMagnitude") elif c is None: self.pointdata.select("GlyphRGB") self.name = "Glyph" class Tensors(Mesh): """ Geometric representation of tensors defined on a domain or set of points. Tensors can be scaled and/or rotated according to the source at each input point. Scaling and rotation is controlled by the eigenvalues/eigenvectors of the symmetrical part of the tensor as follows: For each tensor, the eigenvalues (and associated eigenvectors) are sorted to determine the major, medium, and minor eigenvalues/eigenvectors. The eigenvalue decomposition only makes sense for symmetric tensors, hence the need to only consider the symmetric part of the tensor, which is `1/2*(T+T.transposed())`. """ def __init__( self, domain, source="ellipsoid", use_eigenvalues=True, is_symmetric=True, three_axes=False, scale=1.0, max_scale=None, length=None, res=24, c=None, alpha=1.0, ) -> None: """ Arguments: source : (str, Mesh) preset types of source shapes is "ellipsoid", "cylinder", "cube" or a `Mesh` object. use_eigenvalues : (bool) color source glyph using the eigenvalues or by scalars three_axes : (bool) if `False` scale the source in the x-direction, the medium in the y-direction, and the minor in the z-direction. Then, the source is rotated so that the glyph's local x-axis lies along the major eigenvector, y-axis along the medium eigenvector, and z-axis along the minor. If `True` three sources are produced, each of them oriented along an eigenvector and scaled according to the corresponding eigenvector. is_symmetric : (bool) If `True` each source glyph is mirrored (2 or 6 glyphs will be produced). The x-axis of the source glyph will correspond to the eigenvector on output. length : (float) distance from the origin to the tip of the source glyph along the x-axis scale : (float) scaling factor of the source glyph. max_scale : (float) clamp scaling at this factor. Examples: - [tensors.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/tensors.py) - [tensor_grid1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/tensor_grid1.py) - [tensor_grid2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/tensor_grid2.py) ![](https://vedo.embl.es/images/volumetric/tensor_grid.png) """ if isinstance(source, Points): src = source.dataset else: # is string if "ellip" in source: src = vtki.new("SphereSource") src.SetPhiResolution(res) src.SetThetaResolution(res*2) elif "cyl" in source: src = vtki.new("CylinderSource") src.SetResolution(res) src.CappingOn() elif source == "cube": src = vtki.new("CubeSource") else: vedo.logger.error(f"Unknown source type {source}") raise ValueError() src.Update() src = src.GetOutput() tg = vtki.new("TensorGlyph") if isinstance(domain, vtki.vtkPolyData): tg.SetInputData(domain) else: tg.SetInputData(domain.dataset) tg.SetSourceData(src) if c is None: tg.ColorGlyphsOn() else: tg.ColorGlyphsOff() tg.SetSymmetric(int(is_symmetric)) if length is not None: tg.SetLength(length) if use_eigenvalues: tg.ExtractEigenvaluesOn() tg.SetColorModeToEigenvalues() else: tg.SetColorModeToScalars() tg.SetThreeGlyphs(three_axes) tg.ScalingOn() tg.SetScaleFactor(scale) if max_scale is None: tg.ClampScalingOn() max_scale = scale * 10 tg.SetMaxScaleFactor(max_scale) tg.Update() tgn = vtki.new("PolyDataNormals") tgn.ComputeCellNormalsOff() tgn.SetInputData(tg.GetOutput()) tgn.Update() super().__init__(tgn.GetOutput(), c, alpha) self.name = "Tensors" class Line(Mesh): """ Build the line segment between point `p0` and point `p1`. If `p0` is already a list of points, return the line connecting them. A 2D set of coords can also be passed as `p0=[x..], p1=[y..]`. """ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0) -> None: """ Arguments: closed : (bool) join last to first point res : (int) resolution, number of points along the line (only relevant if only 2 points are specified) lw : (int) line width in pixel units """ if isinstance(p1, Points): p1 = p1.pos() if isinstance(p0, Points): p0 = p0.pos() try: p0 = p0.dataset except AttributeError: pass if isinstance(p0, vtki.vtkPolyData): poly = p0 top = np.array([0,0,1]) base = np.array([0,0,0]) elif utils.is_sequence(p0[0]): # detect if user is passing a list of points p0 = utils.make3d(p0) ppoints = vtki.vtkPoints() # Generate the polyline ppoints.SetData(utils.numpy2vtk(np.asarray(p0), dtype=np.float32)) lines = vtki.vtkCellArray() npt = len(p0) if closed: lines.InsertNextCell(npt + 1) else: lines.InsertNextCell(npt) for i in range(npt): lines.InsertCellPoint(i) if closed: lines.InsertCellPoint(0) poly = vtki.vtkPolyData() poly.SetPoints(ppoints) poly.SetLines(lines) top = p0[-1] base = p0[0] if res != 2: printc(f"Warning: calling Line(res={res}), try remove []?", c='y') res = 2 else: # or just 2 points to link line_source = vtki.new("LineSource") p0 = utils.make3d(p0) p1 = utils.make3d(p1) line_source.SetPoint1(p0) line_source.SetPoint2(p1) line_source.SetResolution(res - 1) line_source.Update() poly = line_source.GetOutput() top = np.asarray(p1, dtype=float) base = np.asarray(p0, dtype=float) super().__init__(poly, c, alpha) self.slope: List[float] = [] # populated by analysis.fit_line self.center: List[float] = [] self.variances: List[float] = [] self.coefficients: List[float] = [] # populated by pyplot.fit() self.covariance_matrix: List[float] = [] self.coefficient_errors: List[float] = [] self.monte_carlo_coefficients: List[float] = [] self.reduced_chi2 = -1 self.ndof = 0 self.data_sigma = 0 self.error_lines: List[Any] = [] self.error_band = None self.res = res self.lw(lw) self.properties.LightingOff() self.actor.PickableOff() self.actor.DragableOff() self.base = base self.top = top self.name = "Line" def clone(self, deep=True) -> "Line": """ Return a copy of the ``Line`` object. Example: ```python from vedo import * ln1 = Line([1,1,1], [2,2,2], lw=3).print() ln2 = ln1.clone().shift(0,0,1).c('red').print() show(ln1, ln2, axes=1, viewup='z').close() ``` ![](https://vedo.embl.es/images/feats/line_clone.png) """ poly = vtki.vtkPolyData() if deep: poly.DeepCopy(self.dataset) else: poly.ShallowCopy(self.dataset) ln = Line(poly) ln.copy_properties_from(self) ln.transform = self.transform.clone() ln.name = self.name ln.base = self.base ln.top = self.top ln.pipeline = utils.OperationNode( "clone", parents=[self], shape="diamond", c="#edede9") return ln def linecolor(self, lc=None) -> "Line": """Assign a color to the line""" # overrides mesh.linecolor which would have no effect here return self.color(lc) def eval(self, x: float) -> np.ndarray: """ Calculate the position of an intermediate point as a fraction of the length of the line, being x=0 the first point and x=1 the last point. This corresponds to an imaginary point that travels along the line at constant speed. Can be used in conjunction with `lin_interpolate()` to map any range to the [0,1] range. """ distance1 = 0.0 length = self.length() pts = self.coordinates for i in range(1, len(pts)): p0 = pts[i - 1] p1 = pts[i] seg = p1 - p0 distance0 = distance1 distance1 += np.linalg.norm(seg) w1 = distance1 / length if w1 >= x: break w0 = distance0 / length v = p0 + seg * (x - w0) / (w1 - w0) return v def find_index_at_position(self, p) -> float: """ Find the index of the line vertex that is closest to the point `p`. Note that the returned index can be fractional if `p` is not exactly one of the vertices of the line. """ q = self.closest_point(p) a, b = sorted(self.closest_point(q, n=2, return_point_id=True)) pts = self.coordinates d = np.linalg.norm(pts[a] - pts[b]) t = a + np.linalg.norm(pts[a] - q) / d return t def pattern(self, stipple, repeats=10) -> "Line": """ Define a stipple pattern for dashing the line. Pass the stipple pattern as a string like `'- - -'`. Repeats controls the number of times the pattern repeats in a single segment. Examples are: `'- -', '-- - --'`, etc. The resolution of the line (nr of points) can affect how pattern will show up. Example: ```python from vedo import Line pts = [[1, 0, 0], [5, 2, 0], [3, 3, 1]] ln = Line(pts, c='r', lw=5).pattern('- -', repeats=10) ln.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/line_pattern.png) """ stipple = str(stipple) * int(2 * repeats) dimension = len(stipple) image = vtki.vtkImageData() image.SetDimensions(dimension, 1, 1) image.AllocateScalars(vtki.VTK_UNSIGNED_CHAR, 4) image.SetExtent(0, dimension - 1, 0, 0, 0, 0) i_dim = 0 while i_dim < dimension: for i in range(dimension): image.SetScalarComponentFromFloat(i_dim, 0, 0, 0, 255) image.SetScalarComponentFromFloat(i_dim, 0, 0, 1, 255) image.SetScalarComponentFromFloat(i_dim, 0, 0, 2, 255) if stipple[i] == " ": image.SetScalarComponentFromFloat(i_dim, 0, 0, 3, 0) else: image.SetScalarComponentFromFloat(i_dim, 0, 0, 3, 255) i_dim += 1 poly = self.dataset # Create texture coordinates tcoords = vtki.vtkDoubleArray() tcoords.SetName("TCoordsStippledLine") tcoords.SetNumberOfComponents(1) tcoords.SetNumberOfTuples(poly.GetNumberOfPoints()) for i in range(poly.GetNumberOfPoints()): tcoords.SetTypedTuple(i, [i / 2]) poly.GetPointData().SetTCoords(tcoords) poly.GetPointData().Modified() texture = vtki.vtkTexture() texture.SetInputData(image) texture.InterpolateOff() texture.RepeatOn() self.actor.SetTexture(texture) return self def length(self) -> float: """Calculate length of the line.""" distance = 0.0 pts = self.coordinates for i in range(1, len(pts)): distance += np.linalg.norm(pts[i] - pts[i - 1]) return distance def tangents(self) -> np.ndarray: """ Compute the tangents of a line in space. Example: ```python from vedo import * shape = Assembly(dataurl+"timecourse1d.npy")[58] pts = shape.rotate_x(30).coordinates tangents = Line(pts).tangents() arrs = Arrows(pts, pts+tangents, c='blue9') show(shape.c('red5').lw(5), arrs, bg='bb', axes=1).close() ``` ![](https://vedo.embl.es/images/feats/line_tangents.png) """ v = np.gradient(self.coordinates)[0] ds_dt = np.linalg.norm(v, axis=1) tangent = np.array([1 / ds_dt] * 3).transpose() * v return tangent def curvature(self) -> np.ndarray: """ Compute the signed curvature of a line in space. The signed is computed assuming the line is about coplanar to the xy plane. Example: ```python from vedo import * from vedo.pyplot import plot shape = Assembly(dataurl+"timecourse1d.npy")[55] curvs = Line(shape.coordinates).curvature() shape.cmap('coolwarm', curvs, vmin=-2,vmax=2).add_scalarbar3d(c='w') shape.render_lines_as_tubes().lw(12) pp = plot(curvs, ac='white', lc='yellow5') show(shape, pp, N=2, bg='bb', sharecam=False).close() ``` ![](https://vedo.embl.es/images/feats/line_curvature.png) """ v = np.gradient(self.coordinates)[0] a = np.gradient(v)[0] av = np.cross(a, v) mav = np.linalg.norm(av, axis=1) mv = utils.mag2(v) val = mav * np.sign(av[:, 2]) / np.power(mv, 1.5) val[0] = val[1] val[-1] = val[-2] return val def compute_curvature(self, method=0) -> "Line": """ Add a pointdata array named 'Curvatures' which contains the curvature value at each point. NB: keyword `method` is overridden in Mesh and has no effect here. """ # overrides mesh.compute_curvature curvs = self.curvature() vmin, vmax = np.min(curvs), np.max(curvs) if vmin < 0 and vmax > 0: v = max(-vmin, vmax) self.cmap("coolwarm", curvs, vmin=-v, vmax=v, name="Curvature") else: self.cmap("coolwarm", curvs, vmin=vmin, vmax=vmax, name="Curvature") return self def plot_scalar( self, radius=0.0, height=1.1, normal=(), camera=None, ) -> "Line": """ Generate a new `Line` which plots the active scalar along the line. Arguments: radius : (float) distance radius to the line height: (float) height of the plot normal: (list) normal vector to the plane of the plot camera: (vtkCamera) camera object to use for the plot orientation Example: ```python from vedo import * circle = Circle(res=360).rotate_y(20) pts = circle.coordinates bore = Line(pts).lw(5) values = np.arctan2(pts[:,1], pts[:,0]) bore.pointdata["scalars"] = values + np.random.randn(360)/5 vap = bore.plot_scalar(radius=0, height=1) show(bore, vap, axes=1, viewup='z').close() ``` ![](https://vedo.embl.es/images/feats/line_plot_scalar.png) """ ap = vtki.new("ArcPlotter") ap.SetInputData(self.dataset) ap.SetCamera(camera) ap.SetRadius(radius) ap.SetHeight(height) if len(normal)>0: ap.UseDefaultNormalOn() ap.SetDefaultNormal(normal) ap.Update() vap = Line(ap.GetOutput()) vap.linewidth(3).lighting('off') vap.name = "ArcPlot" return vap def sweep(self, direction=(1, 0, 0), res=1) -> "Mesh": """ Sweep the `Line` along the specified vector direction. Returns a `Mesh` surface. Line position is updated to allow for additional sweepings. Example: ```python from vedo import Line, show aline = Line([(0,0,0),(1,3,0),(2,4,0)]) surf1 = aline.sweep((1,0.2,0), res=3) surf2 = aline.sweep((0.2,0,1)).alpha(0.5) aline.color('r').linewidth(4) show(surf1, surf2, aline, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/sweepline.png) """ line = self.dataset rows = line.GetNumberOfPoints() spacing = 1 / res surface = vtki.vtkPolyData() res += 1 npts = rows * res npolys = (rows - 1) * (res - 1) points = vtki.vtkPoints() points.Allocate(npts) cnt = 0 x = [0.0, 0.0, 0.0] for row in range(rows): for col in range(res): p = [0.0, 0.0, 0.0] line.GetPoint(row, p) x[0] = p[0] + direction[0] * col * spacing x[1] = p[1] + direction[1] * col * spacing x[2] = p[2] + direction[2] * col * spacing points.InsertPoint(cnt, x) cnt += 1 # Generate the quads polys = vtki.vtkCellArray() polys.Allocate(npolys * 4) pts = [0, 0, 0, 0] for row in range(rows - 1): for col in range(res - 1): pts[0] = col + row * res pts[1] = pts[0] + 1 pts[2] = pts[0] + res + 1 pts[3] = pts[0] + res polys.InsertNextCell(4, pts) surface.SetPoints(points) surface.SetPolys(polys) asurface = Mesh(surface) asurface.copy_properties_from(self) asurface.lighting("default") self.coordinates = self.coordinates + direction return asurface def reverse(self): """Reverse the points sequence order.""" pts = np.flip(self.coordinates, axis=0) self.coordinates = pts return self class DashedLine(Mesh): """ Consider using `Line.pattern()` instead. Build a dashed line segment between points `p0` and `p1`. If `p0` is a list of points returns the line connecting them. A 2D set of coords can also be passed as `p0=[x..], p1=[y..]`. """ def __init__(self, p0, p1=None, spacing=0.1, closed=False, lw=2, c="k5", alpha=1.0) -> None: """ Arguments: closed : (bool) join last to first point spacing : (float) relative size of the dash lw : (int) line width in pixels """ if isinstance(p1, vtki.vtkActor): p1 = p1.GetPosition() if isinstance(p0, vtki.vtkActor): p0 = p0.GetPosition() if isinstance(p0, Points): p0 = p0.coordinates # detect if user is passing a 2D list of points as p0=xlist, p1=ylist: if len(p0) > 3: if not utils.is_sequence(p0[0]) and not utils.is_sequence(p1[0]) and len(p0) == len(p1): # assume input is 2D xlist, ylist p0 = np.stack((p0, p1), axis=1) p1 = None p0 = utils.make3d(p0) if closed: p0 = np.append(p0, [p0[0]], axis=0) if p1 is not None: # assume passing p0=[x,y] if len(p0) == 2 and not utils.is_sequence(p0[0]): p0 = (p0[0], p0[1], 0) if len(p1) == 2 and not utils.is_sequence(p1[0]): p1 = (p1[0], p1[1], 0) # detect if user is passing a list of points: if utils.is_sequence(p0[0]): listp = p0 else: # or just 2 points to link listp = [p0, p1] listp = np.array(listp) if listp.shape[1] == 2: listp = np.c_[listp, np.zeros(listp.shape[0])] xmn = np.min(listp, axis=0) xmx = np.max(listp, axis=0) dlen = np.linalg.norm(xmx - xmn) * np.clip(spacing, 0.01, 1.0) / 10 if not dlen: super().__init__(vtki.vtkPolyData(), c, alpha) self.name = "DashedLine (void)" return qs = [] for ipt in range(len(listp) - 1): p0 = listp[ipt] p1 = listp[ipt + 1] v = p1 - p0 vdist = np.linalg.norm(v) n1 = int(vdist / dlen) if not n1: continue res = 0.0 for i in range(n1 + 2): ist = (i - 0.5) / n1 ist = max(ist, 0) qi = p0 + v * (ist - res / vdist) if ist > 1: qi = p1 res = np.linalg.norm(qi - p1) qs.append(qi) break qs.append(qi) polylns = vtki.new("AppendPolyData") for i, q1 in enumerate(qs): if not i % 2: continue q0 = qs[i - 1] line_source = vtki.new("LineSource") line_source.SetPoint1(q0) line_source.SetPoint2(q1) line_source.Update() polylns.AddInputData(line_source.GetOutput()) polylns.Update() super().__init__(polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") self.base = listp[0] if closed: self.top = listp[-2] else: self.top = listp[-1] self.name = "DashedLine" class RoundedLine(Mesh): """ Create a 2D line of specified thickness (in absolute units) passing through a list of input points. Borders of the line are rounded. """ def __init__(self, pts, lw, res=10, c="gray4", alpha=1.0) -> None: """ Arguments: pts : (list) a list of points in 2D or 3D (z will be ignored). lw : (float) thickness of the line. res : (int) resolution of the rounded regions Example: ```python from vedo import * pts = [(-4,-3),(1,1),(2,4),(4,1),(3,-1),(2,-5),(9,-3)] ln = Line(pts).z(0.01) ln.color("red5").linewidth(2) rl = RoundedLine(pts, 0.6) show(Points(pts), ln, rl, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/rounded_line.png) """ pts = utils.make3d(pts) def _getpts(pts, revd=False): if revd: pts = list(reversed(pts)) if len(pts) == 2: p0, p1 = pts v = p1 - p0 dv = np.linalg.norm(v) nv = np.cross(v, (0, 0, -1)) nv = nv / np.linalg.norm(nv) * lw return [p0 + nv, p1 + nv] ptsnew = [] for k in range(len(pts) - 2): p0 = pts[k] p1 = pts[k + 1] p2 = pts[k + 2] v = p1 - p0 u = p2 - p1 du = np.linalg.norm(u) dv = np.linalg.norm(v) nv = np.cross(v, (0, 0, -1)) nv = nv / np.linalg.norm(nv) * lw nu = np.cross(u, (0, 0, -1)) nu = nu / np.linalg.norm(nu) * lw uv = np.cross(u, v) if k == 0: ptsnew.append(p0 + nv) if uv[2] <= 0: # the following computation can return a value # ever so slightly > 1.0 causing arccos to fail. uv_arg = np.dot(u, v) / du / dv if uv_arg > 1.0: # since the argument to arcos is 1, simply # assign alpha to 0.0 without calculating the # arccos alpha = 0.0 else: alpha = np.arccos(uv_arg) db = lw * np.tan(alpha / 2) p1new = p1 + nv - v / dv * db ptsnew.append(p1new) else: p1a = p1 + nv p1b = p1 + nu for i in range(0, res + 1): pab = p1a * (res - i) / res + p1b * i / res vpab = pab - p1 vpab = vpab / np.linalg.norm(vpab) * lw ptsnew.append(p1 + vpab) if k == len(pts) - 3: ptsnew.append(p2 + nu) if revd: ptsnew.append(p2 - nu) return ptsnew ptsnew = _getpts(pts) + _getpts(pts, revd=True) ppoints = vtki.vtkPoints() # Generate the polyline ppoints.SetData(utils.numpy2vtk(np.asarray(ptsnew), dtype=np.float32)) lines = vtki.vtkCellArray() npt = len(ptsnew) lines.InsertNextCell(npt) for i in range(npt): lines.InsertCellPoint(i) poly = vtki.vtkPolyData() poly.SetPoints(ppoints) poly.SetLines(lines) vct = vtki.new("ContourTriangulator") vct.SetInputData(poly) vct.Update() super().__init__(vct.GetOutput(), c, alpha) self.flat() self.properties.LightingOff() self.name = "RoundedLine" self.base = ptsnew[0] self.top = ptsnew[-1] class Lines(Mesh): """ Build the line segments between two lists of points `start_pts` and `end_pts`. `start_pts` can be also passed in the form `[[point1, point2], ...]`. """ def __init__( self, start_pts, end_pts=None, dotted=False, res=1, scale=1.0, lw=1, c="k4", alpha=1.0 ) -> None: """ Arguments: scale : (float) apply a rescaling factor to the lengths. c : (color, int, str, list) color name, number, or list of [R,G,B] colors alpha : (float) opacity in range [0,1] lw : (int) line width in pixel units dotted : (bool) draw a dotted line res : (int) resolution, number of points along the line (only relevant if only 2 points are specified) Examples: - [fitspheres2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/fitspheres2.py) ![](https://user-images.githubusercontent.com/32848391/52503049-ac9cb600-2be4-11e9-86af-72a538af14ef.png) """ if isinstance(start_pts, vtki.vtkPolyData):######## super().__init__(start_pts, c, alpha) self.lw(lw).lighting("off") self.name = "Lines" return ######################################## if utils.is_sequence(start_pts) and len(start_pts)>1 and isinstance(start_pts[0], Line): # passing a list of Line, see tests/issues/issue_950.py polylns = vtki.new("AppendPolyData") for ln in start_pts: polylns.AddInputData(ln.dataset) polylns.Update() super().__init__(polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") if dotted: self.properties.SetLineStipplePattern(0xF0F0) self.properties.SetLineStippleRepeatFactor(1) self.name = "Lines" return ######################################## if isinstance(start_pts, Points): start_pts = start_pts.coordinates if isinstance(end_pts, Points): end_pts = end_pts.coordinates if end_pts is not None: start_pts = np.stack((start_pts, end_pts), axis=1) polylns = vtki.new("AppendPolyData") if not utils.is_ragged(start_pts): for twopts in start_pts: line_source = vtki.new("LineSource") line_source.SetResolution(res) if len(twopts[0]) == 2: line_source.SetPoint1(twopts[0][0], twopts[0][1], 0.0) else: line_source.SetPoint1(twopts[0]) if scale == 1: pt2 = twopts[1] else: vers = (np.array(twopts[1]) - twopts[0]) * scale pt2 = np.array(twopts[0]) + vers if len(pt2) == 2: line_source.SetPoint2(pt2[0], pt2[1], 0.0) else: line_source.SetPoint2(pt2) polylns.AddInputConnection(line_source.GetOutputPort()) else: polylns = vtki.new("AppendPolyData") for t in start_pts: t = utils.make3d(t) ppoints = vtki.vtkPoints() # Generate the polyline ppoints.SetData(utils.numpy2vtk(t, dtype=np.float32)) lines = vtki.vtkCellArray() npt = len(t) lines.InsertNextCell(npt) for i in range(npt): lines.InsertCellPoint(i) poly = vtki.vtkPolyData() poly.SetPoints(ppoints) poly.SetLines(lines) polylns.AddInputData(poly) polylns.Update() super().__init__(polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") if dotted: self.properties.SetLineStipplePattern(0xF0F0) self.properties.SetLineStippleRepeatFactor(1) self.name = "Lines" class Arc(Line): """ Build a 2D circular arc between 2 points. """ def __init__( self, center=None, point1=None, point2=None, normal=None, angle=None, invert=False, res=60, c="k3", alpha=1.0, ) -> None: """ Build a 2D circular arc between 2 points. Two modes are available: 1. [center, point1, point2] are specified 2. [point1, normal, angle] are specified. In the first case it creates an arc defined by two endpoints and a center. In the second the arc spans the shortest angular sector defined by a starting point, a normal and a spanning angle. if `invert=True`, then the opposite happens. Example 1: ```python from vedo import * center = [0,1,0] p1 = [1,2,0.4] p2 = [0.5,3,-1] arc = Arc(center, p1, p2).lw(5).c("purple5") line2 = Line(center, p2) pts = Points([center, p1,p2], r=9, c='r') show(pts, line2, arc, f"length={arc.length()}", axes=1).close() ``` Example 2: ```python from vedo import * arc = Arc(point1=[0,1,0], normal=[0,0,1], angle=270) arc.lw(5).c("purple5") origin = Point([0,0,0], r=9, c='r') show(origin, arc, arc.labels2d(), axes=1).close() ``` """ ar = vtki.new("ArcSource") if point2 is not None: center = utils.make3d(center) point1 = utils.make3d(point1) point2 = utils.make3d(point2) ar.UseNormalAndAngleOff() ar.SetPoint1(point1-center) ar.SetPoint2(point2-center) elif normal is not None and angle and point1 is not None: normal = utils.make3d(normal) point1 = utils.make3d(point1) ar.UseNormalAndAngleOn() ar.SetAngle(angle) ar.SetPolarVector(point1) ar.SetNormal(normal) self.top = normal else: vedo.logger.error("in Arc(), incorrect input combination.") raise TypeError ar.SetNegative(invert) ar.SetResolution(res) ar.Update() super().__init__(ar.GetOutput(), c, alpha) self.lw(2).lighting("off") if point2 is not None: # nb: not center self.pos(center) self.name = "Arc" class Spline(Line): """ Find the B-Spline curve through a set of points. This curve does not necessarily pass exactly through all the input points. Needs to import `scipy`. """ def __init__(self, points, smooth=0.0, degree=2, closed=False, res=None, easing="") -> None: """ Arguments: smooth : (float) smoothing factor. - 0 = interpolate points exactly [default]. - 1 = average point positions. degree : (int) degree of the spline (between 1 and 5). easing : (str) control sensity of points along the spline. Available options are `[InSine, OutSine, Sine, InQuad, OutQuad, InCubic, OutCubic, InQuart, OutQuart, InCirc, OutCirc].` Can be used to create animations (move objects at varying speed). See e.g.: https://easings.net res : (int) number of points on the spline See also: `CSpline` and `KSpline`. Examples: - [spline_ease.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/spline_ease.py) ![](https://vedo.embl.es/images/simulations/spline_ease.gif) """ from scipy.interpolate import splprep, splev if isinstance(points, Points): points = points.coordinates points = utils.make3d(points) per = 0 if closed: points = np.append(points, [points[0]], axis=0) per = 1 if res is None: res = len(points) * 10 points = np.array(points, dtype=float) minx, miny, minz = np.min(points, axis=0) maxx, maxy, maxz = np.max(points, axis=0) maxb = max(maxx - minx, maxy - miny, maxz - minz) smooth *= maxb / 2 # must be in absolute units x = np.linspace(0.0, 1.0, res) if easing: if easing == "InSine": x = 1.0 - np.cos((x * np.pi) / 2) elif easing == "OutSine": x = np.sin((x * np.pi) / 2) elif easing == "Sine": x = -(np.cos(np.pi * x) - 1) / 2 elif easing == "InQuad": x = x * x elif easing == "OutQuad": x = 1.0 - (1 - x) * (1 - x) elif easing == "InCubic": x = x * x elif easing == "OutCubic": x = 1.0 - np.power(1 - x, 3) elif easing == "InQuart": x = x * x * x * x elif easing == "OutQuart": x = 1.0 - np.power(1 - x, 4) elif easing == "InCirc": x = 1.0 - np.sqrt(1 - np.power(x, 2)) elif easing == "OutCirc": x = np.sqrt(1.0 - np.power(x - 1, 2)) else: vedo.logger.error(f"unknown ease mode {easing}") # find the knots tckp, _ = splprep(points.T, task=0, s=smooth, k=degree, per=per) # evaluate spLine, including interpolated points: xnew, ynew, znew = splev(x, tckp) super().__init__(np.c_[xnew, ynew, znew], lw=2) self.name = "Spline" class KSpline(Line): """ Return a [Kochanek spline](https://en.wikipedia.org/wiki/Kochanek%E2%80%93Bartels_spline) which runs exactly through all the input points. """ def __init__(self, points, continuity=0.0, tension=0.0, bias=0.0, closed=False, res=None) -> None: """ Arguments: continuity : (float) changes the sharpness in change between tangents tension : (float) changes the length of the tangent vector bias : (float) changes the direction of the tangent vector closed : (bool) join last to first point to produce a closed curve res : (int) approximate resolution of the output line. Default is 20 times the number of input points. ![](https://user-images.githubusercontent.com/32848391/65975805-73fd6580-e46f-11e9-8957-75eddb28fa72.png) Warning: This class is not necessarily generating the exact number of points as requested by `res`. Some points may be concident and removed. See also: `Spline` and `CSpline`. """ if isinstance(points, Points): points = points.coordinates if not res: res = len(points) * 20 points = utils.make3d(points).astype(float) vtkKochanekSpline = vtki.get_class("KochanekSpline") xspline = vtkKochanekSpline() yspline = vtkKochanekSpline() zspline = vtkKochanekSpline() for s in [xspline, yspline, zspline]: if bias: s.SetDefaultBias(bias) if tension: s.SetDefaultTension(tension) if continuity: s.SetDefaultContinuity(continuity) s.SetClosed(closed) lenp = len(points[0]) > 2 for i, p in enumerate(points): xspline.AddPoint(i, p[0]) yspline.AddPoint(i, p[1]) if lenp: zspline.AddPoint(i, p[2]) ln = [] for pos in np.linspace(0, len(points), res): x = xspline.Evaluate(pos) y = yspline.Evaluate(pos) z = 0 if lenp: z = zspline.Evaluate(pos) ln.append((x, y, z)) super().__init__(ln, lw=2) self.clean() self.lighting("off") self.name = "KSpline" self.base = np.array(points[0], dtype=float) self.top = np.array(points[-1], dtype=float) class CSpline(Line): """ Return a Cardinal spline which runs exactly through all the input points. """ def __init__(self, points, closed=False, res=None) -> None: """ Arguments: closed : (bool) join last to first point to produce a closed curve res : (int) approximate resolution of the output line. Default is 20 times the number of input points. Warning: This class is not necessarily generating the exact number of points as requested by `res`. Some points may be concident and removed. See also: `Spline` and `KSpline`. """ if isinstance(points, Points): points = points.coordinates if not res: res = len(points) * 20 points = utils.make3d(points).astype(float) vtkCardinalSpline = vtki.get_class("CardinalSpline") xspline = vtkCardinalSpline() yspline = vtkCardinalSpline() zspline = vtkCardinalSpline() for s in [xspline, yspline, zspline]: s.SetClosed(closed) lenp = len(points[0]) > 2 for i, p in enumerate(points): xspline.AddPoint(i, p[0]) yspline.AddPoint(i, p[1]) if lenp: zspline.AddPoint(i, p[2]) ln = [] for pos in np.linspace(0, len(points), res): x = xspline.Evaluate(pos) y = yspline.Evaluate(pos) z = 0 if lenp: z = zspline.Evaluate(pos) ln.append((x, y, z)) super().__init__(ln, lw=2) self.clean() self.lighting("off") self.name = "CSpline" self.base = points[0] self.top = points[-1] class Bezier(Line): """ Generate the Bezier line that links the first to the last point. """ def __init__(self, points, res=None) -> None: """ Example: ```python from vedo import * import numpy as np pts = np.random.randn(25,3) for i,p in enumerate(pts): p += [5*i, 15*sin(i/2), i*i*i/200] show(Points(pts), Bezier(pts), axes=1).close() ``` ![](https://user-images.githubusercontent.com/32848391/90437534-dafd2a80-e0d2-11ea-9b93-9ecb3f48a3ff.png) """ N = len(points) if res is None: res = 10 * N t = np.linspace(0, 1, num=res) bcurve = np.zeros((res, len(points[0]))) def binom(n, k): b = 1 for t in range(1, min(k, n - k) + 1): b *= n / t n -= 1 return b def bernstein(n, k): coeff = binom(n, k) def _bpoly(x): return coeff * x ** k * (1 - x) ** (n - k) return _bpoly for ii in range(N): b = bernstein(N - 1, ii)(t) bcurve += np.outer(b, points[ii]) super().__init__(bcurve, lw=2) self.name = "BezierLine" class NormalLines(Mesh): """ Build an `Glyph` to show the normals at cell centers or at mesh vertices. Arguments: ratio : (int) show 1 normal every `ratio` cells. on : (str) either "cells" or "points". scale : (float) scale factor to control size. """ def __init__(self, msh, ratio=1, on="cells", scale=1.0) -> None: poly = msh.clone().dataset if "cell" in on: centers = vtki.new("CellCenters") centers.SetInputData(poly) centers.Update() poly = centers.GetOutput() mask_pts = vtki.new("MaskPoints") mask_pts.SetInputData(poly) mask_pts.SetOnRatio(ratio) mask_pts.RandomModeOff() mask_pts.Update() ln = vtki.new("LineSource") ln.SetPoint1(0, 0, 0) ln.SetPoint2(1, 0, 0) ln.Update() glyph = vtki.vtkGlyph3D() glyph.SetSourceData(ln.GetOutput()) glyph.SetInputData(mask_pts.GetOutput()) glyph.SetVectorModeToUseNormal() b = poly.GetBounds() f = max([b[1] - b[0], b[3] - b[2], b[5] - b[4]]) / 50 * scale glyph.SetScaleFactor(f) glyph.OrientOn() glyph.Update() super().__init__(glyph.GetOutput()) self.actor.PickableOff() prop = vtki.vtkProperty() prop.DeepCopy(msh.properties) self.actor.SetProperty(prop) self.properties = prop self.properties.LightingOff() self.mapper.ScalarVisibilityOff() self.name = "NormalLines" class Tube(Mesh): """ Build a tube along the line defined by a set of points. """ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0) -> None: """ Arguments: r : (float, list) constant radius or list of radii. res : (int) resolution, number of the sides of the tube c : (color) constant color or list of colors for each point. Example: Create a tube along a line, with data associated to each point: ```python from vedo import * line = Line([(0,0,0), (1,1,1), (2,0,1), (3,1,0)]).lw(5) scalars = np.array([0, 1, 2, 3]) line.pointdata["myscalars"] = scalars tube = Tube(line, r=0.1).lw(1) tube.cmap('viridis', "myscalars").add_scalarbar3d() show(line, tube, axes=1).close() ``` Examples: - [ribbon.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/ribbon.py) - [tube_radii.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/tube_radii.py) ![](https://vedo.embl.es/images/basic/tube.png) """ if utils.is_sequence(points): vpoints = vtki.vtkPoints() idx = len(points) for p in points: vpoints.InsertNextPoint(p) line = vtki.new("PolyLine") line.GetPointIds().SetNumberOfIds(idx) for i in range(idx): line.GetPointIds().SetId(i, i) lines = vtki.vtkCellArray() lines.InsertNextCell(line) polyln = vtki.vtkPolyData() polyln.SetPoints(vpoints) polyln.SetLines(lines) self.base = np.asarray(points[0], dtype=float) self.top = np.asarray(points[-1], dtype=float) elif isinstance(points, Mesh): polyln = points.dataset n = polyln.GetNumberOfPoints() self.base = np.array(polyln.GetPoint(0)) self.top = np.array(polyln.GetPoint(n - 1)) # from vtkmodules.vtkFiltersCore import vtkTubeBender # bender = vtkTubeBender() # bender.SetInputData(polyln) # bender.SetRadius(r) # bender.Update() # polyln = bender.GetOutput() tuf = vtki.new("TubeFilter") tuf.SetCapping(cap) tuf.SetNumberOfSides(res) tuf.SetInputData(polyln) if utils.is_sequence(r): arr = utils.numpy2vtk(r, dtype=float) arr.SetName("TubeRadius") polyln.GetPointData().AddArray(arr) polyln.GetPointData().SetActiveScalars("TubeRadius") tuf.SetVaryRadiusToVaryRadiusByAbsoluteScalar() else: tuf.SetRadius(r) usingColScals = False if utils.is_sequence(c): usingColScals = True cc = vtki.vtkUnsignedCharArray() cc.SetName("TubeColors") cc.SetNumberOfComponents(3) cc.SetNumberOfTuples(len(c)) for i, ic in enumerate(c): r, g, b = get_color(ic) cc.InsertTuple3(i, int(255 * r), int(255 * g), int(255 * b)) polyln.GetPointData().AddArray(cc) c = None tuf.Update() super().__init__(tuf.GetOutput(), c, alpha) self.phong() if usingColScals: self.mapper.SetScalarModeToUsePointFieldData() self.mapper.ScalarVisibilityOn() self.mapper.SelectColorArray("TubeColors") self.mapper.Modified() self.name = "Tube" def ThickTube(pts, r1, r2, res=12, c=None, alpha=1.0) -> Union["Mesh", None]: """ Create a tube with a thickness along a line of points. Example: ```python from vedo import * pts = [[sin(x), cos(x), x/3] for x in np.arange(0.1, 3, 0.3)] vline = Line(pts, lw=5, c='red5') thick_tube = ThickTube(vline, r1=0.2, r2=0.3).lw(1) show(vline, thick_tube, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/thick_tube.png) """ def make_cap(t1, t2): newpoints = t1.coordinates.tolist() + t2.coordinates.tolist() newfaces = [] for i in range(n - 1): newfaces.append([i, i + 1, i + n]) newfaces.append([i + n, i + 1, i + n + 1]) newfaces.append([2 * n - 1, 0, n]) newfaces.append([2 * n - 1, n - 1, 0]) capm = utils.buildPolyData(newpoints, newfaces) return capm assert r1 < r2 t1 = Tube(pts, r=r1, cap=False, res=res) t2 = Tube(pts, r=r2, cap=False, res=res) tc1a, tc1b = t1.boundaries().split() tc2a, tc2b = t2.boundaries().split() n = tc1b.npoints tc1b.join(reset=True).clean() # needed because indices are flipped tc2b.join(reset=True).clean() capa = make_cap(tc1a, tc2a) capb = make_cap(tc1b, tc2b) thick_tube = merge(t1, t2, capa, capb) if thick_tube: thick_tube.c(c).alpha(alpha) thick_tube.base = t1.base thick_tube.top = t1.top thick_tube.name = "ThickTube" return thick_tube return None class Tubes(Mesh): """ Build tubes around a `Lines` object. """ def __init__( self, lines, r=1, vary_radius_by_scalar=False, vary_radius_by_vector=False, vary_radius_by_vector_norm=False, vary_radius_by_absolute_scalar=False, max_radius_factor=100, cap=True, res=12 ) -> None: """ Wrap tubes around the input `Lines` object. Arguments: lines : (Lines) input Lines object. r : (float) constant radius vary_radius_by_scalar : (bool) use scalar array to control radius vary_radius_by_vector : (bool) use vector array to control radius vary_radius_by_vector_norm : (bool) use vector norm to control radius vary_radius_by_absolute_scalar : (bool) use absolute scalar value to control radius max_radius_factor : (float) max tube radius as a multiple of the min radius cap : (bool) capping of the tube res : (int) resolution, number of the sides of the tube c : (color) constant color or list of colors for each point. Examples: - [streamlines1.py](https://github.com/marcomusy/vedo/blob/master/examples/volumetric/streamlines1.py) """ plines = lines.dataset if plines.GetNumberOfLines() == 0: vedo.logger.warning("Tubes(): input Lines is empty.") tuf = vtki.new("TubeFilter") if vary_radius_by_scalar: tuf.SetVaryRadiusToVaryRadiusByScalar() elif vary_radius_by_vector: tuf.SetVaryRadiusToVaryRadiusByVector() elif vary_radius_by_vector_norm: tuf.SetVaryRadiusToVaryRadiusByVectorNorm() elif vary_radius_by_absolute_scalar: tuf.SetVaryRadiusToVaryRadiusByAbsoluteScalar() tuf.SetRadius(r) tuf.SetCapping(cap) tuf.SetGenerateTCoords(0) tuf.SetSidesShareVertices(1) tuf.SetRadiusFactor(max_radius_factor) tuf.SetNumberOfSides(res) tuf.SetInputData(plines) tuf.Update() super().__init__(tuf.GetOutput()) self.name = "Tubes" class Ribbon(Mesh): """ Connect two lines to generate the surface inbetween. Set the mode by which to create the ruled surface. It also works with a single line in input. In this case the ribbon is formed by following the local plane of the line in space. """ def __init__( self, line1, line2=None, mode=0, closed=False, width=None, res=(200, 5), c="indigo3", alpha=1.0, ) -> None: """ Arguments: mode : (int) If mode=0, resample evenly the input lines (based on length) and generates triangle strips. If mode=1, use the existing points and walks around the polyline using existing points. closed : (bool) if True, join the last point with the first to form a closed surface res : (list) ribbon resolutions along the line and perpendicularly to it. Examples: - [ribbon.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/ribbon.py) ![](https://vedo.embl.es/images/basic/ribbon.png) """ if isinstance(line1, Points): line1 = line1.coordinates if isinstance(line2, Points): line2 = line2.coordinates elif line2 is None: ############################################# ribbon_filter = vtki.new("RibbonFilter") aline = Line(line1) ribbon_filter.SetInputData(aline.dataset) if width is None: width = aline.diagonal_size() / 20.0 ribbon_filter.SetWidth(width) ribbon_filter.Update() # convert triangle strips to polygons tris = vtki.new("TriangleFilter") tris.SetInputData(ribbon_filter.GetOutput()) tris.Update() super().__init__(tris.GetOutput(), c, alpha) self.name = "Ribbon" ############################################## return ###################################### ############################################## line1 = np.asarray(line1) line2 = np.asarray(line2) if closed: line1 = line1.tolist() line1 += [line1[0]] line2 = line2.tolist() line2 += [line2[0]] line1 = np.array(line1) line2 = np.array(line2) if len(line1[0]) == 2: line1 = np.c_[line1, np.zeros(len(line1))] if len(line2[0]) == 2: line2 = np.c_[line2, np.zeros(len(line2))] ppoints1 = vtki.vtkPoints() # Generate the polyline1 ppoints1.SetData(utils.numpy2vtk(line1, dtype=np.float32)) lines1 = vtki.vtkCellArray() lines1.InsertNextCell(len(line1)) for i in range(len(line1)): lines1.InsertCellPoint(i) poly1 = vtki.vtkPolyData() poly1.SetPoints(ppoints1) poly1.SetLines(lines1) ppoints2 = vtki.vtkPoints() # Generate the polyline2 ppoints2.SetData(utils.numpy2vtk(line2, dtype=np.float32)) lines2 = vtki.vtkCellArray() lines2.InsertNextCell(len(line2)) for i in range(len(line2)): lines2.InsertCellPoint(i) poly2 = vtki.vtkPolyData() poly2.SetPoints(ppoints2) poly2.SetLines(lines2) # build the lines lines1 = vtki.vtkCellArray() lines1.InsertNextCell(poly1.GetNumberOfPoints()) for i in range(poly1.GetNumberOfPoints()): lines1.InsertCellPoint(i) polygon1 = vtki.vtkPolyData() polygon1.SetPoints(ppoints1) polygon1.SetLines(lines1) lines2 = vtki.vtkCellArray() lines2.InsertNextCell(poly2.GetNumberOfPoints()) for i in range(poly2.GetNumberOfPoints()): lines2.InsertCellPoint(i) polygon2 = vtki.vtkPolyData() polygon2.SetPoints(ppoints2) polygon2.SetLines(lines2) merged_pd = vtki.new("AppendPolyData") merged_pd.AddInputData(polygon1) merged_pd.AddInputData(polygon2) merged_pd.Update() rsf = vtki.new("RuledSurfaceFilter") rsf.CloseSurfaceOff() rsf.SetRuledMode(mode) rsf.SetResolution(res[0], res[1]) rsf.SetInputData(merged_pd.GetOutput()) rsf.Update() # convert triangle strips to polygons tris = vtki.new("TriangleFilter") tris.SetInputData(rsf.GetOutput()) tris.Update() out = tris.GetOutput() super().__init__(out, c, alpha) self.name = "Ribbon" class Arrow(Mesh): """ Build a 3D arrow from `start_pt` to `end_pt` of section size `s`, expressed as the fraction of the window size. """ def __init__( self, start_pt=(0, 0, 0), end_pt=(1, 0, 0), s=None, shaft_radius=None, head_radius=None, head_length=None, res=12, c="r4", alpha=1.0, ) -> None: """ If `c` is a `float` less than 1, the arrow is rendered as a in a color scale from white to red. .. note:: If `s=None` the arrow is scaled proportionally to its length ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestOrientedArrow.png) """ # in case user is passing meshs if isinstance(start_pt, vtki.vtkActor): start_pt = start_pt.GetPosition() if isinstance(end_pt, vtki.vtkActor): end_pt = end_pt.GetPosition() axis = np.asarray(end_pt) - np.asarray(start_pt) length = float(np.linalg.norm(axis)) if length: axis = axis / length if len(axis) < 3: # its 2d theta = np.pi / 2 start_pt = [start_pt[0], start_pt[1], 0.0] end_pt = [end_pt[0], end_pt[1], 0.0] else: theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) self.source = vtki.new("ArrowSource") self.source.SetShaftResolution(res) self.source.SetTipResolution(res) if s: sz = 0.02 self.source.SetTipRadius(sz) self.source.SetShaftRadius(sz / 1.75) self.source.SetTipLength(sz * 15) if head_length: self.source.SetTipLength(head_length) if head_radius: self.source.SetTipRadius(head_radius) if shaft_radius: self.source.SetShaftRadius(shaft_radius) self.source.Update() t = vtki.vtkTransform() t.Translate(start_pt) t.RotateZ(np.rad2deg(phi)) t.RotateY(np.rad2deg(theta)) t.RotateY(-90) # put it along Z if s: sz = 800 * s t.Scale(length, sz, sz) else: t.Scale(length, length, length) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(self.source.GetOutput()) tf.SetTransform(t) tf.Update() super().__init__(tf.GetOutput(), c, alpha) self.transform = LinearTransform().translate(start_pt) self.phong().lighting("plastic") self.actor.PickableOff() self.actor.DragableOff() self.base = np.array(start_pt, dtype=float) # used by pyplot self.top = np.array(end_pt, dtype=float) # used by pyplot self.top_index = self.source.GetTipResolution() * 4 self.fill = True # used by pyplot.__iadd__() self.s = s if s is not None else 1 # used by pyplot.__iadd__() self.name = "Arrow" def top_point(self): """Return the current coordinates of the tip of the Arrow.""" return self.transform.transform_point(self.top) def base_point(self): """Return the current coordinates of the base of the Arrow.""" return self.transform.transform_point(self.base) class Arrows(Glyph): """ Build arrows between two lists of points. """ def __init__( self, start_pts, end_pts=None, s=None, shaft_radius=None, head_radius=None, head_length=None, thickness=1.0, res=6, c='k3', alpha=1.0, ) -> None: """ Build arrows between two lists of points `start_pts` and `end_pts`. `start_pts` can be also passed in the form `[[point1, point2], ...]`. Color can be specified as a colormap which maps the size of the arrows. Arguments: s : (float) fix aspect-ratio of the arrow and scale its cross section c : (color) color or color map name alpha : (float) set object opacity res : (int) set arrow resolution Examples: - [glyphs2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs2.py) ![](https://user-images.githubusercontent.com/32848391/55897850-a1a0da80-5bc1-11e9-81e0-004c8f396b43.jpg) """ if isinstance(start_pts, Points): start_pts = start_pts.coordinates if isinstance(end_pts, Points): end_pts = end_pts.coordinates start_pts = np.asarray(start_pts) if end_pts is None: strt = start_pts[:, 0] end_pts = start_pts[:, 1] start_pts = strt else: end_pts = np.asarray(end_pts) start_pts = utils.make3d(start_pts) end_pts = utils.make3d(end_pts) arr = vtki.new("ArrowSource") arr.SetShaftResolution(res) arr.SetTipResolution(res) if s: sz = 0.02 * s arr.SetTipRadius(sz * 2) arr.SetShaftRadius(sz * thickness) arr.SetTipLength(sz * 10) if head_radius: arr.SetTipRadius(head_radius) if shaft_radius: arr.SetShaftRadius(shaft_radius) if head_length: arr.SetTipLength(head_length) arr.Update() out = arr.GetOutput() orients = end_pts - start_pts color_by_vector_size = utils.is_sequence(c) or c in cmaps_names super().__init__( start_pts, out, orientation_array=orients, scale_by_vector_size=True, color_by_vector_size=color_by_vector_size, c=c, alpha=alpha, ) self.lighting("off") if color_by_vector_size: vals = np.linalg.norm(orients, axis=1) self.mapper.SetScalarRange(vals.min(), vals.max()) else: self.c(c) self.name = "Arrows" class Arrow2D(Mesh): """ Build a 2D arrow. """ def __init__( self, start_pt=(0, 0, 0), end_pt=(1, 0, 0), s=1, rotation=0.0, shaft_length=0.85, shaft_width=0.055, head_length=0.175, head_width=0.175, fill=True, c="red4", alpha=1.0, ) -> None: """ Build a 2D arrow from `start_pt` to `end_pt`. Arguments: s : (float) a global multiplicative convenience factor controlling the arrow size shaft_length : (float) fractional shaft length shaft_width : (float) fractional shaft width head_length : (float) fractional head length head_width : (float) fractional head width fill : (bool) if False only generate the outline """ self.fill = fill ## needed by pyplot.__iadd() self.s = s ## needed by pyplot.__iadd() if s != 1: shaft_width *= s head_width *= np.sqrt(s) # in case user is passing meshs if isinstance(start_pt, vtki.vtkActor): start_pt = start_pt.GetPosition() if isinstance(end_pt, vtki.vtkActor): end_pt = end_pt.GetPosition() if len(start_pt) == 2: start_pt = [start_pt[0], start_pt[1], 0] if len(end_pt) == 2: end_pt = [end_pt[0], end_pt[1], 0] headBase = 1 - head_length head_width = max(head_width, shaft_width) if head_length is None or headBase > shaft_length: headBase = shaft_length verts = [] verts.append([0, -shaft_width / 2, 0]) verts.append([shaft_length, -shaft_width / 2, 0]) verts.append([headBase, -head_width / 2, 0]) verts.append([1, 0, 0]) verts.append([headBase, head_width / 2, 0]) verts.append([shaft_length, shaft_width / 2, 0]) verts.append([0, shaft_width / 2, 0]) if fill: faces = ((0, 1, 3, 5, 6), (5, 3, 4), (1, 2, 3)) poly = utils.buildPolyData(verts, faces) else: lines = (0, 1, 2, 3, 4, 5, 6, 0) poly = utils.buildPolyData(verts, [], lines=lines) axis = np.array(end_pt) - np.array(start_pt) length = float(np.linalg.norm(axis)) if length: axis = axis / length theta = 0 if len(axis) > 2: theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) t = vtki.vtkTransform() t.Translate(start_pt) if phi: t.RotateZ(np.rad2deg(phi)) if theta: t.RotateY(np.rad2deg(theta)) t.RotateY(-90) # put it along Z if rotation: t.RotateX(rotation) t.Scale(length, length, length) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(poly) tf.SetTransform(t) tf.Update() super().__init__(tf.GetOutput(), c, alpha) self.transform = LinearTransform().translate(start_pt) self.lighting("off") self.actor.DragableOff() self.actor.PickableOff() self.base = np.array(start_pt, dtype=float) # used by pyplot self.top = np.array(end_pt, dtype=float) # used by pyplot self.name = "Arrow2D" class Arrows2D(Glyph): """ Build 2D arrows between two lists of points. """ def __init__( self, start_pts, end_pts=None, s=1.0, rotation=0.0, shaft_length=0.8, shaft_width=0.05, head_length=0.225, head_width=0.175, fill=True, c=None, alpha=1.0, ) -> None: """ Build 2D arrows between two lists of points `start_pts` and `end_pts`. `start_pts` can be also passed in the form `[[point1, point2], ...]`. Color can be specified as a colormap which maps the size of the arrows. Arguments: shaft_length : (float) fractional shaft length shaft_width : (float) fractional shaft width head_length : (float) fractional head length head_width : (float) fractional head width fill : (bool) if False only generate the outline """ if isinstance(start_pts, Points): start_pts = start_pts.coordinates if isinstance(end_pts, Points): end_pts = end_pts.coordinates start_pts = np.asarray(start_pts, dtype=float) if end_pts is None: strt = start_pts[:, 0] end_pts = start_pts[:, 1] start_pts = strt else: end_pts = np.asarray(end_pts, dtype=float) if head_length is None: head_length = 1 - shaft_length arr = Arrow2D( (0, 0, 0), (1, 0, 0), s=s, rotation=rotation, shaft_length=shaft_length, shaft_width=shaft_width, head_length=head_length, head_width=head_width, fill=fill, ) orients = end_pts - start_pts orients = utils.make3d(orients) pts = Points(start_pts) super().__init__( pts, arr, orientation_array=orients, scale_by_vector_size=True, c=c, alpha=alpha, ) self.flat().lighting("off").pickable(False) if c is not None: self.color(c) self.name = "Arrows2D" class FlatArrow(Ribbon): """ Build a 2D arrow in 3D space by joining two close lines. """ def __init__(self, line1, line2, tip_size=1.0, tip_width=1.0) -> None: """ Build a 2D arrow in 3D space by joining two close lines. Examples: - [flatarrow.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/flatarrow.py) ![](https://vedo.embl.es/images/basic/flatarrow.png) """ if isinstance(line1, Points): line1 = line1.coordinates if isinstance(line2, Points): line2 = line2.coordinates sm1, sm2 = np.array(line1[-1], dtype=float), np.array(line2[-1], dtype=float) v = (sm1 - sm2) / 3 * tip_width p1 = sm1 + v p2 = sm2 - v pm1 = (sm1 + sm2) / 2 pm2 = (np.array(line1[-2]) + np.array(line2[-2])) / 2 pm12 = pm1 - pm2 tip = pm12 / np.linalg.norm(pm12) * np.linalg.norm(v) * 3 * tip_size / tip_width + pm1 line1.append(p1) line1.append(tip) line2.append(p2) line2.append(tip) resm = max(100, len(line1)) super().__init__(line1, line2, res=(resm, 1)) self.phong().lighting("off") self.actor.PickableOff() self.actor.DragableOff() self.name = "FlatArrow" class Triangle(Mesh): """Create a triangle from 3 points in space.""" def __init__(self, p1, p2, p3, c="green7", alpha=1.0) -> None: """Create a triangle from 3 points in space.""" super().__init__([[p1, p2, p3], [[0, 1, 2]]], c, alpha) self.properties.LightingOff() self.name = "Triangle" class Polygon(Mesh): """ Build a polygon in the `xy` plane. """ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0) -> None: """ Build a polygon in the `xy` plane of `nsides` of radius `r`. ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestRegularPolygonSource.png) """ t = np.linspace(np.pi / 2, 5 / 2 * np.pi, num=nsides, endpoint=False) pts = pol2cart(np.ones_like(t) * r, t).T faces = [list(range(nsides))] # do not use: vtkRegularPolygonSource super().__init__([pts, faces], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.pos(pos) self.properties.LightingOff() self.name = "Polygon " + str(nsides) class Circle(Polygon): """ Build a Circle of radius `r`. """ def __init__(self, pos=(0, 0, 0), r=1.0, res=120, c="gray5", alpha=1.0) -> None: """ Build a Circle of radius `r`. """ super().__init__(pos, nsides=res, r=r) self.nr_of_points = 0 self.va = 0 self.vb = 0 self.axis1: List[float] = [] self.axis2: List[float] = [] self.center: List[float] = [] # filled by pointcloud.pca_ellipse() self.pvalue = 0.0 # filled by pointcloud.pca_ellipse() self.alpha(alpha).c(c) self.name = "Circle" def acircularity(self) -> float: """ Return a measure of how different an ellipse is from a circle. Values close to zero correspond to a circular object. """ a, b = self.va, self.vb value = 0.0 if a+b: value = ((a-b)/(a+b))**2 return value class GeoCircle(Polygon): """ Build a Circle of radius `r`. """ def __init__(self, lat, lon, r=1.0, res=60, c="red4", alpha=1.0) -> None: """ Build a Circle of radius `r` as projected on a geographic map. Circles near the poles will look very squashed. See example: ```bash vedo -r earthquake ``` """ coords = [] sinr, cosr = np.sin(r), np.cos(r) sinlat, coslat = np.sin(lat), np.cos(lat) for phi in np.linspace(0, 2 * np.pi, num=res, endpoint=False): clat = np.arcsin(sinlat * cosr + coslat * sinr * np.cos(phi)) clng = lon + np.arctan2(np.sin(phi) * sinr * coslat, cosr - sinlat * np.sin(clat)) coords.append([clng / np.pi + 1, clat * 2 / np.pi + 1, 0]) super().__init__(nsides=res, c=c, alpha=alpha) self.coordinates = coords # warp polygon points to match geo projection self.name = "Circle" class Star(Mesh): """ Build a 2D star shape. """ def __init__(self, pos=(0, 0, 0), n=5, r1=0.7, r2=1.0, line=False, c="blue6", alpha=1.0) -> None: """ Build a 2D star shape of `n` cusps of inner radius `r1` and outer radius `r2`. If line is True then only build the outer line (no internal surface meshing). Example: - [extrude.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/extrude.py) ![](https://vedo.embl.es/images/basic/extrude.png) """ t = np.linspace(np.pi / 2, 5 / 2 * np.pi, num=n, endpoint=False) x, y = pol2cart(np.ones_like(t) * r2, t) pts = np.c_[x, y, np.zeros_like(x)] apts = [] for i, p in enumerate(pts): apts.append(p) if i + 1 < n: apts.append((p + pts[i + 1]) / 2 * r1 / r2) apts.append((pts[-1] + pts[0]) / 2 * r1 / r2) if line: apts.append(pts[0]) poly = utils.buildPolyData(apts, lines=list(range(len(apts)))) super().__init__(poly, c, alpha) self.lw(2) else: apts.append((0, 0, 0)) cells = [] for i in range(2 * n - 1): cell = [2 * n, i, i + 1] cells.append(cell) cells.append([2 * n, i + 1, 0]) super().__init__([apts, cells], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.properties.LightingOff() self.name = "Star" class Disc(Mesh): """ Build a 2D disc. """ def __init__( self, pos=(0, 0, 0), r1=0.5, r2=1.0, res=(1, 120), angle_range=(), c="gray4", alpha=1.0 ) -> None: """ Build a 2D disc of inner radius `r1` and outer radius `r2`. Set `res` as the resolution in R and Phi (can be a list). Use `angle_range` to create a disc sector between the 2 specified angles. ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestDisk.png) """ if utils.is_sequence(res): res_r, res_phi = res else: res_r, res_phi = res, 12 * res if len(angle_range) == 0: ps = vtki.new("DiskSource") else: ps = vtki.new("SectorSource") ps.SetStartAngle(angle_range[0]) ps.SetEndAngle(angle_range[1]) ps.SetInnerRadius(r1) ps.SetOuterRadius(r2) ps.SetRadialResolution(res_r) ps.SetCircumferentialResolution(res_phi) ps.Update() super().__init__(ps.GetOutput(), c, alpha) self.flat() self.pos(utils.make3d(pos)) self.name = "Disc" class IcoSphere(Mesh): """ Create a sphere made of a uniform triangle mesh. """ def __init__(self, pos=(0, 0, 0), r=1.0, subdivisions=4, c="r5", alpha=1.0) -> None: """ Create a sphere made of a uniform triangle mesh (from recursive subdivision of an icosahedron). Example: ```python from vedo import * icos = IcoSphere(subdivisions=3) icos.compute_quality().cmap('coolwarm') icos.show(axes=1).close() ``` ![](https://vedo.embl.es/images/basic/icosphere.jpg) """ subdivisions = int(min(subdivisions, 9)) # to avoid disasters t = (1.0 + np.sqrt(5.0)) / 2.0 points = np.array( [ [-1, t, 0], [1, t, 0], [-1, -t, 0], [1, -t, 0], [0, -1, t], [0, 1, t], [0, -1, -t], [0, 1, -t], [t, 0, -1], [t, 0, 1], [-t, 0, -1], [-t, 0, 1], ] ) faces = [ [0, 11, 5], [0, 5, 1], [0, 1, 7], [0, 7, 10], [0, 10, 11], [1, 5, 9], [5, 11, 4], [11, 10, 2], [10, 7, 6], [7, 1, 8], [3, 9, 4], [3, 4, 2], [3, 2, 6], [3, 6, 8], [3, 8, 9], [4, 9, 5], [2, 4, 11], [6, 2, 10], [8, 6, 7], [9, 8, 1], ] super().__init__([points * r, faces], c=c, alpha=alpha) for _ in range(subdivisions): self.subdivide(method=1) pts = utils.versor(self.coordinates) * r self.coordinates = pts self.pos(pos) self.name = "IcoSphere" class Sphere(Mesh): """ Build a sphere. """ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) -> None: """ Build a sphere at position `pos` of radius `r`. Arguments: r : (float) sphere radius res : (int, list) resolution in phi, resolution in theta is by default `2*res` quads : (bool) sphere mesh will be made of quads instead of triangles [](https://user-images.githubusercontent.com/32848391/72433092-f0a31e00-3798-11ea-85f7-b2f5fcc31568.png) """ if len(pos) == 2: pos = np.asarray([pos[0], pos[1], 0]) self.radius = r # used by fitSphere self.center = pos self.residue = 0 if quads: res = max(res, 4) img = vtki.vtkImageData() img.SetDimensions(res - 1, res - 1, res - 1) rs = 1.0 / (res - 2) img.SetSpacing(rs, rs, rs) gf = vtki.new("GeometryFilter") gf.SetInputData(img) gf.Update() super().__init__(gf.GetOutput(), c, alpha) self.lw(0.1) cgpts = self.coordinates - (0.5, 0.5, 0.5) x, y, z = cgpts.T x = x * (1 + x * x) / 2 y = y * (1 + y * y) / 2 z = z * (1 + z * z) / 2 _, theta, phi = cart2spher(x, y, z) pts = spher2cart(np.ones_like(phi) * r, theta, phi).T self.coordinates = pts else: if utils.is_sequence(res): res_t, res_phi = res else: res_t, res_phi = 2 * res, res ss = vtki.new("SphereSource") ss.SetRadius(r) ss.SetThetaResolution(res_t) ss.SetPhiResolution(res_phi) ss.Update() super().__init__(ss.GetOutput(), c, alpha) self.phong() self.pos(pos) self.name = "Sphere" class Spheres(Mesh): """ Build a large set of spheres. """ def __init__(self, centers, r=1.0, res=8, c="red5", alpha=1) -> None: """ Build a (possibly large) set of spheres at `centers` of radius `r`. Either `c` or `r` can be a list of RGB colors or radii. Examples: - [manyspheres.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/manyspheres.py) ![](https://vedo.embl.es/images/basic/manyspheres.jpg) """ if isinstance(centers, Points): centers = centers.coordinates centers = np.asarray(centers, dtype=float) base = centers[0] cisseq = False if utils.is_sequence(c): cisseq = True if cisseq: if len(centers) != len(c): vedo.logger.error(f"mismatch #centers {len(centers)} != {len(c)} #colors") raise RuntimeError() risseq = False if utils.is_sequence(r): risseq = True if risseq: if len(centers) != len(r): vedo.logger.error(f"mismatch #centers {len(centers)} != {len(r)} #radii") raise RuntimeError() if cisseq and risseq: vedo.logger.error("Limitation: c and r cannot be both sequences.") raise RuntimeError() src = vtki.new("SphereSource") if not risseq: src.SetRadius(r) if utils.is_sequence(res): res_t, res_phi = res else: res_t, res_phi = 2 * res, res src.SetThetaResolution(res_t) src.SetPhiResolution(res_phi) src.Update() psrc = vtki.new("PointSource") psrc.SetNumberOfPoints(len(centers)) psrc.Update() pd = psrc.GetOutput() vpts = pd.GetPoints() glyph = vtki.vtkGlyph3D() glyph.SetSourceConnection(src.GetOutputPort()) if cisseq: glyph.SetColorModeToColorByScalar() ucols = vtki.vtkUnsignedCharArray() ucols.SetNumberOfComponents(3) ucols.SetName("Colors") for acol in c: cx, cy, cz = get_color(acol) ucols.InsertNextTuple3(cx * 255, cy * 255, cz * 255) pd.GetPointData().AddArray(ucols) pd.GetPointData().SetActiveScalars("Colors") glyph.ScalingOff() elif risseq: glyph.SetScaleModeToScaleByScalar() urads = utils.numpy2vtk(2 * np.ascontiguousarray(r), dtype=np.float32) urads.SetName("Radii") pd.GetPointData().AddArray(urads) pd.GetPointData().SetActiveScalars("Radii") vpts.SetData(utils.numpy2vtk(centers - base, dtype=np.float32)) glyph.SetInputData(pd) glyph.Update() super().__init__(glyph.GetOutput(), alpha=alpha) self.pos(base) self.phong() if cisseq: self.mapper.ScalarVisibilityOn() else: self.mapper.ScalarVisibilityOff() self.c(c) self.name = "Spheres" class Earth(Mesh): """ Build a textured mesh representing the Earth. """ def __init__(self, style=1, r=1.0) -> None: """ Build a textured mesh representing the Earth. Example: - [geodesic_curve.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/geodesic_curve.py) ![](https://vedo.embl.es/images/advanced/geodesic.png) """ tss = vtki.new("TexturedSphereSource") tss.SetRadius(r) tss.SetThetaResolution(72) tss.SetPhiResolution(36) tss.Update() super().__init__(tss.GetOutput(), c="w") atext = vtki.vtkTexture() pnm_reader = vtki.new("JPEGReader") fn = vedo.file_io.download(vedo.dataurl + f"textures/earth{style}.jpg", verbose=False) pnm_reader.SetFileName(fn) atext.SetInputConnection(pnm_reader.GetOutputPort()) atext.InterpolateOn() self.texture(atext) self.name = "Earth" class Ellipsoid(Mesh): """Build a 3D ellipsoid.""" def __init__( self, pos=(0, 0, 0), axis1=(0.5, 0, 0), axis2=(0, 1, 0), axis3=(0, 0, 1.5), res=24, c="cyan4", alpha=1.0, ) -> None: """ Build a 3D ellipsoid centered at position `pos`. Arguments: axis1 : (list) First axis. Length corresponds to semi-axis. axis2 : (list) Second axis. Length corresponds to semi-axis. axis3 : (list) Third axis. Length corresponds to semi-axis. """ self.center = utils.make3d(pos) self.axis1 = utils.make3d(axis1) self.axis2 = utils.make3d(axis2) self.axis3 = utils.make3d(axis3) self.va = np.linalg.norm(self.axis1) self.vb = np.linalg.norm(self.axis2) self.vc = np.linalg.norm(self.axis3) self.va_error = 0 self.vb_error = 0 self.vc_error = 0 self.nr_of_points = 1 # used by pointcloud.pca_ellipsoid() self.pvalue = 0 # used by pointcloud.pca_ellipsoid() if utils.is_sequence(res): res_t, res_phi = res else: res_t, res_phi = 2 * res, res elli_source = vtki.new("SphereSource") elli_source.SetRadius(1) elli_source.SetThetaResolution(res_t) elli_source.SetPhiResolution(res_phi) elli_source.Update() super().__init__(elli_source.GetOutput(), c, alpha) matrix = np.c_[self.axis1, self.axis2, self.axis3] lt = LinearTransform(matrix).translate(pos) self.apply_transform(lt) self.name = "Ellipsoid" def asphericity(self) -> float: """ Return a measure of how different an ellipsoid is from a sphere. Values close to zero correspond to a spheric object. """ a, b, c = self.va, self.vb, self.vc asp = ( ((a-b)/(a+b))**2 + ((a-c)/(a+c))**2 + ((b-c)/(b+c))**2 ) / 3. * 4. return float(asp) def asphericity_error(self) -> float: """ Calculate statistical error on the asphericity value. Errors on the main axes are stored in `Ellipsoid.va_error`, Ellipsoid.vb_error` and `Ellipsoid.vc_error`. """ a, b, c = self.va, self.vb, self.vc sqrtn = np.sqrt(self.nr_of_points) ea, eb, ec = a / 2 / sqrtn, b / 2 / sqrtn, b / 2 / sqrtn # from sympy import * # init_printing(use_unicode=True) # a, b, c, ea, eb, ec = symbols("a b c, ea, eb,ec") # L = ( # (((a - b) / (a + b)) ** 2 + ((c - b) / (c + b)) ** 2 + ((a - c) / (a + c)) ** 2) # / 3 * 4) # dl2 = (diff(L, a) * ea) ** 2 + (diff(L, b) * eb) ** 2 + (diff(L, c) * ec) ** 2 # print(dl2) # exit() dL2 = ( ea ** 2 * ( -8 * (a - b) ** 2 / (3 * (a + b) ** 3) - 8 * (a - c) ** 2 / (3 * (a + c) ** 3) + 4 * (2 * a - 2 * c) / (3 * (a + c) ** 2) + 4 * (2 * a - 2 * b) / (3 * (a + b) ** 2) ) ** 2 + eb ** 2 * ( 4 * (-2 * a + 2 * b) / (3 * (a + b) ** 2) - 8 * (a - b) ** 2 / (3 * (a + b) ** 3) - 8 * (-b + c) ** 2 / (3 * (b + c) ** 3) + 4 * (2 * b - 2 * c) / (3 * (b + c) ** 2) ) ** 2 + ec ** 2 * ( 4 * (-2 * a + 2 * c) / (3 * (a + c) ** 2) - 8 * (a - c) ** 2 / (3 * (a + c) ** 3) + 4 * (-2 * b + 2 * c) / (3 * (b + c) ** 2) - 8 * (-b + c) ** 2 / (3 * (b + c) ** 3) ) ** 2 ) err = np.sqrt(dL2) self.va_error = ea self.vb_error = eb self.vc_error = ec return err class Grid(Mesh): """ An even or uneven 2D grid. """ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1.0) -> None: """ Create an even or uneven 2D grid. Can also be created from a `np.mgrid` object (see example). Arguments: pos : (list, Points, Mesh) position in space, can also be passed as a bounding box [xmin,xmax, ymin,ymax]. s : (float, list) if a float is provided it is interpreted as the total size along x and y, if a list of coords is provided they are interpreted as the vertices of the grid along x and y. In this case keyword `res` is ignored (see example below). res : (list) resolutions along x and y, e.i. the number of subdivisions lw : (int) line width Example: ```python from vedo import * xcoords = np.arange(0, 2, 0.2) ycoords = np.arange(0, 1, 0.2) sqrtx = sqrt(xcoords) grid = Grid(s=(sqrtx, ycoords)).lw(2) grid.show(axes=8).close() # Can also create a grid from a np.mgrid: X, Y = np.mgrid[-12:12:10*1j, 200:215:10*1j] vgrid = Grid(s=(X[:,0], Y[0])) vgrid.show(axes=8).close() ``` ![](https://vedo.embl.es/images/feats/uneven_grid.png) """ resx, resy = res sx, sy = s try: bb = pos.bounds() pos = [(bb[0] + bb[1])/2, (bb[2] + bb[3])/2, (bb[4] + bb[5])/2] sx = bb[1] - bb[0] sy = bb[3] - bb[2] except AttributeError: pass if len(pos) == 2: pos = (pos[0], pos[1], 0) elif len(pos) in [4,6]: # passing a bounding box bb = pos pos = [(bb[0] + bb[1])/2, (bb[2] + bb[3])/2, 0] sx = bb[1] - bb[0] sy = bb[3] - bb[2] if len(pos)==6: pos[2] = bb[4] - bb[5] if utils.is_sequence(sx) and utils.is_sequence(sy): verts = [] for y in sy: for x in sx: verts.append([x, y, 0]) faces = [] n = len(sx) m = len(sy) for j in range(m - 1): j1n = (j + 1) * n for i in range(n - 1): faces.append([i + j * n, i + 1 + j * n, i + 1 + j1n, i + j1n]) super().__init__([verts, faces], c, alpha) else: ps = vtki.new("PlaneSource") ps.SetResolution(resx, resy) ps.Update() t = vtki.vtkTransform() t.Translate(pos) t.Scale(sx, sy, 1) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(ps.GetOutput()) tf.SetTransform(t) tf.Update() super().__init__(tf.GetOutput(), c, alpha) self.wireframe().lw(lw) self.properties.LightingOff() self.name = "Grid" class Plane(Mesh): """Create a plane in space.""" def __init__( self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), edge_direction=(), c="gray5", alpha=1.0, ) -> None: """ Create a plane of size `s=(xsize, ysize)` oriented perpendicular to vector `normal` so that it passes through point `pos`, optionally aligning an edge with `direction`. Arguments: pos : (list) position of the plane center normal : (list) normal vector to the plane s : (list) size of the plane along x and y res : (list) resolution of the plane along x and y edge_direction : (list) direction vector to align one edge of the plane """ if isinstance(pos, vtki.vtkPolyData): super().__init__(pos, c, alpha) else: ps = vtki.new("PlaneSource") ps.SetResolution(res[0], res[1]) tri = vtki.new("TriangleFilter") tri.SetInputConnection(ps.GetOutputPort()) tri.Update() super().__init__(tri.GetOutput(), c, alpha) pos = utils.make3d(pos) normal = np.asarray(normal, dtype=float) axis = normal / np.linalg.norm(normal) # Calculate orientation using normal theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) t = LinearTransform() t.scale([s[0], s[1], 1]) # Rotate to align normal t.rotate_y(np.rad2deg(theta)) t.rotate_z(np.rad2deg(phi)) # Additional direction alignment if len(edge_direction) >= 2: direction = utils.make3d(edge_direction).astype(float) direction /= np.linalg.norm(direction) if s[0] <= s[1]: current_direction = np.asarray([0,1,0]) else: current_direction = np.asarray([1,0,0]) transformed_current_direction = t.transform_point(current_direction) n = transformed_current_direction / np.linalg.norm(transformed_current_direction) if np.linalg.norm(transformed_current_direction) >= 1e-6: angle = np.arccos(np.dot(n, direction)) t.rotate(axis=axis, angle=np.rad2deg(angle)) t.translate(pos) self.apply_transform(t) self.lighting("off") self.name = "Plane" self.variance = 0 # used by pointcloud.fit_plane() def clone(self, deep=True) -> "Plane": newplane = Plane() if deep: newplane.dataset.DeepCopy(self.dataset) else: newplane.dataset.ShallowCopy(self.dataset) newplane.copy_properties_from(self) newplane.transform = self.transform.clone() newplane.variance = 0 return newplane @property def normal(self) -> np.ndarray: pts = self.coordinates # this is necessary because plane can have high resolution # p0, p1 = pts[0], pts[1] # AB = p1 - p0 # AB /= np.linalg.norm(AB) # for pt in pts[2:]: # AC = pt - p0 # AC /= np.linalg.norm(AC) # cosine_angle = np.dot(AB, AC) # if abs(cosine_angle) < 0.99: # normal = np.cross(AB, AC) # return normal / np.linalg.norm(normal) p0, p1, p2 = pts[0], pts[1], pts[int(len(pts)/2 +0.5)] AB = p1 - p0 AB /= np.linalg.norm(AB) AC = p2 - p0 AC /= np.linalg.norm(AC) normal = np.cross(AB, AC) return normal / np.linalg.norm(normal) @property def center(self) -> np.ndarray: pts = self.coordinates return np.mean(pts, axis=0) def contains(self, points, tol=0) -> np.ndarray: """ Check if each of the provided point lies on this plane. `points` is an array of shape (n, 3). """ points = np.array(points, dtype=float) bounds = self.coordinates mask = np.isclose(np.dot(points - self.center, self.normal), 0, atol=tol) for i in [1, 3]: AB = bounds[i] - bounds[0] AP = points - bounds[0] mask_l = np.less_equal(np.dot(AP, AB), np.linalg.norm(AB)) mask_g = np.greater_equal(np.dot(AP, AB), 0) mask = np.logical_and(mask, mask_l) mask = np.logical_and(mask, mask_g) return mask class Rectangle(Mesh): """ Build a rectangle in the xy plane. """ def __init__(self, p1=(0, 0), p2=(1, 1), radius=None, res=12, c="gray5", alpha=1.0) -> None: """ Build a rectangle in the xy plane identified by any two corner points. Arguments: p1 : (list) bottom-left position of the corner p2 : (list) top-right position of the corner radius : (float, list) smoothing radius of the corner in world units. A list can be passed with 4 individual values. """ if len(p1) == 2: p1 = np.array([p1[0], p1[1], 0.0]) else: p1 = np.array(p1, dtype=float) if len(p2) == 2: p2 = np.array([p2[0], p2[1], 0.0]) else: p2 = np.array(p2, dtype=float) self.corner1 = p1 self.corner2 = p2 color = c smoothr = False risseq = False if utils.is_sequence(radius): risseq = True smoothr = True if max(radius) == 0: smoothr = False elif radius: smoothr = True if not smoothr: radius = None self.radius = radius if smoothr: r = radius if not risseq: r = [r, r, r, r] rd, ra, rb, rc = r if p1[0] > p2[0]: # flip p1 - p2 p1, p2 = p2, p1 if p1[1] > p2[1]: # flip p1y - p2y p1[1], p2[1] = p2[1], p1[1] px, py, _ = p2 - p1 k = min(px / 2, py / 2) ra = min(abs(ra), k) rb = min(abs(rb), k) rc = min(abs(rc), k) rd = min(abs(rd), k) beta = np.linspace(0, 2 * np.pi, num=res * 4, endpoint=False) betas = np.split(beta, 4) rrx = np.cos(betas) rry = np.sin(betas) q1 = (rd, 0) # q2 = (px-ra, 0) q3 = (px, ra) # q4 = (px, py-rb) q5 = (px - rb, py) # q6 = (rc, py) q7 = (0, py - rc) # q8 = (0, rd) a = np.c_[rrx[3], rry[3]]*ra + [px-ra, ra] if ra else np.array([]) b = np.c_[rrx[0], rry[0]]*rb + [px-rb, py-rb] if rb else np.array([]) c = np.c_[rrx[1], rry[1]]*rc + [rc, py-rc] if rc else np.array([]) d = np.c_[rrx[2], rry[2]]*rd + [rd, rd] if rd else np.array([]) pts = [q1, *a.tolist(), q3, *b.tolist(), q5, *c.tolist(), q7, *d.tolist()] faces = [list(range(len(pts)))] else: p1r = np.array([p2[0], p1[1], 0.0]) p2l = np.array([p1[0], p2[1], 0.0]) pts = ([0.0, 0.0, 0.0], p1r - p1, p2 - p1, p2l - p1) faces = [(0, 1, 2, 3)] super().__init__([pts, faces], color, alpha) self.pos(p1) self.properties.LightingOff() self.name = "Rectangle" class Box(Mesh): """ Build a box of specified dimensions. """ def __init__( self, pos=(0, 0, 0), length=1.0, width=2.0, height=3.0, size=(), c="g4", alpha=1.0) -> None: """ Build a box of dimensions `x=length, y=width and z=height`. Alternatively dimensions can be defined by setting `size` keyword with a tuple. If `pos` is a list of 6 numbers, this will be interpreted as the bounding box: `[xmin,xmax, ymin,ymax, zmin,zmax]` Note that the shape polygonal data contains duplicated vertices. This is to allow each face to have its own normal, which is essential for some operations. Use the `clean()` method to remove duplicate points. Examples: - [aspring1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/aspring1.py) ![](https://vedo.embl.es/images/simulations/50738955-7e891800-11d9-11e9-85cd-02bd4f3f13ea.gif) """ src = vtki.new("CubeSource") if len(pos) == 2: pos = (pos[0], pos[1], 0) if len(pos) == 6: src.SetBounds(pos) pos = [(pos[0] + pos[1]) / 2, (pos[2] + pos[3]) / 2, (pos[4] + pos[5]) / 2] elif len(size) == 3: length, width, height = size src.SetXLength(length) src.SetYLength(width) src.SetZLength(height) src.SetCenter(pos) else: src.SetXLength(length) src.SetYLength(width) src.SetZLength(height) src.SetCenter(pos) src.Update() pd = src.GetOutput() tc = [ [0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0], [1.0, 1.0], [0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 1.0], [0.0, 0.0], [0.0, 1.0], [0.0, 0.0], [1.0, 1.0], [1.0, 0.0], [1.0, 0.0], [0.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0], ] vtc = utils.numpy2vtk(tc) pd.GetPointData().SetTCoords(vtc) super().__init__(pd, c, alpha) self.transform = LinearTransform().translate(pos) self.name = "Box" class Cube(Box): """ Build a cube shape. Note that the shape polygonal data contains duplicated vertices. This is to allow each face to have its own normal, which is essential for some operations. Use the `clean()` method to remove duplicate points. """ def __init__(self, pos=(0, 0, 0), side=1.0, c="g4", alpha=1.0) -> None: """Build a cube of size `side`.""" super().__init__(pos, side, side, side, (), c, alpha) self.name = "Cube" class TessellatedBox(Mesh): """ Build a cubic `Mesh` made of quads. """ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", alpha=0.5) -> None: """ Build a cubic `Mesh` made of `n` small quads in the 3 axis directions. Arguments: pos : (list) position of the left bottom corner n : (int, list) number of subdivisions along each side spacing : (float) size of the side of the single quad in the 3 directions """ if utils.is_sequence(n): # slow img = vtki.vtkImageData() img.SetDimensions(n[0] + 1, n[1] + 1, n[2] + 1) img.SetSpacing(spacing) gf = vtki.new("GeometryFilter") gf.SetInputData(img) gf.Update() poly = gf.GetOutput() else: # fast n -= 1 tbs = vtki.new("TessellatedBoxSource") tbs.SetLevel(n) if len(bounds): tbs.SetBounds(bounds) else: tbs.SetBounds(0, n * spacing[0], 0, n * spacing[1], 0, n * spacing[2]) tbs.QuadsOn() #tbs.SetOutputPointsPrecision(vtki.vtkAlgorithm.SINGLE_PRECISION) tbs.Update() poly = tbs.GetOutput() super().__init__(poly, c=c, alpha=alpha) self.pos(pos) self.lw(1).lighting("off") self.name = "TessellatedBox" class Spring(Mesh): """ Build a spring model. """ def __init__( self, start_pt=(0, 0, 0), end_pt=(1, 0, 0), coils=20, r1=0.1, r2=None, thickness=None, c="gray5", alpha=1.0, ) -> None: """ Build a spring of specified nr of `coils` between `start_pt` and `end_pt`. Arguments: coils : (int) number of coils r1 : (float) radius at start point r2 : (float) radius at end point thickness : (float) thickness of the coil section """ start_pt = utils.make3d(start_pt) end_pt = utils.make3d(end_pt) diff = end_pt - start_pt length = np.linalg.norm(diff) if not length: return if not r1: r1 = length / 20 trange = np.linspace(0, length, num=50 * coils) om = 6.283 * (coils - 0.5) / length if not r2: r2 = r1 pts = [] for t in trange: f = (length - t) / length rd = r1 * f + r2 * (1 - f) pts.append([rd * np.cos(om * t), rd * np.sin(om * t), t]) pts = [[0, 0, 0]] + pts + [[0, 0, length]] diff = diff / length theta = np.arccos(diff[2]) phi = np.arctan2(diff[1], diff[0]) sp = Line(pts) t = vtki.vtkTransform() t.Translate(start_pt) t.RotateZ(np.rad2deg(phi)) t.RotateY(np.rad2deg(theta)) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(sp.dataset) tf.SetTransform(t) tf.Update() tuf = vtki.new("TubeFilter") tuf.SetNumberOfSides(12) tuf.CappingOn() tuf.SetInputData(tf.GetOutput()) if not thickness: thickness = r1 / 10 tuf.SetRadius(thickness) tuf.Update() super().__init__(tuf.GetOutput(), c, alpha) self.phong().lighting("metallic") self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) self.name = "Spring" class Cylinder(Mesh): """ Build a cylinder of specified height and radius. """ def __init__( self, pos=(0, 0, 0), r=1.0, height=2.0, axis=(0, 0, 1), cap=True, res=24, c="teal3", alpha=1.0 ) -> None: """ Build a cylinder of specified height and radius `r`, centered at `pos`. If `pos` is a list of 2 points, e.g. `pos=[v1, v2]`, build a cylinder with base centered at `v1` and top at `v2`. Arguments: cap : (bool) enable/disable the caps of the cylinder res : (int) resolution of the cylinder sides ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestCylinder.png) """ if utils.is_sequence(pos[0]): # assume user is passing pos=[base, top] base = np.array(pos[0], dtype=float) top = np.array(pos[1], dtype=float) pos = (base + top) / 2 height = np.linalg.norm(top - base) axis = top - base axis = utils.versor(axis) else: axis = utils.versor(axis) base = pos - axis * height / 2 top = pos + axis * height / 2 cyl = vtki.new("CylinderSource") cyl.SetResolution(res) cyl.SetRadius(r) cyl.SetHeight(height) cyl.SetCapping(cap) cyl.Update() theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) t = vtki.vtkTransform() t.PostMultiply() t.RotateX(90) # put it along Z t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) t.Translate(pos) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(cyl.GetOutput()) tf.SetTransform(t) tf.Update() super().__init__(tf.GetOutput(), c, alpha) self.phong() self.base = base self.top = top self.transform = LinearTransform().translate(pos) self.name = "Cylinder" class Cone(Mesh): """Build a cone of specified radius and height.""" def __init__(self, pos=(0, 0, 0), r=1.0, height=3.0, axis=(0, 0, 1), res=48, c="green3", alpha=1.0) -> None: """Build a cone of specified radius `r` and `height`, centered at `pos`.""" con = vtki.new("ConeSource") con.SetResolution(res) con.SetRadius(r) con.SetHeight(height) con.SetDirection(axis) con.Update() super().__init__(con.GetOutput(), c, alpha) self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) self.pos(pos) v = utils.versor(axis) * height / 2 self.base = pos - v self.top = pos + v self.name = "Cone" class Pyramid(Cone): """Build a pyramidal shape.""" def __init__(self, pos=(0, 0, 0), s=1.0, height=1.0, axis=(0, 0, 1), c="green3", alpha=1) -> None: """Build a pyramid of specified base size `s` and `height`, centered at `pos`.""" super().__init__(pos, s, height, axis, 4, c, alpha) self.name = "Pyramid" class Torus(Mesh): """ Build a toroidal shape. """ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow3", alpha=1.0) -> None: """ Build a torus of specified outer radius `r1` internal radius `r2`, centered at `pos`. If `quad=True` a quad-mesh is generated. """ if utils.is_sequence(res): res_u, res_v = res else: res_u, res_v = 3 * res, res if quads: # https://github.com/marcomusy/vedo/issues/710 n = res_v m = res_u theta = np.linspace(0, 2.0 * np.pi, n) phi = np.linspace(0, 2.0 * np.pi, m) theta, phi = np.meshgrid(theta, phi) t = r1 + r2 * np.cos(theta) x = t * np.cos(phi) y = t * np.sin(phi) z = r2 * np.sin(theta) pts = np.column_stack((x.ravel(), y.ravel(), z.ravel())) faces = [] for j in range(m - 1): j1n = (j + 1) * n for i in range(n - 1): faces.append([i + j * n, i + 1 + j * n, i + 1 + j1n, i + j1n]) super().__init__([pts, faces], c, alpha) else: rs = vtki.new("ParametricTorus") rs.SetRingRadius(r1) rs.SetCrossSectionRadius(r2) pfs = vtki.new("ParametricFunctionSource") pfs.SetParametricFunction(rs) pfs.SetUResolution(res_u) pfs.SetVResolution(res_v) pfs.Update() super().__init__(pfs.GetOutput(), c, alpha) self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) self.pos(pos) self.name = "Torus" class Paraboloid(Mesh): """ Build a paraboloid. """ def __init__(self, pos=(0, 0, 0), height=1.0, res=50, c="cyan5", alpha=1.0) -> None: """ Build a paraboloid of specified height and radius `r`, centered at `pos`. Full volumetric expression is: `F(x,y,z)=a_0x^2+a_1y^2+a_2z^2+a_3xy+a_4yz+a_5xz+ a_6x+a_7y+a_8z+a_9` ![](https://user-images.githubusercontent.com/32848391/51211547-260ef480-1916-11e9-95f6-4a677e37e355.png) """ quadric = vtki.new("Quadric") quadric.SetCoefficients(1, 1, 0, 0, 0, 0, 0, 0, height / 4, 0) # F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 # + a3*x*y + a4*y*z + a5*x*z # + a6*x + a7*y + a8*z +a9 sample = vtki.new("SampleFunction") sample.SetSampleDimensions(res, res, res) sample.SetImplicitFunction(quadric) contours = vtki.new("ContourFilter") contours.SetInputConnection(sample.GetOutputPort()) contours.GenerateValues(1, 0.01, 0.01) contours.Update() super().__init__(contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper.ScalarVisibilityOff() self.pos(pos) self.name = "Paraboloid" class Hyperboloid(Mesh): """ Build a hyperboloid. """ def __init__(self, pos=(0, 0, 0), a2=1.0, value=0.5, res=100, c="pink4", alpha=1.0) -> None: """ Build a hyperboloid of specified aperture `a2` and `height`, centered at `pos`. Full volumetric expression is: `F(x,y,z)=a_0x^2+a_1y^2+a_2z^2+a_3xy+a_4yz+a_5xz+ a_6x+a_7y+a_8z+a_9` """ q = vtki.new("Quadric") q.SetCoefficients(2, 2, -1 / a2, 0, 0, 0, 0, 0, 0, 0) # F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 # + a3*x*y + a4*y*z + a5*x*z # + a6*x + a7*y + a8*z +a9 sample = vtki.new("SampleFunction") sample.SetSampleDimensions(res, res, res) sample.SetImplicitFunction(q) contours = vtki.new("ContourFilter") contours.SetInputConnection(sample.GetOutputPort()) contours.GenerateValues(1, value, value) contours.Update() super().__init__(contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper.ScalarVisibilityOff() self.pos(pos) self.name = "Hyperboloid" def Marker(symbol, pos=(0, 0, 0), c="k", alpha=1.0, s=0.1, filled=True) -> Any: """ Generate a marker shape. Typically used in association with `Glyph`. """ if isinstance(symbol, Mesh): return symbol.c(c).alpha(alpha).lighting("off") if isinstance(symbol, int): symbs = [".", "o", "O", "0", "p", "*", "h", "D", "d", "v", "^", ">", "<", "s", "x", "a"] symbol = symbol % len(symbs) symbol = symbs[symbol] if symbol == ".": mesh = Polygon(nsides=24, r=s * 0.6) elif symbol == "o": mesh = Polygon(nsides=24, r=s * 0.75) elif symbol == "O": mesh = Disc(r1=s * 0.6, r2=s * 0.75, res=(1, 24)) elif symbol == "0": m1 = Disc(r1=s * 0.6, r2=s * 0.75, res=(1, 24)) m2 = Circle(r=s * 0.36).reverse() mesh = merge(m1, m2) elif symbol == "p": mesh = Polygon(nsides=5, r=s) elif symbol == "*": mesh = Star(r1=0.65 * s * 1.1, r2=s * 1.1, line=not filled) elif symbol == "h": mesh = Polygon(nsides=6, r=s) elif symbol == "D": mesh = Polygon(nsides=4, r=s) elif symbol == "d": mesh = Polygon(nsides=4, r=s * 1.1).scale([0.5, 1, 1]) elif symbol == "v": mesh = Polygon(nsides=3, r=s).rotate_z(180) elif symbol == "^": mesh = Polygon(nsides=3, r=s) elif symbol == ">": mesh = Polygon(nsides=3, r=s).rotate_z(-90) elif symbol == "<": mesh = Polygon(nsides=3, r=s).rotate_z(90) elif symbol == "s": mesh = Mesh( [[[-1, -1, 0], [1, -1, 0], [1, 1, 0], [-1, 1, 0]], [[0, 1, 2, 3]]] ).scale(s / 1.4) elif symbol == "x": mesh = Text3D("+", pos=(0, 0, 0), s=s * 2.6, justify="center", depth=0) # mesh.rotate_z(45) elif symbol == "a": mesh = Text3D("*", pos=(0, 0, 0), s=s * 2.6, justify="center", depth=0) else: mesh = Text3D(symbol, pos=(0, 0, 0), s=s * 2, justify="center", depth=0) mesh.flat().lighting("off").wireframe(not filled).c(c).alpha(alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) mesh.pos(pos) mesh.name = "Marker" return mesh class Brace(Mesh): """ Create a brace (bracket) shape. """ def __init__( self, q1, q2, style="}", padding1=0.0, font="Theemim", comment="", justify=None, angle=0.0, padding2=0.2, s=1.0, italic=0, c="k1", alpha=1.0, ) -> None: """ Create a brace (bracket) shape which spans from point q1 to point q2. Arguments: q1 : (list) point 1. q2 : (list) point 2. style : (str) style of the bracket, eg. `{}, [], (), <>`. padding1 : (float) padding space in percent form the input points. font : (str) font type comment : (str) additional text to appear next to the brace symbol. justify : (str) specify the anchor point to justify text comment, e.g. "top-left". italic : float italicness of the text comment (can be a positive or negative number) angle : (float) rotation angle of text. Use `None` to keep it horizontal. padding2 : (float) padding space in percent form brace to text comment. s : (float) scale factor for the comment Examples: - [scatter3.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter3.py) ![](https://vedo.embl.es/images/pyplot/scatter3.png) """ if isinstance(q1, vtki.vtkActor): q1 = q1.GetPosition() if isinstance(q2, vtki.vtkActor): q2 = q2.GetPosition() if len(q1) == 2: q1 = [q1[0], q1[1], 0.0] if len(q2) == 2: q2 = [q2[0], q2[1], 0.0] q1 = np.array(q1, dtype=float) q2 = np.array(q2, dtype=float) mq = (q1 + q2) / 2 q1 = q1 - mq q2 = q2 - mq d = np.linalg.norm(q2 - q1) q2[2] = q1[2] if style not in "{}[]()<>|I": vedo.logger.error(f"unknown style {style}." + "Use {}[]()<>|I") style = "}" flip = False if style in ["{", "[", "(", "<"]: flip = True i = ["{", "[", "(", "<"].index(style) style = ["}", "]", ")", ">"][i] br = Text3D(style, font="Theemim", justify="center-left") br.scale([0.4, 1, 1]) angler = np.arctan2(q2[1], q2[0]) * 180 / np.pi - 90 if flip: angler += 180 _, x1, y0, y1, _, _ = br.bounds() if comment: just = "center-top" if angle is None: angle = -angler + 90 if not flip: angle += 180 if flip: angle += 180 just = "center-bottom" if justify is not None: just = justify cmt = Text3D(comment, font=font, justify=just, italic=italic) cx0, cx1 = cmt.xbounds() cmt.rotate_z(90 + angle) cmt.scale(1 / (cx1 - cx0) * s * len(comment) / 5) cmt.shift(x1 * (1 + padding2), 0, 0) poly = merge(br, cmt).dataset else: poly = br.dataset tr = vtki.vtkTransform() tr.Translate(mq) tr.RotateZ(angler) tr.Translate(padding1 * d, 0, 0) pscale = 1 tr.Scale(pscale / (y1 - y0) * d, pscale / (y1 - y0) * d, 1) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(poly) tf.SetTransform(tr) tf.Update() poly = tf.GetOutput() super().__init__(poly, c, alpha) self.base = q1 self.top = q2 self.name = "Brace" class Star3D(Mesh): """ Build a 3D starred shape. """ def __init__(self, pos=(0, 0, 0), r=1.0, thickness=0.1, c="blue4", alpha=1.0) -> None: """ Build a 3D star shape of 5 cusps, mainly useful as a 3D marker. """ pts = ((1.34, 0., -0.37), (5.75e-3, -0.588, thickness/10), (0.377, 0.,-0.38), (0.0116, 0., -1.35), (-0.366, 0., -0.384), (-1.33, 0., -0.385), (-0.600, 0., 0.321), (-0.829, 0., 1.19), (-1.17e-3, 0., 0.761), (0.824, 0., 1.20), (0.602, 0., 0.328), (6.07e-3, 0.588, thickness/10)) fcs = [[0, 1, 2], [0, 11,10], [2, 1, 3], [2, 11, 0], [3, 1, 4], [3, 11, 2], [4, 1, 5], [4, 11, 3], [5, 1, 6], [5, 11, 4], [6, 1, 7], [6, 11, 5], [7, 1, 8], [7, 11, 6], [8, 1, 9], [8, 11, 7], [9, 1,10], [9, 11, 8], [10,1, 0],[10,11, 9]] super().__init__([pts, fcs], c, alpha) self.rotate_x(90) self.scale(r).lighting("shiny") if len(pos) == 2: pos = (pos[0], pos[1], 0) self.pos(pos) self.name = "Star3D" class Cross3D(Mesh): """ Build a 3D cross shape. """ def __init__(self, pos=(0, 0, 0), s=1.0, thickness=0.3, c="b", alpha=1.0) -> None: """ Build a 3D cross shape, mainly useful as a 3D marker. """ if len(pos) == 2: pos = (pos[0], pos[1], 0) c1 = Cylinder(r=thickness * s, height=2 * s) c2 = Cylinder(r=thickness * s, height=2 * s).rotate_x(90) c3 = Cylinder(r=thickness * s, height=2 * s).rotate_y(90) poly = merge(c1, c2, c3).color(c).alpha(alpha).pos(pos).dataset super().__init__(poly, c, alpha) self.name = "Cross3D" class ParametricShape(Mesh): """ A set of built-in shapes mainly for illustration purposes. """ def __init__(self, name, res=51, n=25, seed=1): """ A set of built-in shapes mainly for illustration purposes. Name can be an integer or a string in this list: `['Boy', 'ConicSpiral', 'CrossCap', 'Dini', 'Enneper', 'Figure8Klein', 'Klein', 'Mobius', 'RandomHills', 'Roman', 'SuperEllipsoid', 'BohemianDome', 'Bour', 'CatalanMinimal', 'Henneberg', 'Kuen', 'PluckerConoid', 'Pseudosphere']`. Example: ```python from vedo import * settings.immediate_rendering = False plt = Plotter(N=18) for i in range(18): ps = ParametricShape(i).color(i) plt.at(i).show(ps, ps.name) plt.interactive().close() ``` """ shapes = [ "Boy", "ConicSpiral", "CrossCap", "Enneper", "Figure8Klein", "Klein", "Dini", "Mobius", "RandomHills", "Roman", "SuperEllipsoid", "BohemianDome", "Bour", "CatalanMinimal", "Henneberg", "Kuen", "PluckerConoid", "Pseudosphere", ] if isinstance(name, int): name = name % len(shapes) name = shapes[name] if name == "Boy": ps = vtki.new("ParametricBoy") elif name == "ConicSpiral": ps = vtki.new("ParametricConicSpiral") elif name == "CrossCap": ps = vtki.new("ParametricCrossCap") elif name == "Dini": ps = vtki.new("ParametricDini") elif name == "Enneper": ps = vtki.new("ParametricEnneper") elif name == "Figure8Klein": ps = vtki.new("ParametricFigure8Klein") elif name == "Klein": ps = vtki.new("ParametricKlein") elif name == "Mobius": ps = vtki.new("ParametricMobius") ps.SetRadius(2.0) ps.SetMinimumV(-0.5) ps.SetMaximumV(0.5) elif name == "RandomHills": ps = vtki.new("ParametricRandomHills") ps.AllowRandomGenerationOn() ps.SetRandomSeed(seed) ps.SetNumberOfHills(n) elif name == "Roman": ps = vtki.new("ParametricRoman") elif name == "SuperEllipsoid": ps = vtki.new("ParametricSuperEllipsoid") ps.SetN1(0.5) ps.SetN2(0.4) elif name == "BohemianDome": ps = vtki.new("ParametricBohemianDome") ps.SetA(5.0) ps.SetB(1.0) ps.SetC(2.0) elif name == "Bour": ps = vtki.new("ParametricBour") elif name == "CatalanMinimal": ps = vtki.new("ParametricCatalanMinimal") elif name == "Henneberg": ps = vtki.new("ParametricHenneberg") elif name == "Kuen": ps = vtki.new("ParametricKuen") ps.SetDeltaV0(0.001) elif name == "PluckerConoid": ps = vtki.new("ParametricPluckerConoid") elif name == "Pseudosphere": ps = vtki.new("ParametricPseudosphere") else: vedo.logger.error(f"unknown ParametricShape {name}") return pfs = vtki.new("ParametricFunctionSource") pfs.SetParametricFunction(ps) pfs.SetUResolution(res) pfs.SetVResolution(res) pfs.SetWResolution(res) pfs.SetScalarModeToZ() pfs.Update() super().__init__(pfs.GetOutput()) if name == "RandomHills": self.shift([0,-10,-2.25]) if name != 'Kuen': self.normalize() if name == 'Dini': self.scale(0.4) if name == 'Enneper': self.scale(0.4) if name == 'ConicSpiral': self.bc('tomato') self.name = name @lru_cache(None) def _load_font(font) -> np.ndarray: # print('_load_font()', font) if utils.is_number(font): font = list(settings.font_parameters.keys())[int(font)] if font.endswith(".npz"): # user passed font as a local path fontfile = font font = os.path.basename(font).split(".")[0] elif font.startswith("https"): # user passed URL link, make it a path try: fontfile = vedo.file_io.download(font, verbose=False, force=False) font = os.path.basename(font).split(".")[0] except: vedo.logger.warning(f"font {font} not found") font = settings.default_font fontfile = os.path.join(vedo.fonts_path, font + ".npz") else: # user passed font by its standard name font = font[:1].upper() + font[1:] # capitalize first letter only fontfile = os.path.join(vedo.fonts_path, font + ".npz") if font not in settings.font_parameters.keys(): font = "Normografo" vedo.logger.warning( f"Unknown font: {font}\n" f"Available 3D fonts are: " f"{list(settings.font_parameters.keys())}\n" f"Using font {font} instead." ) fontfile = os.path.join(vedo.fonts_path, font + ".npz") if not settings.font_parameters[font]["islocal"]: font = "https://vedo.embl.es/fonts/" + font + ".npz" try: fontfile = vedo.file_io.download(font, verbose=False, force=False) font = os.path.basename(font).split(".")[0] except: vedo.logger.warning(f"font {font} not found") font = settings.default_font fontfile = os.path.join(vedo.fonts_path, font + ".npz") ##### try: font_meshes = np.load(fontfile, allow_pickle=True)["font"][0] except: vedo.logger.warning(f"font name {font} not found.") raise RuntimeError return font_meshes @lru_cache(None) def _get_font_letter(font, letter): # print("_get_font_letter", font, letter) font_meshes = _load_font(font) try: pts, faces = font_meshes[letter] return utils.buildPolyData(pts.astype(float), faces) except KeyError: return None class Text3D(Mesh): """ Generate a 3D polygonal Mesh to represent a text string. """ def __init__( self, txt, pos=(0, 0, 0), s=1.0, font="", hspacing=1.15, vspacing=2.15, depth=0.0, italic=False, justify="bottom-left", literal=False, c=None, alpha=1.0, ) -> None: """ Generate a 3D polygonal `Mesh` representing a text string. Can render strings like `3.7 10^9` or `H_2 O` with subscripts and superscripts. Most Latex symbols are also supported. Symbols `~ ^ _` are reserved modifiers: - use ~ to add a short space, 1/4 of the default empty space, - use ^ and _ to start up/sub scripting, a space terminates their effect. Monospaced fonts are: `Calco, ComicMono, Glasgo, SmartCouric, VictorMono, Justino`. More fonts at: https://vedo.embl.es/fonts/ Arguments: pos : (list) position coordinates in 3D space s : (float) vertical size of the text (as scaling factor) depth : (float) text thickness (along z) italic : (bool), float italic font type (can be a signed float too) justify : (str) text justification as centering of the bounding box (bottom-left, bottom-right, top-left, top-right, centered) font : (str, int) some of the available 3D-polygonized fonts are: Bongas, Calco, Comae, ComicMono, Kanopus, Glasgo, Ubuntu, LogoType, Normografo, Quikhand, SmartCouric, Theemim, VictorMono, VTK, Capsmall, Cartoons123, Vega, Justino, Spears, Meson. Check for more at https://vedo.embl.es/fonts/ Or type in your terminal `vedo --run fonts`. Default is Normografo, which can be changed using `settings.default_font`. hspacing : (float) horizontal spacing of the font vspacing : (float) vertical spacing of the font for multiple lines text literal : (bool) if set to True will ignore modifiers like _ or ^ Examples: - [markpoint.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/markpoint.py) - [fonts.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/fonts.py) - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) ![](https://vedo.embl.es/images/pyplot/fonts3d.png) .. note:: Type `vedo -r fonts` for a demo. """ if len(pos) == 2: pos = (pos[0], pos[1], 0) if c is None: # automatic black or white pli = vedo.plotter_instance if pli and pli.renderer: c = (0.9, 0.9, 0.9) if pli.renderer.GetGradientBackground(): bgcol = pli.renderer.GetBackground2() else: bgcol = pli.renderer.GetBackground() if np.sum(bgcol) > 1.5: c = (0.1, 0.1, 0.1) else: c = (0.6, 0.6, 0.6) tpoly = self._get_text3d_poly( txt, s, font, hspacing, vspacing, depth, italic, justify, literal ) super().__init__(tpoly, c, alpha) self.pos(pos) self.lighting("off") self.actor.PickableOff() self.actor.DragableOff() self.init_scale = s self.name = "Text3D" self.txt = txt self.justify = justify def text( self, txt=None, s=1, font="", hspacing=1.15, vspacing=2.15, depth=0, italic=False, justify="", literal=False, ) -> "Text3D": """ Update the text and some of its properties. Check [available fonts here](https://vedo.embl.es/fonts). """ if txt is None: return self.txt if not justify: justify = self.justify poly = self._get_text3d_poly( txt, self.init_scale * s, font, hspacing, vspacing, depth, italic, justify, literal ) # apply the current transformation to the new polydata tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(poly) tf.SetTransform(self.transform.T) tf.Update() tpoly = tf.GetOutput() self._update(tpoly) self.txt = txt return self def _get_text3d_poly( self, txt, s=1, font="", hspacing=1.15, vspacing=2.15, depth=0, italic=False, justify="bottom-left", literal=False, ) -> vtki.vtkPolyData: if not font: font = settings.default_font txt = str(txt) if font == "VTK": ####################################### vtt = vtki.new("VectorText") vtt.SetText(txt) vtt.Update() tpoly = vtt.GetOutput() else: ################################################### stxt = set(txt) # check here if null or only spaces if not txt or (len(stxt) == 1 and " " in stxt): return vtki.vtkPolyData() if italic is True: italic = 1 if isinstance(font, int): lfonts = list(settings.font_parameters.keys()) font = font % len(lfonts) font = lfonts[font] if font not in settings.font_parameters.keys(): fpars = settings.font_parameters["Normografo"] else: fpars = settings.font_parameters[font] # ad hoc adjustments mono = fpars["mono"] lspacing = fpars["lspacing"] hspacing *= fpars["hspacing"] fscale = fpars["fscale"] dotsep = fpars["dotsep"] # replacements if ":" in txt: for r in _reps: txt = txt.replace(r[0], r[1]) if not literal: reps2 = [ (r"\_", "┭"), # trick to protect ~ _ and ^ chars (r"\^", "┮"), # (r"\~", "┯"), # ("**", "^"), # order matters ("e+0", dotsep + "10^"), ("e-0", dotsep + "10^-"), ("E+0", dotsep + "10^"), ("E-0", dotsep + "10^-"), ("e+", dotsep + "10^"), ("e-", dotsep + "10^-"), ("E+", dotsep + "10^"), ("E-", dotsep + "10^-"), ] for r in reps2: txt = txt.replace(r[0], r[1]) xmax, ymax, yshift, scale = 0.0, 0.0, 0.0, 1.0 save_xmax = 0.0 notfounds = set() polyletters = [] ntxt = len(txt) for i, t in enumerate(txt): ########## if t == "┭": t = "_" elif t == "┮": t = "^" elif t == "┯": t = "~" elif t == "^" and not literal: if yshift < 0: xmax = save_xmax yshift = 0.9 * fscale scale = 0.5 continue elif t == "_" and not literal: if yshift > 0: xmax = save_xmax yshift = -0.3 * fscale scale = 0.5 continue elif (t in (" ", "\\n")) and yshift: yshift = 0.0 scale = 1.0 save_xmax = xmax if t == " ": continue elif t == "~": if i < ntxt - 1 and txt[i + 1] == "_": continue xmax += hspacing * scale * fscale / 4 continue ############ if t == " ": xmax += hspacing * scale * fscale elif t == "\n": xmax = 0.0 save_xmax = 0.0 ymax -= vspacing else: poly = _get_font_letter(font, t) if not poly: notfounds.add(t) xmax += hspacing * scale * fscale continue if poly.GetNumberOfPoints() == 0: continue tr = vtki.vtkTransform() tr.Translate(xmax, ymax + yshift, 0) pscale = scale * fscale / 1000 tr.Scale(pscale, pscale, pscale) if italic: tr.Concatenate([1, italic * 0.15, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(poly) tf.SetTransform(tr) tf.Update() poly = tf.GetOutput() polyletters.append(poly) bx = poly.GetBounds() if mono: xmax += hspacing * scale * fscale else: xmax += bx[1] - bx[0] + hspacing * scale * fscale * lspacing if yshift == 0: save_xmax = xmax if len(polyletters) == 1: tpoly = polyletters[0] else: polyapp = vtki.new("AppendPolyData") for polyd in polyletters: polyapp.AddInputData(polyd) polyapp.Update() tpoly = polyapp.GetOutput() if notfounds: wmsg = f"unavailable characters in font name '{font}': {notfounds}." wmsg += '\nType "vedo -r fonts" for a demo.' vedo.logger.warning(wmsg) bb = tpoly.GetBounds() dx, dy = (bb[1] - bb[0]) / 2 * s, (bb[3] - bb[2]) / 2 * s shift = -np.array([(bb[1] + bb[0]), (bb[3] + bb[2]), (bb[5] + bb[4])]) * s /2 if "bottom" in justify: shift += np.array([ 0, dy, 0.]) if "top" in justify: shift += np.array([ 0,-dy, 0.]) if "left" in justify: shift += np.array([ dx, 0, 0.]) if "right" in justify: shift += np.array([-dx, 0, 0.]) if tpoly.GetNumberOfPoints(): t = vtki.vtkTransform() t.PostMultiply() t.Scale(s, s, s) t.Translate(shift) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(tpoly) tf.SetTransform(t) tf.Update() tpoly = tf.GetOutput() if depth: extrude = vtki.new("LinearExtrusionFilter") extrude.SetInputData(tpoly) extrude.SetExtrusionTypeToVectorExtrusion() extrude.SetVector(0, 0, 1) extrude.SetScaleFactor(depth * dy) extrude.Update() tpoly = extrude.GetOutput() return tpoly class TextBase: "Base class." def __init__(self): "Do not instantiate this base class." self.rendered_at = set() self.properties = None self.name = "Text" self.filename = "" self.time = 0 self.info = {} if isinstance(settings.default_font, int): lfonts = list(settings.font_parameters.keys()) font = settings.default_font % len(lfonts) self.fontname = lfonts[font] else: self.fontname = settings.default_font def angle(self, value: float): """Orientation angle in degrees""" self.properties.SetOrientation(value) return self def line_spacing(self, value: float): """Set the extra spacing between lines expressed as a text height multiplicative factor.""" self.properties.SetLineSpacing(value) return self def line_offset(self, value: float): """Set/Get the vertical offset (measured in pixels).""" self.properties.SetLineOffset(value) return self def bold(self, value=True): """Set bold face""" self.properties.SetBold(value) return self def italic(self, value=True): """Set italic face""" self.properties.SetItalic(value) return self def shadow(self, offset=(1, -1)): """Text shadowing. Set to `None` to disable it.""" if offset is None: self.properties.ShadowOff() else: self.properties.ShadowOn() self.properties.SetShadowOffset(offset) return self def color(self, c=None): """Set the text color""" if c is None: return get_color(self.properties.GetColor()) self.properties.SetColor(get_color(c)) return self def c(self, color=None): """Set the text color""" if color is None: return get_color(self.properties.GetColor()) return self.color(color) def alpha(self, value: float): """Set the text opacity""" self.properties.SetBackgroundOpacity(value) return self def background(self, color="k9", alpha=1.0): """Text background. Set to `None` to disable it.""" bg = get_color(color) if color is None: self.properties.SetBackgroundOpacity(0) else: self.properties.SetBackgroundColor(bg) if alpha: self.properties.SetBackgroundOpacity(alpha) return self def frame(self, color="k1", lw=2): """Border color and width""" if color is None: self.properties.FrameOff() else: c = get_color(color) self.properties.FrameOn() self.properties.SetFrameColor(c) self.properties.SetFrameWidth(lw) return self def font(self, font: str): """Text font face""" if isinstance(font, int): lfonts = list(settings.font_parameters.keys()) n = font % len(lfonts) font = lfonts[n] self.fontname = font if not font: # use default font font = self.fontname fpath = os.path.join(vedo.fonts_path, font + ".ttf") elif font.startswith("https"): # user passed URL link, make it a path fpath = vedo.file_io.download(font, verbose=False, force=False) elif font.endswith(".ttf"): # user passing a local path to font file fpath = font else: # user passing name of preset font fpath = os.path.join(vedo.fonts_path, font + ".ttf") if font == "Courier": self.properties.SetFontFamilyToCourier() elif font == "Times": self.properties.SetFontFamilyToTimes() elif font == "Arial": self.properties.SetFontFamilyToArial() else: fpath = utils.get_font_path(font) self.properties.SetFontFamily(vtki.VTK_FONT_FILE) self.properties.SetFontFile(fpath) self.fontname = font # io.tonumpy() uses it return self def on(self): """Make text visible""" self.actor.SetVisibility(True) return self def off(self): """Make text invisible""" self.actor.SetVisibility(False) return self class Text2D(TextBase, vedo.visual.Actor2D): """ Create a 2D text object. """ def __init__( self, txt="", pos="top-left", s=1.0, bg=None, font="", justify="", bold=False, italic=False, c=None, alpha=0.5, ) -> None: """ Create a 2D text object. All properties of the text, and the text itself, can be changed after creation (which is especially useful in loops). Arguments: pos : (str) text is placed in one of the 8 positions: - bottom-left - bottom-right - top-left - top-right - bottom-middle - middle-right - middle-left - top-middle If a pair (x,y) is passed as input the 2D text is place at that position in the coordinate system of the 2D screen (with the origin sitting at the bottom left). s : (float) size of text bg : (color) background color alpha : (float) background opacity justify : (str) text justification font : (str) built-in available fonts are: - Antares - Arial - Bongas - Calco - Comae - ComicMono - Courier - Glasgo - Kanopus - LogoType - Normografo - Quikhand - SmartCouric - Theemim - Times - VictorMono - More fonts at: https://vedo.embl.es/fonts/ A path to a `.otf` or `.ttf` font-file can also be supplied as input. Examples: - [fonts.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/fonts.py) - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) - [colorcubes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/colorcubes.py) ![](https://vedo.embl.es/images/basic/colorcubes.png) """ super().__init__() self.name = "Text2D" self.mapper = vtki.new("TextMapper") self.SetMapper(self.mapper) self.properties = self.mapper.GetTextProperty() self.actor = self self.actor.retrieve_object = weak_ref_to(self) self.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() # automatic black or white if c is None: c = (0.1, 0.1, 0.1) if vedo.plotter_instance and vedo.plotter_instance.renderer: if vedo.plotter_instance.renderer.GetGradientBackground(): bgcol = vedo.plotter_instance.renderer.GetBackground2() else: bgcol = vedo.plotter_instance.renderer.GetBackground() c = (0.9, 0.9, 0.9) if np.sum(bgcol) > 1.5: c = (0.1, 0.1, 0.1) self.font(font).color(c).background(bg, alpha).bold(bold).italic(italic) self.pos(pos, justify).size(s).text(txt).line_spacing(1.2).line_offset(5) self.PickableOff() def pos(self, pos="top-left", justify=""): """ Set position of the text to draw. Keyword `pos` can be a string or 2D coordinates in the range [0,1], being (0,0) the bottom left corner. """ ajustify = "top-left" # autojustify if isinstance(pos, str): # corners ajustify = pos if "top" in pos: if "left" in pos: pos = (0.008, 0.994) elif "right" in pos: pos = (0.994, 0.994) elif "mid" in pos or "cent" in pos: pos = (0.5, 0.994) elif "bottom" in pos: if "left" in pos: pos = (0.008, 0.008) elif "right" in pos: pos = (0.994, 0.008) elif "mid" in pos or "cent" in pos: pos = (0.5, 0.008) elif "mid" in pos or "cent" in pos: if "left" in pos: pos = (0.008, 0.5) elif "right" in pos: pos = (0.994, 0.5) else: pos = (0.5, 0.5) else: vedo.logger.warning(f"cannot understand text position {pos}") pos = (0.008, 0.994) ajustify = "top-left" elif len(pos) != 2: vedo.logger.error("pos must be of length 2 or integer value or string") raise RuntimeError() if not justify: justify = ajustify self.properties.SetJustificationToLeft() if "top" in justify: self.properties.SetVerticalJustificationToTop() if "bottom" in justify: self.properties.SetVerticalJustificationToBottom() if "cent" in justify or "mid" in justify: self.properties.SetJustificationToCentered() if "left" in justify: self.properties.SetJustificationToLeft() if "right" in justify: self.properties.SetJustificationToRight() self.SetPosition(pos) return self def text(self, txt=None): """Set/get the input text string.""" if txt is None: return self.mapper.GetInput() if ":" in txt: for r in _reps: txt = txt.replace(r[0], r[1]) else: txt = str(txt) self.mapper.SetInput(txt) return self def size(self, s): """Set the font size.""" self.properties.SetFontSize(int(s * 22.5)) return self class CornerAnnotation(TextBase, vtki.vtkCornerAnnotation): # PROBABLY USELESS given that Text2D does pretty much the same ... """ Annotate the window corner with 2D text. See `Text2D` description as the basic functionality is very similar. The added value of this class is the possibility to manage with one single object the all corner annotations (instead of creating 4 `Text2D` instances). Examples: - [timer_callback2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/timer_callback2.py) """ def __init__(self, c=None) -> None: super().__init__() self.properties = self.GetTextProperty() # automatic black or white if c is None: if vedo.plotter_instance and vedo.plotter_instance.renderer: c = (0.9, 0.9, 0.9) if vedo.plotter_instance.renderer.GetGradientBackground(): bgcol = vedo.plotter_instance.renderer.GetBackground2() else: bgcol = vedo.plotter_instance.renderer.GetBackground() if np.sum(bgcol) > 1.5: c = (0.1, 0.1, 0.1) else: c = (0.5, 0.5, 0.5) self.SetNonlinearFontScaleFactor(1 / 2.75) self.PickableOff() self.properties.SetColor(get_color(c)) self.properties.SetBold(False) self.properties.SetItalic(False) def size(self, s:float, linear=False) -> "CornerAnnotation": """ The font size is calculated as the largest possible value such that the annotations for the given viewport do not overlap. This font size can be scaled non-linearly with the viewport size, to maintain an acceptable readable size at larger viewport sizes, without being too big. `f' = linearScale * pow(f,nonlinearScale)` """ if linear: self.SetLinearFontScaleFactor(s * 5.5) else: self.SetNonlinearFontScaleFactor(s / 2.75) return self def text(self, txt: str, pos=2) -> "CornerAnnotation": """Set text at the assigned position""" if isinstance(pos, str): # corners if "top" in pos: if "left" in pos: pos = 2 elif "right" in pos: pos = 3 elif "mid" in pos or "cent" in pos: pos = 7 elif "bottom" in pos: if "left" in pos: pos = 0 elif "right" in pos: pos = 1 elif "mid" in pos or "cent" in pos: pos = 4 else: if "left" in pos: pos = 6 elif "right" in pos: pos = 5 else: pos = 2 if "\\" in repr(txt): for r in _reps: txt = txt.replace(r[0], r[1]) else: txt = str(txt) self.SetText(pos, txt) return self def clear(self) -> "CornerAnnotation": """Remove all text from all corners""" self.ClearAllTexts() return self class Latex(Image): """ Render Latex text and formulas. """ def __init__(self, formula, pos=(0, 0, 0), s=1.0, bg=None, res=150, usetex=False, c="k", alpha=1.0) -> None: """ Render Latex text and formulas. Arguments: formula : (str) latex text string pos : (list) position coordinates in space bg : (color) background color box res : (int) dpi resolution usetex : (bool) use latex compiler of matplotlib if available You can access the latex formula in `Latex.formula`. Examples: - [latex.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/latex.py) ![](https://vedo.embl.es/images/pyplot/latex.png) """ from tempfile import NamedTemporaryFile import matplotlib.pyplot as mpltib def build_img_plt(formula, tfile): mpltib.rc("text", usetex=usetex) formula1 = "$" + formula + "$" mpltib.axis("off") col = get_color(c) if bg: bx = dict(boxstyle="square", ec=col, fc=get_color(bg)) else: bx = None mpltib.text( 0.5, 0.5, formula1, size=res, color=col, alpha=alpha, ha="center", va="center", bbox=bx, ) mpltib.savefig( tfile, format="png", transparent=True, bbox_inches="tight", pad_inches=0 ) mpltib.close() if len(pos) == 2: pos = (pos[0], pos[1], 0) tmp_file = NamedTemporaryFile(delete=True) tmp_file.name = tmp_file.name + ".png" build_img_plt(formula, tmp_file.name) super().__init__(tmp_file.name, channels=4) self.alpha(alpha) self.scale([0.25 / res * s, 0.25 / res * s, 0.25 / res * s]) self.pos(pos) self.name = "Latex" self.formula = formula # except: # printc("Error in Latex()\n", formula, c="r") # printc(" latex or dvipng not installed?", c="r") # printc(" Try: usetex=False", c="r") # printc(" Try: sudo apt install dvipng", c="r") class ConvexHull(Mesh): """ Create the 2D/3D convex hull from a set of points. """ def __init__(self, pts) -> None: """ Create the 2D/3D convex hull from a set of input points or input Mesh. Examples: - [convex_hull.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/convex_hull.py) ![](https://vedo.embl.es/images/advanced/convexHull.png) """ if utils.is_sequence(pts): pts = utils.make3d(pts).astype(float) mesh = Points(pts) else: mesh = pts apoly = mesh.clean().dataset # Create the convex hull of the pointcloud z0, z1 = mesh.zbounds() d = mesh.diagonal_size() if (z1 - z0) / d > 0.0001: delaunay = vtki.new("Delaunay3D") delaunay.SetInputData(apoly) delaunay.Update() surfaceFilter = vtki.new("DataSetSurfaceFilter") surfaceFilter.SetInputConnection(delaunay.GetOutputPort()) surfaceFilter.Update() out = surfaceFilter.GetOutput() else: delaunay = vtki.new("Delaunay2D") delaunay.SetInputData(apoly) delaunay.Update() fe = vtki.new("FeatureEdges") fe.SetInputConnection(delaunay.GetOutputPort()) fe.BoundaryEdgesOn() fe.Update() out = fe.GetOutput() super().__init__(out, c=mesh.color(), alpha=0.75) self.flat() self.name = "ConvexHull" def VedoLogo(distance=0.0, c=None, bc="t", version=False, frame=True) -> "vedo.Assembly": """ Create the 3D vedo logo. Arguments: distance : (float) send back logo by this distance from camera version : (bool) add version text to the right end of the logo bc : (color) text back face color """ if c is None: c = (0, 0, 0) if vedo.plotter_instance: if sum(get_color(vedo.plotter_instance.backgrcol)) > 1.5: c = [0, 0, 0] else: c = "linen" font = "Comae" vlogo = Text3D("vэdo", font=font, s=1350, depth=0.2, c=c, hspacing=0.8) vlogo.scale([1, 0.95, 1]).x(-2525).pickable(False).bc(bc) vlogo.properties.LightingOn() vr, rul = None, None if version: vr = Text3D( vedo.__version__, font=font, s=165, depth=0.2, c=c, hspacing=1 ).scale([1, 0.7, 1]) vr.rotate_z(90).pos(2450, 50, 80) vr.bc(bc).pickable(False) elif frame: rul = vedo.RulerAxes( (-2600, 2110, 0, 1650, 0, 0), xlabel="European Molecular Biology Laboratory", ylabel=vedo.__version__, font=font, xpadding=0.09, ypadding=0.04, ) fakept = vedo.Point((0, 500, distance * 1725), alpha=0, c=c, r=1).pickable(0) return vedo.Assembly([vlogo, vr, fakept, rul]).scale(1 / 1725) vedo-2025.5.3/vedo/transformations.py000066400000000000000000001072731474667405700175030ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- from typing import List from typing_extensions import Self import numpy as np import vedo.vtkclasses as vtki # a wrapper for lazy imports __docformat__ = "google" __doc__ = """ Submodule to work with linear and non-linear transformations
![](https://vedo.embl.es/images/feats/transforms.png) """ __all__ = [ "LinearTransform", "NonLinearTransform", "TransformInterpolator", "spher2cart", "cart2spher", "cart2cyl", "cyl2cart", "cyl2spher", "spher2cyl", "cart2pol", "pol2cart", ] ################################################### def _is_sequence(arg): if hasattr(arg, "strip"): return False if hasattr(arg, "__getslice__"): return True if hasattr(arg, "__iter__"): return True return False ################################################### class LinearTransform: """Work with linear transformations.""" def __init__(self, T=None) -> None: """ Define a linear transformation. Can be saved to file and reloaded. Arguments: T : (str, vtkTransform, numpy array) input transformation. Defaults to unit. Example: ```python from vedo import * settings.use_parallel_projection = True LT = LinearTransform() LT.translate([3,0,1]).rotate_z(45) LT.comment = "shifting by (3,0,1) and rotating by 45 deg" print(LT) sph = Sphere(r=0.2) sph.apply_transform(LT) # same as: LT.move(s1) print(sph.transform) show(Point([0,0,0]), sph, str(LT.matrix), axes=1).close() ``` """ self.name = "LinearTransform" self.filename = "" self.comment = "" if T is None: T = vtki.vtkTransform() elif isinstance(T, vtki.vtkMatrix4x4): S = vtki.vtkTransform() S.SetMatrix(T) T = S elif isinstance(T, vtki.vtkLandmarkTransform): S = vtki.vtkTransform() S.SetMatrix(T.GetMatrix()) T = S elif _is_sequence(T): S = vtki.vtkTransform() M = vtki.vtkMatrix4x4() n = len(T) for i in range(n): for j in range(n): M.SetElement(i, j, T[i][j]) S.SetMatrix(M) T = S elif isinstance(T, vtki.vtkLinearTransform): S = vtki.vtkTransform() S.DeepCopy(T) T = S elif isinstance(T, LinearTransform): S = vtki.vtkTransform() S.DeepCopy(T.T) T = S elif isinstance(T, str): import json self.filename = str(T) try: with open(self.filename, "r") as read_file: D = json.load(read_file) self.name = D["name"] self.comment = D["comment"] matrix = np.array(D["matrix"]) except json.decoder.JSONDecodeError: ### assuming legacy vedo format E.g.: # aligned by manual_align.py # 0.8026854838223 -0.0789823873914 -0.508476844097 38.17377632072 # 0.0679734082661 0.9501827489452 -0.040289803376 -69.53864247951 # 0.5100652300642 -0.0023313569781 0.805555043665 -81.20317788519 # 0.0 0.0 0.0 1.0 with open(self.filename, "r", encoding="UTF-8") as read_file: lines = read_file.readlines() i = 0 matrix = np.eye(4) for l in lines: if l.startswith("#"): self.comment = l.replace("#", "").strip() continue vals = l.split(" ") for j in range(len(vals)): v = vals[j].replace("\n", "") if v != "": matrix[i, j] = float(v) i += 1 T = vtki.vtkTransform() m = vtki.vtkMatrix4x4() for i in range(4): for j in range(4): m.SetElement(i, j, matrix[i][j]) T.SetMatrix(m) self.T = T self.T.PostMultiply() self.inverse_flag = False def __str__(self): module = self.__class__.__module__ name = self.__class__.__name__ s = f"\x1b[7m\x1b[1m{module}.{name} at ({hex(id(self))})".ljust(75) + "\x1b[0m" s += "\nname".ljust(15) + ": " + self.name if self.filename: s += "\nfilename".ljust(15) + ": " + self.filename if self.comment: s += "\ncomment".ljust(15) + f': \x1b[3m"{self.comment}"\x1b[0m' s += f"\nconcatenations".ljust(15) + f": {self.ntransforms}" s += "\ninverse flag".ljust(15) + f": {bool(self.inverse_flag)}" arr = np.array2string(self.matrix, separator=', ', precision=6, suppress_small=True) s += "\nmatrix 4x4".ljust(15) + f":\n{arr}" return s def __repr__(self): return self.__str__() def print(self) -> "LinearTransform": """Print transformation.""" print(self.__str__()) return self def __call__(self, obj): """ Apply transformation to object or single point. Same as `move()` except that a copy is returned. """ return self.move(obj.copy()) def transform_point(self, p) -> np.ndarray: """ Apply transformation to a single point. """ if len(p) == 2: p = [p[0], p[1], 0] return np.array(self.T.TransformFloatPoint(p)) def move(self, obj): """ Apply transformation to object or single point. Note: When applying a transformation to a mesh, the mesh is modified in place. If you want to keep the original mesh unchanged, use `clone()` method. Example: ```python from vedo import * settings.use_parallel_projection = True LT = LinearTransform() LT.translate([3,0,1]).rotate_z(45) print(LT) s = Sphere(r=0.2) LT.move(s) # same as: # s.apply_transform(LT) zero = Point([0,0,0]) show(s, zero, axes=1).close() ``` """ if _is_sequence(obj): n = len(obj) if n == 2: obj = [obj[0], obj[1], 0] return np.array(self.T.TransformFloatPoint(obj)) obj.apply_transform(self) return obj def reset(self) -> Self: """Reset transformation.""" self.T.Identity() return self def compute_main_axes(self) -> np.ndarray: """ Compute main axes of the transformation matrix. These are the axes of the ellipsoid that is the image of the unit sphere under the transformation. Example: ```python from vedo import * settings.use_parallel_projection = True M = np.random.rand(3,3)-0.5 print(M) print(" M@[1,0,0] =", M@[1,1,0]) ###################### A = LinearTransform(M) print(A) pt = Point([1,1,0]) print(A(pt).coordinates[0], "is the same as", A([1,1,0])) maxes = A.compute_main_axes() arr1 = Arrow([0,0,0], maxes[0]).c('r') arr2 = Arrow([0,0,0], maxes[1]).c('g') arr3 = Arrow([0,0,0], maxes[2]).c('b') sphere1 = Sphere().wireframe().lighting('off') sphere1.cmap('hot', sphere1.coordinates[:,2]) sphere2 = sphere1.clone().apply_transform(A) show([sphere1, [sphere2, arr1, arr2, arr3]], N=2, axes=1, bg='bb') ``` """ m = self.matrix3x3 eigval, eigvec = np.linalg.eig(m @ m.T) eigval = np.sqrt(eigval) return np.array([ eigvec[:,0] * eigval[0], eigvec[:,1] * eigval[1], eigvec[:,2] * eigval[2], ]) def pop(self) -> Self: """Delete the transformation on the top of the stack and sets the top to the next transformation on the stack.""" self.T.Pop() return self def is_identity(self) -> bool: """Check if the transformation is the identity.""" m = self.T.GetMatrix() M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] if np.allclose(M - np.eye(4), 0): return True return False def invert(self) -> Self: """Invert the transformation. Acts in-place.""" self.T.Inverse() self.inverse_flag = bool(self.T.GetInverseFlag()) return self def compute_inverse(self) -> "LinearTransform": """Compute the inverse.""" t = self.clone() t.invert() return t def transpose(self) -> Self: """Transpose the transformation. Acts in-place.""" M = vtki.vtkMatrix4x4() self.T.GetTranspose(M) self.T.SetMatrix(M) return self def copy(self) -> "LinearTransform": """Return a copy of the transformation. Alias of `clone()`.""" return self.clone() def clone(self) -> "LinearTransform": """Clone transformation to make an exact copy.""" return LinearTransform(self.T) def concatenate(self, T, pre_multiply=False) -> Self: """ Post-multiply (by default) 2 transfomations. T can also be a 4x4 matrix or 3x3 matrix. Example: ```python from vedo import LinearTransform A = LinearTransform() A.rotate_x(45) A.translate([7,8,9]) A.translate([10,10,10]) A.name = "My transformation A" print(A) B = A.compute_inverse() B.shift([1,2,3]) B.name = "My transformation B (shifted inverse of A)" print(B) # A is applied first, then B # print("A.concatenate(B)", A.concatenate(B)) # B is applied first, then A print(B*A) ``` """ if _is_sequence(T): S = vtki.vtkTransform() M = vtki.vtkMatrix4x4() n = len(T) for i in range(n): for j in range(n): M.SetElement(i, j, T[i][j]) S.SetMatrix(M) T = S if pre_multiply: self.T.PreMultiply() try: self.T.Concatenate(T) except: self.T.Concatenate(T.T) self.T.PostMultiply() return self def __mul__(self, A): """Pre-multiply 2 transfomations.""" return self.concatenate(A, pre_multiply=True) def get_concatenated_transform(self, i) -> "LinearTransform": """Get intermediate matrix by concatenation index.""" return LinearTransform(self.T.GetConcatenatedTransform(i)) @property def ntransforms(self) -> int: """Get the number of concatenated transforms.""" return self.T.GetNumberOfConcatenatedTransforms() def translate(self, p) -> Self: """Translate, same as `shift`.""" if len(p) == 2: p = [p[0], p[1], 0] self.T.Translate(p) return self def shift(self, p) -> Self: """Shift, same as `translate`.""" return self.translate(p) def scale(self, s, origin=True) -> Self: """Scale.""" if not _is_sequence(s): s = [s, s, s] if origin is True: p = np.array(self.T.GetPosition()) if np.linalg.norm(p) > 0: self.T.Translate(-p) self.T.Scale(*s) self.T.Translate(p) else: self.T.Scale(*s) elif _is_sequence(origin): origin = np.asarray(origin) self.T.Translate(-origin) self.T.Scale(*s) self.T.Translate(origin) else: self.T.Scale(*s) return self def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False) -> Self: """ Rotate around an arbitrary `axis` passing through `point`. Example: ```python from vedo import * c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 v = vector(0.2, 1, 0) p = vector(1.0, 0, 0) # axis passes through this point c2.rotate(90, axis=v, point=p) l = Line(p-v, p+v).c('red5').lw(3) show(c1, l, c2, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ if np.all(axis == 0): return self if not angle: return self if rad: anglerad = angle else: anglerad = np.deg2rad(angle) axis = np.asarray(axis) / np.linalg.norm(axis) a = np.cos(anglerad / 2) b, c, d = -axis * np.sin(anglerad / 2) aa, bb, cc, dd = a * a, b * b, c * c, d * d bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d R = np.array( [ [aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)], [2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)], [2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc], ] ) rv = np.dot(R, self.T.GetPosition() - np.asarray(point)) + point if rad: angle *= 180.0 / np.pi # this vtk method only rotates in the origin of the object: self.T.RotateWXYZ(angle, axis[0], axis[1], axis[2]) self.T.Translate(rv - np.array(self.T.GetPosition())) return self def _rotatexyz(self, axe, angle, rad, around): if not angle: return self if rad: angle *= 180 / np.pi rot = dict(x=self.T.RotateX, y=self.T.RotateY, z=self.T.RotateZ) if around is None: # rotate around its origin rot[axe](angle) else: # displacement needed to bring it back to the origin self.T.Translate(-np.asarray(around)) rot[axe](angle) self.T.Translate(around) return self def rotate_x(self, angle: float, rad=False, around=None) -> Self: """ Rotate around x-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ return self._rotatexyz("x", angle, rad, around) def rotate_y(self, angle: float, rad=False, around=None) -> Self: """ Rotate around y-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ return self._rotatexyz("y", angle, rad, around) def rotate_z(self, angle: float, rad=False, around=None) -> Self: """ Rotate around z-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ return self._rotatexyz("z", angle, rad, around) def set_position(self, p) -> Self: """Set position.""" if len(p) == 2: p = np.array([p[0], p[1], 0]) q = np.array(self.T.GetPosition()) self.T.Translate(p - q) return self # def set_scale(self, s): # """Set absolute scale.""" # if not _is_sequence(s): # s = [s, s, s] # s0, s1, s2 = 1, 1, 1 # b = self.T.GetScale() # print(b) # if b[0]: # s0 = s[0] / b[0] # if b[1]: # s1 = s[1] / b[1] # if b[2]: # s2 = s[2] / b[2] # self.T.Scale(s0, s1, s2) # print() # return self def get_scale(self) -> np.ndarray: """Get current scale.""" return np.array(self.T.GetScale()) @property def orientation(self) -> np.ndarray: """Compute orientation.""" return np.array(self.T.GetOrientation()) @property def position(self) -> np.ndarray: """Compute position.""" return np.array(self.T.GetPosition()) @property def matrix(self) -> np.ndarray: """Get the 4x4 trasformation matrix.""" m = self.T.GetMatrix() M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] return np.array(M) @matrix.setter def matrix(self, M) -> None: """Set trasformation by assigning a 4x4 or 3x3 numpy matrix.""" n = len(M) m = vtki.vtkMatrix4x4() for i in range(n): for j in range(n): m.SetElement(i, j, M[i][j]) self.T.SetMatrix(m) @property def matrix3x3(self) -> np.ndarray: """Get the 3x3 trasformation matrix.""" m = self.T.GetMatrix() M = [[m.GetElement(i, j) for j in range(3)] for i in range(3)] return np.array(M) def write(self, filename="transform.mat") -> Self: """Save transformation to ASCII file.""" import json m = self.T.GetMatrix() M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] arr = np.array(M) dictionary = { "name": self.name, "comment": self.comment, "matrix": arr.astype(float).tolist(), "ntransforms": self.ntransforms, } with open(filename, "w") as outfile: json.dump(dictionary, outfile, sort_keys=True, indent=2) return self def reorient( self, initaxis, newaxis, around=(0, 0, 0), rotation=0.0, rad=False, xyplane=True ) -> Self: """ Set/Get object orientation. Arguments: rotation : (float) rotate object around newaxis. concatenate : (bool) concatenate the orientation operation with the previous existing transform (if any) rad : (bool) set to True if angle is expressed in radians. xyplane : (bool) make an extra rotation to keep the object aligned to the xy-plane """ newaxis = np.asarray(newaxis) / np.linalg.norm(newaxis) initaxis = np.asarray(initaxis) / np.linalg.norm(initaxis) if not np.any(initaxis - newaxis): return self if not np.any(initaxis + newaxis): print("Warning: in reorient() initaxis and newaxis are parallel") newaxis += np.array([0.0000001, 0.0000002, 0.0]) angleth = np.pi else: angleth = np.arccos(np.dot(initaxis, newaxis)) crossvec = np.cross(initaxis, newaxis) p = np.asarray(around) self.T.Translate(-p) if rotation: if rad: rotation = np.rad2deg(rotation) self.T.RotateWXYZ(rotation, initaxis) self.T.RotateWXYZ(np.rad2deg(angleth), crossvec) if xyplane: self.T.RotateWXYZ(-self.orientation[0] * 1.4142, newaxis) self.T.Translate(p) return self ################################################### class NonLinearTransform: """Work with non-linear transformations.""" def __init__(self, T=None, **kwargs) -> None: """ Define a non-linear transformation. Can be saved to file and reloaded. Arguments: T : (vtkThinPlateSplineTransform, str, dict) vtk transformation. If T is a string, it is assumed to be a filename. If T is a dictionary, it is assumed to be a set of keyword arguments. Defaults to None. **kwargs : (dict) keyword arguments to define the transformation. The following keywords are accepted: - name : (str) name of the transformation - comment : (str) comment - source_points : (list) source points - target_points : (list) target points - mode : (str) either '2d' or '3d' - sigma : (float) sigma parameter Example: ```python from vedo import * settings.use_parallel_projection = True NLT = NonLinearTransform() NLT.source_points = [[-2,0,0], [1,2,1], [2,-2,2]] NLT.target_points = NLT.source_points + np.random.randn(3,3)*0.5 NLT.mode = '3d' print(NLT) s1 = Sphere() NLT.move(s1) # same as: # s1.apply_transform(NLT) arrs = Arrows(NLT.source_points, NLT.target_points) show(s1, arrs, Sphere().alpha(0.1), axes=1).close() ``` """ self.name = "NonLinearTransform" self.filename = "" self.comment = "" if T is None and len(kwargs) == 0: T = vtki.vtkThinPlateSplineTransform() elif isinstance(T, vtki.vtkThinPlateSplineTransform): S = vtki.vtkThinPlateSplineTransform() S.DeepCopy(T) T = S elif isinstance(T, NonLinearTransform): S = vtki.vtkThinPlateSplineTransform() S.DeepCopy(T.T) T = S elif isinstance(T, str): import json filename = str(T) self.filename = filename with open(filename, "r") as read_file: D = json.load(read_file) self.name = D["name"] self.comment = D["comment"] source = D["source_points"] target = D["target_points"] mode = D["mode"] sigma = D["sigma"] T = vtki.vtkThinPlateSplineTransform() vptss = vtki.vtkPoints() for p in source: if len(p) == 2: p = [p[0], p[1], 0.0] vptss.InsertNextPoint(p) T.SetSourceLandmarks(vptss) vptst = vtki.vtkPoints() for p in target: if len(p) == 2: p = [p[0], p[1], 0.0] vptst.InsertNextPoint(p) T.SetTargetLandmarks(vptst) T.SetSigma(sigma) if mode == "2d": T.SetBasisToR2LogR() elif mode == "3d": T.SetBasisToR() else: print(f'In {filename} mode can be either "2d" or "3d"') elif len(kwargs) > 0: T = kwargs.copy() self.name = T.pop("name", "NonLinearTransform") self.comment = T.pop("comment", "") source = T.pop("source_points", []) target = T.pop("target_points", []) mode = T.pop("mode", "3d") sigma = T.pop("sigma", 1.0) if len(T) > 0: print("Warning: NonLinearTransform got unexpected keyword arguments:") print(T) T = vtki.vtkThinPlateSplineTransform() vptss = vtki.vtkPoints() for p in source: if len(p) == 2: p = [p[0], p[1], 0.0] vptss.InsertNextPoint(p) T.SetSourceLandmarks(vptss) vptst = vtki.vtkPoints() for p in target: if len(p) == 2: p = [p[0], p[1], 0.0] vptst.InsertNextPoint(p) T.SetTargetLandmarks(vptst) T.SetSigma(sigma) if mode == "2d": T.SetBasisToR2LogR() elif mode == "3d": T.SetBasisToR() else: print(f'Warning: mode can be either "2d" or "3d"') self.T = T self.inverse_flag = False def __str__(self): module = self.__class__.__module__ name = self.__class__.__name__ s = f"\x1b[7m\x1b[1m{module}.{name} at ({hex(id(self))})".ljust(75) + "\x1b[0m\n" s += "name".ljust(9) + ": " + self.name + "\n" if self.filename: s += "filename".ljust(9) + ": " + self.filename + "\n" if self.comment: s += "comment".ljust(9) + f': \x1b[3m"{self.comment}"\x1b[0m\n' s += f"mode".ljust(9) + f": {self.mode}\n" s += f"sigma".ljust(9) + f": {self.sigma}\n" p = self.source_points q = self.target_points s += f"sources".ljust(9) + f": {p.size}, bounds {np.min(p, axis=0)}, {np.max(p, axis=0)}\n" s += f"targets".ljust(9) + f": {q.size}, bounds {np.min(q, axis=0)}, {np.max(q, axis=0)}" return s def __repr__(self): return self.__str__() def print(self) -> Self: """Print transformation.""" print(self.__str__()) return self def update(self) -> Self: """Update transformation.""" self.T.Update() return self @property def position(self) -> np.ndarray: """ Trying to get the position of a `NonLinearTransform` always returns [0,0,0]. """ return np.array([0.0, 0.0, 0.0], dtype=np.float32) # @position.setter # def position(self, p): # """ # Trying to set position of a `NonLinearTransform` # has no effect and prints a warning. # Use clone() method to create a copy of the object, # or reset it with 'object.transform = vedo.LinearTransform()' # """ # print("Warning: NonLinearTransform has no position.") # print(" Use clone() method to create a copy of the object,") # print(" or reset it with 'object.transform = vedo.LinearTransform()'") @property def source_points(self) -> np.ndarray: """Get the source points.""" pts = self.T.GetSourceLandmarks() vpts = [] if pts: for i in range(pts.GetNumberOfPoints()): vpts.append(pts.GetPoint(i)) return np.array(vpts, dtype=np.float32) @source_points.setter def source_points(self, pts): """Set source points.""" if _is_sequence(pts): pass else: pts = pts.coordinates vpts = vtki.vtkPoints() for p in pts: if len(p) == 2: p = [p[0], p[1], 0.0] vpts.InsertNextPoint(p) self.T.SetSourceLandmarks(vpts) @property def target_points(self) -> np.ndarray: """Get the target points.""" pts = self.T.GetTargetLandmarks() vpts = [] for i in range(pts.GetNumberOfPoints()): vpts.append(pts.GetPoint(i)) return np.array(vpts, dtype=np.float32) @target_points.setter def target_points(self, pts): """Set target points.""" if _is_sequence(pts): pass else: pts = pts.coordinates vpts = vtki.vtkPoints() for p in pts: if len(p) == 2: p = [p[0], p[1], 0.0] vpts.InsertNextPoint(p) self.T.SetTargetLandmarks(vpts) @property def sigma(self) -> float: """Set sigma.""" return self.T.GetSigma() @sigma.setter def sigma(self, s): """Get sigma.""" self.T.SetSigma(s) @property def mode(self) -> str: """Get mode.""" m = self.T.GetBasis() # print("T.GetBasis()", m, self.T.GetBasisAsString()) if m == 2: return "2d" elif m == 1: return "3d" else: print("Warning: NonLinearTransform has no valid mode.") return "" @mode.setter def mode(self, m): """Set mode.""" if m == "3d": self.T.SetBasisToR() elif m == "2d": self.T.SetBasisToR2LogR() else: print('In NonLinearTransform mode can be either "2d" or "3d"') def clone(self) -> "NonLinearTransform": """Clone transformation to make an exact copy.""" return NonLinearTransform(self.T) def write(self, filename) -> Self: """Save transformation to ASCII file.""" import json dictionary = { "name": self.name, "comment": self.comment, "mode": self.mode, "sigma": self.sigma, "source_points": self.source_points.astype(float).tolist(), "target_points": self.target_points.astype(float).tolist(), } with open(filename, "w") as outfile: json.dump(dictionary, outfile, sort_keys=True, indent=2) return self def invert(self) -> "NonLinearTransform": """Invert transformation.""" self.T.Inverse() self.inverse_flag = bool(self.T.GetInverseFlag()) return self def compute_inverse(self) -> Self: """Compute inverse.""" t = self.clone() t.invert() return t def __call__(self, obj): """ Apply transformation to object or single point. Same as `move()` except that a copy is returned. """ # use copy here not clone in case user passes a numpy array return self.move(obj.copy()) def compute_main_axes(self, pt=(0,0,0), ds=1) -> np.ndarray: """ Compute main axes of the transformation. These are the axes of the ellipsoid that is the image of the unit sphere under the transformation. Arguments: pt : (list) point to compute the axes at. ds : (float) step size to compute the axes. """ if len(pt) == 2: pt = [pt[0], pt[1], 0] pt = np.asarray(pt) m = np.array([ self.move(pt + [ds,0,0]), self.move(pt + [0,ds,0]), self.move(pt + [0,0,ds]), ]) eigval, eigvec = np.linalg.eig(m @ m.T) eigval = np.sqrt(eigval) return np.array([ eigvec[:, 0] * eigval[0], eigvec[:, 1] * eigval[1], eigvec[:, 2] * eigval[2], ]) def transform_point(self, p) -> np.ndarray: """ Apply transformation to a single point. """ if len(p) == 2: p = [p[0], p[1], 0] return np.array(self.T.TransformFloatPoint(p)) def move(self, obj): """ Apply transformation to the argument object. Note: When applying a transformation to a mesh, the mesh is modified in place. If you want to keep the original mesh unchanged, use the `clone()` method. Example: ```python from vedo import * np.random.seed(0) settings.use_parallel_projection = True NLT = NonLinearTransform() NLT.source_points = [[-2,0,0], [1,2,1], [2,-2,2]] NLT.target_points = NLT.source_points + np.random.randn(3,3)*0.5 NLT.mode = '3d' print(NLT) s1 = Sphere() NLT.move(s1) # same as: # s1.apply_transform(NLT) arrs = Arrows(NLT.source_points, NLT.target_points) show(s1, arrs, Sphere().alpha(0.1), axes=1).close() ``` """ if _is_sequence(obj): return self.transform_point(obj) obj.apply_transform(self) return obj ######################################################################## class TransformInterpolator: """ Interpolate between a set of linear transformations. Position, scale and orientation (i.e., rotations) are interpolated separately, and can be interpolated linearly or with a spline function. Note that orientation is interpolated using quaternions via SLERP (spherical linear interpolation) or the special `vtkQuaternionSpline` class. To use this class, add at least two pairs of (t, transformation) with the add() method. Then interpolate the transforms with the `TransformInterpolator(t)` call method, where "t" must be in the range of `(min, max)` times specified by the add() method. Example: ```python from vedo import * T0 = LinearTransform() T1 = LinearTransform().rotate_x(90).shift([12,0,0]) TRI = TransformInterpolator("linear") TRI.add(0, T0) TRI.add(1, T1) plt = Plotter(axes=1) for i in range(11): t = i/10 T = TRI(t) plt += Cube().color(i).apply_transform(T) plt.show().close() ``` ![](https://vedo.embl.es/images/other/transf_interp.png) """ def __init__(self, mode="linear") -> None: """ Interpolate between two or more linear transformations. """ self.vtk_interpolator = vtki.new("TransformInterpolator") self.mode(mode) self.TS: List[LinearTransform] = [] def __call__(self, t): """ Get the intermediate transformation at time `t`. """ xform = vtki.vtkTransform() self.vtk_interpolator.InterpolateTransform(t, xform) return LinearTransform(xform) def add(self, t, T) -> "TransformInterpolator": """Add intermediate transformations.""" try: # in case a vedo object is passed T = T.transform except AttributeError: pass self.TS.append(T) self.vtk_interpolator.AddTransform(t, T.T) return self # def remove(self, t) -> "TransformInterpolator": # """Remove intermediate transformations.""" # self.TS.pop(t) # self.vtk_interpolator.RemoveTransform(t) # return self def trange(self) -> np.ndarray: """Get interpolation range.""" tmin = self.vtk_interpolator.GetMinimumT() tmax = self.vtk_interpolator.GetMaximumT() return np.array([tmin, tmax]) def clear(self) -> "TransformInterpolator": """Clear all intermediate transformations.""" self.TS = [] self.vtk_interpolator.Initialize() return self def mode(self, m) -> "TransformInterpolator": """Set interpolation mode ('linear' or 'spline').""" if m == "linear": self.vtk_interpolator.SetInterpolationTypeToLinear() elif m == "spline": self.vtk_interpolator.SetInterpolationTypeToSpline() else: print('In TransformInterpolator mode can be either "linear" or "spline"') return self @property def ntransforms(self) -> int: """Get number of transformations.""" return self.vtk_interpolator.GetNumberOfTransforms() ######################################################################## # 2d ###### def cart2pol(x, y) -> np.ndarray: """2D Cartesian to Polar coordinates conversion.""" theta = np.arctan2(y, x) rho = np.hypot(x, y) return np.array([rho, theta]) def pol2cart(rho, theta) -> np.ndarray: """2D Polar to Cartesian coordinates conversion.""" x = rho * np.cos(theta) y = rho * np.sin(theta) return np.array([x, y]) ######################################################################## # 3d ###### def cart2spher(x, y, z) -> np.ndarray: """3D Cartesian to Spherical coordinate conversion.""" hxy = np.hypot(x, y) rho = np.hypot(hxy, z) theta = np.arctan2(hxy, z) phi = np.arctan2(y, x) return np.array([rho, theta, phi]) def spher2cart(rho, theta, phi) -> np.ndarray: """3D Spherical to Cartesian coordinate conversion.""" st = np.sin(theta) sp = np.sin(phi) ct = np.cos(theta) cp = np.cos(phi) rst = rho * st x = rst * cp y = rst * sp z = rho * ct return np.array([x, y, z]) def cart2cyl(x, y, z) -> np.ndarray: """3D Cartesian to Cylindrical coordinate conversion.""" rho = np.sqrt(x * x + y * y) theta = np.arctan2(y, x) return np.array([rho, theta, z]) def cyl2cart(rho, theta, z) -> np.ndarray: """3D Cylindrical to Cartesian coordinate conversion.""" x = rho * np.cos(theta) y = rho * np.sin(theta) return np.array([x, y, z]) def cyl2spher(rho, theta, z) -> np.ndarray: """3D Cylindrical to Spherical coordinate conversion.""" rhos = np.sqrt(rho * rho + z * z) phi = np.arctan2(rho, z) return np.array([rhos, phi, theta]) def spher2cyl(rho, theta, phi) -> np.ndarray: """3D Spherical to Cylindrical coordinate conversion.""" rhoc = rho * np.sin(theta) z = rho * np.cos(theta) return np.array([rhoc, phi, z]) vedo-2025.5.3/vedo/utils.py000066400000000000000000002665141474667405700154160ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import time from typing import Union, Tuple, MutableSequence, List import numpy as np from vtkmodules.util.numpy_support import numpy_to_vtk, vtk_to_numpy from vtkmodules.util.numpy_support import numpy_to_vtkIdTypeArray import vedo.vtkclasses as vtki import vedo __docformat__ = "google" __doc__ = "Utilities submodule." __all__ = [ "OperationNode", "ProgressBar", "progressbar", "Minimizer", "geometry", "is_sequence", "lin_interpolate", "vector", "mag", "mag2", "versor", "precision", "round_to_digit", "point_in_triangle", "point_line_distance", "closest", "grep", "make_bands", "pack_spheres", "humansort", "print_histogram", "print_inheritance_tree", "camera_from_quaternion", "camera_from_neuroglancer", "camera_from_dict", "camera_to_dict", "oriented_camera", "vedo2trimesh", "trimesh2vedo", "vedo2meshlab", "meshlab2vedo", "vedo2open3d", "open3d2vedo", "vtk2numpy", "numpy2vtk", "get_uv", "andrews_curves", ] ########################################################################### class OperationNode: """ Keep track of the operations which led to a final state. """ # https://www.graphviz.org/doc/info/shapes.html#html # Mesh #e9c46a # Follower #d9ed92 # Volume, UnstructuredGrid #4cc9f0 # TetMesh #9e2a2b # File #8a817c # Image #f28482 # Assembly #f08080 def __init__( self, operation, parents=(), comment="", shape="none", c="#e9c46a", style="filled" ) -> None: """ Keep track of the operations which led to a final object. This allows to show the `pipeline` tree for any `vedo` object with e.g.: ```python from vedo import * sp = Sphere() sp.clean().subdivide() sp.pipeline.show() ``` Arguments: operation : (str, class) descriptor label, if a class is passed then grab its name parents : (list) list of the parent classes the object comes from comment : (str) a second-line text description shape : (str) shape of the frame, check out [this link.](https://graphviz.org/doc/info/shapes.html) c : (hex) hex color style : (str) comma-separated list of styles Example: ```python from vedo.utils import OperationNode op_node1 = OperationNode("Operation1", c="lightblue") op_node2 = OperationNode("Operation2") op_node3 = OperationNode("Operation3", shape='diamond') op_node4 = OperationNode("Operation4") op_node5 = OperationNode("Operation5") op_node6 = OperationNode("Result", c="lightgreen") op_node3.add_parent(op_node1) op_node4.add_parent(op_node1) op_node3.add_parent(op_node2) op_node5.add_parent(op_node2) op_node6.add_parent(op_node3) op_node6.add_parent(op_node5) op_node6.add_parent(op_node1) op_node6.show(orientation="TB") ``` ![](https://vedo.embl.es/images/feats/operation_node.png) """ if not vedo.settings.enable_pipeline: return if isinstance(operation, str): self.operation = operation else: self.operation = operation.__class__.__name__ self.operation_plain = str(self.operation) pp = [] # filter out invalid stuff for p in parents: if hasattr(p, "pipeline"): pp.append(p.pipeline) self.parents = pp if comment: self.operation = f"<{self.operation}
{comment}>" self.dot = None self.time = time.time() self.shape = shape self.style = style self.color = c self.counts = 0 def add_parent(self, parent) -> None: self.parents.append(parent) def _build_tree(self, dot): dot.node( str(id(self)), label=self.operation, shape=self.shape, color=self.color, style=self.style, ) for parent in self.parents: if parent: t = f"{self.time - parent.time: .1f}s" dot.edge(str(id(parent)), str(id(self)), label=t) parent._build_tree(dot) def __repr__(self): try: from treelib import Tree except ImportError: vedo.logger.error( "To use this functionality please install treelib:" "\n pip install treelib" ) return "" def _build_tree(parent): for par in parent.parents: if par: op = par.operation_plain tree.create_node( op, op + str(par.time), parent=parent.operation_plain + str(parent.time) ) _build_tree(par) try: tree = Tree() tree.create_node(self.operation_plain, self.operation_plain + str(self.time)) _build_tree(self) out = tree.show(stdout=False) except: out = f"Sorry treelib failed to build the tree for '{self.operation_plain}()'." return out def print(self) -> None: """Print the tree of operations.""" print(self.__str__()) def show(self, orientation="LR", popup=True) -> None: """Show the graphviz output for the pipeline of this object""" if not vedo.settings.enable_pipeline: return try: from graphviz import Digraph except ImportError: vedo.logger.error("please install graphviz with command\n pip install graphviz") return # visualize the entire tree dot = Digraph( node_attr={"fontcolor": "#201010", "fontname": "Helvetica", "fontsize": "12"}, edge_attr={"fontname": "Helvetica", "fontsize": "6", "arrowsize": "0.4"}, ) dot.attr(rankdir=orientation) self.counts = 0 self._build_tree(dot) self.dot = dot home_dir = os.path.expanduser("~") gpath = os.path.join( home_dir, vedo.settings.cache_directory, "vedo", "pipeline_graphviz") dot.render(gpath, view=popup) ########################################################################### class ProgressBar: """ Class to print a progress bar. """ def __init__( self, start, stop, step=1, c=None, bold=True, italic=False, title="", eta=True, delay=-1, width=25, char="\U00002501", char_back="\U00002500", ) -> None: """ Class to print a progress bar with optional text message. Check out also function `progressbar()`. Arguments: start : (int) starting value stop : (int) stopping value step : (int) step value c : (str) color in hex format title : (str) title text eta : (bool) estimate time of arrival delay : (float) minimum time before printing anything, if negative use the default value as set in `vedo.settings.progressbar_delay` width : (int) width of the progress bar char : (str) character to use for the progress bar char_back : (str) character to use for the background of the progress bar Example: ```python import time from vedo import ProgressBar pb = ProgressBar(0,40, c='r') for i in pb.range(): time.sleep(0.1) pb.print() ``` ![](https://user-images.githubusercontent.com/32848391/51858823-ed1f4880-2335-11e9-8788-2d102ace2578.png) """ self.char = char self.char_back = char_back self.title = title + " " if title: self.title = " " + self.title if delay < 0: delay = vedo.settings.progressbar_delay self.start = start self.stop = stop self.step = step self.color = c self.bold = bold self.italic = italic self.width = width self.pbar = "" self.percent = 0.0 self.percent_int = 0 self.eta = eta self.delay = delay self.t0 = time.time() self._remaining = 1e10 self._update(0) self._counts = 0 self._oldbar = "" self._lentxt = 0 self._range = np.arange(start, stop, step) def print(self, txt="", c=None) -> None: """Print the progress bar with an optional message.""" if not c: c = self.color self._update(self._counts + self.step) if self.delay: if time.time() - self.t0 < self.delay: return if self.pbar != self._oldbar: self._oldbar = self.pbar if self.eta and self._counts > 1: tdenom = time.time() - self.t0 if tdenom: vel = self._counts / tdenom self._remaining = (self.stop - self._counts) / vel else: vel = 1 self._remaining = 0.0 if self._remaining > 60: _mins = int(self._remaining / 60) _secs = self._remaining - 60 * _mins mins = f"{_mins}m" secs = f"{int(_secs + 0.5)}s " else: mins = "" secs = f"{int(self._remaining + 0.5)}s " vel = round(vel, 1) eta = f"eta: {mins}{secs}({vel} it/s) " if self._remaining < 0.5: dt = time.time() - self.t0 if dt > 60: _mins = int(dt / 60) _secs = dt - 60 * _mins mins = f"{_mins}m" secs = f"{int(_secs + 0.5)}s " else: mins = "" secs = f"{int(dt + 0.5)}s " eta = f"elapsed: {mins}{secs}({vel} it/s) " txt = "" else: eta = "" eraser = " " * self._lentxt + "\b" * self._lentxt s = f"{self.pbar} {eraser}{eta}{txt}\r" vedo.printc(s, c=c, bold=self.bold, italic=self.italic, end="") if self.percent > 99.999: print("") self._lentxt = len(txt) def range(self) -> np.ndarray: """Return the range iterator.""" return self._range def _update(self, counts): if counts < self.start: counts = self.start elif counts > self.stop: counts = self.stop self._counts = counts self.percent = (self._counts - self.start) * 100.0 delta = self.stop - self.start if delta: self.percent /= delta else: self.percent = 0.0 self.percent_int = int(round(self.percent)) af = self.width - 2 nh = int(round(self.percent_int / 100 * af)) pbar_background = "\x1b[2m" + self.char_back * (af - nh) self.pbar = f"{self.title}{self.char * (nh-1)}{pbar_background}" if self.percent < 100.0: ps = f" {self.percent_int}%" else: ps = "" self.pbar += ps ##################################### def progressbar( iterable, c=None, bold=True, italic=False, title="", eta=True, width=25, delay=-1, ): """ Function to print a progress bar with optional text message. Use delay to set a minimum time before printing anything. If delay is negative, then use the default value as set in `vedo.settings.progressbar_delay`. Arguments: start : (int) starting value stop : (int) stopping value step : (int) step value c : (str) color in hex format title : (str) title text eta : (bool) estimate time of arrival delay : (float) minimum time before printing anything, if negative use the default value set in `vedo.settings.progressbar_delay` width : (int) width of the progress bar char : (str) character to use for the progress bar char_back : (str) character to use for the background of the progress bar Example: ```python import time for i in progressbar(range(100), c='r'): time.sleep(0.1) ``` ![](https://user-images.githubusercontent.com/32848391/51858823-ed1f4880-2335-11e9-8788-2d102ace2578.png) """ try: if is_number(iterable): total = int(iterable) iterable = range(total) else: total = len(iterable) except TypeError: iterable = list(iterable) total = len(iterable) pb = ProgressBar( 0, total, c=c, bold=bold, italic=italic, title=title, eta=eta, delay=delay, width=width, ) for item in iterable: pb.print() yield item ########################################################### class Minimizer: """ A function minimizer that uses the Nelder-Mead method. The algorithm constructs an n-dimensional simplex in parameter space (i.e. a tetrahedron if the number or parameters is 3) and moves the vertices around parameter space until a local minimum is found. The amoeba method is robust, reasonably efficient, but is not guaranteed to find the global minimum if several local minima exist. Arguments: function : (callable) the function to minimize max_iterations : (int) the maximum number of iterations contraction_ratio : (float) The contraction ratio. The default value of 0.5 gives fast convergence, but larger values such as 0.6 or 0.7 provide greater stability. expansion_ratio : (float) The expansion ratio. The default value is 2.0, which provides rapid expansion. Values between 1.1 and 2.0 are valid. tol : (float) the tolerance for convergence Example: - [nelder-mead.py](https://github.com/marcomusy/vedo/blob/master/examples/others/nelder-mead.py) """ def __init__( self, function=None, max_iterations=10000, contraction_ratio=0.5, expansion_ratio=2.0, tol=1e-5, ) -> None: self.function = function self.tolerance = tol self.contraction_ratio = contraction_ratio self.expansion_ratio = expansion_ratio self.max_iterations = max_iterations self.minimizer = vtki.new("AmoebaMinimizer") self.minimizer.SetFunction(self._vtkfunc) self.results = {} self.parameters_path = [] self.function_path = [] def _vtkfunc(self): n = self.minimizer.GetNumberOfParameters() ain = [self.minimizer.GetParameterValue(i) for i in range(n)] r = self.function(ain) self.minimizer.SetFunctionValue(r) self.parameters_path.append(ain) self.function_path.append(r) return r def eval(self, parameters=()) -> float: """ Evaluate the function at the current or given parameters. """ if len(parameters) == 0: return self.minimizer.EvaluateFunction() self.set_parameters(parameters) return self.function(parameters) def set_parameter(self, name, value, scale=1.0) -> None: """ Set the parameter value. The initial amount by which the parameter will be modified during the search for the minimum. """ self.minimizer.SetParameterValue(name, value) self.minimizer.SetParameterScale(name, scale) def set_parameters(self, parameters) -> None: """ Set the parameters names and values from a dictionary. """ for name, value in parameters.items(): if len(value) == 2: self.set_parameter(name, value[0], value[1]) else: self.set_parameter(name, value) def minimize(self) -> dict: """ Minimize the input function. Returns: dict : the minimization results init_parameters : (dict) the initial parameters parameters : (dict) the final parameters min_value : (float) the minimum value iterations : (int) the number of iterations max_iterations : (int) the maximum number of iterations tolerance : (float) the tolerance for convergence convergence_flag : (int) zero if the tolerance stopping criterion has been met. parameters_path : (np.array) the path of the minimization algorithm in parameter space function_path : (np.array) the path of the minimization algorithm in function space hessian : (np.array) the Hessian matrix of the function at the minimum parameter_errors : (np.array) the errors on the parameters """ n = self.minimizer.GetNumberOfParameters() out = [( self.minimizer.GetParameterName(i), (self.minimizer.GetParameterValue(i), self.minimizer.GetParameterScale(i)) ) for i in range(n)] self.results["init_parameters"] = dict(out) self.minimizer.SetTolerance(self.tolerance) self.minimizer.SetContractionRatio(self.contraction_ratio) self.minimizer.SetExpansionRatio(self.expansion_ratio) self.minimizer.SetMaxIterations(self.max_iterations) self.minimizer.Minimize() self.results["convergence_flag"] = not bool(self.minimizer.Iterate()) out = [( self.minimizer.GetParameterName(i), self.minimizer.GetParameterValue(i), ) for i in range(n)] self.results["parameters"] = dict(out) self.results["min_value"] = self.minimizer.GetFunctionValue() self.results["iterations"] = self.minimizer.GetIterations() self.results["max_iterations"] = self.minimizer.GetMaxIterations() self.results["tolerance"] = self.minimizer.GetTolerance() self.results["expansion_ratio"] = self.expansion_ratio self.results["contraction_ratio"] = self.contraction_ratio self.results["parameters_path"] = np.array(self.parameters_path) self.results["function_path"] = np.array(self.function_path) self.results["hessian"] = np.zeros((n,n)) self.results["parameter_errors"] = np.zeros(n) return self.results def compute_hessian(self, epsilon=0) -> np.array: """ Compute the Hessian matrix of `function` at the minimum numerically. Arguments: epsilon : (float) Step size used for numerical approximation. Returns: array: Hessian matrix of `function` at minimum. """ if not epsilon: epsilon = self.tolerance * 10 n = self.minimizer.GetNumberOfParameters() x0 = [self.minimizer.GetParameterValue(i) for i in range(n)] hessian = np.zeros((n, n)) for i in vedo.progressbar(n, title="Computing Hessian", delay=2): for j in range(n): xijp = np.copy(x0) xijp[i] += epsilon xijp[j] += epsilon xijm = np.copy(x0) xijm[i] += epsilon xijm[j] -= epsilon xjip = np.copy(x0) xjip[i] -= epsilon xjip[j] += epsilon xjim = np.copy(x0) xjim[i] -= epsilon xjim[j] -= epsilon # Second derivative approximation fijp = self.function(xijp) fijm = self.function(xijm) fjip = self.function(xjip) fjim = self.function(xjim) hessian[i, j] = (fijp - fijm - fjip + fjim) / (2 * epsilon**2) self.results["hessian"] = hessian try: ihess = np.linalg.inv(hessian) self.results["parameter_errors"] = np.sqrt(np.diag(ihess)) except: vedo.logger.warning("Cannot compute hessian for parameter errors") self.results["parameter_errors"] = np.zeros(n) return hessian def __str__(self) -> str: out = vedo.printc( f"vedo.utils.Minimizer at ({hex(id(self))})".ljust(75), bold=True, invert=True, return_string=True, ) out += "Function name".ljust(20) + self.function.__name__ + "()\n" out += "-------- parameters initial value -----------\n" out += "Name".ljust(20) + "Value".ljust(20) + "Scale\n" for name, value in self.results["init_parameters"].items(): out += name.ljust(20) + str(value[0]).ljust(20) + str(value[1]) + "\n" out += "-------- parameters final value --------------\n" for name, value in self.results["parameters"].items(): out += name.ljust(20) + f"{value:.6f}" ierr = list(self.results["parameters"]).index(name) err = self.results["parameter_errors"][ierr] if err: out += f" ± {err:.4f}" out += "\n" out += "Value at minimum".ljust(20)+ f'{self.results["min_value"]}\n' out += "Iterations".ljust(20) + f'{self.results["iterations"]}\n' out += "Max iterations".ljust(20) + f'{self.results["max_iterations"]}\n' out += "Convergence flag".ljust(20)+ f'{self.results["convergence_flag"]}\n' out += "Tolerance".ljust(20) + f'{self.results["tolerance"]}\n' try: arr = np.array2string( self.compute_hessian(), separator=', ', precision=6, suppress_small=True, ) out += "Hessian Matrix:\n" + arr except: out += "Hessian Matrix: (not available)" return out ########################################################### def andrews_curves(M, res=100) -> np.ndarray: """ Computes the [Andrews curves](https://en.wikipedia.org/wiki/Andrews_plot) for the provided data. The input array is an array of shape (n,m) where n is the number of features and m is the number of observations. Arguments: M : (ndarray) the data matrix (or data vector). res : (int) the resolution (n. of points) of the output curve. Example: - [andrews_cluster.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/andrews_cluster.py) ![](https://vedo.embl.es/images/pyplot/andrews_cluster.png) """ # Credits: # https://gist.github.com/ryuzakyl/12c221ff0e54d8b1ac171c69ea552c0a M = np.asarray(M) m = int(res + 0.5) # getting data vectors X = np.reshape(M, (1, -1)) if len(M.shape) == 1 else M.copy() _rows, n = X.shape # andrews curve dimension (n. theta angles) t = np.linspace(-np.pi, np.pi, m) # m: range of values for angle theta # n: amount of components of the Fourier expansion A = np.empty((m, n)) # setting first column of A A[:, 0] = [1/np.sqrt(2)] * m # filling columns of A for i in range(1, n): # computing the scaling coefficient for angle theta c = np.ceil(i / 2) # computing i-th column of matrix A col = np.sin(c * t) if i % 2 == 1 else np.cos(c * t) # setting column in matrix A A[:, i] = col[:] # computing Andrews curves for provided data andrew_curves = np.dot(A, X.T).T # returning the Andrews Curves (raveling if needed) return np.ravel(andrew_curves) if andrew_curves.shape[0] == 1 else andrew_curves ########################################################### def numpy2vtk(arr, dtype=None, deep=True, name=""): """ Convert a numpy array into a `vtkDataArray`. Use `dtype='id'` for `vtkIdTypeArray` objects. """ # https://github.com/Kitware/VTK/blob/master/Wrapping/Python/vtkmodules/util/numpy_support.py if arr is None: return None arr = np.ascontiguousarray(arr) if dtype == "id": if vtki.vtkIdTypeArray().GetDataTypeSize() != 4: ast = np.int64 else: ast = np.int32 varr = numpy_to_vtkIdTypeArray(arr.astype(ast), deep=deep) elif dtype: varr = numpy_to_vtk(arr.astype(dtype), deep=deep) else: # let numpy_to_vtk() decide what is best type based on arr type if arr.dtype == np.bool_: arr = arr.astype(np.uint8) varr = numpy_to_vtk(arr, deep=deep) if name: varr.SetName(name) return varr def vtk2numpy(varr): """Convert a `vtkDataArray`, `vtkIdList` or `vtTransform` into a numpy array.""" if varr is None: return np.array([]) if isinstance(varr, vtki.vtkIdList): return np.array([varr.GetId(i) for i in range(varr.GetNumberOfIds())]) elif isinstance(varr, vtki.vtkBitArray): carr = vtki.vtkCharArray() carr.DeepCopy(varr) varr = carr elif isinstance(varr, vtki.vtkHomogeneousTransform): try: varr = varr.GetMatrix() except AttributeError: pass M = [[varr.GetElement(i, j) for j in range(4)] for i in range(4)] return np.array(M) return vtk_to_numpy(varr) def make3d(pts) -> np.ndarray: """ Make an array which might be 2D to 3D. Array can also be in the form `[allx, ally, allz]`. """ if pts is None: return np.array([]) pts = np.asarray(pts) if pts.dtype == "object": raise ValueError("Cannot form a valid numpy array, input may be non-homogenous") if pts.size == 0: # empty list return pts if pts.ndim == 1: if pts.shape[0] == 2: return np.hstack([pts, [0]]).astype(pts.dtype) elif pts.shape[0] == 3: return pts else: raise ValueError if pts.shape[1] == 3: return pts # if 2 <= pts.shape[0] <= 3 and pts.shape[1] > 3: # pts = pts.T if pts.shape[1] == 2: return np.c_[pts, np.zeros(pts.shape[0], dtype=pts.dtype)] if pts.shape[1] != 3: raise ValueError(f"input shape is not supported: {pts.shape}") return pts def geometry(obj, extent=None) -> "vedo.Mesh": """ Apply the `vtkGeometryFilter` to the input object. This is a general-purpose filter to extract geometry (and associated data) from any type of dataset. This filter also may be used to convert any type of data to polygonal type. The conversion process may be less than satisfactory for some 3D datasets. For example, this filter will extract the outer surface of a volume or structured grid dataset. Returns a `vedo.Mesh` object. Set `extent` as the `[xmin,xmax, ymin,ymax, zmin,zmax]` bounding box to clip data. """ gf = vtki.new("GeometryFilter") gf.SetInputData(obj) if extent is not None: gf.SetExtent(extent) gf.Update() return vedo.Mesh(gf.GetOutput()) def buildPolyData(vertices, faces=None, lines=None, strips=None, index_offset=0) -> vtki.vtkPolyData: """ Build a `vtkPolyData` object from a list of vertices where faces represents the connectivity of the polygonal mesh. Lines and triangle strips can also be specified. E.g. : - `vertices=[[x1,y1,z1],[x2,y2,z2], ...]` - `faces=[[0,1,2], [1,2,3], ...]` - `lines=[[0,1], [1,2,3,4], ...]` - `strips=[[0,1,2,3,4,5], [2,3,9,7,4], ...]` A flat list of faces can be passed as `faces=[3, 0,1,2, 4, 1,2,3,4, ...]`. For lines use `lines=[2, 0,1, 4, 1,2,3,4, ...]`. Use `index_offset=1` if face numbering starts from 1 instead of 0. """ if is_sequence(faces) and len(faces) == 0: faces=None if is_sequence(lines) and len(lines) == 0: lines=None if is_sequence(strips) and len(strips) == 0: strips=None poly = vtki.vtkPolyData() if len(vertices) == 0: return poly vertices = make3d(vertices) source_points = vtki.vtkPoints() if vedo.settings.force_single_precision_points: source_points.SetData(numpy2vtk(vertices, dtype=np.float32)) else: source_points.SetData(numpy2vtk(vertices)) poly.SetPoints(source_points) if lines is not None: # Create a cell array to store the lines in and add the lines to it linesarr = vtki.vtkCellArray() if is_sequence(lines[0]): # assume format [(id0,id1),..] for iline in lines: for i in range(0, len(iline) - 1): i1, i2 = iline[i], iline[i + 1] if i1 != i2: vline = vtki.vtkLine() vline.GetPointIds().SetId(0, i1) vline.GetPointIds().SetId(1, i2) linesarr.InsertNextCell(vline) else: # assume format [id0,id1,...] # print("buildPolyData: assuming lines format [id0,id1,...]", lines) # TODO CORRECT THIS CASE, MUST BE [2, id0,id1,...] for i in range(0, len(lines) - 1): vline = vtki.vtkLine() vline.GetPointIds().SetId(0, lines[i]) vline.GetPointIds().SetId(1, lines[i + 1]) linesarr.InsertNextCell(vline) poly.SetLines(linesarr) if faces is not None: source_polygons = vtki.vtkCellArray() if isinstance(faces, np.ndarray) or not is_ragged(faces): ##### all faces are composed of equal nr of vtxs, FAST faces = np.asarray(faces) if vtki.vtkIdTypeArray().GetDataTypeSize() != 4: ast = np.int64 else: ast = np.int32 if faces.ndim > 1: nf, nc = faces.shape hs = np.hstack((np.zeros(nf)[:, None] + nc, faces)) else: nf = faces.shape[0] hs = faces arr = numpy_to_vtkIdTypeArray(hs.astype(ast).ravel(), deep=True) source_polygons.SetCells(nf, arr) else: ############################# manually add faces, SLOW for f in faces: n = len(f) if n == 3: tri = vtki.vtkTriangle() pids = tri.GetPointIds() for i in range(3): pids.SetId(i, f[i] - index_offset) source_polygons.InsertNextCell(tri) else: ele = vtki.vtkPolygon() pids = ele.GetPointIds() pids.SetNumberOfIds(n) for i in range(n): pids.SetId(i, f[i] - index_offset) source_polygons.InsertNextCell(ele) poly.SetPolys(source_polygons) if strips is not None: tscells = vtki.vtkCellArray() for strip in strips: # create a triangle strip # https://vtk.org/doc/nightly/html/classvtkTriangleStrip.html n = len(strip) tstrip = vtki.vtkTriangleStrip() tstrip_ids = tstrip.GetPointIds() tstrip_ids.SetNumberOfIds(n) for i in range(n): tstrip_ids.SetId(i, strip[i] - index_offset) tscells.InsertNextCell(tstrip) poly.SetStrips(tscells) if faces is None and lines is None and strips is None: source_vertices = vtki.vtkCellArray() for i in range(len(vertices)): source_vertices.InsertNextCell(1) source_vertices.InsertCellPoint(i) poly.SetVerts(source_vertices) # print("buildPolyData \n", # poly.GetNumberOfPoints(), # poly.GetNumberOfCells(), # grand total # poly.GetNumberOfLines(), # poly.GetNumberOfPolys(), # poly.GetNumberOfStrips(), # poly.GetNumberOfVerts(), # ) return poly ############################################################################## def get_font_path(font: str) -> str: """Internal use.""" if font in vedo.settings.font_parameters.keys(): if vedo.settings.font_parameters[font]["islocal"]: fl = os.path.join(vedo.fonts_path, f"{font}.ttf") else: try: fl = vedo.file_io.download(f"https://vedo.embl.es/fonts/{font}.ttf", verbose=False) except: vedo.logger.warning(f"Could not download https://vedo.embl.es/fonts/{font}.ttf") fl = os.path.join(vedo.fonts_path, "Normografo.ttf") else: if font.startswith("https://"): fl = vedo.file_io.download(font, verbose=False) elif os.path.isfile(font): fl = font # assume user is passing a valid file else: if font.endswith(".ttf"): vedo.logger.error( f"Could not set font file {font}" f"-> using default: {vedo.settings.default_font}" ) else: vedo.settings.default_font = "Normografo" vedo.logger.error( f"Could not set font name {font}" f" -> using default: Normografo\n" f"Check out https://vedo.embl.es/fonts for additional fonts\n" f"Type 'vedo -r fonts' to see available fonts" ) fl = get_font_path(vedo.settings.default_font) return fl def is_sequence(arg) -> bool: """Check if the input is iterable.""" if hasattr(arg, "strip"): return False if hasattr(arg, "__getslice__"): return True if hasattr(arg, "__iter__"): return True return False def is_ragged(arr, deep=False) -> bool: """ A ragged or inhomogeneous array in Python is an array with arrays of different lengths as its elements. To check if an array is ragged, we iterate through the elements and check if their lengths are the same. Example: ```python arr = [[1, 2, 3], [[4, 5], [6], 1], [7, 8, 9]] print(is_ragged(arr, deep=True)) # output: True ``` """ n = len(arr) if n == 0: return False if is_sequence(arr[0]): length = len(arr[0]) for i in range(1, n): if len(arr[i]) != length or (deep and is_ragged(arr[i])): return True return False return False def flatten(list_to_flatten) -> list: """Flatten out a list.""" def _genflatten(lst): for elem in lst: if isinstance(elem, (list, tuple)): for x in flatten(elem): yield x else: yield elem return list(_genflatten(list_to_flatten)) def humansort(alist) -> list: """ Sort in place a given list the way humans expect. E.g. `['file11', 'file1'] -> ['file1', 'file11']` .. warning:: input list is modified in-place by this function. """ import re def alphanum_key(s): # Turn a string into a list of string and number chunks. # e.g. "z23a" -> ["z", 23, "a"] def tryint(s): if s.isdigit(): return int(s) return s return [tryint(c) for c in re.split("([0-9]+)", s)] alist.sort(key=alphanum_key) return alist # NB: input list is modified def sort_by_column(arr, nth, invert=False) -> np.ndarray: """Sort a numpy array by its `n-th` column.""" arr = np.asarray(arr) arr = arr[arr[:, nth].argsort()] if invert: return np.flip(arr, axis=0) return arr def point_in_triangle(p, p1, p2, p3) -> Union[bool, None]: """ Return True if a point is inside (or above/below) a triangle defined by 3 points in space. """ p1 = np.array(p1) u = p2 - p1 v = p3 - p1 n = np.cross(u, v) w = p - p1 ln = np.dot(n, n) if not ln: return None # degenerate triangle gamma = (np.dot(np.cross(u, w), n)) / ln if 0 < gamma < 1: beta = (np.dot(np.cross(w, v), n)) / ln if 0 < beta < 1: alpha = 1 - gamma - beta if 0 < alpha < 1: return True return False def intersection_ray_triangle(P0, P1, V0, V1, V2) -> Union[bool, None, np.ndarray]: """ Fast intersection between a directional ray defined by `P0,P1` and triangle `V0, V1, V2`. Returns the intersection point or - `None` if triangle is degenerate, or ray is parallel to triangle plane. - `False` if no intersection, or ray direction points away from triangle. """ # Credits: http://geomalgorithms.com/a06-_intersect-2.html # Get triangle edge vectors and plane normal # todo : this is slow should check # https://vtk.org/doc/nightly/html/classvtkCell.html V0 = np.asarray(V0, dtype=float) P0 = np.asarray(P0, dtype=float) u = V1 - V0 v = V2 - V0 n = np.cross(u, v) if not np.abs(v).sum(): # triangle is degenerate return None # do not deal with this case rd = P1 - P0 # ray direction vector w0 = P0 - V0 a = -np.dot(n, w0) b = np.dot(n, rd) if not b: # ray is parallel to triangle plane return None # Get intersect point of ray with triangle plane r = a / b if r < 0.0: # ray goes away from triangle return False # => no intersect # Gor a segment, also test if (r > 1.0) => no intersect I = P0 + r * rd # intersect point of ray and plane # is I inside T? uu = np.dot(u, u) uv = np.dot(u, v) vv = np.dot(v, v) w = I - V0 wu = np.dot(w, u) wv = np.dot(w, v) D = uv * uv - uu * vv # Get and test parametric coords s = (uv * wv - vv * wu) / D if s < 0.0 or s > 1.0: # I is outside T return False t = (uv * wu - uu * wv) / D if t < 0.0 or (s + t) > 1.0: # I is outside T return False return I # I is in T def triangle_solver(**input_dict): """ Solve a triangle from any 3 known elements. (Note that there might be more than one solution or none). Angles are in radians. Example: ```python print(triangle_solver(a=3, b=4, c=5)) print(triangle_solver(a=3, ac=0.9273, ab=1.5716)) print(triangle_solver(a=3, b=4, ab=1.5716)) print(triangle_solver(b=4, bc=.64, ab=1.5716)) print(triangle_solver(c=5, ac=.9273, bc=0.6435)) print(triangle_solver(a=3, c=5, bc=0.6435)) print(triangle_solver(b=4, c=5, ac=0.927)) ``` """ a = input_dict.get("a") b = input_dict.get("b") c = input_dict.get("c") ab = input_dict.get("ab") bc = input_dict.get("bc") ac = input_dict.get("ac") if ab and bc: ac = np.pi - bc - ab elif bc and ac: ab = np.pi - bc - ac elif ab and ac: bc = np.pi - ab - ac if a is not None and b is not None and c is not None: ab = np.arccos((a ** 2 + b ** 2 - c ** 2) / (2 * a * b)) sinab = np.sin(ab) ac = np.arcsin(a / c * sinab) bc = np.arcsin(b / c * sinab) elif a is not None and b is not None and ab is not None: c = np.sqrt(a ** 2 + b ** 2 - 2 * a * b * np.cos(ab)) sinab = np.sin(ab) ac = np.arcsin(a / c * sinab) bc = np.arcsin(b / c * sinab) elif a is not None and ac is not None and ab is not None: h = a * np.sin(ac) b = h / np.sin(bc) c = b * np.cos(bc) + a * np.cos(ac) elif b is not None and bc is not None and ab is not None: h = b * np.sin(bc) a = h / np.sin(ac) c = np.sqrt(a * a + b * b) elif c is not None and ac is not None and bc is not None: h = c * np.sin(bc) b1 = c * np.cos(bc) b2 = h / np.tan(ab) b = b1 + b2 a = np.sqrt(b2 * b2 + h * h) elif a is not None and c is not None and bc is not None: # double solution h = c * np.sin(bc) k = np.sqrt(a * a - h * h) omega = np.arcsin(k / a) cosbc = np.cos(bc) b = c * cosbc - k phi = np.pi / 2 - bc - omega ac = phi ab = np.pi - ac - bc if k: b2 = c * cosbc + k ac2 = phi + 2 * omega ab2 = np.pi - ac2 - bc return [ {"a": a, "b": b, "c": c, "ab": ab, "bc": bc, "ac": ac}, {"a": a, "b": b2, "c": c, "ab": ab2, "bc": bc, "ac": ac2}, ] elif b is not None and c is not None and ac is not None: # double solution h = c * np.sin(ac) k = np.sqrt(b * b - h * h) omega = np.arcsin(k / b) cosac = np.cos(ac) a = c * cosac - k phi = np.pi / 2 - ac - omega bc = phi ab = np.pi - bc - ac if k: a2 = c * cosac + k bc2 = phi + 2 * omega ab2 = np.pi - ac - bc2 return [ {"a": a, "b": b, "c": c, "ab": ab, "bc": bc, "ac": ac}, {"a": a2, "b": b, "c": c, "ab": ab2, "bc": bc2, "ac": ac}, ] else: vedo.logger.error(f"Case {input_dict} is not supported.") return [] return [{"a": a, "b": b, "c": c, "ab": ab, "bc": bc, "ac": ac}] ############################################################################# def circle_from_3points(p1, p2, p3) -> np.ndarray: """ Find the center and radius of a circle given 3 points in 3D space. Returns the center of the circle. Example: ```python from vedo.utils import mag, circle_from_3points p1 = [0,1,1] p2 = [3,0,1] p3 = [1,2,0] c = circle_from_3points(p1, p2, p3) print(mag(c-p1), mag(c-p2), mag(c-p3)) ``` """ p1 = np.asarray(p1) p2 = np.asarray(p2) p3 = np.asarray(p3) v1 = p2 - p1 v2 = p3 - p1 v11 = np.dot(v1, v1) v22 = np.dot(v2, v2) v12 = np.dot(v1, v2) f = 1.0 / (2 * (v11 * v22 - v12 * v12)) k1 = f * v22 * (v11-v12) k2 = f * v11 * (v22-v12) return p1 + k1 * v1 + k2 * v2 def point_line_distance(p, p1, p2) -> float: """ Compute the distance of a point to a line (not the segment) defined by `p1` and `p2`. """ return np.sqrt(vtki.vtkLine.DistanceToLine(p, p1, p2)) def line_line_distance(p1, p2, q1, q2) -> Tuple[float, np.ndarray, np.ndarray, float, float]: """ Compute the distance of a line to a line (not the segment) defined by `p1` and `p2` and `q1` and `q2`. Returns the distance, the closest point on line 1, the closest point on line 2. Their parametric coords (-inf <= t0, t1 <= inf) are also returned. """ closest_pt1: MutableSequence[float] = [0,0,0] closest_pt2: MutableSequence[float] = [0,0,0] t1, t2 = 0.0, 0.0 d = vtki.vtkLine.DistanceBetweenLines( p1, p2, q1, q2, closest_pt1, closest_pt2, t1, t2) return np.sqrt(d), closest_pt1, closest_pt2, t1, t2 def segment_segment_distance(p1, p2, q1, q2): """ Compute the distance of a segment to a segment defined by `p1` and `p2` and `q1` and `q2`. Returns the distance, the closest point on line 1, the closest point on line 2. Their parametric coords (-inf <= t0, t1 <= inf) are also returned. """ closest_pt1 = [0,0,0] closest_pt2 = [0,0,0] t1, t2 = 0.0, 0.0 d = vtki.vtkLine.DistanceBetweenLineSegments( p1, p2, q1, q2, closest_pt1, closest_pt2, t1, t2) return np.sqrt(d), closest_pt1, closest_pt2, t1, t2 def closest(point, points, n=1, return_ids=False, use_tree=False): """ Returns the distances and the closest point(s) to the given set of points. Needs `scipy.spatial` library. Arguments: n : (int) the nr of closest points to return return_ids : (bool) return the ids instead of the points coordinates use_tree : (bool) build a `scipy.spatial.KDTree`. An already existing one can be passed to avoid rebuilding. """ from scipy.spatial import distance, KDTree points = np.asarray(points) if n == 1: dists = distance.cdist([point], points) closest_idx = np.argmin(dists) else: if use_tree: if isinstance(use_tree, KDTree): # reuse tree = use_tree else: tree = KDTree(points) dists, closest_idx = tree.query([point], k=n) closest_idx = closest_idx[0] else: dists = distance.cdist([point], points) closest_idx = np.argsort(dists)[0][:n] if return_ids: return dists, closest_idx else: return dists, points[closest_idx] ############################################################################# def lin_interpolate(x, rangeX, rangeY): """ Interpolate linearly the variable `x` in `rangeX` onto the new `rangeY`. If `x` is a 3D vector the linear weight is the distance to the two 3D `rangeX` vectors. E.g. if `x` runs in `rangeX=[x0,x1]` and I want it to run in `rangeY=[y0,y1]` then `y = lin_interpolate(x, rangeX, rangeY)` will interpolate `x` onto `rangeY`. Examples: - [lin_interpolate.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/lin_interpolate.py) ![](https://vedo.embl.es/images/basic/linInterpolate.png) """ if is_sequence(x): x = np.asarray(x) x0, x1 = np.asarray(rangeX) y0, y1 = np.asarray(rangeY) dx = x1 - x0 dxn = np.linalg.norm(dx) if not dxn: return y0 s = np.linalg.norm(x - x0) / dxn t = np.linalg.norm(x - x1) / dxn st = s + t out = y0 * (t / st) + y1 * (s / st) else: # faster x0 = rangeX[0] dx = rangeX[1] - x0 if not dx: return rangeY[0] s = (x - x0) / dx out = rangeY[0] * (1 - s) + rangeY[1] * s return out def get_uv(p, x, v): """ Obtain the texture uv-coords of a point p belonging to a face that has point coordinates (x0, x1, x2) with the corresponding uv-coordinates v=(v0, v1, v2). All p and x0,x1,x2 are 3D-vectors, while v are their 2D uv-coordinates. Example: ```python from vedo import * pic = Image(dataurl+"coloured_cube_faces.jpg") cb = Mesh(dataurl+"coloured_cube.obj").lighting("off").texture(pic) cbpts = cb.points faces = cb.cells uv = cb.pointdata["Material"] pt = [-0.2, 0.75, 2] pr = cb.closest_point(pt) idface = cb.closest_point(pt, return_cell_id=True) idpts = faces[idface] uv_face = uv[idpts] uv_pr = utils.get_uv(pr, cbpts[idpts], uv_face) print("interpolated uv =", uv_pr) sx, sy = pic.dimensions() i_interp_uv = uv_pr * [sy, sx] ix, iy = i_interp_uv.astype(int) mpic = pic.tomesh() rgba = mpic.pointdata["RGBA"].reshape(sy, sx, 3) print("color =", rgba[ix, iy]) show( [[cb, Point(pr), cb.labels("Material")], [pic, Point(i_interp_uv)]], N=2, axes=1, sharecam=False, ).close() ``` ![](https://vedo.embl.es/images/feats/utils_get_uv.png) """ # Vector vp=p-x0 is representable as alpha*s + beta*t, # where s = x1-x0 and t = x2-x0, in matrix form # vp = [alpha, beta] . matrix(s,t) # M = matrix(s,t) is 2x3 matrix, so (alpha, beta) can be found by # inverting any of its minor A with non-zero determinant. # Once found, uv-coords of p are vt0 + alpha (vt1-v0) + beta (vt2-v0) p = np.asarray(p) x0, x1, x2 = np.asarray(x)[:3] vt0, vt1, vt2 = np.asarray(v)[:3] s = x1 - x0 t = x2 - x0 vs = vt1 - vt0 vt = vt2 - vt0 vp = p - x0 # finding a minor with independent rows M = np.matrix([s, t]) mnr = [0, 1] A = M[:, mnr] if np.abs(np.linalg.det(A)) < 0.000001: mnr = [0, 2] A = M[:, mnr] if np.abs(np.linalg.det(A)) < 0.000001: mnr = [1, 2] A = M[:, mnr] Ainv = np.linalg.inv(A) alpha_beta = vp[mnr].dot(Ainv) # [alpha, beta] return np.asarray(vt0 + alpha_beta.dot(np.matrix([vs, vt])))[0] def vector(x, y=None, z=0.0, dtype=np.float64) -> np.ndarray: """ Return a 3D numpy array representing a vector. If `y` is `None`, assume input is already in the form `[x,y,z]`. """ if y is None: # assume x is already [x,y,z] return np.asarray(x, dtype=dtype) return np.array([x, y, z], dtype=dtype) def versor(x, y=None, z=0.0, dtype=np.float64) -> np.ndarray: """Return the unit vector. Input can be a list of vectors.""" v = vector(x, y, z, dtype) if isinstance(v[0], np.ndarray): return np.divide(v, mag(v)[:, None]) return v / mag(v) def mag(v): """Get the magnitude of a vector or array of vectors.""" v = np.asarray(v) if v.ndim == 1: return np.linalg.norm(v) return np.linalg.norm(v, axis=1) def mag2(v) -> np.ndarray: """Get the squared magnitude of a vector or array of vectors.""" v = np.asarray(v) if v.ndim == 1: return np.square(v).sum() return np.square(v).sum(axis=1) def is_integer(n) -> bool: """Check if input is an integer.""" try: float(n) except (ValueError, TypeError): return False else: return float(n).is_integer() def is_number(n) -> bool: """Check if input is a number""" try: float(n) return True except (ValueError, TypeError): return False def round_to_digit(x, p) -> float: """Round a real number to the specified number of significant digits.""" if not x: return 0 r = np.round(x, p - int(np.floor(np.log10(abs(x)))) - 1) if int(r) == r: return int(r) return r def pack_spheres(bounds, radius) -> np.ndarray: """ Packing spheres into a bounding box. Returns a numpy array of sphere centers. """ h = 0.8164965 / 2 d = 0.8660254 a = 0.288675135 if is_sequence(bounds): x0, x1, y0, y1, z0, z1 = bounds else: x0, x1, y0, y1, z0, z1 = bounds.bounds() x = np.arange(x0, x1, radius) nul = np.zeros_like(x) nz = int((z1 - z0) / radius / h / 2 + 1.5) ny = int((y1 - y0) / radius / d + 1.5) pts = [] for iz in range(nz): z = z0 + nul + iz * h * radius dx, dy, dz = [radius * 0.5, radius * a, iz * h * radius] for iy in range(ny): y = y0 + nul + iy * d * radius if iy % 2: xs = x else: xs = x + radius * 0.5 if iz % 2: p = np.c_[xs, y, z] + [dx, dy, dz] else: p = np.c_[xs, y, z] + [0, 0, dz] pts += p.tolist() return np.array(pts) def precision(x, p: int, vrange=None, delimiter="e") -> str: """ Returns a string representation of `x` formatted to precision `p`. Set `vrange` to the range in which x exists (to snap x to '0' if below precision). """ # Based on the webkit javascript implementation # `from here `_, # and implemented by `randlet `_. # Modified for vedo by M.Musy 2020 if isinstance(x, str): # do nothing return x if is_sequence(x): out = "(" nn = len(x) - 1 for i, ix in enumerate(x): try: if np.isnan(ix): return "NaN" except: # cannot handle list of list continue out += precision(ix, p) if i < nn: out += ", " return out + ")" ############ <-- try: if np.isnan(x): return "NaN" except TypeError: return "NaN" x = float(x) if x == 0.0 or (vrange is not None and abs(x) < vrange / pow(10, p)): return "0" out = [] if x < 0: out.append("-") x = -x e = int(np.log10(x)) # tens = np.power(10, e - p + 1) tens = 10 ** (e - p + 1) n = np.floor(x / tens) # if n < np.power(10, p - 1): if n < 10 ** (p - 1): e = e - 1 # tens = np.power(10, e - p + 1) tens = 10 ** (e - p + 1) n = np.floor(x / tens) if abs((n + 1.0) * tens - x) <= abs(n * tens - x): n = n + 1 # if n >= np.power(10, p): if n >= 10 ** p: n = n / 10.0 e = e + 1 m = "%.*g" % (p, n) if e < -2 or e >= p: out.append(m[0]) if p > 1: out.append(".") out.extend(m[1:p]) out.append(delimiter) if e > 0: out.append("+") out.append(str(e)) elif e == (p - 1): out.append(m) elif e >= 0: out.append(m[: e + 1]) if e + 1 < len(m): out.append(".") out.extend(m[e + 1 :]) else: out.append("0.") out.extend(["0"] * -(e + 1)) out.append(m) return "".join(out) ################################################################################## def grep(filename: str, tag: str, column=None, first_occurrence_only=False) -> list: """Greps the line in a file that starts with a specific `tag` string inside the file.""" import re with open(filename, "r", encoding="UTF-8") as afile: content = [] for line in afile: if re.search(tag, line): c = line.split() c[-1] = c[-1].replace("\n", "") if column is not None: c = c[column] content.append(c) if first_occurrence_only: break return content def parse_pattern(query, strings_to_parse) -> list: """ Parse a pattern query to a list of strings. The query string can contain wildcards like * and ?. Arguments: query : (str) the query to parse strings_to_parse : (str/list) the string or list of strings to parse Returns: a list of booleans, one for each string in strings_to_parse Example: >>> query = r'*Sphere 1?3*' >>> strings = ["Sphere 143 red", "Sphere 13 red", "Sphere 123", "ASphere 173"] >>> parse_pattern(query, strings) [True, True, False, False] """ from re import findall as re_findall if not isinstance(query, str): return [False] if not is_sequence(strings_to_parse): strings_to_parse = [strings_to_parse] outs = [] for sp in strings_to_parse: if not isinstance(sp, str): outs.append(False) continue s = query if s.startswith("*"): s = s[1:] else: s = "^" + s t = "" if not s.endswith("*"): t = "$" else: s = s[:-1] pattern = s.replace('?', r'\w').replace(' ', r'\s').replace("*", r"\w+") + t # Search for the pattern in the input string match = re_findall(pattern, sp) out = bool(match) outs.append(out) # Print the matches for debugging print("pattern", pattern, "in:", strings_to_parse) print("matches", match, "result:", out) return outs def print_histogram( data, bins=10, height=10, logscale=False, minbin=0, horizontal=True, char="\U00002589", c=None, bold=True, title="histogram", spacer="", ) -> np.ndarray: """ Ascii histogram printing. Input can be a `vedo.Volume` or `vedo.Mesh`. Returns the raw data before binning (useful when passing vtk objects). Arguments: bins : (int) number of histogram bins height : (int) height of the histogram in character units logscale : (bool) use logscale for frequencies minbin : (int) ignore bins before minbin horizontal : (bool) show histogram horizontally char : (str) character to be used bold : (bool) use boldface title : (str) histogram title spacer : (str) horizontal spacer Example: ```python from vedo import print_histogram import numpy as np d = np.random.normal(size=1000) data = print_histogram(d, c='b', logscale=True, title='my scalars') data = print_histogram(d, c='o') print(np.mean(data)) # data here is same as d ``` ![](https://vedo.embl.es/images/feats/print_histogram.png) """ # credits: http://pyinsci.blogspot.com/2009/10/ascii-histograms.html # adapted for vedo by M.Musy, 2019 if not horizontal: # better aspect ratio bins *= 2 try: data = vtk2numpy(data.dataset.GetPointData().GetScalars()) except AttributeError: # already an array data = np.asarray(data) if isinstance(data, vtki.vtkImageData): dims = data.GetDimensions() nvx = min(100000, dims[0] * dims[1] * dims[2]) idxs = np.random.randint(0, min(dims), size=(nvx, 3)) data = [] for ix, iy, iz in idxs: d = data.GetScalarComponentAsFloat(ix, iy, iz, 0) data.append(d) data = np.array(data) elif isinstance(data, vtki.vtkPolyData): arr = data.GetPointData().GetScalars() if not arr: arr = data.GetCellData().GetScalars() if not arr: return np.array([]) data = vtk2numpy(arr) try: h = np.histogram(data, bins=bins) except TypeError as e: vedo.logger.error(f"cannot compute histogram: {e}") return np.array([]) if minbin: hi = h[0][minbin:-1] else: hi = h[0] if char == "\U00002589" and horizontal: char = "\U00002586" title = title.ljust(14) + ":" entrs = " entries=" + str(len(data)) if logscale: h0 = np.log10(hi + 1) maxh0 = int(max(h0) * 100) / 100 title = title + entrs + " (logscale)" else: h0 = hi maxh0 = max(h0) title = title + entrs def _v(): his = "" if title: his += title + "\n" bars = h0 / maxh0 * height for l in reversed(range(1, height + 1)): line = "" if l == height: line = "%s " % maxh0 else: line = " |" + " " * (len(str(maxh0)) - 3) for c in bars: if c >= np.ceil(l): line += char else: line += " " line += "\n" his += line his += "%.2f" % h[1][0] + "." * (bins) + "%.2f" % h[1][-1] + "\n" return his def _h(): his = "" if title: his += title + "\n" xl = ["%.2f" % n for n in h[1]] lxl = [len(l) for l in xl] bars = h0 / maxh0 * height his += spacer + " " * int(max(bars) + 2 + max(lxl)) + "%s\n" % maxh0 for i, c in enumerate(bars): line = xl[i] + " " * int(max(lxl) - lxl[i]) + "| " + char * int(c) + "\n" his += spacer + line return his if horizontal: height *= 2 vedo.printc(_h(), c=c, bold=bold) else: vedo.printc(_v(), c=c, bold=bold) return data def print_table(*columns, headers=None, c="g") -> None: """ Print lists as tables. Example: ```python from vedo.utils import print_table list1 = ["A", "B", "C"] list2 = [142, 220, 330] list3 = [True, False, True] headers = ["First Column", "Second Column", "Third Column"] print_table(list1, list2, list3, headers=headers) ``` ![](https://vedo.embl.es/images/feats/) """ # If headers is not provided, use default header names corner = "─" if headers is None: headers = [f"Column {i}" for i in range(1, len(columns) + 1)] assert len(headers) == len(columns) # Find the maximum length of the elements in each column and header max_lens = [max(len(str(x)) for x in column) for column in columns] max_len_headers = [max(len(str(header)), max_len) for header, max_len in zip(headers, max_lens)] # Construct the table header header = ( "│ " + " │ ".join(header.ljust(max_len) for header, max_len in zip(headers, max_len_headers)) + " │" ) # Construct the line separator line1 = "┌" + corner.join("─" * (max_len + 2) for max_len in max_len_headers) + "┐" line2 = "└" + corner.join("─" * (max_len + 2) for max_len in max_len_headers) + "┘" # Print the table header vedo.printc(line1, c=c) vedo.printc(header, c=c) vedo.printc(line2, c=c) # Print the data rows for row in zip(*columns): row = ( "│ " + " │ ".join(str(col).ljust(max_len) for col, max_len in zip(row, max_len_headers)) + " │" ) vedo.printc(row, bold=False, c=c) # Print the line separator again to close the table vedo.printc(line2, c=c) def print_inheritance_tree(C) -> None: """Prints the inheritance tree of class C.""" # Adapted from: https://stackoverflow.com/questions/26568976/ def class_tree(cls): subc = [class_tree(sub_class) for sub_class in cls.__subclasses__()] return {cls.__name__: subc} def print_tree(tree, indent=8, current_ind=0): for k, v in tree.items(): if current_ind: before_dashes = current_ind - indent m = " " * before_dashes + "└" + "─" * (indent - 1) + " " + k vedo.printc(m) else: vedo.printc(k) for sub_tree in v: print_tree(sub_tree, indent=indent, current_ind=current_ind + indent) if str(C.__class__) != "": C = C.__class__ ct = class_tree(C) print_tree(ct) def make_bands(inputlist, n): """ Group values of a list into bands of equal value, where `n` is the number of bands, a positive integer > 2. Returns a binned list of the same length as the input. """ if n < 2: return inputlist vmin = np.min(inputlist) vmax = np.max(inputlist) bb = np.linspace(vmin, vmax, n, endpoint=0) dr = bb[1] - bb[0] bb += dr / 2 tol = dr / 2 * 1.001 newlist = [] for s in inputlist: for b in bb: if abs(s - b) < tol: newlist.append(b) break return np.array(newlist) ################################################################# # Functions adapted from: # https://github.com/sdorkenw/MeshParty/blob/master/meshparty/trimesh_vtk.py def camera_from_quaternion(pos, quaternion, distance=10000, ngl_correct=True) -> vtki.vtkCamera: """ Define a `vtkCamera` with a particular orientation. Arguments: pos: (np.array, list, tuple) an iterator of length 3 containing the focus point of the camera quaternion: (np.array, list, tuple) a len(4) quaternion `(x,y,z,w)` describing the rotation of the camera such as returned by neuroglancer `x,y,z,w` all in `[0,1]` range distance: (float) the desired distance from pos to the camera (default = 10000 nm) Returns: `vtki.vtkCamera`, a vtk camera setup according to these rules. """ camera = vtki.vtkCamera() # define the quaternion in vtk, note the swapped order # w,x,y,z instead of x,y,z,w quat_vtk = vtki.get_class("Quaternion")( quaternion[3], quaternion[0], quaternion[1], quaternion[2]) # use this to define a rotation matrix in x,y,z # right handed units M = np.zeros((3, 3), dtype=np.float32) quat_vtk.ToMatrix3x3(M) # the default camera orientation is y up up = [0, 1, 0] # calculate default camera position is backed off in positive z pos = [0, 0, distance] # set the camera rototation by applying the rotation matrix camera.SetViewUp(*np.dot(M, up)) # set the camera position by applying the rotation matrix camera.SetPosition(*np.dot(M, pos)) if ngl_correct: # neuroglancer has positive y going down # so apply these azimuth and roll corrections # to fix orientatins camera.Azimuth(-180) camera.Roll(180) # shift the camera posiiton and focal position # to be centered on the desired location p = camera.GetPosition() p_new = np.array(p) + pos camera.SetPosition(*p_new) camera.SetFocalPoint(*pos) return camera def camera_from_neuroglancer(state, zoom) -> vtki.vtkCamera: """ Define a `vtkCamera` from a neuroglancer state dictionary. Arguments: state: (dict) an neuroglancer state dictionary. zoom: (float) how much to multiply zoom by to get camera backoff distance Returns: `vtki.vtkCamera`, a vtk camera setup that matches this state. """ orient = state.get("perspectiveOrientation", [0.0, 0.0, 0.0, 1.0]) pzoom = state.get("perspectiveZoom", 10.0) position = state["navigation"]["pose"]["position"] pos_nm = np.array(position["voxelCoordinates"]) * position["voxelSize"] return camera_from_quaternion(pos_nm, orient, pzoom * zoom, ngl_correct=True) def oriented_camera(center, up_vector, backoff_vector, backoff) -> vtki.vtkCamera: """ Generate a `vtkCamera` pointed at a specific location, oriented with a given up direction, set to a backoff. """ vup = np.array(up_vector) vup = vup / np.linalg.norm(vup) pt_backoff = center - backoff * np.array(backoff_vector) camera = vtki.vtkCamera() camera.SetFocalPoint(center[0], center[1], center[2]) camera.SetViewUp(vup[0], vup[1], vup[2]) camera.SetPosition(pt_backoff[0], pt_backoff[1], pt_backoff[2]) return camera def camera_from_dict(camera, modify_inplace=None) -> vtki.vtkCamera: """ Generate a `vtkCamera` object from a python dictionary. Parameters of the camera are: - `position` or `pos` (3-tuple) - `focal_point` (3-tuple) - `viewup` (3-tuple) - `distance` (float) - `clipping_range` (2-tuple) - `parallel_scale` (float) - `thickness` (float) - `view_angle` (float) - `roll` (float) Exaplanation of the parameters can be found in the [vtkCamera documentation](https://vtk.org/doc/nightly/html/classvtkCamera.html). Arguments: camera: (dict) a python dictionary containing camera parameters. modify_inplace: (vtkCamera) an existing `vtkCamera` object to modify in place. Returns: `vtki.vtkCamera`, a vtk camera setup that matches this state. """ if modify_inplace: vcam = modify_inplace else: vcam = vtki.vtkCamera() camera = dict(camera) # make a copy so input is not emptied by pop() cm_pos = camera.pop("position", camera.pop("pos", None)) cm_focal_point = camera.pop("focal_point", camera.pop("focalPoint", None)) cm_viewup = camera.pop("viewup", None) cm_distance = camera.pop("distance", None) cm_clipping_range = camera.pop("clipping_range", camera.pop("clippingRange", None)) cm_parallel_scale = camera.pop("parallel_scale", camera.pop("parallelScale", None)) cm_thickness = camera.pop("thickness", None) cm_view_angle = camera.pop("view_angle", camera.pop("viewAngle", None)) cm_roll = camera.pop("roll", None) if len(camera.keys()) > 0: vedo.logger.warning(f"in camera_from_dict, key(s) not recognized: {camera.keys()}") if cm_pos is not None: vcam.SetPosition(cm_pos) if cm_focal_point is not None: vcam.SetFocalPoint(cm_focal_point) if cm_viewup is not None: vcam.SetViewUp(cm_viewup) if cm_distance is not None: vcam.SetDistance(cm_distance) if cm_clipping_range is not None: vcam.SetClippingRange(cm_clipping_range) if cm_parallel_scale is not None: vcam.SetParallelScale(cm_parallel_scale) if cm_thickness is not None: vcam.SetThickness(cm_thickness) if cm_view_angle is not None: vcam.SetViewAngle(cm_view_angle) if cm_roll is not None: vcam.SetRoll(cm_roll) return vcam def camera_to_dict(vtkcam) -> dict: """ Convert a [vtkCamera](https://vtk.org/doc/nightly/html/classvtkCamera.html) object into a python dictionary. Parameters of the camera are: - `position` (3-tuple) - `focal_point` (3-tuple) - `viewup` (3-tuple) - `distance` (float) - `clipping_range` (2-tuple) - `parallel_scale` (float) - `thickness` (float) - `view_angle` (float) - `roll` (float) Arguments: vtkcam: (vtkCamera) a `vtkCamera` object to convert. """ cam = dict() cam["position"] = np.array(vtkcam.GetPosition()) cam["focal_point"] = np.array(vtkcam.GetFocalPoint()) cam["viewup"] = np.array(vtkcam.GetViewUp()) cam["distance"] = vtkcam.GetDistance() cam["clipping_range"] = np.array(vtkcam.GetClippingRange()) cam["parallel_scale"] = vtkcam.GetParallelScale() cam["thickness"] = vtkcam.GetThickness() cam["view_angle"] = vtkcam.GetViewAngle() cam["roll"] = vtkcam.GetRoll() return cam def vtkCameraToK3D(vtkcam) -> np.ndarray: """ Convert a `vtkCamera` object into a 9-element list to be used by the K3D backend. Output format is: `[posx,posy,posz, targetx,targety,targetz, upx,upy,upz]`. """ cpos = np.array(vtkcam.GetPosition()) kam = [cpos.tolist()] kam.append(vtkcam.GetFocalPoint()) kam.append(vtkcam.GetViewUp()) return np.array(kam).ravel() def make_ticks( x0: float, x1: float, n=None, labels=None, digits=None, logscale=False, useformat="", ) -> Tuple[np.ndarray, List[str]]: """ Generate numeric labels for the `[x0, x1]` range. The format specifier could be expressed in the format: `:[[fill]align][sign][#][0][width][,][.precision][type]` where, the options are: ``` fill = any character align = < | > | = | ^ sign = + | - | " " width = integer precision = integer type = b | c | d | e | E | f | F | g | G | n | o | s | x | X | % ``` E.g.: useformat=":.2f" """ # Copyright M. Musy, 2021, license: MIT. # # useformat eg: ":.2f", check out: # https://mkaz.blog/code/python-string-format-cookbook/ # https://www.programiz.com/python-programming/methods/built-in/format if x1 <= x0: # vedo.printc("Error in make_ticks(): x0 >= x1", x0,x1, c='r') return np.array([0.0, 1.0]), ["", ""] ticks_str, ticks_float = [], [] baseline = (1, 2, 5, 10, 20, 50) if logscale: if x0 <= 0 or x1 <= 0: vedo.logger.error("make_ticks: zero or negative range with log scale.") raise RuntimeError if n is None: n = int(abs(np.log10(x1) - np.log10(x0))) + 1 x0, x1 = np.log10([x0, x1]) if not n: n = 5 if labels is not None: # user is passing custom labels ticks_float.append(0) ticks_str.append("") for tp, ts in labels: if tp == x1: continue ticks_str.append(str(ts)) tickn = lin_interpolate(tp, [x0, x1], [0, 1]) ticks_float.append(tickn) else: # ..here comes one of the shortest and most painful pieces of code: # automatically choose the best natural axis subdivision based on multiples of 1,2,5 dstep = (x1 - x0) / n # desired step size, begin of the nightmare basestep = pow(10, np.floor(np.log10(dstep))) steps = np.array([basestep * i for i in baseline]) idx = (np.abs(steps - dstep)).argmin() s = steps[idx] # chosen step size low_bound, up_bound = 0, 0 if x0 < 0: low_bound = -pow(10, np.ceil(np.log10(-x0))) if x1 > 0: up_bound = pow(10, np.ceil(np.log10(x1))) if low_bound < 0: if up_bound < 0: negaxis = np.arange(low_bound, int(up_bound / s) * s) else: if -low_bound / s > 1.0e06: return np.array([0.0, 1.0]), ["", ""] negaxis = np.arange(low_bound, 0, s) else: negaxis = np.array([]) if up_bound > 0: if low_bound > 0: posaxis = np.arange(int(low_bound / s) * s, up_bound, s) else: if up_bound / s > 1.0e06: return np.array([0.0, 1.0]), ["", ""] posaxis = np.arange(0, up_bound, s) else: posaxis = np.array([]) fulaxis = np.unique(np.clip(np.concatenate([negaxis, posaxis]), x0, x1)) # end of the nightmare if useformat: sf = "{" + f"{useformat}" + "}" sas = "" for x in fulaxis: sas += sf.format(x) + " " elif digits is None: np.set_printoptions(suppress=True) # avoid zero precision sas = str(fulaxis).replace("[", "").replace("]", "") sas = sas.replace(".e", "e").replace("e+0", "e+").replace("e-0", "e-") np.set_printoptions(suppress=None) # set back to default else: sas = precision(fulaxis, digits, vrange=(x0, x1)) sas = sas.replace("[", "").replace("]", "").replace(")", "").replace(",", "") sas2 = [] for s in sas.split(): if s.endswith("."): s = s[:-1] if s == "-0": s = "0" if digits is not None and "e" in s: s += " " # add space to terminate modifiers sas2.append(s) for ts, tp in zip(sas2, fulaxis): if tp == x1: continue tickn = lin_interpolate(tp, [x0, x1], [0, 1]) ticks_float.append(tickn) if logscale: val = np.power(10, tp) if useformat: sf = "{" + f"{useformat}" + "}" ticks_str.append(sf.format(val)) else: if val >= 10: val = int(val + 0.5) else: val = round_to_digit(val, 2) ticks_str.append(str(val)) else: ticks_str.append(ts) ticks_str.append("") ticks_float.append(1) return np.array(ticks_float), ticks_str def grid_corners(i: int, nm: list, size: list, margin=0, yflip=True) -> Tuple[np.ndarray, np.ndarray]: """ Compute the 2 corners coordinates of the i-th box in a grid of shape n*m. The top-left square is square number 1. Arguments: i : (int) input index of the desired grid square (to be used in `show(..., at=...)`). nm : (list) grid shape as (n,m). size : (list) total size of the grid along x and y. margin : (float) keep a small margin between boxes. yflip : (bool) y-coordinate points downwards Returns: Two 2D points representing the bottom-left corner and the top-right corner of the `i`-nth box in the grid. Example: ```python from vedo import * acts=[] n,m = 5,7 for i in range(1, n*m + 1): c1,c2 = utils.grid_corners(i, [n,m], [1,1], 0.01) t = Text3D(i, (c1+c2)/2, c='k', s=0.02, justify='center').z(0.01) r = Rectangle(c1, c2, c=i) acts += [t,r] show(acts, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/grid_corners.png) """ i -= 1 n, m = nm sx, sy = size dx, dy = sx / n, sy / m nx = i % n ny = int((i - nx) / n) if yflip: ny = n - ny c1 = (dx * nx + margin, dy * ny + margin) c2 = (dx * (nx + 1) - margin, dy * (ny + 1) - margin) return np.array(c1), np.array(c2) ############################################################################ # Trimesh support # # Install trimesh with: # # sudo apt install python3-rtree # pip install rtree shapely # conda install trimesh # # Check the example gallery in: examples/other/trimesh> ########################################################################### def vedo2trimesh(mesh): """ Convert `vedo.mesh.Mesh` to `Trimesh.Mesh` object. """ if is_sequence(mesh): tms = [] for a in mesh: tms.append(vedo2trimesh(a)) return tms try: from trimesh import Trimesh except ModuleNotFoundError: vedo.logger.error("Need trimesh to run:\npip install trimesh") return None tris = mesh.cells carr = mesh.celldata["CellIndividualColors"] ccols = carr points = mesh.coordinates varr = mesh.pointdata["VertexColors"] vcols = varr if len(tris) == 0: tris = None return Trimesh(vertices=points, faces=tris, face_colors=ccols, vertex_colors=vcols, process=False) def trimesh2vedo(inputobj): """ Convert a `Trimesh` object to `vedo.Mesh` or `vedo.Assembly` object. """ if is_sequence(inputobj): vms = [] for ob in inputobj: vms.append(trimesh2vedo(ob)) return vms inputobj_type = str(type(inputobj)) if "Trimesh" in inputobj_type or "primitives" in inputobj_type: faces = inputobj.faces poly = buildPolyData(inputobj.vertices, faces) tact = vedo.Mesh(poly) if inputobj.visual.kind == "face": trim_c = inputobj.visual.face_colors elif inputobj.visual.kind == "texture": trim_c = inputobj.visual.to_color().vertex_colors else: trim_c = inputobj.visual.vertex_colors if is_sequence(trim_c): if is_sequence(trim_c[0]): same_color = len(np.unique(trim_c, axis=0)) < 2 # all vtxs have same color if same_color: tact.c(trim_c[0, [0, 1, 2]]).alpha(trim_c[0, 3]) else: if inputobj.visual.kind == "face": tact.cellcolors = trim_c return tact if "PointCloud" in inputobj_type: vdpts = vedo.shapes.Points(inputobj.vertices, r=8, c='k') if hasattr(inputobj, "vertices_color"): vcols = (inputobj.vertices_color * 1).astype(np.uint8) vdpts.pointcolors = vcols return vdpts if "path" in inputobj_type: lines = [] for e in inputobj.entities: # print('trimesh entity', e.to_dict()) l = vedo.shapes.Line(inputobj.vertices[e.points], c="k", lw=2) lines.append(l) return vedo.Assembly(lines) return None def vedo2meshlab(vmesh): """Convert a `vedo.Mesh` to a Meshlab object.""" try: import pymeshlab as mlab except ModuleNotFoundError: vedo.logger.error("Need pymeshlab to run:\npip install pymeshlab") vertex_matrix = vmesh.vertices.astype(np.float64) try: face_matrix = np.asarray(vmesh.cells, dtype=np.float64) except: print("WARNING: in vedo2meshlab(), need to triangulate mesh first!") face_matrix = np.array(vmesh.clone().triangulate().cells, dtype=np.float64) # v_normals_matrix = vmesh.normals(cells=False, recompute=False) v_normals_matrix = vmesh.vertex_normals if not v_normals_matrix.shape[0]: v_normals_matrix = np.empty((0, 3), dtype=np.float64) # f_normals_matrix = vmesh.normals(cells=True, recompute=False) f_normals_matrix = vmesh.cell_normals if not f_normals_matrix.shape[0]: f_normals_matrix = np.empty((0, 3), dtype=np.float64) v_color_matrix = vmesh.pointdata["RGBA"] if v_color_matrix is None: v_color_matrix = np.empty((0, 4), dtype=np.float64) else: v_color_matrix = v_color_matrix.astype(np.float64) / 255 if v_color_matrix.shape[1] == 3: v_color_matrix = np.c_[ v_color_matrix, np.ones(v_color_matrix.shape[0], dtype=np.float64) ] f_color_matrix = vmesh.celldata["RGBA"] if f_color_matrix is None: f_color_matrix = np.empty((0, 4), dtype=np.float64) else: f_color_matrix = f_color_matrix.astype(np.float64) / 255 if f_color_matrix.shape[1] == 3: f_color_matrix = np.c_[ f_color_matrix, np.ones(f_color_matrix.shape[0], dtype=np.float64) ] m = mlab.Mesh( vertex_matrix=vertex_matrix, face_matrix=face_matrix, v_normals_matrix=v_normals_matrix, f_normals_matrix=f_normals_matrix, v_color_matrix=v_color_matrix, f_color_matrix=f_color_matrix, ) for k in vmesh.pointdata.keys(): data = vmesh.pointdata[k] if data is not None: if data.ndim == 1: # scalar m.add_vertex_custom_scalar_attribute(data.astype(np.float64), k) elif data.ndim == 2: # vectorial data if "tcoord" not in k.lower() and k not in ["Normals", "TextureCoordinates"]: m.add_vertex_custom_point_attribute(data.astype(np.float64), k) for k in vmesh.celldata.keys(): data = vmesh.celldata[k] if data is not None: if data.ndim == 1: # scalar m.add_face_custom_scalar_attribute(data.astype(np.float64), k) elif data.ndim == 2 and k != "Normals": # vectorial data m.add_face_custom_point_attribute(data.astype(np.float64), k) m.update_bounding_box() return m def meshlab2vedo(mmesh, pointdata_keys=(), celldata_keys=()): """Convert a Meshlab object to `vedo.Mesh`.""" inputtype = str(type(mmesh)) if "MeshSet" in inputtype: mmesh = mmesh.current_mesh() mpoints, mcells = mmesh.vertex_matrix(), mmesh.face_matrix() if len(mcells) > 0: polydata = buildPolyData(mpoints, mcells) else: polydata = buildPolyData(mpoints, None) if mmesh.has_vertex_scalar(): parr = mmesh.vertex_scalar_array() parr_vtk = numpy_to_vtk(parr) parr_vtk.SetName("MeshLabScalars") polydata.GetPointData().AddArray(parr_vtk) polydata.GetPointData().SetActiveScalars("MeshLabScalars") if mmesh.has_face_scalar(): carr = mmesh.face_scalar_array() carr_vtk = numpy_to_vtk(carr) carr_vtk.SetName("MeshLabScalars") x0, x1 = carr_vtk.GetRange() polydata.GetCellData().AddArray(carr_vtk) polydata.GetCellData().SetActiveScalars("MeshLabScalars") for k in pointdata_keys: parr = mmesh.vertex_custom_scalar_attribute_array(k) parr_vtk = numpy_to_vtk(parr) parr_vtk.SetName(k) polydata.GetPointData().AddArray(parr_vtk) polydata.GetPointData().SetActiveScalars(k) for k in celldata_keys: carr = mmesh.face_custom_scalar_attribute_array(k) carr_vtk = numpy_to_vtk(carr) carr_vtk.SetName(k) polydata.GetCellData().AddArray(carr_vtk) polydata.GetCellData().SetActiveScalars(k) pnorms = mmesh.vertex_normal_matrix() if len(pnorms) > 0: polydata.GetPointData().SetNormals(numpy2vtk(pnorms, name="Normals")) cnorms = mmesh.face_normal_matrix() if len(cnorms) > 0: polydata.GetCellData().SetNormals(numpy2vtk(cnorms, name="Normals")) return vedo.Mesh(polydata) def open3d2vedo(o3d_mesh): """Convert `open3d.geometry.TriangleMesh` to a `vedo.Mesh`.""" m = vedo.Mesh([np.array(o3d_mesh.vertices), np.array(o3d_mesh.triangles)]) # TODO: could also check whether normals and color are present in # order to port with the above vertices/faces return m def vedo2open3d(vedo_mesh): """ Return an `open3d.geometry.TriangleMesh` version of the current mesh. """ try: import open3d as o3d except RuntimeError: vedo.logger.error("Need open3d to run:\npip install open3d") # create from numpy arrays o3d_mesh = o3d.geometry.TriangleMesh( vertices=o3d.utility.Vector3dVector(vedo_mesh.vertices), triangles=o3d.utility.Vector3iVector(vedo_mesh.cells), ) # TODO: need to add some if check here in case color and normals # info are not existing # o3d_mesh.vertex_colors = o3d.utility.Vector3dVector(vedo_mesh.pointdata["RGB"]/255) # o3d_mesh.vertex_normals= o3d.utility.Vector3dVector(vedo_mesh.pointdata["Normals"]) return o3d_mesh def vedo2madcad(vedo_mesh): """ Convert a `vedo.Mesh` to a `madcad.Mesh`. """ try: import madcad import numbers except ModuleNotFoundError: vedo.logger.error("Need madcad to run:\npip install pymadcad") points = [madcad.vec3(*pt) for pt in vedo_mesh.vertices] faces = [madcad.vec3(*fc) for fc in vedo_mesh.cells] options = {} for key, val in vedo_mesh.pointdata.items(): vec_type = f"vec{val.shape[-1]}" is_float = np.issubdtype(val.dtype, np.floating) madcad_dtype = getattr(madcad, f"f{vec_type}" if is_float else vec_type) options[key] = [madcad_dtype(v) for v in val] madcad_mesh = madcad.Mesh(points=points, faces=faces, options=options) return madcad_mesh def madcad2vedo(madcad_mesh): """ Convert a `madcad.Mesh` to a `vedo.Mesh`. A pointdata or celldata array named "tracks" is added to the output mesh, indicating the mesh region each point belongs to. A metadata array named "madcad_groups" is added to the output mesh, indicating the mesh groups. See [pymadcad website](https://pymadcad.readthedocs.io/en/latest/index.html) for more info. """ try: madcad_mesh = madcad_mesh["part"] except: pass madp = [] for p in madcad_mesh.points: madp.append([float(p[0]), float(p[1]), float(p[2])]) madp = np.array(madp) madf = [] try: for f in madcad_mesh.faces: madf.append([int(f[0]), int(f[1]), int(f[2])]) madf = np.array(madf).astype(np.uint16) except AttributeError: # print("no faces") pass made = [] try: edges = madcad_mesh.edges for e in edges: made.append([int(e[0]), int(e[1])]) made = np.array(made).astype(np.uint16) except (AttributeError, TypeError): # print("no edges") pass try: line = np.array(madcad_mesh.indices).astype(np.uint16) made.append(line) except AttributeError: # print("no indices") pass madt = [] try: for t in madcad_mesh.tracks: madt.append(int(t)) madt = np.array(madt).astype(np.uint16) except AttributeError: # print("no tracks") pass ############################### poly = vedo.utils.buildPolyData(madp, madf, made) if len(madf) == 0 and len(made) == 0: m = vedo.Points(poly) else: m = vedo.Mesh(poly) if len(madt) == len(madf): m.celldata["tracks"] = madt maxt = np.max(madt) m.mapper.SetScalarRange(0, np.max(madt)) if maxt==0: m.mapper.SetScalarVisibility(0) elif len(madt) == len(madp): m.pointdata["tracks"] = madt maxt = np.max(madt) m.mapper.SetScalarRange(0, maxt) if maxt==0: m.mapper.SetScalarVisibility(0) try: m.info["madcad_groups"] = madcad_mesh.groups except AttributeError: # print("no groups") pass try: options = dict(madcad_mesh.options) if "display_wire" in options and options["display_wire"]: m.lw(1).lc(madcad_mesh.c()) if "display_faces" in options and not options["display_faces"]: m.alpha(0.2) if "color" in options: m.c(options["color"]) for key, val in options.items(): m.pointdata[key] = val except AttributeError: # print("no options") pass return m def vtk_version_at_least(major, minor=0, build=0) -> bool: """ Check the installed VTK version. Return `True` if the requested VTK version is greater or equal to the actual VTK version. Arguments: major : (int) Major version. minor : (int) Minor version. build : (int) Build version. """ needed_version = 10000000000 * int(major) + 100000000 * int(minor) + int(build) try: vtk_version_number = vtki.VTK_VERSION_NUMBER except AttributeError: # as error: ver = vtki.vtkVersion() vtk_version_number = ( 10000000000 * ver.GetVTKMajorVersion() + 100000000 * ver.GetVTKMinorVersion() + ver.GetVTKBuildVersion() ) return vtk_version_number >= needed_version def ctf2lut(vol, logscale=False): """Internal use.""" # build LUT from a color transfer function for tmesh or volume ctf = vol.properties.GetRGBTransferFunction() otf = vol.properties.GetScalarOpacity() x0, x1 = vol.dataset.GetScalarRange() cols, alphas = [], [] for x in np.linspace(x0, x1, 256): cols.append(ctf.GetColor(x)) alphas.append(otf.GetValue(x)) if logscale: lut = vtki.vtkLogLookupTable() else: lut = vtki.vtkLookupTable() lut.SetRange(x0, x1) lut.SetNumberOfTableValues(len(cols)) for i, col in enumerate(cols): r, g, b = col lut.SetTableValue(i, r, g, b, alphas[i]) lut.Build() return lut def get_vtk_name_event(name: str) -> str: """ Return the name of a VTK event. Frequently used events are: - KeyPress, KeyRelease: listen to keyboard events - LeftButtonPress, LeftButtonRelease: listen to mouse clicks - MiddleButtonPress, MiddleButtonRelease - RightButtonPress, RightButtonRelease - MouseMove: listen to mouse pointer changing position - MouseWheelForward, MouseWheelBackward - Enter, Leave: listen to mouse entering or leaving the window - Pick, StartPick, EndPick: listen to object picking - ResetCamera, ResetCameraClippingRange - Error, Warning, Char, Timer Check the complete list of events here: https://vtk.org/doc/nightly/html/classvtkCommand.html """ # as vtk names are ugly and difficult to remember: ln = name.lower() if "click" in ln or "button" in ln: event_name = "LeftButtonPress" if "right" in ln: event_name = "RightButtonPress" elif "mid" in ln: event_name = "MiddleButtonPress" if "release" in ln: event_name = event_name.replace("Press", "Release") else: event_name = name if "key" in ln: if "release" in ln: event_name = "KeyRelease" else: event_name = "KeyPress" if ("mouse" in ln and "mov" in ln) or "over" in ln: event_name = "MouseMove" words = [ "pick", "timer", "reset", "enter", "leave", "char", "error", "warning", "start", "end", "wheel", "clipping", "range", "camera", "render", "interaction", "modified", ] for w in words: if w in ln: event_name = event_name.replace(w, w.capitalize()) event_name = event_name.replace("REnd ", "Rend") event_name = event_name.replace("the ", "") event_name = event_name.replace(" of ", "").replace(" ", "") if not event_name.endswith("Event"): event_name += "Event" if vtki.vtkCommand.GetEventIdFromString(event_name) == 0: vedo.printc( f"Error: '{name}' is not a valid event name.", c='r') vedo.printc("Check the list of events here:", c='r') vedo.printc("\thttps://vtk.org/doc/nightly/html/classvtkCommand.html", c='r') # raise RuntimeError return event_name vedo-2025.5.3/vedo/version.py000066400000000000000000000000261474667405700157230ustar00rootroot00000000000000_version = '2025.5.3' vedo-2025.5.3/vedo/visual.py000066400000000000000000003274441474667405700155610ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os from typing import Union from typing_extensions import Self from weakref import ref as weak_ref_to import numpy as np import vedo.vtkclasses as vtki import vedo from vedo import colors from vedo import utils __docformat__ = "google" __doc__ = """ Base classes to manage visualization and apperance of objects and their properties. """ __all__ = [ "CommonVisual", "PointsVisual", "VolumeVisual", "MeshVisual", "ImageVisual", "Actor2D", "LightKit", ] ################################################### class CommonVisual: """Class to manage the visual aspects common to all objects.""" def __init__(self): # print("init CommonVisual", type(self)) self.properties = None self.scalarbar = None self.pipeline = None self.trail = None self.trail_points = [] self.trail_segment_size = 0 self.trail_offset = None self.shadows = [] self.axes = None self.picked3d = None self.rendered_at = set() self._ligthingnr = 0 # index of the lighting mode changed from CLI self._cmap_name = "" # remember the cmap name for self._keypress self._caption = None def print(self): """Print object info.""" print(self.__str__()) return self @property def LUT(self) -> np.ndarray: """Return the lookup table of the object as a numpy object.""" try: _lut = self.mapper.GetLookupTable() values = [] for i in range(_lut.GetTable().GetNumberOfTuples()): # print("LUT i =", i, "value =", _lut.GetTableValue(i)) values.append(_lut.GetTableValue(i)) return np.array(values) except AttributeError: return np.array([], dtype=float) @LUT.setter def LUT(self, arr): """ Set the lookup table of the object from a numpy or `vtkLookupTable` object. Consider using `cmap()` or `build_lut()` instead as it allows to set the range of the LUT and to use a string name for the color map. """ if isinstance(arr, vtki.vtkLookupTable): newlut = arr self.mapper.SetScalarRange(newlut.GetRange()) else: newlut = vtki.vtkLookupTable() newlut.SetNumberOfTableValues(len(arr)) if len(arr[0]) == 3: arr = np.insert(arr, 3, 1, axis=1) for i, v in enumerate(arr): newlut.SetTableValue(i, v) newlut.SetRange(self.mapper.GetScalarRange()) # print("newlut.GetRange() =", newlut.GetRange()) # print("self.mapper.GetScalarRange() =", self.mapper.GetScalarRange()) newlut.Build() self.mapper.SetLookupTable(newlut) self.mapper.ScalarVisibilityOn() def scalar_range(self, vmin=None, vmax=None): """Set the range of the scalar value for visualization.""" if vmin is None and vmax is None: return np.array(self.mapper.GetScalarRange()) if vmax is None: vmin, vmax = vmin # assume it is a list self.mapper.SetScalarRange(float(vmin), float(vmax)) return self def add_observer(self, event_name, func, priority=0) -> int: """Add a callback function that will be called when an event occurs.""" event_name = utils.get_vtk_name_event(event_name) idd = self.actor.AddObserver(event_name, func, priority) return idd def invoke_event(self, event_name) -> Self: """Invoke an event.""" event_name = utils.get_vtk_name_event(event_name) self.actor.InvokeEvent(event_name) return self # def abort_event(self, obs_id): # """Abort an event.""" # cmd = self.actor.GetCommand(obs_id) # vtkCommand # if cmd: # cmd.AbortFlagOn() # return self def show(self, **options) -> Union["vedo.Plotter", None]: """ Create on the fly an instance of class `Plotter` or use the last existing one to show one single object. This method is meant as a shortcut. If more than one object needs to be visualised please use the syntax `show(mesh1, mesh2, volume, ..., options)`. Returns the `Plotter` class instance. """ return vedo.plotter.show(self, **options) def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation=0, axes=False) -> np.ndarray: """Build a thumbnail of the object and return it as an array.""" # speed is about 20Hz for size=[200,200] ren = vtki.vtkRenderer() actor = self.actor if isinstance(self, vedo.UnstructuredGrid): geo = vtki.new("GeometryFilter") geo.SetInputData(self.dataset) geo.Update() actor = vedo.Mesh(geo.GetOutput()).cmap("rainbow").actor ren.AddActor(actor) if axes: axes = vedo.addons.Axes(self) ren.AddActor(axes.actor) ren.ResetCamera() cam = ren.GetActiveCamera() cam.Zoom(zoom) cam.Elevation(elevation) cam.Azimuth(azimuth) ren_win = vtki.vtkRenderWindow() ren_win.SetOffScreenRendering(True) ren_win.SetSize(size) ren.SetBackground(colors.get_color(bg)) ren_win.AddRenderer(ren) ren.ResetCameraClippingRange() ren_win.Render() nx, ny = ren_win.GetSize() arr = vtki.vtkUnsignedCharArray() ren_win.GetRGBACharPixelData(0, 0, nx - 1, ny - 1, 0, arr) narr = utils.vtk2numpy(arr).T[:3].T.reshape([ny, nx, 3]) narr = np.ascontiguousarray(np.flip(narr, axis=0)) ren.RemoveActor(actor) if axes: ren.RemoveActor(axes.actor) ren_win.Finalize() del ren_win return narr def pickable(self, value=None) -> Self: """Set/get the pickability property of an object.""" if value is None: return self.actor.GetPickable() self.actor.SetPickable(value) return self def use_bounds(self, value=True) -> Self: """ Instruct the current camera to either take into account or ignore the object bounds when resetting. """ self.actor.SetUseBounds(value) return self def draggable(self, value=None) -> Self: # NOT FUNCTIONAL? """Set/get the draggability property of an object.""" if value is None: return self.actor.GetDragable() self.actor.SetDragable(value) return self def on(self) -> Self: """Switch on object visibility. Object is not removed.""" self.actor.VisibilityOn() try: self.scalarbar.actor.VisibilityOn() except AttributeError: pass try: self.trail.actor.VisibilityOn() except AttributeError: pass try: for sh in self.shadows: sh.actor.VisibilityOn() except AttributeError: pass return self def off(self) -> Self: """Switch off object visibility. Object is not removed.""" self.actor.VisibilityOff() try: self.scalarbar.actor.VisibilityOff() except AttributeError: pass try: self.trail.actor.VisibilityOff() except AttributeError: pass try: for sh in self.shadows: sh.actor.VisibilityOff() except AttributeError: pass return self def toggle(self) -> Self: """Toggle object visibility on/off.""" v = self.actor.GetVisibility() if v: self.off() else: self.on() return self def add_scalarbar( self, title="", pos=(), size=(80, 400), font_size=14, title_yoffset=15, nlabels=None, c=None, horizontal=False, use_alpha=True, label_format=":6.3g", ) -> Self: """ Add a 2D scalar bar for the specified object. Arguments: title : (str) scalar bar title pos : (list) position coordinates of the bottom left corner. Can also be a pair of (x,y) values in the range [0,1] to indicate the position of the bottom left and top right corners. size : (float,float) size of the scalarbar in number of pixels (width, height) font_size : (float) size of font for title and numeric labels title_yoffset : (float) vertical space offset between title and color scalarbar nlabels : (int) number of numeric labels c : (list) color of the scalar bar text horizontal : (bool) lay the scalarbar horizontally use_alpha : (bool) render transparency in the color bar itself label_format : (str) c-style format string for numeric labels Examples: - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) """ plt = vedo.plotter_instance if plt and plt.renderer: c = (0.9, 0.9, 0.9) if np.sum(plt.renderer.GetBackground()) > 1.5: c = (0.1, 0.1, 0.1) if isinstance(self.scalarbar, vtki.vtkActor): plt.renderer.RemoveActor(self.scalarbar) elif isinstance(self.scalarbar, vedo.Assembly): for a in self.scalarbar.unpack(): plt.renderer.RemoveActor(a) if c is None: c = "gray" sb = vedo.addons.ScalarBar( self, title, pos, size, font_size, title_yoffset, nlabels, c, horizontal, use_alpha, label_format, ) self.scalarbar = sb return self def add_scalarbar3d( self, title="", pos=None, size=(0, 0), title_font="", title_xoffset=-1.2, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, nlabels=9, label_font="", label_size=1, label_offset=0.375, label_rotation=0, label_format="", italic=0, c=None, draw_box=True, above_text=None, below_text=None, nan_text="NaN", categories=None, ) -> Self: """ Associate a 3D scalar bar to the object and add it to the scene. The new scalarbar object (Assembly) will be accessible as obj.scalarbar Arguments: size : (list) (thickness, length) of scalarbar title : (str) scalar bar title title_xoffset : (float) horizontal space btw title and color scalarbar title_yoffset : (float) vertical space offset title_size : (float) size of title wrt numeric labels title_rotation : (float) title rotation in degrees nlabels : (int) number of numeric labels label_font : (str) font type for labels label_size : (float) label scale factor label_offset : (float) space btw numeric labels and scale label_rotation : (float) label rotation in degrees label_format : (str) label format for floats and integers (e.g. `':.2f'`) draw_box : (bool) draw a box around the colorbar categories : (list) make a categorical scalarbar, the input list will have the format `[value, color, alpha, textlabel]` Examples: - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) """ plt = vedo.plotter_instance if plt and c is None: # automatic black or white c = (0.9, 0.9, 0.9) if np.sum(vedo.get_color(plt.backgrcol)) > 1.5: c = (0.1, 0.1, 0.1) if c is None: c = (0, 0, 0) c = vedo.get_color(c) self.scalarbar = vedo.addons.ScalarBar3D( self, title, pos, size, title_font, title_xoffset, title_yoffset, title_size, title_rotation, nlabels, label_font, label_size, label_offset, label_rotation, label_format, italic, c, draw_box, above_text, below_text, nan_text, categories, ) return self def color(self, col, alpha=None, vmin=None, vmax=None): """ Assign a color or a set of colors along the range of the scalar value. A single constant color can also be assigned. Any matplotlib color map name is also accepted, e.g. `volume.color('jet')`. E.g.: say that your cells scalar runs from -3 to 6, and you want -3 to show red and 1.5 violet and 6 green, then just set: `volume.color(['red', 'violet', 'green'])` You can also assign a specific color to a aspecific value with eg.: `volume.color([(0,'red'), (0.5,'violet'), (1,'green')])` Arguments: alpha : (list) use a list to specify transparencies along the scalar range vmin : (float) force the min of the scalar range to be this value vmax : (float) force the max of the scalar range to be this value """ # supersedes method in Points, Mesh if col is None: return self if vmin is None: vmin, _ = self.dataset.GetScalarRange() if vmax is None: _, vmax = self.dataset.GetScalarRange() ctf = self.properties.GetRGBTransferFunction() ctf.RemoveAllPoints() if utils.is_sequence(col): if utils.is_sequence(col[0]) and len(col[0]) == 2: # user passing [(value1, color1), ...] for x, ci in col: r, g, b = colors.get_color(ci) ctf.AddRGBPoint(x, r, g, b) # colors.printc('color at', round(x, 1), # 'set to', colors.get_color_name((r, g, b)), bold=0) else: # user passing [color1, color2, ..] for i, ci in enumerate(col): r, g, b = colors.get_color(ci) x = vmin + (vmax - vmin) * i / (len(col) - 1) ctf.AddRGBPoint(x, r, g, b) elif isinstance(col, str): if col in colors.colors.keys() or col in colors.color_nicks.keys(): r, g, b = colors.get_color(col) ctf.AddRGBPoint(vmin, r, g, b) # constant color ctf.AddRGBPoint(vmax, r, g, b) else: # assume it's a colormap for x in np.linspace(vmin, vmax, num=64, endpoint=True): r, g, b = colors.color_map(x, name=col, vmin=vmin, vmax=vmax) ctf.AddRGBPoint(x, r, g, b) elif isinstance(col, int): r, g, b = colors.get_color(col) ctf.AddRGBPoint(vmin, r, g, b) # constant color ctf.AddRGBPoint(vmax, r, g, b) else: vedo.logger.warning(f"in color() unknown input type {type(col)}") if alpha is not None: self.alpha(alpha, vmin=vmin, vmax=vmax) return self def alpha(self, alpha, vmin=None, vmax=None) -> Self: """ Assign a set of tranparencies along the range of the scalar value. A single constant value can also be assigned. E.g.: say `alpha=(0.0, 0.3, 0.9, 1)` and the scalar range goes from -10 to 150. Then all cells with a value close to -10 will be completely transparent, cells at 1/4 of the range will get an alpha equal to 0.3 and voxels with value close to 150 will be completely opaque. As a second option one can set explicit (x, alpha_x) pairs to define the transfer function. E.g.: say `alpha=[(-5, 0), (35, 0.4) (123,0.9)]` and the scalar range goes from -10 to 150. Then all cells below -5 will be completely transparent, cells with a scalar value of 35 will get an opacity of 40% and above 123 alpha is set to 90%. """ if vmin is None: vmin, _ = self.dataset.GetScalarRange() if vmax is None: _, vmax = self.dataset.GetScalarRange() otf = self.properties.GetScalarOpacity() otf.RemoveAllPoints() if utils.is_sequence(alpha): alpha = np.array(alpha) if len(alpha.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) for i, al in enumerate(alpha): xalpha = vmin + (vmax - vmin) * i / (len(alpha) - 1) # Create transfer mapping scalar value to opacity otf.AddPoint(xalpha, al) # print("alpha at", round(xalpha, 1), "\tset to", al) elif len(alpha.shape) == 2: # user passing [(x0,alpha0), ...] otf.AddPoint(vmin, alpha[0][1]) for xalpha, al in alpha: # Create transfer mapping scalar value to opacity otf.AddPoint(xalpha, al) otf.AddPoint(vmax, alpha[-1][1]) else: otf.AddPoint(vmin, alpha) # constant alpha otf.AddPoint(vmax, alpha) return self ######################################################################################## class Actor2D(vtki.vtkActor2D): """Wrapping of `vtkActor2D`.""" def __init__(self): """Manage 2D objects.""" super().__init__() self.dataset = None self.properties = self.GetProperty() self.name = "" self.filename = "" self.file_size = 0 self.pipeline = None self.shape = [] # for images @property def mapper(self): """Get the internal vtkMapper.""" return self.GetMapper() @mapper.setter def mapper(self, amapper): """Set the internal vtkMapper.""" self.SetMapper(amapper) def layer(self, value=None): """Set/Get the layer number in the overlay planes into which to render.""" if value is None: return self.GetLayerNumber() self.SetLayerNumber(value) return self def pos(self, px=None, py=None) -> Union[np.ndarray, Self]: """Set/Get the screen-coordinate position.""" if isinstance(px, str): vedo.logger.error("Use string descriptors only inside the constructor") return self if px is None: return np.array(self.GetPosition(), dtype=int) if py is not None: p = [px, py] else: p = px assert len(p) == 2, "Error: len(pos) must be 2 for Actor2D" self.SetPosition(p) return self def coordinate_system(self, value=None) -> Self: """ Set/get the coordinate system which this coordinate is defined in. The options are: 0. Display 1. Normalized Display 2. Viewport 3. Normalized Viewport 4. View 5. Pose 6. World """ coor = self.GetPositionCoordinate() if value is None: return coor.GetCoordinateSystem() coor.SetCoordinateSystem(value) return self def on(self) -> Self: """Set object visibility.""" self.VisibilityOn() return self def off(self) -> Self: """Set object visibility.""" self.VisibilityOn() return self def toggle(self) -> Self: """Toggle object visibility.""" self.SetVisibility(not self.GetVisibility()) return self def visibility(value=None) -> bool: """Get/Set object visibility.""" if value is not None: self.SetVisibility(value) return self.GetVisibility() def pickable(self, value=True) -> Self: """Set object pickability.""" self.SetPickable(value) return self def color(self, value=None) -> Union[np.ndarray, Self]: """Set/Get the object color.""" if value is None: return self.properties.GetColor() self.properties.SetColor(colors.get_color(value)) return self def c(self, value=None) -> Union[np.ndarray, Self]: """Set/Get the object color.""" return self.color(value) def alpha(self, value=None) -> Union[float, Self]: """Set/Get the object opacity.""" if value is None: return self.properties.GetOpacity() self.properties.SetOpacity(value) return self def ps(self, point_size=None) -> Union[int, Self]: if point_size is None: return self.properties.GetPointSize() self.properties.SetPointSize(point_size) return self def lw(self, line_width=None) -> Union[int, Self]: if line_width is None: return self.properties.GetLineWidth() self.properties.SetLineWidth(line_width) return self def ontop(self, value=True) -> Self: """Keep the object always on top of everything else.""" if value: self.properties.SetDisplayLocationToForeground() else: self.properties.SetDisplayLocationToBackground() return self def add_observer(self, event_name, func, priority=0) -> int: """Add a callback function that will be called when an event occurs.""" event_name = utils.get_vtk_name_event(event_name) idd = self.AddObserver(event_name, func, priority) return idd ######################################################################################## class Actor3DHelper: def apply_transform(self, LT) -> Self: """Apply a linear transformation to the actor.""" self.transform.concatenate(LT) self.actor.SetPosition(self.transform.T.GetPosition()) self.actor.SetOrientation(self.transform.T.GetOrientation()) self.actor.SetScale(self.transform.T.GetScale()) return self def pos(self, x=None, y=None, z=None) -> Union[np.ndarray, Self]: """Set/Get object position.""" if x is None: # get functionality return self.transform.position if z is None and y is None: # assume x is of the form (x,y,z) if len(x) == 3: x, y, z = x else: x, y = x z = 0 elif z is None: # assume x,y is of the form x, y z = 0 q = self.transform.position LT = vedo.LinearTransform().translate([x,y,z]-q) return self.apply_transform(LT) def shift(self, dx, dy=0, dz=0) -> Self: """Add a vector to the current object position.""" if vedo.utils.is_sequence(dx): vedo.utils.make3d(dx) dx, dy, dz = dx LT = vedo.LinearTransform().translate([dx, dy, dz]) return self.apply_transform(LT) def origin(self, point=None) -> Union[np.ndarray, Self]: """ Set/get origin of object. Useful for defining pivoting point when rotating and/or scaling. """ if point is None: return np.array(self.actor.GetOrigin()) self.actor.SetOrigin(point) return self def scale(self, s, origin=True) -> Self: """Multiply object size by `s` factor.""" LT = vedo.LinearTransform().scale(s, origin=origin) return self.apply_transform(LT) def x(self, val=None) -> Union[float, Self]: """Set/Get object position along x axis.""" p = self.transform.position if val is None: return p[0] self.pos(val, p[1], p[2]) return self def y(self, val=None) -> Union[float, Self]: """Set/Get object position along y axis.""" p = self.transform.position if val is None: return p[1] self.pos(p[0], val, p[2]) return self def z(self, val=None) -> Union[float, Self]: """Set/Get object position along z axis.""" p = self.transform.position if val is None: return p[2] self.pos(p[0], p[1], val) return self def rotate_x(self, angle) -> Self: """Rotate object around x axis.""" LT = vedo.LinearTransform().rotate_x(angle) return self.apply_transform(LT) def rotate_y(self, angle) -> Self: """Rotate object around y axis.""" LT = vedo.LinearTransform().rotate_y(angle) return self.apply_transform(LT) def rotate_z(self, angle) -> Self: """Rotate object around z axis.""" LT = vedo.LinearTransform().rotate_z(angle) return self.apply_transform(LT) def reorient(self, old_axis, new_axis, rotation=0, rad=False) -> Self: """Rotate object to a new orientation.""" if rad: rotation *= 180 / np.pi axis = old_axis / np.linalg.norm(old_axis) direction = new_axis / np.linalg.norm(new_axis) angle = np.arccos(np.dot(axis, direction)) * 180 / np.pi self.actor.RotateZ(rotation) a,b,c = np.cross(axis, direction) self.actor.RotateWXYZ(angle, c,b,a) return self def bounds(self) -> np.ndarray: """ Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ return np.array(self.actor.GetBounds()) def xbounds(self, i=None) -> Union[float, tuple]: """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i is not None: return b[i] return (b[0], b[1]) def ybounds(self, i=None) -> Union[float, tuple]: """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i == 0: return b[2] if i == 1: return b[3] return (b[2], b[3]) def zbounds(self, i=None) -> Union[float, tuple]: """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i == 0: return b[4] if i == 1: return b[5] return (b[4], b[5]) def diagonal_size(self) -> float: """Get the diagonal size of the bounding box.""" b = self.bounds() return np.sqrt((b[1]-b[0])**2 + (b[3]-b[2])**2 + (b[5]-b[4])**2) ################################################### class PointsVisual(CommonVisual): """Class to manage the visual aspects of a ``Points`` object.""" def __init__(self): # print("init PointsVisual") super().__init__() self.properties_backface = None self._cmap_name = None self.trail = None self.trail_offset = 0 self.trail_points = [] self._caption = None def clone2d(self, size=None, offset=(), scale=None): """ Turn a 3D `Points` or `Mesh` into a flat 2D actor. Returns a `Actor2D`. Arguments: size : (float) size as scaling factor for the 2D actor offset : (list) 2D (x, y) position of the actor in the range [-1, 1] scale : (float) Deprecated. Use `size` instead. Examples: - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) ![](https://vedo.embl.es/images/other/clone2d.png) """ # assembly.Assembly.clone2d() superseeds this method if scale is not None: vedo.logger.warning("clone2d(): use keyword size not scale") size = scale if size is None: # work out a reasonable scale msiz = self.diagonal_size() if vedo.plotter_instance and vedo.plotter_instance.window: sz = vedo.plotter_instance.window.GetSize() dsiz = utils.mag(sz) size = dsiz / msiz / 10 else: size = 350 / msiz tp = vtki.new("TransformPolyDataFilter") transform = vtki.vtkTransform() transform.Scale(size, size, size) if len(offset) == 0: offset = self.pos() transform.Translate(-utils.make3d(offset)) tp.SetTransform(transform) tp.SetInputData(self.dataset) tp.Update() poly = tp.GetOutput() cm = self.mapper.GetColorMode() lut = self.mapper.GetLookupTable() sv = self.mapper.GetScalarVisibility() use_lut = self.mapper.GetUseLookupTableScalarRange() vrange = self.mapper.GetScalarRange() sm = self.mapper.GetScalarMode() act2d = Actor2D() act2d.dataset = poly mapper2d = vtki.new("PolyDataMapper2D") mapper2d.SetInputData(poly) mapper2d.SetColorMode(cm) mapper2d.SetLookupTable(lut) mapper2d.SetScalarVisibility(sv) mapper2d.SetUseLookupTableScalarRange(use_lut) mapper2d.SetScalarRange(vrange) mapper2d.SetScalarMode(sm) act2d.mapper = mapper2d act2d.GetPositionCoordinate().SetCoordinateSystem(4) act2d.properties.SetColor(self.color()) act2d.properties.SetOpacity(self.alpha()) act2d.properties.SetLineWidth(self.properties.GetLineWidth()) act2d.properties.SetPointSize(self.properties.GetPointSize()) act2d.properties.SetDisplayLocation(0) # 0 = back, 1 = front act2d.PickableOff() return act2d ################################################## def copy_properties_from(self, source, deep=True, actor_related=True) -> Self: """ Copy properties from another ``Points`` object. """ pr = vtki.vtkProperty() try: sp = source.properties mp = source.mapper sa = source.actor except AttributeError: sp = source.GetProperty() mp = source.GetMapper() sa = source if deep: pr.DeepCopy(sp) else: pr.ShallowCopy(sp) self.actor.SetProperty(pr) self.properties = pr if self.actor.GetBackfaceProperty(): bfpr = vtki.vtkProperty() bfpr.DeepCopy(sa.GetBackfaceProperty()) self.actor.SetBackfaceProperty(bfpr) self.properties_backface = bfpr if not actor_related: return self # mapper related: self.mapper.SetScalarVisibility(mp.GetScalarVisibility()) self.mapper.SetScalarMode(mp.GetScalarMode()) self.mapper.SetScalarRange(mp.GetScalarRange()) self.mapper.SetLookupTable(mp.GetLookupTable()) self.mapper.SetColorMode(mp.GetColorMode()) self.mapper.SetInterpolateScalarsBeforeMapping( mp.GetInterpolateScalarsBeforeMapping() ) self.mapper.SetUseLookupTableScalarRange( mp.GetUseLookupTableScalarRange() ) self.actor.SetPickable(sa.GetPickable()) self.actor.SetDragable(sa.GetDragable()) self.actor.SetTexture(sa.GetTexture()) self.actor.SetVisibility(sa.GetVisibility()) return self def color(self, c=False, alpha=None) -> Union[np.ndarray, Self]: """ Set/get mesh's color. If None is passed as input, will use colors from active scalars. Same as `mesh.c()`. """ if c is False: return np.array(self.properties.GetColor()) if c is None: self.mapper.ScalarVisibilityOn() return self self.mapper.ScalarVisibilityOff() cc = colors.get_color(c) self.properties.SetColor(cc) if self.trail: self.trail.properties.SetColor(cc) if alpha is not None: self.alpha(alpha) return self def c(self, color=False, alpha=None) -> Union[np.ndarray, Self]: """ Shortcut for `color()`. If None is passed as input, will use colors from current active scalars. """ return self.color(color, alpha) def alpha(self, opacity=None) -> Union[float, Self]: """Set/get mesh's transparency. Same as `mesh.opacity()`.""" if opacity is None: return self.properties.GetOpacity() self.properties.SetOpacity(opacity) bfp = self.actor.GetBackfaceProperty() if bfp: if opacity < 1: self.properties_backface = bfp self.actor.SetBackfaceProperty(None) else: self.actor.SetBackfaceProperty(self.properties_backface) return self def lut_color_at(self, value) -> np.ndarray: """ Return the color and alpha in the lookup table at given value. """ lut = self.mapper.GetLookupTable() if not lut: return None rgb = [0,0,0] lut.GetColor(value, rgb) alpha = lut.GetOpacity(value) return np.array(rgb + [alpha]) def opacity(self, alpha=None) -> Union[float, Self]: """Set/get mesh's transparency. Same as `mesh.alpha()`.""" return self.alpha(alpha) def force_opaque(self, value=True) -> Self: """ Force the Mesh, Line or point cloud to be treated as opaque""" ## force the opaque pass, fixes picking in vtk9 # but causes other bad troubles with lines.. self.actor.SetForceOpaque(value) return self def force_translucent(self, value=True) -> Self: """ Force the Mesh, Line or point cloud to be treated as translucent""" self.actor.SetForceTranslucent(value) return self def point_size(self, value=None) -> Union[int, Self]: """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" if value is None: return self.properties.GetPointSize() # self.properties.SetRepresentationToSurface() else: self.properties.SetRepresentationToPoints() self.properties.SetPointSize(value) return self def ps(self, pointsize=None) -> Union[int, Self]: """Set/get mesh's point size of vertices. Same as `mesh.point_size()`""" return self.point_size(pointsize) def render_points_as_spheres(self, value=True) -> Self: """Make points look spheric or else make them look as squares.""" self.properties.SetRenderPointsAsSpheres(value) return self def lighting( self, style="", ambient=None, diffuse=None, specular=None, specular_power=None, specular_color=None, metallicity=None, roughness=None, ) -> Self: """ Set the ambient, diffuse, specular and specular_power lighting constants. Arguments: style : (str) preset style, options are `[metallic, plastic, shiny, glossy, ambient, off]` ambient : (float) ambient fraction of emission [0-1] diffuse : (float) emission of diffused light in fraction [0-1] specular : (float) fraction of reflected light [0-1] specular_power : (float) precision of reflection [1-100] specular_color : (color) color that is being reflected by the surface Examples: - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) """ pr = self.properties if style: if style != "off": pr.LightingOn() if style == "off": pr.SetInterpolationToFlat() pr.LightingOff() return self ############## if hasattr(pr, "GetColor"): # could be Volume c = pr.GetColor() else: c = (1, 1, 0.99) mpr = self.mapper if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): c = (1,1,0.99) if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, (1,1,0.99)] elif style=='ambient' : pars = [0.8, 0.1, 0.0, 1, (1,1,1)] elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] else: vedo.logger.error("in lighting(): Available styles are") vedo.logger.error("[default, metallic, plastic, shiny, glossy, ambient, off]") raise RuntimeError() pr.SetAmbient(pars[0]) pr.SetDiffuse(pars[1]) pr.SetSpecular(pars[2]) pr.SetSpecularPower(pars[3]) if hasattr(pr, "GetColor"): pr.SetSpecularColor(pars[4]) if ambient is not None: pr.SetAmbient(ambient) if diffuse is not None: pr.SetDiffuse(diffuse) if specular is not None: pr.SetSpecular(specular) if specular_power is not None: pr.SetSpecularPower(specular_power) if specular_color is not None: pr.SetSpecularColor(colors.get_color(specular_color)) if metallicity is not None: pr.SetInterpolationToPBR() pr.SetMetallic(metallicity) if roughness is not None: pr.SetInterpolationToPBR() pr.SetRoughness(roughness) return self def point_blurring(self, r=1, alpha=1.0, emissive=False) -> Self: """Set point blurring. Apply a gaussian convolution filter to the points. In this case the radius `r` is in absolute units of the mesh coordinates. With emissive set, the halo of point becomes light-emissive. """ self.properties.SetRepresentationToPoints() if emissive: self.mapper.SetEmissive(bool(emissive)) self.mapper.SetScaleFactor(r * 1.4142) # https://kitware.github.io/vtk-examples/site/Python/Meshes/PointInterpolator/ if alpha < 1: self.mapper.SetSplatShaderCode( "//VTK::Color::Impl\n" "float dist = dot(offsetVCVSOutput.xy,offsetVCVSOutput.xy);\n" "if (dist > 1.0) {\n" " discard;\n" "} else {\n" f" float scale = ({alpha} - dist);\n" " ambientColor *= scale;\n" " diffuseColor *= scale;\n" "}\n" ) alpha = 1 self.mapper.Modified() self.actor.Modified() self.properties.SetOpacity(alpha) self.actor.SetMapper(self.mapper) return self @property def cellcolors(self): """ Colorize each cell (face) of a mesh by passing a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. Colors levels and opacities must be in the range [0,255]. A single constant color can also be passed as string or RGBA. A cell array named "CellsRGBA" is automatically created. Examples: - [color_mesh_cells1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells1.py) - [color_mesh_cells2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells2.py) ![](https://vedo.embl.es/images/basic/colorMeshCells.png) """ if "CellsRGBA" not in self.celldata.keys(): lut = self.mapper.GetLookupTable() vscalars = self.dataset.GetCellData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.ncells, 4], dtype=np.uint8) col = np.array(self.properties.GetColor()) col = np.round(col * 255).astype(np.uint8) alf = self.properties.GetOpacity() alf = np.round(alf * 255).astype(np.uint8) arr[:, (0, 1, 2)] = col arr[:, 3] = alf else: cols = lut.MapScalars(vscalars, 0, 0) arr = utils.vtk2numpy(cols) self.celldata["CellsRGBA"] = arr self.celldata.select("CellsRGBA") return self.celldata["CellsRGBA"] @cellcolors.setter def cellcolors(self, value): if isinstance(value, str): c = colors.get_color(value) value = np.array([*c, 1]) * 255 value = np.round(value) value = np.asarray(value) n = self.ncells if value.ndim == 1: value = np.repeat([value], n, axis=0) if value.shape[1] == 3: z = np.zeros((n, 1), dtype=np.uint8) value = np.append(value, z + 255, axis=1) assert n == value.shape[0] self.celldata["CellsRGBA"] = value.astype(np.uint8) # self.mapper.SetColorModeToDirectScalars() # done in select() self.celldata.select("CellsRGBA") @property def pointcolors(self): """ Colorize each point (or vertex of a mesh) by passing a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. Colors levels and opacities must be in the range [0,255]. A single constant color can also be passed as string or RGBA. A point array named "PointsRGBA" is automatically created. """ if "PointsRGBA" not in self.pointdata.keys(): lut = self.mapper.GetLookupTable() vscalars = self.dataset.GetPointData().GetScalars() if vscalars is None or lut is None: # create a constant array arr = np.zeros([self.npoints, 4], dtype=np.uint8) col = np.array(self.properties.GetColor()) col = np.round(col * 255).astype(np.uint8) alf = self.properties.GetOpacity() alf = np.round(alf * 255).astype(np.uint8) arr[:, (0, 1, 2)] = col arr[:, 3] = alf else: cols = lut.MapScalars(vscalars, 0, 0) arr = utils.vtk2numpy(cols) self.pointdata["PointsRGBA"] = arr self.pointdata.select("PointsRGBA") return self.pointdata["PointsRGBA"] @pointcolors.setter def pointcolors(self, value): if isinstance(value, str): c = colors.get_color(value) value = np.array([*c, 1]) * 255 value = np.round(value) value = np.asarray(value) n = self.npoints if value.ndim == 1: value = np.repeat([value], n, axis=0) if value.shape[1] == 3: z = np.zeros((n, 1), dtype=np.uint8) value = np.append(value, z + 255, axis=1) assert n == value.shape[0] self.pointdata["PointsRGBA"] = value.astype(np.uint8) # self.mapper.SetColorModeToDirectScalars() # done in select() self.pointdata.select("PointsRGBA") ##################################################################################### def cmap( self, input_cmap, input_array=None, on="", name="Scalars", vmin=None, vmax=None, n_colors=256, alpha=1.0, logscale=False, ) -> Self: """ Set individual point/cell colors by providing a list of scalar values and a color map. Arguments: input_cmap : (str, list, vtkLookupTable, matplotlib.colors.LinearSegmentedColormap) color map scheme to transform a real number into a color. input_array : (str, list, vtkArray) can be the string name of an existing array, a new array or a `vtkArray`. on : (str) either 'points' or 'cells' or blank (automatic). Apply the color map to data which is defined on either points or cells. name : (str) give a name to the provided array (if input_array is an array) vmin : (float) clip scalars to this minimum value vmax : (float) clip scalars to this maximum value n_colors : (int) number of distinct colors to be used in colormap table. alpha : (float, list) Mesh transparency. Can be a `list` of values one for each vertex. logscale : (bool) Use logscale Examples: - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) - [mesh_alphas.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_alphas.py) - [mesh_custom.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_custom.py) - (and many others) ![](https://vedo.embl.es/images/basic/mesh_custom.png) """ self._cmap_name = input_cmap if on == "": try: on = self.mapper.GetScalarModeAsString().replace("Use", "") if on not in ["PointData", "CellData"]: # can be "Default" on = "points" self.mapper.SetScalarModeToUsePointData() except AttributeError: on = "points" elif on == "Default": on = "points" self.mapper.SetScalarModeToUsePointData() if input_array is None: if not self.pointdata.keys() and self.celldata.keys(): on = "cells" if not self.dataset.GetCellData().GetScalars(): input_array = 0 # pick the first at hand if "point" in on.lower(): data = self.dataset.GetPointData() n = self.dataset.GetNumberOfPoints() elif "cell" in on.lower(): data = self.dataset.GetCellData() n = self.dataset.GetNumberOfCells() else: vedo.logger.error( f"Must specify in cmap(on=...) to either 'cells' or 'points', not {on}") raise RuntimeError() if input_array is None: # if None try to fetch the active scalars arr = data.GetScalars() if not arr: vedo.logger.error(f"in cmap(), cannot find any {on} active array ...skip coloring.") return self if not arr.GetName(): # sometimes arrays dont have a name.. arr.SetName(name) elif isinstance(input_array, str): # if a string is passed arr = data.GetArray(input_array) if not arr: vedo.logger.error(f"in cmap(), cannot find {on} array {input_array} ...skip coloring.") return self elif isinstance(input_array, int): # if an int is passed if input_array < data.GetNumberOfArrays(): arr = data.GetArray(input_array) else: vedo.logger.error(f"in cmap(), cannot find {on} array at {input_array} ...skip coloring.") return self elif utils.is_sequence(input_array): # if a numpy array is passed npts = len(input_array) if npts != n: vedo.logger.error(f"in cmap(), nr. of input {on} scalars {npts} != {n} ...skip coloring.") return self arr = utils.numpy2vtk(input_array, name=name, dtype=float) data.AddArray(arr) data.Modified() elif isinstance(input_array, vtki.vtkArray): # if a vtkArray is passed arr = input_array data.AddArray(arr) data.Modified() else: vedo.logger.error(f"in cmap(), cannot understand input type {type(input_array)}") raise RuntimeError() # Now we have array "arr" array_name = arr.GetName() if arr.GetNumberOfComponents() == 1: if vmin is None: vmin = arr.GetRange()[0] if vmax is None: vmax = arr.GetRange()[1] else: if vmin is None or vmax is None: vn = utils.mag(utils.vtk2numpy(arr)) if vmin is None: vmin = vn.min() if vmax is None: vmax = vn.max() # interpolate alphas if they are not constant if not utils.is_sequence(alpha): alpha = [alpha] * n_colors else: v = np.linspace(0, 1, n_colors, endpoint=True) xp = np.linspace(0, 1, len(alpha), endpoint=True) alpha = np.interp(v, xp, alpha) ########################### build the look-up table if isinstance(input_cmap, vtki.vtkLookupTable): # vtkLookupTable lut = input_cmap elif utils.is_sequence(input_cmap): # manual sequence of colors lut = vtki.vtkLookupTable() if logscale: lut.SetScaleToLog10() lut.SetRange(vmin, vmax) ncols = len(input_cmap) lut.SetNumberOfTableValues(ncols) for i, c in enumerate(input_cmap): r, g, b = colors.get_color(c) lut.SetTableValue(i, r, g, b, alpha[i]) lut.Build() else: # assume string cmap name OR matplotlib.colors.LinearSegmentedColormap lut = vtki.vtkLookupTable() if logscale: lut.SetScaleToLog10() lut.SetVectorModeToMagnitude() lut.SetRange(vmin, vmax) lut.SetNumberOfTableValues(n_colors) mycols = colors.color_map(range(n_colors), input_cmap, 0, n_colors) for i, c in enumerate(mycols): r, g, b = c lut.SetTableValue(i, r, g, b, alpha[i]) lut.Build() # TEST NEW WAY self.mapper.SetLookupTable(lut) self.mapper.ScalarVisibilityOn() self.mapper.SetColorModeToMapScalars() self.mapper.SetScalarRange(lut.GetRange()) if "point" in on.lower(): self.pointdata.select(array_name) else: self.celldata.select(array_name) return self # # TEST this is the old way: # # arr.SetLookupTable(lut) # wrong! causes weird instabilities with LUT # # if data.GetScalars(): # # data.GetScalars().SetLookupTable(lut) # # data.GetScalars().Modified() # data.SetActiveScalars(array_name) # # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars # # data.SetActiveAttribute(array_name, 0) # boh! # self.mapper.SetLookupTable(lut) # self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars # self.mapper.ScalarVisibilityOn() # self.mapper.SetScalarRange(lut.GetRange()) # if on.startswith("point"): # self.mapper.SetScalarModeToUsePointData() # else: # self.mapper.SetScalarModeToUseCellData() # if hasattr(self.mapper, "SetArrayName"): # self.mapper.SetArrayName(array_name) # return self def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2) -> Self: """ Add a trailing line to mesh. This new mesh is accessible through `mesh.trail`. Arguments: offset : (float) set an offset vector from the object center. n : (int) number of segments lw : (float) line width of the trail Examples: - [trail.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/trail.py) ![](https://vedo.embl.es/images/simulations/trail.gif) - [airplane1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane1.py) - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) """ if self.trail is None: pos = self.pos() self.trail_offset = np.asarray(offset) self.trail_points = [pos] * n if c is None: col = self.properties.GetColor() else: col = colors.get_color(c) tline = vedo.shapes.Line(pos, pos, res=n, c=col, alpha=alpha, lw=lw) self.trail = tline # holds the Line self.trail.initilized = False # so the first update will be a reset return self def update_trail(self) -> Self: """ Update the trailing line of a moving object. """ currentpos = self.pos() if not self.trail.initilized: self.trail_points = [currentpos] * self.trail.npoints self.trail.initilized = True return self self.trail_points.append(currentpos) # cycle self.trail_points.pop(0) data = np.array(self.trail_points) + self.trail_offset tpoly = self.trail.dataset tpoly.GetPoints().SetData(utils.numpy2vtk(data, dtype=np.float32)) return self def _compute_shadow(self, plane, point, direction): shad = self.clone() shad.name = "Shadow" tarr = shad.dataset.GetPointData().GetTCoords() if tarr: # remove any texture coords tname = tarr.GetName() shad.pointdata.remove(tname) shad.dataset.GetPointData().SetTCoords(None) shad.actor.SetTexture(None) pts = shad.vertices if plane == "x": # shad = shad.project_on_plane('x') # instead do it manually so in case of alpha<1 # we dont see glitches due to coplanar points # we leave a small tolerance of 0.1% in thickness x0, x1 = self.xbounds() pts[:, 0] = (pts[:, 0] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[0] shad.vertices = pts shad.x(point) elif plane == "y": x0, x1 = self.ybounds() pts[:, 1] = (pts[:, 1] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[1] shad.vertices = pts shad.y(point) elif plane == "z": x0, x1 = self.zbounds() pts[:, 2] = (pts[:, 2] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[2] shad.vertices = pts shad.z(point) else: shad = shad.project_on_plane(plane, point, direction) return shad def add_shadow(self, plane, point, direction=None, c=(0.6, 0.6, 0.6), alpha=1, culling=0) -> Self: """ Generate a shadow out of an `Mesh` on one of the three Cartesian planes. The output is a new `Mesh` representing the shadow. This new mesh is accessible through `mesh.shadow`. By default the shadow mesh is placed on the bottom wall of the bounding box. See also `pointcloud.project_on_plane()`. Arguments: plane : (str, Plane) if plane is `str`, plane can be one of `['x', 'y', 'z']`, represents x-plane, y-plane and z-plane, respectively. Otherwise, plane should be an instance of `vedo.shapes.Plane` point : (float, array) if plane is `str`, point should be a float represents the intercept. Otherwise, point is the camera point of perspective projection direction : (list) direction of oblique projection culling : (int) choose between front [1] or backface [-1] culling or None. Examples: - [shadow1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/shadow1.py) - [airplane1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane1.py) - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) ![](https://vedo.embl.es/images/simulations/57341963-b8910900-713c-11e9-898a-84b6d3712bce.gif) """ shad = self._compute_shadow(plane, point, direction) shad.c(c).alpha(alpha) try: # Points dont have these methods shad.flat() if culling in (1, True): shad.frontface_culling() elif culling == -1: shad.backface_culling() except AttributeError: pass shad.properties.LightingOff() shad.actor.SetPickable(False) shad.actor.SetUseBounds(True) if shad not in self.shadows: self.shadows.append(shad) shad.info = dict(plane=plane, point=point, direction=direction) # shad.metadata["plane"] = plane # shad.metadata["point"] = point # print("AAAA", direction, plane, point) # if direction is None: # direction = [0,0,0] # shad.metadata["direction"] = direction return self def update_shadows(self) -> Self: """Update the shadows of a moving object.""" for sha in self.shadows: plane = sha.info["plane"] point = sha.info["point"] direction = sha.info["direction"] # print("update_shadows direction", direction,plane,point ) # plane = sha.metadata["plane"] # point = sha.metadata["point"] # direction = sha.metadata["direction"] # if direction[0]==0 and direction[1]==0 and direction[2]==0: # direction = None # print("BBBB", sha.metadata["direction"], # sha.metadata["plane"], sha.metadata["point"]) new_sha = self._compute_shadow(plane, point, direction) sha._update(new_sha.dataset) if self.trail: self.trail.update_shadows() return self def labels( self, content=None, on="points", scale=None, xrot=0.0, yrot=0.0, zrot=0.0, ratio=1, precision=None, italic=False, font="", justify="", c="black", alpha=1.0, ) -> Union["vedo.Mesh", None]: """ Generate value or ID labels for mesh cells or points. For large nr. of labels use `font="VTK"` which is much faster. See also: `labels2d()`, `flagpole()`, `caption()` and `legend()`. Arguments: content : (list,int,str) either 'id', 'cellid', array name or array number. A array can also be passed (must match the nr. of points or cells). on : (str) generate labels for "cells" instead of "points" scale : (float) absolute size of labels, if left as None it is automatic zrot : (float) local rotation angle of label in degrees ratio : (int) skipping ratio, to reduce nr of labels for large meshes precision : (int) numeric precision of labels ```python from vedo import * s = Sphere(res=10).linewidth(1).c("orange").compute_normals() point_ids = s.labels('id', on="points").c('green') cell_ids = s.labels('id', on="cells" ).c('black') show(s, point_ids, cell_ids) ``` ![](https://vedo.embl.es/images/feats/labels.png) Examples: - [boundaries.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boundaries.py) ![](https://vedo.embl.es/images/basic/boundaries.png) """ cells = False if "cell" in on or "face" in on: cells = True justify = "centered" if justify == "" else justify if isinstance(content, str): if content in ("pointid", "pointsid"): cells = False content = "id" justify = "bottom-left" if justify == "" else justify if content in ("cellid", "cellsid"): cells = True content = "id" justify = "centered" if justify == "" else justify try: if cells: ns = np.sqrt(self.ncells) elems = self.cell_centers().points norms = self.cell_normals justify = "centered" if justify == "" else justify else: ns = np.sqrt(self.npoints) elems = self.vertices norms = self.vertex_normals except AttributeError: norms = [] if not justify: justify = "bottom-left" hasnorms = False if len(norms) > 0: hasnorms = True if scale is None: if not ns: ns = 100 scale = self.diagonal_size() / ns / 10 arr = None mode = 0 if content is None: mode = 0 if cells: if self.dataset.GetCellData().GetScalars(): name = self.dataset.GetCellData().GetScalars().GetName() arr = self.celldata[name] else: if self.dataset.GetPointData().GetScalars(): name = self.dataset.GetPointData().GetScalars().GetName() arr = self.pointdata[name] elif isinstance(content, (str, int)): if content == "id": mode = 1 elif cells: mode = 0 arr = self.celldata[content] else: mode = 0 arr = self.pointdata[content] elif utils.is_sequence(content): mode = 0 arr = content if arr is None and mode == 0: vedo.logger.error("in labels(), array not found in point or cell data") return None ratio = int(ratio+0.5) tapp = vtki.new("AppendPolyData") has_inputs = False for i, e in enumerate(elems): if i % ratio: continue if mode == 1: txt_lab = str(i) else: if precision: txt_lab = utils.precision(arr[i], precision) else: txt_lab = str(arr[i]) if not txt_lab: continue if font == "VTK": tx = vtki.new("VectorText") tx.SetText(txt_lab) tx.Update() tx_poly = tx.GetOutput() else: tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify).dataset if tx_poly.GetNumberOfPoints() == 0: continue ###################### T = vtki.vtkTransform() T.PostMultiply() if italic: T.Concatenate([1, 0.2, 0, 0, 0, 1 , 0, 0, 0, 0 , 1, 0, 0, 0 , 0, 1]) if hasnorms: ni = norms[i] if cells and font=="VTK": # center-justify bb = tx_poly.GetBounds() dx, dy = (bb[1] - bb[0]) / 2, (bb[3] - bb[2]) / 2 T.Translate(-dx, -dy, 0) if xrot: T.RotateX(xrot) if yrot: T.RotateY(yrot) if zrot: T.RotateZ(zrot) crossvec = np.cross([0, 0, 1], ni) angle = np.arccos(np.dot([0, 0, 1], ni)) * 57.3 T.RotateWXYZ(float(angle), crossvec.tolist()) T.Translate(ni / 100) else: if xrot: T.RotateX(xrot) if yrot: T.RotateY(yrot) if zrot: T.RotateZ(zrot) T.Scale(scale, scale, scale) T.Translate(e) tf = vtki.new("TransformPolyDataFilter") tf.SetInputData(tx_poly) tf.SetTransform(T) tf.Update() tapp.AddInputData(tf.GetOutput()) has_inputs = True if has_inputs: tapp.Update() lpoly = tapp.GetOutput() else: lpoly = vtki.vtkPolyData() ids = vedo.Mesh(lpoly, c=c, alpha=alpha) ids.properties.LightingOff() ids.actor.PickableOff() ids.actor.SetUseBounds(False) ids.name = "Labels" return ids def labels2d( self, content="id", on="points", scale=1.0, precision=4, font="Calco", justify="bottom-left", angle=0.0, frame=False, c="black", bc=None, alpha=1.0, ) -> Union["Actor2D", None]: """ Generate value or ID bi-dimensional labels for mesh cells or points. See also: `labels()`, `flagpole()`, `caption()` and `legend()`. Arguments: content : (str) either 'id', 'cellid', or array name on : (str) generate labels for "cells" instead of "points" (the default) scale : (float) size scaling of labels precision : (int) precision of numeric labels angle : (float) local rotation angle of label in degrees frame : (bool) draw a frame around the label bc : (str) background color of the label ```python from vedo import Sphere, show sph = Sphere(quads=True, res=4).compute_normals().wireframe() sph.celldata["zvals"] = sph.cell_centers().coordinates[:,2] l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') show(sph, l2d, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/labels2d.png) """ cells = False if "cell" in on: cells = True if isinstance(content, str): if content in ("id", "pointid", "pointsid"): cells = False content = "id" if content in ("cellid", "cellsid"): cells = True content = "id" if cells: if content != "id" and content not in self.celldata.keys(): vedo.logger.error(f"In labels2d: cell array {content} does not exist.") return None arr = self.dataset.GetCellData().GetScalars() poly = self.cell_centers().dataset poly.GetPointData().SetScalars(arr) else: arr = self.dataset.GetPointData().GetScalars() poly = self.dataset if content != "id" and content not in self.pointdata.keys(): vedo.logger.error(f"In labels2d: point array {content} does not exist.") return None mp = vtki.new("LabeledDataMapper") if content == "id": mp.SetLabelModeToLabelIds() else: mp.SetLabelModeToLabelScalars() if precision is not None: dtype = arr.GetDataType() if dtype in (vtki.VTK_FLOAT, vtki.VTK_DOUBLE): mp.SetLabelFormat(f"%-#.{precision}g") pr = mp.GetLabelTextProperty() c = colors.get_color(c) pr.SetColor(c) pr.SetOpacity(alpha) pr.SetFrame(frame) pr.SetFrameColor(c) pr.SetItalic(False) pr.BoldOff() pr.ShadowOff() pr.UseTightBoundingBoxOn() pr.SetOrientation(angle) pr.SetFontFamily(vtki.VTK_FONT_FILE) fl = utils.get_font_path(font) pr.SetFontFile(fl) pr.SetFontSize(int(20 * scale)) if "cent" in justify or "mid" in justify: pr.SetJustificationToCentered() elif "rig" in justify: pr.SetJustificationToRight() elif "left" in justify: pr.SetJustificationToLeft() # ------ if "top" in justify: pr.SetVerticalJustificationToTop() else: pr.SetVerticalJustificationToBottom() if bc is not None: bc = colors.get_color(bc) pr.SetBackgroundColor(bc) pr.SetBackgroundOpacity(alpha) mp.SetInputData(poly) a2d = Actor2D() a2d.PickableOff() a2d.SetMapper(mp) return a2d def legend(self, txt) -> Self: """Book a legend text.""" self.info["legend"] = txt # self.metadata["legend"] = txt return self def flagpole( self, txt=None, point=None, offset=None, s=None, font="Calco", rounded=True, c=None, alpha=1.0, lw=2, italic=0.0, padding=0.1, ) -> Union["vedo.Mesh", None]: """ Generate a flag pole style element to describe an object. Returns a `Mesh` object. Use flagpole.follow_camera() to make it face the camera in the scene. Consider using `settings.use_parallel_projection = True` to avoid perspective distortions. See also `flagpost()`. Arguments: txt : (str) Text to display. The default is the filename or the object name. point : (list) position of the flagpole pointer. offset : (list) text offset wrt the application point. s : (float) size of the flagpole. font : (str) font face. Check [available fonts here](https://vedo.embl.es/fonts). rounded : (bool) draw a rounded or squared box around the text. c : (list) text and box color. alpha : (float) opacity of text and box. lw : (float) line with of box frame. italic : (float) italicness of text. Examples: - [intersect2d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/intersect2d.py) ![](https://vedo.embl.es/images/pyplot/intersect2d.png) - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) """ objs = [] if txt is None: if self.filename: txt = self.filename.split("/")[-1] elif self.name: txt = self.name else: return None x0, x1, y0, y1, z0, z1 = self.bounds() d = self.diagonal_size() if point is None: if d: point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) # point = self.closest_point([x1, y0, z1]) else: # it's a Point point = self.transform.position pt = utils.make3d(point) if offset is None: offset = [(x1 - x0) / 1.75, (y1 - y0) / 5, 0] offset = utils.make3d(offset) if s is None: s = d / 20 sph = None if d and (z1 - z0) / d > 0.1: sph = vedo.shapes.Sphere(pt, r=s * 0.4, res=6) if c is None: c = np.array(self.color()) / 1.4 lab = vedo.shapes.Text3D( txt, pos=pt + offset, s=s, font=font, italic=italic, justify="center" ) objs.append(lab) if d and not sph: sph = vedo.shapes.Circle(pt, r=s / 3, res=16) objs.append(sph) x0, x1, y0, y1, z0, z1 = lab.bounds() aline = [(x0,y0,z0), (x1,y0,z0), (x1,y1,z0), (x0,y1,z0)] if rounded: box = vedo.shapes.KSpline(aline, closed=True) else: box = vedo.shapes.Line(aline, closed=True) cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] # box.actor.SetOrigin(cnt) box.scale([1 + padding, 1 + 2 * padding, 1], origin=cnt) objs.append(box) x0, x1, y0, y1, z0, z1 = box.bounds() if x0 < pt[0] < x1: c0 = box.closest_point(pt) c1 = [c0[0], c0[1] + (pt[1] - y0) / 4, pt[2]] elif (pt[0] - x0) < (x1 - pt[0]): c0 = [x0, (y0 + y1) / 2, pt[2]] c1 = [x0 + (pt[0] - x0) / 4, (y0 + y1) / 2, pt[2]] else: c0 = [x1, (y0 + y1) / 2, pt[2]] c1 = [x1 + (pt[0] - x1) / 4, (y0 + y1) / 2, pt[2]] con = vedo.shapes.Line([c0, c1, pt]) objs.append(con) mobjs = vedo.merge(objs).c(c).alpha(alpha) mobjs.name = "FlagPole" mobjs.bc("tomato").pickable(False) mobjs.properties.LightingOff() mobjs.properties.SetLineWidth(lw) mobjs.actor.UseBoundsOff() mobjs.actor.SetPosition([0,0,0]) mobjs.actor.SetOrigin(pt) return mobjs # mobjs = vedo.Assembly(objs)#.c(c).alpha(alpha) # mobjs.name = "FlagPole" # # mobjs.bc("tomato").pickable(False) # # mobjs.properties.LightingOff() # # mobjs.properties.SetLineWidth(lw) # # mobjs.actor.UseBoundsOff() # # mobjs.actor.SetPosition([0,0,0]) # # mobjs.actor.SetOrigin(pt) # # print(pt) # return mobjs def flagpost( self, txt=None, point=None, offset=None, s=1.0, c="k9", bc="k1", alpha=1, lw=0, font="Calco", justify="center-left", vspacing=1.0, ) -> Union["vedo.addons.Flagpost", None]: """ Generate a flag post style element to describe an object. Arguments: txt : (str) Text to display. The default is the filename or the object name. point : (list) position of the flag anchor point. The default is None. offset : (list) a 3D displacement or offset. The default is None. s : (float) size of the text to be shown c : (list) color of text and line bc : (list) color of the flag background alpha : (float) opacity of text and box. lw : (int) line with of box frame. The default is 0. font : (str) font name. Use a monospace font for better rendering. The default is "Calco". Type `vedo -r fonts` for a font demo. Check [available fonts here](https://vedo.embl.es/fonts). justify : (str) internal text justification. The default is "center-left". vspacing : (float) vertical spacing between lines. Examples: - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/other/flag_labels2.py) ![](https://vedo.embl.es/images/other/flag_labels2.png) """ if txt is None: if self.filename: txt = self.filename.split("/")[-1] elif self.name: txt = self.name else: return None x0, x1, y0, y1, z0, z1 = self.bounds() d = self.diagonal_size() if point is None: if d: point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) else: # it's a Point point = self.transform.position point = utils.make3d(point) if offset is None: offset = [0, 0, (z1 - z0) / 2] offset = utils.make3d(offset) fpost = vedo.addons.Flagpost( txt, point, point + offset, s, c, bc, alpha, lw, font, justify, vspacing ) self._caption = fpost return fpost def caption( self, txt=None, point=None, size=(0.30, 0.15), padding=5, font="Calco", justify="center-right", vspacing=1.0, c=None, alpha=1.0, lw=1, ontop=True, ) -> Union["vtki.vtkCaptionActor2D", None]: """ Create a 2D caption to an object which follows the camera movements. Latex is not supported. Returns the same input object for concatenation. See also `flagpole()`, `flagpost()`, `labels()` and `legend()` with similar functionality. Arguments: txt : (str) text to be rendered. The default is the file name. point : (list) anchoring point. The default is None. size : (list) (width, height) of the caption box. The default is (0.30, 0.15). padding : (float) padding space of the caption box in pixels. The default is 5. font : (str) font name. Use a monospace font for better rendering. The default is "VictorMono". Type `vedo -r fonts` for a font demo. Check [available fonts here](https://vedo.embl.es/fonts). justify : (str) internal text justification. The default is "center-right". vspacing : (float) vertical spacing between lines. The default is 1. c : (str) text and box color. The default is 'lb'. alpha : (float) text and box transparency. The default is 1. lw : (int) line width in pixels. The default is 1. ontop : (bool) keep the 2d caption always on top. The default is True. Examples: - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) ![](https://vedo.embl.es/images/pyplot/caption.png) - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) """ if txt is None: if self.filename: txt = self.filename.split("/")[-1] elif self.name: txt = self.name if not txt: # disable it self._caption = None return None for r in vedo.shapes._reps: txt = txt.replace(r[0], r[1]) if c is None: c = np.array(self.properties.GetColor()) / 2 else: c = colors.get_color(c) if point is None: x0, x1, y0, y1, _, z1 = self.dataset.GetBounds() pt = [(x0 + x1) / 2, (y0 + y1) / 2, z1] point = self.closest_point(pt) capt = vtki.vtkCaptionActor2D() capt.SetAttachmentPoint(point) capt.SetBorder(True) capt.SetLeader(True) sph = vtki.new("SphereSource") sph.Update() capt.SetLeaderGlyphData(sph.GetOutput()) capt.SetMaximumLeaderGlyphSize(5) capt.SetPadding(int(padding)) capt.SetCaption(txt) capt.SetWidth(size[0]) capt.SetHeight(size[1]) capt.SetThreeDimensionalLeader(not ontop) pra = capt.GetProperty() pra.SetColor(c) pra.SetOpacity(alpha) pra.SetLineWidth(lw) pr = capt.GetCaptionTextProperty() pr.SetFontFamily(vtki.VTK_FONT_FILE) fl = utils.get_font_path(font) pr.SetFontFile(fl) pr.ShadowOff() pr.BoldOff() pr.FrameOff() pr.SetColor(c) pr.SetOpacity(alpha) pr.SetJustificationToLeft() if "top" in justify: pr.SetVerticalJustificationToTop() if "bottom" in justify: pr.SetVerticalJustificationToBottom() if "cent" in justify: pr.SetVerticalJustificationToCentered() pr.SetJustificationToCentered() if "left" in justify: pr.SetJustificationToLeft() if "right" in justify: pr.SetJustificationToRight() pr.SetLineSpacing(vspacing) return capt ##################################################################### class MeshVisual(PointsVisual): """Class to manage the visual aspects of a ``Maesh`` object.""" def __init__(self) -> None: # print("INIT MeshVisual", super()) super().__init__() def follow_camera(self, camera=None, origin=None) -> Self: """ Return an object that will follow camera movements and stay locked to it. Use `mesh.follow_camera(False)` to disable it. A `vtkCamera` object can also be passed. """ if camera is False: try: self.SetCamera(None) return self except AttributeError: return self factor = vtki.vtkFollower() factor.SetMapper(self.mapper) factor.SetProperty(self.properties) factor.SetBackfaceProperty(self.actor.GetBackfaceProperty()) factor.SetTexture(self.actor.GetTexture()) factor.SetScale(self.actor.GetScale()) # factor.SetOrientation(self.actor.GetOrientation()) factor.SetPosition(self.actor.GetPosition()) factor.SetUseBounds(self.actor.GetUseBounds()) if origin is None: factor.SetOrigin(self.actor.GetOrigin()) else: factor.SetOrigin(origin) factor.PickableOff() if isinstance(camera, vtki.vtkCamera): factor.SetCamera(camera) else: plt = vedo.plotter_instance if plt and plt.renderer and plt.renderer.GetActiveCamera(): factor.SetCamera(plt.renderer.GetActiveCamera()) self.actor = None factor.retrieve_object = weak_ref_to(self) self.actor = factor return self def wireframe(self, value=True) -> Self: """Set mesh's representation as wireframe or solid surface.""" if value: self.properties.SetRepresentationToWireframe() else: self.properties.SetRepresentationToSurface() return self def flat(self) -> Self: """Set surface interpolation to flat. """ self.properties.SetInterpolationToFlat() return self def phong(self) -> Self: """Set surface interpolation to "phong".""" self.properties.SetInterpolationToPhong() return self def backface_culling(self, value=True) -> Self: """Set culling of polygons based on orientation of normal with respect to camera.""" self.properties.SetBackfaceCulling(value) return self def render_lines_as_tubes(self, value=True) -> Self: """Wrap a fake tube around a simple line for visualization""" self.properties.SetRenderLinesAsTubes(value) return self def frontface_culling(self, value=True) -> Self: """Set culling of polygons based on orientation of normal with respect to camera.""" self.properties.SetFrontfaceCulling(value) return self def backcolor(self, bc=None) -> Union[Self, np.ndarray]: """ Set/get mesh's backface color. """ back_prop = self.actor.GetBackfaceProperty() if bc is None: if back_prop: return back_prop.GetDiffuseColor() return self if self.properties.GetOpacity() < 1: return self if not back_prop: back_prop = vtki.vtkProperty() back_prop.SetDiffuseColor(colors.get_color(bc)) back_prop.SetOpacity(self.properties.GetOpacity()) self.actor.SetBackfaceProperty(back_prop) self.mapper.ScalarVisibilityOff() return self def bc(self, backcolor=False) -> Union[Self, np.ndarray]: """Shortcut for `mesh.backcolor()`.""" return self.backcolor(backcolor) def linewidth(self, lw=None) -> Union[Self, int]: """Set/get width of mesh edges. Same as `lw()`.""" if lw is not None: if lw == 0: self.properties.EdgeVisibilityOff() self.properties.SetRepresentationToSurface() return self self.properties.EdgeVisibilityOn() self.properties.SetLineWidth(lw) else: return self.properties.GetLineWidth() return self def lw(self, linewidth=None) -> Union[Self, int]: """Set/get width of mesh edges. Same as `linewidth()`.""" return self.linewidth(linewidth) def linecolor(self, lc=None) -> Union[Self, np.ndarray]: """Set/get color of mesh edges. Same as `lc()`.""" if lc is None: return np.array(self.properties.GetEdgeColor()) self.properties.EdgeVisibilityOn() self.properties.SetEdgeColor(colors.get_color(lc)) return self def lc(self, linecolor=None) -> Union[Self, np.ndarray]: """Set/get color of mesh edges. Same as `linecolor()`.""" return self.linecolor(linecolor) def texture( self, tname, tcoords=None, interpolate=True, repeat=True, edge_clamp=False, scale=None, ushift=None, vshift=None, ) -> Self: """ Assign a texture to mesh from image file or predefined texture `tname`. If tname is set to `None` texture is disabled. Input tname can also be an array or a `vtkTexture`. Arguments: tname : (numpy.array, str, Image, vtkTexture, None) the input texture to be applied. Can be a numpy array, a path to an image file, a vedo Image. The None value disables texture. tcoords : (numpy.array, str) this is the (u,v) texture coordinate array. Can also be a string of an existing array in the mesh. interpolate : (bool) turn on/off linear interpolation of the texture map when rendering. repeat : (bool) repeat of the texture when tcoords extend beyond the [0,1] range. edge_clamp : (bool) turn on/off the clamping of the texture map when the texture coords extend beyond the [0,1] range. Only used when repeat is False, and edge clamping is supported by the graphics card. scale : (bool) scale the texture image by this factor ushift : (bool) shift u-coordinates of texture by this amount vshift : (bool) shift v-coordinates of texture by this amount Examples: - [texturecubes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/texturecubes.py) ![](https://vedo.embl.es/images/basic/texturecubes.png) """ pd = self.dataset out_img = None if tname is None: # disable texture pd.GetPointData().SetTCoords(None) pd.GetPointData().Modified() return self ###################################### if isinstance(tname, vtki.vtkTexture): tu = tname elif isinstance(tname, vedo.Image): tu = vtki.vtkTexture() out_img = tname.dataset elif utils.is_sequence(tname): tu = vtki.vtkTexture() out_img = vedo.image._get_img(tname) elif isinstance(tname, str): tu = vtki.vtkTexture() if "https://" in tname: try: tname = vedo.file_io.download(tname, verbose=False) except: vedo.logger.error(f"texture {tname} could not be downloaded") return self fn = tname + ".jpg" if os.path.exists(tname): fn = tname else: vedo.logger.error(f"texture file {tname} does not exist") return self fnl = fn.lower() if ".jpg" in fnl or ".jpeg" in fnl: reader = vtki.new("JPEGReader") elif ".png" in fnl: reader = vtki.new("PNGReader") elif ".bmp" in fnl: reader = vtki.new("BMPReader") else: vedo.logger.error("in texture() supported files are only PNG, BMP or JPG") return self reader.SetFileName(fn) reader.Update() out_img = reader.GetOutput() else: vedo.logger.error(f"in texture() cannot understand input {type(tname)}") return self if tcoords is not None: if isinstance(tcoords, str): vtarr = pd.GetPointData().GetArray(tcoords) else: tcoords = np.asarray(tcoords) if tcoords.ndim != 2: vedo.logger.error("tcoords must be a 2-dimensional array") return self if tcoords.shape[0] != pd.GetNumberOfPoints(): vedo.logger.error("nr of texture coords must match nr of points") return self if tcoords.shape[1] != 2: vedo.logger.error("tcoords texture vector must have 2 components") vtarr = utils.numpy2vtk(tcoords) vtarr.SetName("TCoordinates") pd.GetPointData().SetTCoords(vtarr) pd.GetPointData().Modified() elif not pd.GetPointData().GetTCoords(): # TCoords still void.. # check that there are no texture-like arrays: names = self.pointdata.keys() candidate_arr = "" for name in names: vtarr = pd.GetPointData().GetArray(name) if vtarr.GetNumberOfComponents() != 2: continue t0, t1 = vtarr.GetRange() if t0 >= 0 and t1 <= 1: candidate_arr = name if candidate_arr: vtarr = pd.GetPointData().GetArray(candidate_arr) pd.GetPointData().SetTCoords(vtarr) pd.GetPointData().Modified() else: # last resource is automatic mapping tmapper = vtki.new("TextureMapToPlane") tmapper.AutomaticPlaneGenerationOn() tmapper.SetInputData(pd) tmapper.Update() tc = tmapper.GetOutput().GetPointData().GetTCoords() if scale or ushift or vshift: ntc = utils.vtk2numpy(tc) if scale: ntc *= scale if ushift: ntc[:, 0] += ushift if vshift: ntc[:, 1] += vshift tc = utils.numpy2vtk(tc) pd.GetPointData().SetTCoords(tc) pd.GetPointData().Modified() if out_img: tu.SetInputData(out_img) tu.SetInterpolate(interpolate) tu.SetRepeat(repeat) tu.SetEdgeClamp(edge_clamp) self.properties.SetColor(1, 1, 1) self.mapper.ScalarVisibilityOff() self.actor.SetTexture(tu) # if seam_threshold is not None: # tname = self.dataset.GetPointData().GetTCoords().GetName() # grad = self.gradient(tname) # ugrad, vgrad = np.split(grad, 2, axis=1) # ugradm, vgradm = utils.mag2(ugrad), utils.mag2(vgrad) # gradm = np.log(ugradm + vgradm) # largegrad_ids = np.arange(len(grad))[gradm > seam_threshold * 4] # uvmap = self.pointdata[tname] # # collapse triangles that have large gradient # new_points = self.points.copy() # for f in self.cells: # if np.isin(f, largegrad_ids).all(): # id1, id2, id3 = f # uv1, uv2, uv3 = uvmap[f] # d12 = utils.mag2(uv1 - uv2) # d23 = utils.mag2(uv2 - uv3) # d31 = utils.mag2(uv3 - uv1) # idm = np.argmin([d12, d23, d31]) # if idm == 0: # new_points[id1] = new_points[id3] # new_points[id2] = new_points[id3] # elif idm == 1: # new_points[id2] = new_points[id1] # new_points[id3] = new_points[id1] # self.points = new_points self.dataset.Modified() return self ######################################################################################## class VolumeVisual(CommonVisual): """Class to manage the visual aspects of a ``Volume`` object.""" def __init__(self) -> None: # print("INIT VolumeVisual") super().__init__() def alpha_unit(self, u=None) -> Union[Self, float]: """ Defines light attenuation per unit length. Default is 1. The larger the unit length, the further light has to travel to attenuate the same amount. E.g., if you set the unit distance to 0, you will get full opacity. It means that when light travels 0 distance it's already attenuated a finite amount. Thus, any finite distance should attenuate all light. The larger you make the unit distance, the more transparent the rendering becomes. """ if u is None: return self.properties.GetScalarOpacityUnitDistance() self.properties.SetScalarOpacityUnitDistance(u) return self def alpha_gradient(self, alpha_grad, vmin=None, vmax=None) -> Self: """ Assign a set of tranparencies to a volume's gradient along the range of the scalar value. A single constant value can also be assigned. The gradient function is used to decrease the opacity in the "flat" regions of the volume while maintaining the opacity at the boundaries between material types. The gradient is measured as the amount by which the intensity changes over unit distance. The format for alpha_grad is the same as for method `volume.alpha()`. """ if vmin is None: vmin, _ = self.dataset.GetScalarRange() if vmax is None: _, vmax = self.dataset.GetScalarRange() if alpha_grad is None: self.properties.DisableGradientOpacityOn() return self self.properties.DisableGradientOpacityOff() gotf = self.properties.GetGradientOpacity() if utils.is_sequence(alpha_grad): alpha_grad = np.array(alpha_grad) if len(alpha_grad.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) for i, al in enumerate(alpha_grad): xalpha = vmin + (vmax - vmin) * i / (len(alpha_grad) - 1) # Create transfer mapping scalar value to gradient opacity gotf.AddPoint(xalpha, al) elif len(alpha_grad.shape) == 2: # user passing [(x0,alpha0), ...] gotf.AddPoint(vmin, alpha_grad[0][1]) for xalpha, al in alpha_grad: # Create transfer mapping scalar value to opacity gotf.AddPoint(xalpha, al) gotf.AddPoint(vmax, alpha_grad[-1][1]) # print("alpha_grad at", round(xalpha, 1), "\tset to", al) else: gotf.AddPoint(vmin, alpha_grad) # constant alpha_grad gotf.AddPoint(vmax, alpha_grad) return self def cmap(self, c, alpha=None, vmin=None, vmax=None) -> Self: """Same as `color()`. Arguments: alpha : (list) use a list to specify transparencies along the scalar range vmin : (float) force the min of the scalar range to be this value vmax : (float) force the max of the scalar range to be this value """ return self.color(c, alpha, vmin, vmax) def jittering(self, status=None) -> Union[Self, bool]: """ If `True`, each ray traversal direction will be perturbed slightly using a noise-texture to get rid of wood-grain effects. """ if hasattr(self.mapper, "SetUseJittering"): # tetmesh doesnt have it if status is None: return self.mapper.GetUseJittering() self.mapper.SetUseJittering(status) return self def hide_voxels(self, ids) -> Self: """ Hide voxels (cells) from visualization. Example: ```python from vedo import * embryo = Volume(dataurl+'embryo.tif') embryo.hide_voxels(list(range(400000))) show(embryo, axes=1).close() ``` See also: `volume.mask()` """ ghost_mask = np.zeros(self.ncells, dtype=np.uint8) ghost_mask[ids] = vtki.vtkDataSetAttributes.HIDDENCELL name = vtki.vtkDataSetAttributes.GhostArrayName() garr = utils.numpy2vtk(ghost_mask, name=name, dtype=np.uint8) self.dataset.GetCellData().AddArray(garr) self.dataset.GetCellData().Modified() return self def mask(self, data) -> Self: """ Mask a volume visualization with a binary value. Needs to specify `volume.mapper = "gpu"`. Example: ```python from vedo import np, Volume, show data_matrix = np.zeros([75, 75, 75], dtype=np.uint8) # all voxels have value zero except: data_matrix[ 0:35, 0:35, 0:35] = 1 data_matrix[35:55, 35:55, 35:55] = 2 data_matrix[55:74, 55:74, 55:74] = 3 vol = Volume(data_matrix).cmap('Blues') vol.mapper = "gpu" data_mask = np.zeros_like(data_matrix) data_mask[10:65, 10:60, 20:70] = 1 vol.mask(data_mask) show(vol, axes=1).close() ``` See also: `volume.hide_voxels()` """ rdata = data.astype(np.uint8).ravel(order="F") varr = utils.numpy2vtk(rdata, name="input_mask") img = vtki.vtkImageData() img.SetDimensions(self.dimensions()) img.GetPointData().AddArray(varr) img.GetPointData().SetActiveScalars(varr.GetName()) try: self.mapper.SetMaskTypeToBinary() self.mapper.SetMaskInput(img) except AttributeError: vedo.logger.error("volume.mask() must specify volume.mapper = 'gpu'") return self def mode(self, mode=None) -> Union[Self, int]: """ Define the volumetric rendering mode following this: - 0, composite rendering - 1, maximum projection rendering - 2, minimum projection rendering - 3, average projection rendering - 4, additive mode The default mode is "composite" where the scalar values are sampled through the volume and composited in a front-to-back scheme through alpha blending. The final color and opacity is determined using the color and opacity transfer functions specified in alpha keyword. Maximum and minimum intensity blend modes use the maximum and minimum scalar values, respectively, along the sampling ray. The final color and opacity is determined by passing the resultant value through the color and opacity transfer functions. Additive blend mode accumulates scalar values by passing each value through the opacity transfer function and then adding up the product of the value and its opacity. In other words, the scalar values are scaled using the opacity transfer function and summed to derive the final color. Note that the resulting image is always grayscale i.e. aggregated values are not passed through the color transfer function. This is because the final value is a derived value and not a real data value along the sampling ray. Average intensity blend mode works similar to the additive blend mode where the scalar values are multiplied by opacity calculated from the opacity transfer function and then added. The additional step here is to divide the sum by the number of samples taken through the volume. As is the case with the additive intensity projection, the final image will always be grayscale i.e. the aggregated values are not passed through the color transfer function. """ if mode is None: return self.mapper.GetBlendMode() if isinstance(mode, str): if "comp" in mode: mode = 0 elif "proj" in mode: if "max" in mode: mode = 1 elif "min" in mode: mode = 2 elif "ave" in mode: mode = 3 else: vedo.logger.warning(f"unknown mode {mode}") mode = 0 elif "add" in mode: mode = 4 else: vedo.logger.warning(f"unknown mode {mode}") mode = 0 self.mapper.SetBlendMode(mode) return self def shade(self, status=None) -> Union[Self, bool]: """ Set/Get the shading of a Volume. Shading can be further controlled with `volume.lighting()` method. If shading is turned on, the mapper may perform shading calculations. In some cases shading does not apply (for example, in maximum intensity projection mode). """ if status is None: return self.properties.GetShade() self.properties.SetShade(status) return self def interpolation(self, itype) -> Self: """ Set interpolation type. 0=nearest neighbour, 1=linear """ self.properties.SetInterpolationType(itype) return self ######################################################################################## class ImageVisual(CommonVisual, Actor3DHelper): def __init__(self) -> None: # print("init ImageVisual") super().__init__() def memory_size(self) -> int: """ Return the size in bytes of the object in memory. """ return self.dataset.GetActualMemorySize() def scalar_range(self) -> np.ndarray: """ Return the scalar range of the image. """ return np.array(self.dataset.GetScalarRange()) def alpha(self, a=None) -> Union[Self, float]: """Set/get image's transparency in the rendering scene.""" if a is not None: self.properties.SetOpacity(a) return self return self.properties.GetOpacity() def level(self, value=None) -> Union[Self, float]: """Get/Set the image color level (brightness) in the rendering scene.""" if value is None: return self.properties.GetColorLevel() self.properties.SetColorLevel(value) return self def window(self, value=None) -> Union[Self, float]: """Get/Set the image color window (contrast) in the rendering scene.""" if value is None: return self.properties.GetColorWindow() self.properties.SetColorWindow(value) return self class LightKit: """ A LightKit consists of three lights, a 'key light', a 'fill light', and a 'head light'. The main light is the key light. It is usually positioned so that it appears like an overhead light (like the sun, or a ceiling light). It is generally positioned to shine down on the scene from about a 45 degree angle vertically and at least a little offset side to side. The key light usually at least about twice as bright as the total of all other lights in the scene to provide good modeling of object features. The other lights in the kit (the fill light, headlight, and a pair of back lights) are weaker sources that provide extra illumination to fill in the spots that the key light misses. The fill light is usually positioned across from or opposite from the key light (though still on the same side of the object as the camera) in order to simulate diffuse reflections from other objects in the scene. The headlight, always located at the position of the camera, reduces the contrast between areas lit by the key and fill light. The two back lights, one on the left of the object as seen from the observer and one on the right, fill on the high-contrast areas behind the object. To enforce the relationship between the different lights, the intensity of the fill, back and headlights are set as a ratio to the key light brightness. Thus, the brightness of all the lights in the scene can be changed by changing the key light intensity. All lights are directional lights, infinitely far away with no falloff. Lights move with the camera. For simplicity, the position of lights in the LightKit can only be specified using angles: the elevation (latitude) and azimuth (longitude) of each light with respect to the camera, in degrees. For example, a light at (elevation=0, azimuth=0) is located at the camera (a headlight). A light at (elevation=90, azimuth=0) is above the lookat point, shining down. Negative azimuth values move the lights clockwise as seen above, positive values counter-clockwise. So, a light at (elevation=45, azimuth=-20) is above and in front of the object and shining slightly from the left side. LightKit limits the colors that can be assigned to any light to those of incandescent sources such as light bulbs and sunlight. It defines a special color spectrum called "warmth" from which light colors can be chosen, where 0 is cold blue, 0.5 is neutral white, and 1 is deep sunset red. Colors close to 0.5 are "cool whites" and "warm whites," respectively. Since colors far from white on the warmth scale appear less bright, key-to-fill and key-to-headlight ratios are skewed by key, fill, and headlight colors. If `maintain_luminance` is set, LightKit will attempt to compensate for these perceptual differences by increasing the brightness of more saturated colors. To specify the color of a light, positioning etc you can pass a dictionary with the following keys: - `intensity` : (float) The intensity of the key light. Default is 1. - `ratio` : (float) The ratio of the light intensity wrt key light. - `warmth` : (float) The warmth of the light. Default is 0.5. - `elevation` : (float) The elevation of the light in degrees. - `azimuth` : (float) The azimuth of the light in degrees. Example: ```python from vedo import * lightkit = LightKit(head={"warmth":0.6}) mesh = Mesh(dataurl+"bunny.obj") plt = Plotter() plt.remove_lights().add(mesh, lightkit) plt.show().close() ``` """ def __init__(self, key=(), fill=(), back=(), head=(), maintain_luminance=False) -> None: self.lightkit = vtki.new("LightKit") self.lightkit.SetMaintainLuminance(maintain_luminance) self.key = dict(key) self.head = dict(head) self.fill = dict(fill) self.back = dict(back) self.update() def update(self) -> None: """Update the LightKit properties.""" if "warmth" in self.key: self.lightkit.SetKeyLightWarmth(self.key["warmth"]) if "warmth" in self.fill: self.lightkit.SetFillLightWarmth(self.fill["warmth"]) if "warmth" in self.head: self.lightkit.SetHeadLightWarmth(self.head["warmth"]) if "warmth" in self.back: self.lightkit.SetBackLightWarmth(self.back["warmth"]) if "intensity" in self.key: self.lightkit.SetKeyLightIntensity(self.key["intensity"]) if "ratio" in self.fill: self.lightkit.SetKeyToFillRatio(self.key["ratio"]) if "ratio" in self.head: self.lightkit.SetKeyToHeadRatio(self.key["ratio"]) if "ratio" in self.back: self.lightkit.SetKeyToBackRatio(self.key["ratio"]) if "elevation" in self.key: self.lightkit.SetKeyLightElevation(self.key["elevation"]) if "elevation" in self.fill: self.lightkit.SetFillLightElevation(self.fill["elevation"]) if "elevation" in self.head: self.lightkit.SetHeadLightElevation(self.head["elevation"]) if "elevation" in self.back: self.lightkit.SetBackLightElevation(self.back["elevation"]) if "azimuth" in self.key: self.lightkit.SetKeyLightAzimuth(self.key["azimuth"]) if "azimuth" in self.fill: self.lightkit.SetFillLightAzimuth(self.fill["azimuth"]) if "azimuth" in self.head: self.lightkit.SetHeadLightAzimuth(self.head["azimuth"]) if "azimuth" in self.back: self.lightkit.SetBackLightAzimuth(self.back["azimuth"]) vedo-2025.5.3/vedo/volume.py000066400000000000000000001657611474667405700155670ustar00rootroot00000000000000import glob import os import time from weakref import ref as weak_ref_to from typing import Union, List, Iterable from typing_extensions import Self import numpy as np import vedo.vtkclasses as vtki import vedo from vedo import transformations from vedo import utils from vedo.mesh import Mesh from vedo.core import VolumeAlgorithms from vedo.visual import VolumeVisual __docformat__ = "google" __doc__ = """ Work with volumetric datasets (voxel data). ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) """ __all__ = ["Volume"] ########################################################################## class Volume(VolumeAlgorithms, VolumeVisual): """ Class to describe dataset that are defined on "voxels", the 3D equivalent of 2D pixels. """ def __init__( self, input_obj=None, dims=None, origin=None, spacing=None, ) -> None: """ This class can be initialized with a numpy object, a `vtkImageData` or a list of 2D bmp files. Arguments: input_obj : (str, vtkImageData, np.ndarray) input data can be a file name, a vtkImageData or a numpy object. origin : (list) set volume origin coordinates spacing : (list) voxel dimensions in x, y and z. dims : (list) specify the dimensions of the volume. Note: If your input is an array ordered as ZYX you can permute it to XYZ with: `array = np.transpose(array, axes=[2, 1, 0])`. Alternatively you can also use the `Volume(zyx_array).permute_axes(2,1,0)` method. Example: ```python from vedo import Volume vol = Volume("path/to/mydata/rec*.bmp") vol.show() ``` Examples: - [numpy2volume1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/numpy2volume1.py) ![](https://vedo.embl.es/images/volumetric/numpy2volume1.png) - [read_volume2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/read_volume2.py) ![](https://vedo.embl.es/images/volumetric/read_volume2.png) .. note:: if a `list` of values is used for `alphas` this is interpreted as a transfer function along the range of the scalar. """ super().__init__() self.name = "Volume" self.filename = "" self.file_size = "" self.info = {} self.time = time.time() self.actor = vtki.vtkVolume() self.actor.retrieve_object = weak_ref_to(self) self.properties = self.actor.GetProperty() self.transform = None self.point_locator = None self.cell_locator = None self.line_locator = None ################### if isinstance(input_obj, str): if "https://" in input_obj: input_obj = vedo.file_io.download(input_obj, verbose=False) # fpath elif os.path.isfile(input_obj): self.filename = input_obj else: input_obj = sorted(glob.glob(input_obj)) ################### inputtype = str(type(input_obj)) # print('Volume inputtype', inputtype, c='b') if input_obj is None: img = vtki.vtkImageData() elif utils.is_sequence(input_obj): if isinstance(input_obj[0], str) and ".bmp" in input_obj[0].lower(): # scan sequence of BMP files ima = vtki.new("ImageAppend") ima.SetAppendAxis(2) pb = utils.ProgressBar(0, len(input_obj)) for i in pb.range(): f = input_obj[i] if "_rec_spr" in f: # OPT specific continue picr = vtki.new("BMPReader") picr.SetFileName(f) picr.Update() mgf = vtki.new("ImageMagnitude") mgf.SetInputData(picr.GetOutput()) mgf.Update() ima.AddInputData(mgf.GetOutput()) pb.print("loading...") ima.Update() img = ima.GetOutput() else: if len(input_obj.shape) == 1: varr = utils.numpy2vtk(input_obj) else: varr = utils.numpy2vtk(input_obj.ravel(order="F")) varr.SetName("input_scalars") img = vtki.vtkImageData() if dims is not None: img.SetDimensions(dims[2], dims[1], dims[0]) else: if len(input_obj.shape) == 1: vedo.logger.error("must set dimensions (dims keyword) in Volume") raise RuntimeError() img.SetDimensions(input_obj.shape) img.GetPointData().AddArray(varr) img.GetPointData().SetActiveScalars(varr.GetName()) elif isinstance(input_obj, vtki.vtkImageData): img = input_obj elif isinstance(input_obj, str): if "https://" in input_obj: input_obj = vedo.file_io.download(input_obj, verbose=False) img = vedo.file_io.loadImageData(input_obj) self.filename = input_obj else: vedo.logger.error(f"cannot understand input type {inputtype}") return if dims is not None: img.SetDimensions(dims) if origin is not None: img.SetOrigin(origin) if spacing is not None: img.SetSpacing(spacing) self.dataset = img self.transform = None ##################################### mapper = vtki.new("SmartVolumeMapper") mapper.SetInputData(img) self.actor.SetMapper(mapper) if img.GetPointData().GetScalars(): if img.GetPointData().GetScalars().GetNumberOfComponents() == 1: self.properties.SetShade(True) self.properties.SetInterpolationType(1) self.cmap("RdBu_r") # make asigmoidal transfer function by default # xvalues = np.linspace(0, 1, 11) # sigmoid = np.clip(1/(1+np.exp(-20*(xvalues-0.5))), 0, 1) # print("Volume: setting sigmoidal transfer function", xvalues, sigmoid) # self.alpha(sigmoid) self.alpha([0.0, 0.001, 0.3, 0.5, 0.7, 0.8, 1.0]) # we need to revert this.. self.alpha_gradient(None) self.properties.SetScalarOpacityUnitDistance(1.0) self.pipeline = utils.OperationNode( "Volume", comment=f"dims={tuple(self.dimensions())}", c="#4cc9f0" ) ####################################################################### @property def mapper(self): """Return the underlying `vtkMapper` object.""" return self.actor.GetMapper() @mapper.setter def mapper(self, mapper): """ Set the underlying `vtkMapper` object. Arguments: mapper : (str, vtkMapper) either 'gpu', 'opengl_gpu', 'fixed' or 'smart' """ if isinstance(mapper, (vtki.get_class("Mapper"), vtki.get_class("ImageResliceMapper")) ): pass elif mapper is None: mapper = vtki.new("SmartVolumeMapper") elif "gpu" in mapper: mapper = vtki.new("GPUVolumeRayCastMapper") elif "opengl_gpu" in mapper: mapper = vtki.new("OpenGLGPUVolumeRayCastMapper") elif "smart" in mapper: mapper = vtki.new("SmartVolumeMapper") elif "fixed" in mapper: mapper = vtki.new("FixedPointVolumeRayCastMapper") else: print("Error unknown mapper type", [mapper]) raise RuntimeError() mapper.SetInputData(self.dataset) self.actor.SetMapper(mapper) def c(self, *args, **kwargs) -> Self: """Deprecated. Use `Volume.cmap()` instead.""" vedo.logger.warning("Volume.c() is deprecated, use Volume.cmap() instead") return self.cmap(*args, **kwargs) def _update(self, data, reset_locators=False): # reset_locators here is dummy self.dataset = data self.mapper.SetInputData(data) self.dataset.GetPointData().Modified() self.mapper.Modified() self.mapper.Update() return self def __str__(self): """Print a summary for the `Volume` object.""" module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), c="c", bold=True, invert=True, return_string=True, ) out += "\x1b[0m\x1b[36;1m" out+= "name".ljust(14) + ": " + str(self.name) + "\n" if self.filename: out+= "filename".ljust(14) + ": " + str(self.filename) + "\n" out+= "dimensions".ljust(14) + ": " + str(self.shape) + "\n" out+= "origin".ljust(14) + ": " out+= utils.precision(self.origin(), 6) + "\n" out+= "center".ljust(14) + ": " out+= utils.precision(self.center(), 6) + "\n" out+= "spacing".ljust(14) + ": " out+= utils.precision(self.spacing(), 6) + "\n" bnds = self.bounds() bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) out+= "bounds".ljust(14) + ":" out+= " x=(" + bx1 + ", " + bx2 + ")," out+= " y=(" + by1 + ", " + by2 + ")," out+= " z=(" + bz1 + ", " + bz2 + ")\n" out+= "memory size".ljust(14) + ": " out+= str(int(self.dataset.GetActualMemorySize()/1024+0.5))+" MB\n" st = self.dataset.GetScalarTypeAsString() out+= "scalar size".ljust(14) + ": " out+= str(self.dataset.GetScalarSize()) + f" bytes ({st})\n" out+= "scalar range".ljust(14) + ": " out+= str(self.dataset.GetScalarRange()) + "\n" #utils.print_histogram(self, logscale=True, bins=8, height=15, c="b", bold=True) return out.rstrip() + "\x1b[0m" def _repr_html_(self): """ HTML representation of the Volume object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.volume.Volume" help_url = "https://vedo.embl.es/docs/vedo/volume.html" arr = self.thumbnail(azimuth=0, elevation=-60, zoom=1.4, axes=True) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" # statisitics bounds = "
".join( [ utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self.dataset.GetPointData().GetScalars(): if self.dataset.GetPointData().GetScalars().GetName(): name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self.dataset.GetCellData().GetScalars(): if self.dataset.GetCellData().GetScalars().GetName(): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " voxel data array " + name + "" img = self.dataset allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", pdata, cdata, "", "
bounds
(x/y/z)
" + str(bounds) + "
dimensions " + str(img.GetDimensions()) + "
voxel spacing " + utils.precision(img.GetSpacing(), 3) + "
in memory size " + str(int(img.GetActualMemorySize() / 1024)) + "MB
scalar range " + utils.precision(img.GetScalarRange(), 4) + "
", "
", ] return "\n".join(allt) def copy(self, deep=True) -> "Volume": """Return a copy of the Volume. Alias of `clone()`.""" return self.clone(deep=deep) def clone(self, deep=True) -> "Volume": """Return a clone copy of the Volume. Alias of `copy()`.""" if deep: newimg = vtki.vtkImageData() newimg.CopyStructure(self.dataset) newimg.CopyAttributes(self.dataset) newvol = Volume(newimg) else: newvol = Volume(self.dataset) prop = vtki.vtkVolumeProperty() prop.DeepCopy(self.properties) newvol.actor.SetProperty(prop) newvol.properties = prop newvol.pipeline = utils.OperationNode("clone", parents=[self], c="#bbd0ff", shape="diamond") return newvol def astype(self, dtype: Union[str, int]) -> Self: """ Reset the type of the scalars array. Arguments: dtype : (str) the type of the scalars array in ["int8", "uint8", "int16", "uint16", "int32", "uint32", "float32", "float64"] """ if dtype in ["int8", "uint8", "int16", "uint16", "int32", "uint32", "float32", "float64"]: caster = vtki.new("ImageCast") caster.SetInputData(self.dataset) caster.SetOutputScalarType(int(vtki.array_types[dtype])) caster.ClampOverflowOn() caster.Update() self._update(caster.GetOutput()) self.pipeline = utils.OperationNode(f"astype({dtype})", parents=[self], c="#4cc9f0") else: vedo.logger.error(f"astype(): unknown type {dtype}") raise ValueError() return self def component_weight(self, i: int, weight: float) -> Self: """Set the scalar component weight in range [0,1].""" self.properties.SetComponentWeight(i, weight) return self def xslice(self, i: int) -> Mesh: """Extract the slice at index `i` of volume along x-axis.""" vslice = vtki.new("ImageDataGeometryFilter") vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if i > nx - 1: i = nx - 1 vslice.SetExtent(i, i, 0, ny, 0, nz) vslice.Update() m = Mesh(vslice.GetOutput()) m.pipeline = utils.OperationNode(f"xslice {i}", parents=[self], c="#4cc9f0:#e9c46a") return m def yslice(self, j: int) -> Mesh: """Extract the slice at index `j` of volume along y-axis.""" vslice = vtki.new("ImageDataGeometryFilter") vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if j > ny - 1: j = ny - 1 vslice.SetExtent(0, nx, j, j, 0, nz) vslice.Update() m = Mesh(vslice.GetOutput()) m.pipeline = utils.OperationNode(f"yslice {j}", parents=[self], c="#4cc9f0:#e9c46a") return m def zslice(self, k: int) -> Mesh: """Extract the slice at index `i` of volume along z-axis.""" vslice = vtki.new("ImageDataGeometryFilter") vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if k > nz - 1: k = nz - 1 vslice.SetExtent(0, nx, 0, ny, k, k) vslice.Update() m = Mesh(vslice.GetOutput()) m.pipeline = utils.OperationNode(f"zslice {k}", parents=[self], c="#4cc9f0:#e9c46a") return m def slice_plane(self, origin: List[float], normal: List[float], autocrop=False, border=0.5, mode="linear") -> Mesh: """ Extract the slice along a given plane position and normal. Two metadata arrays are added to the output Mesh: - "shape" : contains the shape of the slice - "original_bounds" : contains the original bounds of the slice One can access them with e.g. `myslice.metadata["shape"]`. Arguments: origin : (list) position of the plane normal : (list) normal to the plane autocrop : (bool) crop the output to the minimal possible size border : (float) add a border to the output slice mode : (str) interpolation mode, one of the following: "linear", "nearest", "cubic" Example: - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) ![](https://vedo.embl.es/images/volumetric/slicePlane1.gif) - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) - [slice_plane3.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane3.py) ![](https://vedo.embl.es/images/volumetric/slicePlane3.jpg) """ newaxis = utils.versor(normal) pos = np.array(origin) initaxis = (0, 0, 1) crossvec = np.cross(initaxis, newaxis) angle = np.arccos(np.dot(initaxis, newaxis)) T = vtki.vtkTransform() T.PostMultiply() T.RotateWXYZ(np.rad2deg(angle), crossvec.tolist()) T.Translate(pos.tolist()) reslice = vtki.new("ImageReslice") reslice.SetResliceAxes(T.GetMatrix()) reslice.SetInputData(self.dataset) reslice.SetOutputDimensionality(2) reslice.SetTransformInputSampling(True) reslice.SetGenerateStencilOutput(False) if border: reslice.SetBorder(True) reslice.SetBorderThickness(border) else: reslice.SetBorder(False) if mode == "linear": reslice.SetInterpolationModeToLinear() elif mode == "nearest": reslice.SetInterpolationModeToNearestNeighbor() elif mode == "cubic": reslice.SetInterpolationModeToCubic() else: vedo.logger.error(f"in slice_plane(): unknown interpolation mode {mode}") raise ValueError() reslice.SetAutoCropOutput(not autocrop) reslice.Update() img = reslice.GetOutput() vslice = vtki.new("ImageDataGeometryFilter") vslice.SetInputData(img) vslice.Update() msh = Mesh(vslice.GetOutput()).apply_transform(T) msh.properties.LightingOff() d0, d1, _ = img.GetDimensions() varr1 = utils.numpy2vtk([d1, d0], name="shape") varr2 = utils.numpy2vtk(img.GetBounds(), name="original_bounds") msh.dataset.GetFieldData().AddArray(varr1) msh.dataset.GetFieldData().AddArray(varr2) msh.pipeline = utils.OperationNode("slice_plane", parents=[self], c="#4cc9f0:#e9c46a") return msh def slab(self, slice_range=(), axis='z', operation="mean") -> Mesh: """ Extract a slab from a `Volume` by combining all of the slices of an image to create a single slice. Returns a `Mesh` containing metadata which can be accessed with e.g. `mesh.metadata["slab_range"]`. Metadata: slab_range : (list) contains the range of slices extracted slab_axis : (str) contains the axis along which the slab was extracted slab_operation : (str) contains the operation performed on the slab slab_bounding_box : (list) contains the bounding box of the slab Arguments: slice_range : (list) range of slices to extract axis : (str) axis along which to extract the slab operation : (str) operation to perform on the slab, allowed values are: "sum", "min", "max", "mean". Example: - [slab.py](https://github.com/marcomusy/vedo/blob/master/examples/volumetric/slab_vol.py) ![](https://vedo.embl.es/images/volumetric/slab_vol.jpg) """ if len(slice_range) != 2: vedo.logger.error("in slab(): slice_range is empty or invalid") raise ValueError() islab = vtki.new("ImageSlab") islab.SetInputData(self.dataset) if operation in ["+", "add", "sum"]: islab.SetOperationToSum() elif "min" in operation: islab.SetOperationToMin() elif "max" in operation: islab.SetOperationToMax() elif "mean" in operation: islab.SetOperationToMean() else: vedo.logger.error(f"in slab(): unknown operation {operation}") raise ValueError() dims = self.dimensions() if axis == 'x': islab.SetOrientationToX() if slice_range[0] > dims[0]-1: slice_range[0] = dims[0]-1 if slice_range[1] > dims[0]-1: slice_range[1] = dims[0]-1 elif axis == 'y': islab.SetOrientationToY() if slice_range[0] > dims[1]-1: slice_range[0] = dims[1]-1 if slice_range[1] > dims[1]-1: slice_range[1] = dims[1]-1 elif axis == 'z': islab.SetOrientationToZ() if slice_range[0] > dims[2]-1: slice_range[0] = dims[2]-1 if slice_range[1] > dims[2]-1: slice_range[1] = dims[2]-1 else: vedo.logger.error(f"Error in slab(): unknown axis {axis}") raise RuntimeError() islab.SetSliceRange(slice_range) islab.Update() msh = Mesh(islab.GetOutput()).lighting('off') msh.mapper.SetLookupTable(utils.ctf2lut(self, msh)) msh.mapper.SetScalarRange(self.scalar_range()) msh.metadata["slab_range"] = slice_range msh.metadata["slab_axis"] = axis msh.metadata["slab_operation"] = operation # compute bounds of slab origin = list(self.origin()) spacing = list(self.spacing()) if axis == 'x': msh.metadata["slab_bounding_box"] = [ origin[0] + slice_range[0]*spacing[0], origin[0] + slice_range[1]*spacing[0], origin[1], origin[1] + dims[1]*spacing[1], origin[2], origin[2] + dims[2]*spacing[2], ] elif axis == 'y': msh.metadata["slab_bounding_box"] = [ origin[0], origin[0] + dims[0]*spacing[0], origin[1] + slice_range[0]*spacing[1], origin[1] + slice_range[1]*spacing[1], origin[2], origin[2] + dims[2]*spacing[2], ] elif axis == 'z': msh.metadata["slab_bounding_box"] = [ origin[0], origin[0] + dims[0]*spacing[0], origin[1], origin[1] + dims[1]*spacing[1], origin[2] + slice_range[0]*spacing[2], origin[2] + slice_range[1]*spacing[2], ] msh.pipeline = utils.OperationNode( f"slab{slice_range}", comment=f"axis={axis}, operation={operation}", parents=[self], c="#4cc9f0:#e9c46a", ) msh.name = "SlabMesh" return msh def warp( self, source: Union["vedo.Points", List], target: Union["vedo.Points", List], sigma=1, mode="3d", fit=True, ) -> Self: """ Warp volume scalars within a Volume by specifying source and target sets of points. Arguments: source : (Points, list) the list of source points target : (Points, list) the list of target points fit : (bool) fit/adapt the old bounding box to the warped geometry """ if isinstance(source, vedo.Points): source = source.coordinates if isinstance(target, vedo.Points): target = target.coordinates NLT = transformations.NonLinearTransform() NLT.source_points = source NLT.target_points = target NLT.sigma = sigma NLT.mode = mode self.apply_transform(NLT, fit=fit) self.pipeline = utils.OperationNode("warp", parents=[self], c="#4cc9f0") return self def apply_transform( self, T: Union[transformations.LinearTransform, transformations.NonLinearTransform], fit=True, interpolation="cubic", ) -> Self: """ Apply a transform to the scalars in the volume. Arguments: T : (LinearTransform, NonLinearTransform) The transformation to be applied fit : (bool) fit/adapt the old bounding box to the modified geometry interpolation : (str) one of the following: "nearest", "linear", "cubic" """ if utils.is_sequence(T): T = transformations.LinearTransform(T) TI = T.compute_inverse() reslice = vtki.new("ImageReslice") reslice.SetInputData(self.dataset) reslice.SetResliceTransform(TI.T) reslice.SetOutputDimensionality(3) if "lin" in interpolation.lower(): reslice.SetInterpolationModeToLinear() elif "near" in interpolation.lower(): reslice.SetInterpolationModeToNearestNeighbor() elif "cubic" in interpolation.lower(): reslice.SetInterpolationModeToCubic() else: vedo.logger.error( f"in apply_transform: unknown interpolation mode {interpolation}") raise ValueError() reslice.SetAutoCropOutput(fit) reslice.Update() self._update(reslice.GetOutput()) self.transform = T self.pipeline = utils.OperationNode( "apply_transform", parents=[self], c="#4cc9f0") return self def imagedata(self) -> vtki.vtkImageData: """ DEPRECATED: Use `Volume.dataset` instead. Return the underlying `vtkImagaData` object. """ print("Volume.imagedata() is deprecated, use Volume.dataset instead") return self.dataset def modified(self) -> Self: """ Mark the object as modified. Example: - [numpy2volume0.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/numpy2volume0.py) """ scals = self.dataset.GetPointData().GetScalars() if scals: scals.Modified() return self def tonumpy(self) -> np.ndarray: """ Get read-write access to voxels of a Volume object as a numpy array. When you set values in the output image, you don't want numpy to reallocate the array but instead set values in the existing array, so use the [:] operator. Example: `arr[:] = arr*2 + 15` If the array is modified add a call to: `volume.modified()` when all your modifications are completed. """ narray_shape = tuple(reversed(self.dataset.GetDimensions())) scals = self.dataset.GetPointData().GetScalars() comps = scals.GetNumberOfComponents() if comps == 1: narray = utils.vtk2numpy(scals).reshape(narray_shape) narray = np.transpose(narray, axes=[2, 1, 0]) else: narray = utils.vtk2numpy(scals).reshape(*narray_shape, comps) narray = np.transpose(narray, axes=[2, 1, 0, 3]) # narray = utils.vtk2numpy(self.dataset.GetPointData().GetScalars()).reshape(narray_shape) # narray = np.transpose(narray, axes=[2, 1, 0]) return narray @property def shape(self) -> np.ndarray: """Return the nr. of voxels in the 3 dimensions.""" return np.array(self.dataset.GetDimensions()) def dimensions(self) -> np.ndarray: """Return the nr. of voxels in the 3 dimensions.""" return np.array(self.dataset.GetDimensions()) def scalar_range(self) -> np.ndarray: """Return the range of the scalar values.""" return np.array(self.dataset.GetScalarRange()) def spacing(self, s=None) -> Union[Self, Iterable[float]]: """Set/get the voxels size in the 3 dimensions.""" if s is not None: self.dataset.SetSpacing(s) return self return np.array(self.dataset.GetSpacing()) def origin(self, s=None) -> Union[Self, Iterable[float]]: """ Set/get the origin of the volumetric dataset. The origin is the position in world coordinates of the point index (0,0,0). This point does not have to be part of the dataset, in other words, the dataset extent does not have to start at (0,0,0) and the origin can be outside of the dataset bounding box. The origin plus spacing determine the position in space of the points. """ if s is not None: self.dataset.SetOrigin(s) return self return np.array(self.dataset.GetOrigin()) def pos(self, p=None) -> Union[Self, Iterable[float]]: """Set/get the position of the volumetric dataset.""" if p is not None: self.origin(p) return self return self.origin() def center(self) -> np.ndarray: """Get the center of the volumetric dataset.""" # note that this does not have the set method like origin and spacing return np.array(self.dataset.GetCenter()) def shift(self, s: list) -> Self: """Shift the volumetric dataset by a vector.""" self.origin(self.origin() + np.array(s)) return self def rotate_x(self, angle: float, rad=False, around=None) -> Self: """ Rotate around x-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ if angle == 0: return self LT = transformations.LinearTransform().rotate_x(angle, rad, around) return self.apply_transform(LT, fit=True, interpolation="linear") def rotate_y(self, angle: float, rad=False, around=None) -> Self: """ Rotate around y-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ if angle == 0: return self LT = transformations.LinearTransform().rotate_y(angle, rad, around) return self.apply_transform(LT, fit=True, interpolation="linear") def rotate_z(self, angle: float, rad=False, around=None) -> Self: """ Rotate around z-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ if angle == 0: return self LT = transformations.LinearTransform().rotate_z(angle, rad, around) return self.apply_transform(LT, fit=True, interpolation="linear") def get_cell_from_ijk(self, ijk: list) -> int: """ Get the voxel id number at the given ijk coordinates. Arguments: ijk : (list) the ijk coordinates of the voxel """ return self.dataset.ComputeCellId(ijk) def get_point_from_ijk(self, ijk: list) -> int: """ Get the point id number at the given ijk coordinates. Arguments: ijk : (list) the ijk coordinates of the voxel """ return self.dataset.ComputePointId(ijk) def permute_axes(self, x: int, y: int, z: int) -> Self: """ Reorder the axes of the Volume by specifying the input axes which are supposed to become the new X, Y, and Z. """ imp = vtki.new("ImagePermute") imp.SetFilteredAxes(x, y, z) imp.SetInputData(self.dataset) imp.Update() self._update(imp.GetOutput()) self.pipeline = utils.OperationNode( f"permute_axes({(x,y,z)})", parents=[self], c="#4cc9f0" ) return self def resample(self, new_spacing: List[float], interpolation=1) -> Self: """ Resamples a `Volume` to be larger or smaller. This method modifies the spacing of the input. Linear interpolation is used to resample the data. Arguments: new_spacing : (list) a list of 3 new spacings for the 3 axes interpolation : (int) 0=nearest_neighbor, 1=linear, 2=cubic """ rsp = vtki.new("ImageResample") oldsp = self.spacing() for i in range(3): if oldsp[i] != new_spacing[i]: rsp.SetAxisOutputSpacing(i, new_spacing[i]) rsp.InterpolateOn() rsp.SetInterpolationMode(interpolation) rsp.OptimizationOn() rsp.Update() self._update(rsp.GetOutput()) self.pipeline = utils.OperationNode( "resample", comment=f"spacing: {tuple(new_spacing)}", parents=[self], c="#4cc9f0" ) return self def threshold(self, above=None, below=None, replace=None, replace_value=None) -> Self: """ Binary or continuous volume thresholding. Find the voxels that contain a value above/below the input values and replace them with a new value (default is 0). """ th = vtki.new("ImageThreshold") th.SetInputData(self.dataset) # sanity checks if above is not None and below is not None: if above == below: return self if above > below: vedo.logger.warning("in volume.threshold(), above > below, skip.") return self ## cases if below is not None and above is not None: th.ThresholdBetween(above, below) elif above is not None: th.ThresholdByUpper(above) elif below is not None: th.ThresholdByLower(below) ## if replace is not None: th.SetReplaceIn(True) th.SetInValue(replace) else: th.SetReplaceIn(False) if replace_value is not None: th.SetReplaceOut(True) th.SetOutValue(replace_value) else: th.SetReplaceOut(False) th.Update() self._update(th.GetOutput()) self.pipeline = utils.OperationNode("threshold", parents=[self], c="#4cc9f0") return self def crop(self, left=None, right=None, back=None, front=None, bottom=None, top=None, VOI=()) -> Self: """ Crop a `Volume` object. Arguments: left : (float) fraction to crop from the left plane (negative x) right : (float) fraction to crop from the right plane (positive x) back : (float) fraction to crop from the back plane (negative y) front : (float) fraction to crop from the front plane (positive y) bottom : (float) fraction to crop from the bottom plane (negative z) top : (float) fraction to crop from the top plane (positive z) VOI : (list) extract Volume Of Interest expressed in voxel numbers Example: `vol.crop(VOI=(xmin, xmax, ymin, ymax, zmin, zmax)) # all integers nrs` """ extractVOI = vtki.new("ExtractVOI") extractVOI.SetInputData(self.dataset) if VOI: extractVOI.SetVOI(VOI) else: d = self.dataset.GetDimensions() bx0, bx1, by0, by1, bz0, bz1 = 0, d[0]-1, 0, d[1]-1, 0, d[2]-1 if left is not None: bx0 = int((d[0]-1)*left) if right is not None: bx1 = int((d[0]-1)*(1-right)) if back is not None: by0 = int((d[1]-1)*back) if front is not None: by1 = int((d[1]-1)*(1-front)) if bottom is not None: bz0 = int((d[2]-1)*bottom) if top is not None: bz1 = int((d[2]-1)*(1-top)) extractVOI.SetVOI(bx0, bx1, by0, by1, bz0, bz1) extractVOI.Update() self._update(extractVOI.GetOutput()) self.pipeline = utils.OperationNode( "crop", parents=[self], c="#4cc9f0", comment=f"dims={tuple(self.dimensions())}" ) return self def append(self, *volumes, axis="z", preserve_extents=False) -> Self: """ Take the components from multiple inputs and merges them into one output. Except for the append axis, all inputs must have the same extent. All inputs must have the same number of scalar components. The output has the same origin and spacing as the first input. The origin and spacing of all other inputs are ignored. All inputs must have the same scalar type. Arguments: axis : (int, str) axis expanded to hold the multiple images preserve_extents : (bool) if True, the extent of the inputs is used to place the image in the output. The whole extent of the output is the union of the input whole extents. Any portion of the output not covered by the inputs is set to zero. The origin and spacing is taken from the first input. Example: ```python from vedo import Volume, dataurl vol = Volume(dataurl+'embryo.tif') vol.append(vol, axis='x').show().close() ``` ![](https://vedo.embl.es/images/feats/volume_append.png) """ ima = vtki.new("ImageAppend") ima.SetInputData(self.dataset) # if not utils.is_sequence(volumes): # volumes = [volumes] for volume in volumes: if isinstance(volume, vtki.vtkImageData): ima.AddInputData(volume) else: ima.AddInputData(volume.dataset) ima.SetPreserveExtents(preserve_extents) if axis == "x": axis = 0 elif axis == "y": axis = 1 elif axis == "z": axis = 2 ima.SetAppendAxis(axis) ima.Update() self._update(ima.GetOutput()) self.pipeline = utils.OperationNode( "append", parents=[self, *volumes], c="#4cc9f0", comment=f"dims={tuple(self.dimensions())}", ) return self def pad(self, voxels=10, value=0) -> Self: """ Add the specified number of voxels at the `Volume` borders. Voxels can be a list formatted as `[nx0, nx1, ny0, ny1, nz0, nz1]`. Arguments: voxels : (int, list) number of voxels to be added (or a list of length 4) value : (int) intensity value (gray-scale color) of the padding Example: ```python from vedo import Volume, dataurl, show iso = Volume(dataurl+'embryo.tif').isosurface() vol = iso.binarize(spacing=(100, 100, 100)).pad(10) vol.dilate([15,15,15]) show(iso, vol.isosurface(), N=2, axes=1) ``` ![](https://vedo.embl.es/images/volumetric/volume_pad.png) """ x0, x1, y0, y1, z0, z1 = self.dataset.GetExtent() pf = vtki.new("ImageConstantPad") pf.SetInputData(self.dataset) pf.SetConstant(value) if utils.is_sequence(voxels): pf.SetOutputWholeExtent( x0 - voxels[0], x1 + voxels[1], y0 - voxels[2], y1 + voxels[3], z0 - voxels[4], z1 + voxels[5], ) else: pf.SetOutputWholeExtent( x0 - voxels, x1 + voxels, y0 - voxels, y1 + voxels, z0 - voxels, z1 + voxels, ) pf.Update() self._update(pf.GetOutput()) self.pipeline = utils.OperationNode( "pad", comment=f"{voxels} voxels", parents=[self], c="#f28482" ) return self def resize(self, newdims: List[int]) -> Self: """Increase or reduce the number of voxels of a Volume with interpolation.""" rsz = vtki.new("ImageResize") rsz.SetResizeMethodToOutputDimensions() rsz.SetInputData(self.dataset) rsz.SetOutputDimensions(newdims) rsz.Update() self.dataset = rsz.GetOutput() self._update(self.dataset) self.pipeline = utils.OperationNode( "resize", parents=[self], c="#4cc9f0", comment=f"dims={tuple(self.dimensions())}" ) return self def normalize(self) -> Self: """Normalize that scalar components for each point.""" norm = vtki.new("ImageNormalize") norm.SetInputData(self.dataset) norm.Update() self._update(norm.GetOutput()) self.pipeline = utils.OperationNode("normalize", parents=[self], c="#4cc9f0") return self def mirror(self, axis="x") -> Self: """ Mirror flip along one of the cartesian axes. """ img = self.dataset ff = vtki.new("ImageFlip") ff.SetInputData(img) if axis.lower() == "x": ff.SetFilteredAxis(0) elif axis.lower() == "y": ff.SetFilteredAxis(1) elif axis.lower() == "z": ff.SetFilteredAxis(2) else: vedo.logger.error("mirror must be set to either x, y, z or n") raise RuntimeError() ff.Update() self._update(ff.GetOutput()) self.pipeline = utils.OperationNode(f"mirror {axis}", parents=[self], c="#4cc9f0") return self def operation(self, operation: str, volume2=None) -> "Volume": """ Perform operations with `Volume` objects. Keyword `volume2` can be a constant `float`. Possible operations are: ``` and, or, xor, nand, nor, not, +, -, /, 1/x, sin, cos, exp, log, abs, **2, sqrt, min, max, atan, atan2, median, mag, dot, gradient, divergence, laplacian. ``` Example: ```py from vedo import Box, show vol1 = Box(size=(35,10, 5)).binarize() vol2 = Box(size=( 5,10,35)).binarize() vol = vol1.operation("xor", vol2) show([[vol1, vol2], ["vol1 xor vol2", vol]], N=2, axes=1, viewup="z", ).close() ``` Note: For logic operations, the two volumes must have the same bounds. If they do not, a larger image is created to contain both and the volumes are resampled onto the larger image before the operation is performed. This can be slow and memory intensive. See also: - [volume_operations.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/volume_operations.py) """ op = operation.lower() image1 = self.dataset if op in ["and", "or", "xor", "nand", "nor"]: if not np.allclose(image1.GetBounds(), volume2.dataset.GetBounds()): # create a larger image to contain both b1 = image1.GetBounds() b2 = volume2.dataset.GetBounds() b = [ min(b1[0], b2[0]), max(b1[1], b2[1]), min(b1[2], b2[2]), max(b1[3], b2[3]), min(b1[4], b2[4]), max(b1[5], b2[5]), ] dims1 = image1.GetDimensions() dims2 = volume2.dataset.GetDimensions() dims = [max(dims1[0], dims2[0]), max(dims1[1], dims2[1]), max(dims1[2], dims2[2])] image = vtki.vtkImageData() image.SetDimensions(dims) spacing = ( (b[1] - b[0]) / dims[0], (b[3] - b[2]) / dims[1], (b[5] - b[4]) / dims[2], ) image.SetSpacing(spacing) image.SetOrigin((b[0], b[2], b[4])) image.AllocateScalars(vtki.VTK_UNSIGNED_CHAR, 1) image.GetPointData().GetScalars().FillComponent(0, 0) interp1 = vtki.new("ImageReslice") interp1.SetInputData(image1) interp1.SetOutputExtent(image.GetExtent()) interp1.SetOutputOrigin(image.GetOrigin()) interp1.SetOutputSpacing(image.GetSpacing()) interp1.SetInterpolationModeToNearestNeighbor() interp1.Update() imageA = interp1.GetOutput() interp2 = vtki.new("ImageReslice") interp2.SetInputData(volume2.dataset) interp2.SetOutputExtent(image.GetExtent()) interp2.SetOutputOrigin(image.GetOrigin()) interp2.SetOutputSpacing(image.GetSpacing()) interp2.SetInterpolationModeToNearestNeighbor() interp2.Update() imageB = interp2.GetOutput() else: imageA = image1 imageB = volume2.dataset img_logic = vtki.new("ImageLogic") img_logic.SetInput1Data(imageA) img_logic.SetInput2Data(imageB) img_logic.SetOperation(["and", "or", "xor", "nand", "nor"].index(op)) img_logic.Update() out_vol = Volume(img_logic.GetOutput()) out_vol.pipeline = utils.OperationNode( "operation", comment=f"{op}", parents=[self, volume2], c="#4cc9f0", shape="cylinder" ) return out_vol ###################################################### if volume2 and isinstance(volume2, Volume): # assert image1.GetScalarType() == volume2.dataset.GetScalarType(), "volumes have different scalar types" # make sure they have the same bounds: assert np.allclose(image1.GetBounds(), volume2.dataset.GetBounds()), "volumes have different bounds" # make sure they have the same spacing: assert np.allclose(image1.GetSpacing(), volume2.dataset.GetSpacing()), "volumes have different spacing" # make sure they have the same origin: assert np.allclose(image1.GetOrigin(), volume2.dataset.GetOrigin()), "volumes have different origin" mf = None if op in ["median"]: mf = vtki.new("ImageMedian3D") mf.SetInputData(image1) elif op in ["mag"]: mf = vtki.new("ImageMagnitude") mf.SetInputData(image1) elif op in ["dot"]: mf = vtki.new("ImageDotProduct") mf.SetInput1Data(image1) mf.SetInput2Data(volume2.dataset) elif op in ["grad", "gradient"]: mf = vtki.new("ImageGradient") mf.SetDimensionality(3) mf.SetInputData(image1) elif op in ["div", "divergence"]: mf = vtki.new("ImageDivergence") mf.SetInputData(image1) elif op in ["laplacian"]: mf = vtki.new("ImageLaplacian") mf.SetDimensionality(3) mf.SetInputData(image1) elif op in ["not"]: mf = vtki.new("ImageLogic") mf.SetInput1Data(image1) mf.SetOperation(4) if mf is not None: mf.Update() vol = Volume(mf.GetOutput()) vol.pipeline = utils.OperationNode( "operation", comment=f"{op}", parents=[self], c="#4cc9f0", shape="cylinder" ) return vol ###################################################### mat = vtki.new("ImageMathematics") mat.SetInput1Data(image1) K = None if utils.is_number(volume2): K = volume2 mat.SetConstantK(K) mat.SetConstantC(K) elif volume2 is not None: # assume image2 is a constant value mat.SetInput2Data(volume2.dataset) # ########################### if op in ["+", "add", "plus"]: if K: mat.SetOperationToAddConstant() else: mat.SetOperationToAdd() elif op in ["-", "subtract", "minus"]: if K: mat.SetConstantC(-float(K)) mat.SetOperationToAddConstant() else: mat.SetOperationToSubtract() elif op in ["*", "multiply", "times"]: if K: mat.SetOperationToMultiplyByK() else: mat.SetOperationToMultiply() elif op in ["/", "divide"]: if K: mat.SetConstantK(1.0 / K) mat.SetOperationToMultiplyByK() else: mat.SetOperationToDivide() elif op in ["1/x", "invert"]: mat.SetOperationToInvert() elif op in ["sin"]: mat.SetOperationToSin() elif op in ["cos"]: mat.SetOperationToCos() elif op in ["exp"]: mat.SetOperationToExp() elif op in ["log"]: mat.SetOperationToLog() elif op in ["abs"]: mat.SetOperationToAbsoluteValue() elif op in ["**2", "square"]: mat.SetOperationToSquare() elif op in ["sqrt", "sqr"]: mat.SetOperationToSquareRoot() elif op in ["min"]: mat.SetOperationToMin() elif op in ["max"]: mat.SetOperationToMax() elif op in ["atan"]: mat.SetOperationToATAN() elif op in ["atan2"]: mat.SetOperationToATAN2() else: vedo.logger.error(f"unknown operation {operation}") raise RuntimeError() mat.Update() self._update(mat.GetOutput()) self.pipeline = utils.OperationNode( "operation", comment=f"{op}", parents=[self, volume2], shape="cylinder", c="#4cc9f0" ) return self def frequency_pass_filter(self, low_cutoff=None, high_cutoff=None, order=1) -> Self: """ Low-pass and high-pass filtering become trivial in the frequency domain. A portion of the pixels/voxels are simply masked or attenuated. This function applies a high pass Butterworth filter that attenuates the frequency domain image. The gradual attenuation of the filter is important. A simple high-pass filter would simply mask a set of pixels in the frequency domain, but the abrupt transition would cause a ringing effect in the spatial domain. Arguments: low_cutoff : (list) the cutoff frequencies for x, y and z high_cutoff : (list) the cutoff frequencies for x, y and z order : (int) order determines sharpness of the cutoff curve """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass fft = vtki.new("ImageFFT") fft.SetInputData(self.dataset) fft.Update() out = fft.GetOutput() if high_cutoff: blp = vtki.new("ImageButterworthLowPass") blp.SetInputData(out) blp.SetCutOff(high_cutoff) blp.SetOrder(order) blp.Update() out = blp.GetOutput() if low_cutoff: bhp = vtki.new("ImageButterworthHighPass") bhp.SetInputData(out) bhp.SetCutOff(low_cutoff) bhp.SetOrder(order) bhp.Update() out = bhp.GetOutput() rfft = vtki.new("ImageRFFT") rfft.SetInputData(out) rfft.Update() ecomp = vtki.new("ImageExtractComponents") ecomp.SetInputData(rfft.GetOutput()) ecomp.SetComponents(0) ecomp.Update() self._update(ecomp.GetOutput()) self.pipeline = utils.OperationNode("frequency_pass_filter", parents=[self], c="#4cc9f0") return self def smooth_gaussian(self, sigma=(2, 2, 2), radius=None) -> Self: """ Performs a convolution of the input Volume with a gaussian. Arguments: sigma : (float, list) standard deviation(s) in voxel units. A list can be given to smooth in the three direction differently. radius : (float, list) radius factor(s) determine how far out the gaussian kernel will go before being clamped to zero. A list can be given too. """ gsf = vtki.new("ImageGaussianSmooth") gsf.SetDimensionality(3) gsf.SetInputData(self.dataset) if utils.is_sequence(sigma): gsf.SetStandardDeviations(sigma) else: gsf.SetStandardDeviation(sigma) if radius is not None: if utils.is_sequence(radius): gsf.SetRadiusFactors(radius) else: gsf.SetRadiusFactor(radius) gsf.Update() self._update(gsf.GetOutput()) self.pipeline = utils.OperationNode("smooth_gaussian", parents=[self], c="#4cc9f0") return self def smooth_median(self, neighbours=(2, 2, 2)) -> Self: """ Median filter that replaces each pixel with the median value from a rectangular neighborhood around that pixel. """ imgm = vtki.new("ImageMedian3D") imgm.SetInputData(self.dataset) if utils.is_sequence(neighbours): imgm.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) else: imgm.SetKernelSize(neighbours, neighbours, neighbours) imgm.Update() self._update(imgm.GetOutput()) self.pipeline = utils.OperationNode("smooth_median", parents=[self], c="#4cc9f0") return self def erode(self, neighbours=(2, 2, 2)) -> Self: """ Replace a voxel with the minimum over an ellipsoidal neighborhood of voxels. If `neighbours` of an axis is 1, no processing is done on that axis. Examples: - [erode_dilate.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/erode_dilate.py) ![](https://vedo.embl.es/images/volumetric/erode_dilate.png) """ ver = vtki.new("ImageContinuousErode3D") ver.SetInputData(self.dataset) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() self._update(ver.GetOutput()) self.pipeline = utils.OperationNode("erode", parents=[self], c="#4cc9f0") return self def dilate(self, neighbours=(2, 2, 2)) -> Self: """ Replace a voxel with the maximum over an ellipsoidal neighborhood of voxels. If `neighbours` of an axis is 1, no processing is done on that axis. Check also `erode()` and `pad()`. Examples: - [erode_dilate.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/erode_dilate.py) """ ver = vtki.new("ImageContinuousDilate3D") ver.SetInputData(self.dataset) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() self._update(ver.GetOutput()) self.pipeline = utils.OperationNode("dilate", parents=[self], c="#4cc9f0") return self def magnitude(self) -> Self: """Colapses components with magnitude function.""" imgm = vtki.new("ImageMagnitude") imgm.SetInputData(self.dataset) imgm.Update() self._update(imgm.GetOutput()) self.pipeline = utils.OperationNode("magnitude", parents=[self], c="#4cc9f0") return self def topoints(self) -> "vedo.Points": """ Extract all image voxels as points. This function takes an input `Volume` and creates an `Mesh` that contains the points and the point attributes. Examples: - [vol2points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/vol2points.py) """ v2p = vtki.new("ImageToPoints") v2p.SetInputData(self.dataset) v2p.Update() mpts = vedo.Points(v2p.GetOutput()) mpts.pipeline = utils.OperationNode("topoints", parents=[self], c="#4cc9f0:#e9c46a") return mpts def euclidean_distance(self, anisotropy=False, max_distance=None) -> "Volume": """ Implementation of the Euclidean DT (Distance Transform) using Saito's algorithm. The distance map produced contains the square of the Euclidean distance values. The algorithm has a O(n^(D+1)) complexity over n x n x...x n images in D dimensions. Check out also: https://en.wikipedia.org/wiki/Distance_transform Arguments: anisotropy : bool used to define whether Spacing should be used in the computation of the distances. max_distance : bool any distance bigger than max_distance will not be computed but set to this specified value instead. Examples: - [euclidian_dist.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/euclidian_dist.py) """ euv = vtki.new("ImageEuclideanDistance") euv.SetInputData(self.dataset) euv.SetConsiderAnisotropy(anisotropy) if max_distance is not None: euv.InitializeOn() euv.SetMaximumDistance(max_distance) euv.SetAlgorithmToSaito() euv.Update() vol = Volume(euv.GetOutput()) vol.pipeline = utils.OperationNode("euclidean_distance", parents=[self], c="#4cc9f0") return vol def correlation_with(self, vol2: "Volume", dim=2) -> "Volume": """ Find the correlation between two volumetric data sets. Keyword `dim` determines whether the correlation will be 3D, 2D or 1D. The default is a 2D Correlation. The output size will match the size of the first input. The second input is considered the correlation kernel. """ imc = vtki.new("ImageCorrelation") imc.SetInput1Data(self.dataset) imc.SetInput2Data(vol2.dataset) imc.SetDimensionality(dim) imc.Update() vol = Volume(imc.GetOutput()) vol.pipeline = utils.OperationNode("correlation_with", parents=[self, vol2], c="#4cc9f0") return vol def scale_voxels(self, scale=1) -> Self: """Scale the voxel content by factor `scale`.""" rsl = vtki.new("ImageReslice") rsl.SetInputData(self.dataset) rsl.SetScalarScale(scale) rsl.Update() self._update(rsl.GetOutput()) self.pipeline = utils.OperationNode( "scale_voxels", comment=f"scale={scale}", parents=[self], c="#4cc9f0" ) return self vedo-2025.5.3/vedo/vtkclasses.py000066400000000000000000000633651474667405700164370ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Subset of the vtk classes to be imported eagerly or lazily. """ from importlib import import_module __all__ = [] ###################################################################### location = {} module_cache = {} ###################################################################### # noinspection PyUnresolvedReferences from vtkmodules.vtkInteractionStyle import vtkInteractorStyleUser for name in [ "vtkOpenGLGPUVolumeRayCastMapper", "vtkSmartVolumeMapper", ]: location[name] = "vtkRenderingVolumeOpenGL2" ###################################################################### for name in [ "vtkKochanekSpline", "vtkCardinalSpline", "vtkParametricSpline", "vtkParametricFunctionSource", "vtkParametricTorus", "vtkParametricBoy", "vtkParametricConicSpiral", "vtkParametricCrossCap", "vtkParametricDini", "vtkParametricEllipsoid", "vtkParametricEnneper", "vtkParametricFigure8Klein", "vtkParametricKlein", "vtkParametricMobius", "vtkParametricRandomHills", "vtkParametricRoman", "vtkParametricSuperEllipsoid", "vtkParametricSuperToroid", "vtkParametricBohemianDome", "vtkParametricBour", "vtkParametricCatalanMinimal", "vtkParametricHenneberg", "vtkParametricKuen", "vtkParametricPluckerConoid", "vtkParametricPseudosphere", ]: location[name] = "vtkCommonComputationalGeometry" location["vtkNamedColors"] = "vtkCommonColor" location["vtkIntegrateAttributes"] = "vtkFiltersParallel" # noinspection PyUnresolvedReferences from vtkmodules.vtkCommonCore import ( mutable, VTK_UNSIGNED_SHORT, VTK_UNSIGNED_INT, VTK_UNSIGNED_LONG, VTK_UNSIGNED_LONG_LONG, VTK_UNSIGNED_CHAR, VTK_CHAR, VTK_SHORT, VTK_INT, VTK_LONG, VTK_LONG_LONG, VTK_FLOAT, VTK_DOUBLE, VTK_SIGNED_CHAR, VTK_ID_TYPE, VTK_VERSION_NUMBER, VTK_FONT_FILE, vtkArray, vtkIdTypeArray, vtkBitArray, vtkCharArray, vtkCommand, vtkDoubleArray, vtkFloatArray, vtkIdList, vtkIntArray, vtkLookupTable, vtkPoints, vtkStringArray, vtkUnsignedCharArray, vtkVariant, vtkVariantArray, vtkVersion, ) for name in [ "mutable", "VTK_UNSIGNED_CHAR", "VTK_UNSIGNED_SHORT", "VTK_UNSIGNED_INT", "VTK_UNSIGNED_LONG", "VTK_UNSIGNED_LONG_LONG", "VTK_UNSIGNED_CHAR", "VTK_CHAR", "VTK_SHORT", "VTK_INT", "VTK_LONG", "VTK_LONG_LONG", "VTK_FLOAT", "VTK_DOUBLE", "VTK_SIGNED_CHAR", "VTK_ID_TYPE", "VTK_VERSION_NUMBER", "VTK_FONT_FILE", "vtkArray", "vtkIdTypeArray", "vtkBitArray", "vtkCharArray", "vtkCommand", "vtkDoubleArray", "vtkFloatArray", "vtkIdList", "vtkIntArray", "vtkLogger", "vtkLookupTable", "vtkMath", "vtkPoints", "vtkStringArray", "vtkUnsignedCharArray", "vtkVariant", "vtkVariantArray", "vtkVersion", ]: location[name] = "vtkCommonCore" # noinspection PyUnresolvedReferences from vtkmodules.vtkCommonDataModel import ( vtkPolyData, vtkImageData, vtkUnstructuredGrid, vtkRectilinearGrid, vtkStructuredGrid, vtkCellArray, vtkDataSetAttributes, vtkDataObject, vtkDataSet, vtkFieldData, vtkHexagonalPrism, vtkHexahedron, vtkLine, vtkPentagonalPrism, vtkPixel, vtkPlane, vtkPlanes, vtkPointLocator, vtkPolyLine, vtkPolyPlane, vtkPolygon, vtkPolyVertex, vtkPyramid, vtkQuad, vtkTetra, vtkTriangle, vtkTriangleStrip, vtkVertex, vtkVoxel, vtkWedge, ) for name in [ "vtkCellArray", "vtkBox", "vtkCellLocator", "vtkCylinder", "vtkDataSetAttributes", "vtkDataObject", "vtkDataSet", "vtkFieldData", "vtkHexagonalPrism", "vtkHexahedron", "vtkImageData", "vtkImplicitDataSet", "vtkImplicitSelectionLoop", "vtkImplicitWindowFunction", # "vtkImplicitVolume", "vtkIterativeClosestPointTransform", "vtkLine", "vtkMultiBlockDataSet", "vtkMutableDirectedGraph", "vtkPentagonalPrism", "vtkPixel", "vtkPlane", "vtkPlaneCollection", "vtkPlanes", "vtkPointLocator", "vtkPolyData", "vtkPolyLine", "vtkPolyPlane", "vtkPolygon", "vtkPolyVertex", "vtkPyramid", "vtkQuad", "vtkQuadric", "vtkRectilinearGrid", "vtkSelection", "vtkSelectionNode", "vtkSphere", "vtkStaticCellLocator", "vtkStaticPointLocator", "vtkStructuredGrid", "vtkTetra", "vtkTriangle", "vtkTriangleStrip", "vtkUnstructuredGrid", "vtkVertex", "vtkVoxel", "vtkWedge", ]: location[name] = "vtkCommonDataModel" # noinspection PyUnresolvedReferences from vtkmodules.vtkCommonMath import vtkMatrix4x4 location["vtkAmoebaMinimizer"] = "vtkCommonMath" location["vtkMatrix4x4"] = "vtkCommonMath" location["vtkQuaternion"] = "vtkCommonMath" # noinspection PyUnresolvedReferences from vtkmodules.vtkCommonTransforms import ( vtkHomogeneousTransform, vtkLandmarkTransform, vtkLinearTransform, vtkThinPlateSplineTransform, vtkTransform, ) for name in [ "vtkHomogeneousTransform", "vtkLandmarkTransform", "vtkLinearTransform", "vtkThinPlateSplineTransform", "vtkTransform", ]: location[name] = "vtkCommonTransforms" for name in [ "VTK_BEST_FITTING_PLANE", "vtk3DLinearGridCrinkleExtractor", "vtkAppendFilter", "vtkAppendPolyData", "vtkBinnedDecimation", "vtkCellCenters", "vtkCellDataToPointData", "vtkCenterOfMass", "vtkCleanPolyData", "vtkClipPolyData", "vtkPolyDataConnectivityFilter", "vtkPolyDataEdgeConnectivityFilter", "vtkContourFilter", "vtkContourGrid", "vtkCutter", "vtkDecimatePro", "vtkDelaunay2D", "vtkDelaunay3D", "vtkElevationFilter", "vtkFeatureEdges", "vtkFlyingEdges3D", "vtkGlyph3D", "vtkIdFilter", "vtkImageAppend", "vtkImplicitPolyDataDistance", "vtkMarchingSquares", "vtkMaskPoints", "vtkMassProperties", "vtkPointDataToCellData", "vtkPolyDataNormals", "vtkProbeFilter", "vtkQuadricClustering", "vtkQuadricDecimation", "vtkResampleWithDataSet", "vtkReverseSense", "vtkStripper", "vtkSurfaceNets3D", "vtkTensorGlyph", "vtkThreshold", "vtkTriangleFilter", "vtkTubeFilter", "vtkUnstructuredGridQuadricDecimation", "vtkVoronoi2D", "vtkWindowedSincPolyDataFilter", "vtkStaticCleanUnstructuredGrid", "vtkPolyDataPlaneCutter" ]: location[name] = "vtkFiltersCore" # noinspection PyUnresolvedReferences from vtkmodules.vtkFiltersCore import vtkGlyph3D for name in [ "vtkExtractCellsByType", "vtkExtractGeometry", "vtkExtractPolyDataGeometry", "vtkExtractSelection", ]: location[name] = "vtkFiltersExtraction" location["vtkExtractEdges"] = "vtkFiltersCore" location["vtkStreamTracer"] = "vtkFiltersFlowPaths" for name in [ "vtkBooleanOperationPolyDataFilter", "vtkBoxClipDataSet", "vtkCellValidator", "vtkClipDataSet", "vtkClipClosedSurface", "vtkCountVertices", "vtkContourTriangulator", "vtkCurvatures", "vtkDataSetTriangleFilter", "vtkDensifyPolyData", "vtkDistancePolyDataFilter", "vtkGradientFilter", "vtkIntersectionPolyDataFilter", "vtkLoopBooleanPolyDataFilter", "vtkMultiBlockDataGroupFilter", "vtkPolyDataToReebGraphFilter", "vtkTransformPolyDataFilter", "vtkTransformFilter", "vtkOBBTree", "vtkQuantizePolyDataPoints", "vtkRandomAttributeGenerator", "vtkShrinkFilter", "vtkShrinkPolyData", "vtkRectilinearGridToTetrahedra", "vtkVertexGlyphFilter", ]: location[name] = "vtkFiltersGeneral" try: from vtkmodules.vtkCommonDataModel import vtkCellTreeLocator location["vtkCellTreeLocator"] = "vtkCommonDataModel" except ImportError: from vtkmodules.vtkFiltersGeneral import vtkCellTreeLocator location["vtkCellTreeLocator"] = "vtkFiltersGeneral" for name in [ "vtkAttributeSmoothingFilter", "vtkDataSetSurfaceFilter", "vtkGeometryFilter", "vtkImageDataGeometryFilter", "vtkMarkBoundaryFilter", ]: location[name] = "vtkFiltersGeometry" for name in [ "vtkFacetReader", "vtkImplicitModeller", "vtkPolyDataSilhouette", "vtkProcrustesAlignmentFilter", "vtkRenderLargeImage", ]: location[name] = "vtkFiltersHybrid" for name in [ "vtkAdaptiveSubdivisionFilter", "vtkBandedPolyDataContourFilter", "vtkButterflySubdivisionFilter", "vtkContourLoopExtraction", "vtkCookieCutter", "vtkDijkstraGraphGeodesicPath", "vtkFillHolesFilter", "vtkHausdorffDistancePointSetFilter", "vtkImprintFilter", "vtkLinearExtrusionFilter", "vtkLinearSubdivisionFilter", "vtkLoopSubdivisionFilter", "vtkRibbonFilter", "vtkRotationalExtrusionFilter", "vtkRuledSurfaceFilter", "vtkSectorSource", "vtkSelectEnclosedPoints", "vtkSelectPolyData", "vtkSubdivideTetra", "vtkTrimmedExtrusionFilter", ]: location[name] = "vtkFiltersModeling" for name in [ "vtkConnectedPointsFilter", "vtkDensifyPointCloudFilter", "vtkEuclideanClusterExtraction", "vtkExtractEnclosedPoints", "vtkExtractSurface", "vtkGaussianKernel", "vtkLinearKernel", "vtkPCANormalEstimation", "vtkPointDensityFilter", "vtkPointInterpolator", "vtkRadiusOutlierRemoval", "vtkShepardKernel", "vtkSignedDistance", "vtkPointSmoothingFilter", "vtkUnsignedDistance", "vtkVoronoiKernel", ]: location[name] = "vtkFiltersPoints" for name in [ "vtkArcSource", "vtkArrowSource", "vtkConeSource", "vtkCubeSource", "vtkCylinderSource", "vtkDiskSource", "vtkFrustumSource", "vtkGlyphSource2D", "vtkGraphToPolyData", "vtkLineSource", "vtkOutlineCornerFilter", "vtkParametricFunctionSource", "vtkPlaneSource", "vtkPointSource", "vtkProgrammableSource", "vtkSphereSource", "vtkTexturedSphereSource", "vtkTessellatedBoxSource", ]: location[name] = "vtkFiltersSources" location["vtkTextureMapToPlane"] = "vtkFiltersTexture" location["vtkMeshQuality"] = "vtkFiltersVerdict" location["vtkCellSizeFilter"] = "vtkFiltersVerdict" location["vtkPolyDataToImageStencil"] = "vtkImagingStencil" location["vtkX3DExporter"] = "vtkIOExport" location["vtkGL2PSExporter"] = "vtkIOExportGL2PS" for name in [ "vtkBYUReader", "vtkFacetWriter", "vtkOBJReader", "vtkOpenFOAMReader", "vtkParticleReader", "vtkSTLReader", "vtkSTLWriter", ]: location[name] = "vtkIOGeometry" for name in [ "vtkBMPReader", "vtkBMPWriter", "vtkDEMReader", "vtkDICOMImageReader", "vtkHDRReader", "vtkJPEGReader", "vtkJPEGWriter", "vtkMetaImageReader", "vtkMetaImageWriter", "vtkNIFTIImageReader", "vtkNIFTIImageWriter", "vtkNrrdReader", "vtkPNGReader", "vtkPNGWriter", "vtkSLCReader", "vtkTIFFReader", "vtkTIFFWriter", ]: location[name] = "vtkIOImage" location["vtk3DSImporter"] = "vtkIOImport" location["vtkOBJImporter"] = "vtkIOImport" location["vtkVRMLImporter"] = "vtkIOImport" for name in [ "vtkSimplePointsWriter", "vtkStructuredGridReader", "vtkStructuredPointsReader", "vtkDataSetReader", "vtkDataSetWriter", "vtkPolyDataWriter", "vtkRectilinearGridReader", "vtkUnstructuredGridReader", ]: location[name] = "vtkIOLegacy" location["vtkPLYReader"] = "vtkIOPLY" location["vtkPLYWriter"] = "vtkIOPLY" for name in [ "vtkXMLGenericDataObjectReader", "vtkXMLImageDataReader", "vtkXMLImageDataWriter", "vtkXMLMultiBlockDataReader", "vtkXMLMultiBlockDataWriter", "vtkXMLPRectilinearGridReader", "vtkXMLPUnstructuredGridReader", "vtkXMLPolyDataReader", "vtkXMLPolyDataWriter", "vtkXMLRectilinearGridReader", "vtkXMLRectilinearGridWriter", "vtkXMLStructuredGridReader", "vtkXMLUnstructuredGridReader", "vtkXMLUnstructuredGridWriter", ]: location[name] = "vtkIOXML" location["vtkImageLuminance"] = "vtkImagingColor" location["vtkImageMapToWindowLevelColors"] = "vtkImagingColor" for name in [ "vtkImageAppendComponents", "vtkImageBlend", "vtkImageCast", "vtkImageConstantPad", "vtkImageExtractComponents", "vtkImageFlip", "vtkImageMapToColors", "vtkImageMirrorPad", "vtkImagePermute", "vtkImageResample", "vtkImageResize", "vtkImageReslice", "vtkImageThreshold", "vtkImageTranslateExtent", "vtkExtractVOI", ]: location[name] = "vtkImagingCore" for name in [ "vtkImageButterworthHighPass", "vtkImageButterworthLowPass", "vtkImageFFT", "vtkImageFourierCenter", "vtkImageRFFT", ]: location[name] = "vtkImagingFourier" for name in [ "vtkImageCorrelation", "vtkImageEuclideanDistance", "vtkImageGaussianSmooth", "vtkImageGradient", "vtkImageHybridMedian2D", "vtkImageLaplacian", "vtkImageMedian3D", "vtkImageNormalize", "vtkImageSlab", ]: location[name] = "vtkImagingGeneral" for name in ["vtkImageToPoints", "vtkSampleFunction"]: location[name] = "vtkImagingHybrid" for name in [ "vtkImageDivergence", "vtkImageDotProduct", "vtkImageLogarithmicScale", "vtkImageLogic", "vtkImageMagnitude", "vtkImageMathematics", ]: location[name] = "vtkImagingMath" for name in [ "vtkImageContinuousDilate3D", "vtkImageContinuousErode3D", ]: location[name] = "vtkImagingMorphological" location["vtkImageCanvasSource2D"] = "vtkImagingSources" location["vtkImageStencil"] = "vtkImagingStencil" for name in [ "vtkCircularLayoutStrategy", "vtkClustering2DLayoutStrategy", "vtkConeLayoutStrategy", "vtkFast2DLayoutStrategy", "vtkForceDirectedLayoutStrategy", "vtkGraphLayout", "vtkSimple2DLayoutStrategy", "vtkSimple3DCirclesStrategy", "vtkSpanTreeLayoutStrategy", ]: location[name] = "vtkInfovisLayout" for name in [ "vtkInteractorStyleFlight", "vtkInteractorStyleImage", "vtkInteractorStyleJoystickActor", "vtkInteractorStyleJoystickCamera", "vtkInteractorStyleRubberBand2D", "vtkInteractorStyleRubberBand3D", "vtkInteractorStyleRubberBandZoom", "vtkInteractorStyleTerrain", "vtkInteractorStyleTrackballActor", "vtkInteractorStyleTrackballCamera", "vtkInteractorStyleUnicam", "vtkInteractorStyleUser", ]: location[name] = "vtkInteractionStyle" # noinspection PyUnresolvedReferences from vtkmodules.vtkInteractionWidgets import ( vtkBalloonWidget, vtkBoxWidget, vtkContourWidget, vtkFocalPlanePointPlacer, vtkImplicitPlaneWidget, vtkOrientationMarkerWidget, vtkOrientedGlyphContourRepresentation, vtkPlaneWidget, vtkPolygonalSurfacePointPlacer, vtkSliderWidget, vtkSphereWidget, ) for name in [ "vtkBalloonRepresentation", "vtkBalloonWidget", "vtkBoxWidget", "vtkButtonWidget", "vtkContourWidget", "vtkPlaneWidget", "vtkFocalPlanePointPlacer", "vtkImageTracerWidget", "vtkImplicitPlaneWidget", "vtkOrientationMarkerWidget", "vtkOrientedGlyphContourRepresentation", "vtkPolygonalSurfacePointPlacer", "vtkSliderRepresentation2D", "vtkSliderRepresentation3D", "vtkSliderWidget", "vtkSphereWidget", "vtkTexturedButtonRepresentation2D", ]: location[name] = "vtkInteractionWidgets" location["vtkCameraOrientationWidget"] = "vtkInteractionWidgets" # noinspection PyUnresolvedReferences from vtkmodules.vtkRenderingAnnotation import ( vtkAxesActor, vtkAxisActor2D, vtkCaptionActor2D, vtkCornerAnnotation, vtkLegendBoxActor, vtkLegendScaleActor, vtkScalarBarActor, ) for name in [ "vtkAnnotatedCubeActor", "vtkArcPlotter", "vtkAxesActor", "vtkAxisActor2D", "vtkCaptionActor2D", "vtkCornerAnnotation", "vtkCubeAxesActor", "vtkLegendBoxActor", "vtkLegendScaleActor", "vtkPolarAxesActor", "vtkScalarBarActor", "vtkXYPlotActor", ]: location[name] = "vtkRenderingAnnotation" # noinspection PyUnresolvedReferences from vtkmodules.vtkRenderingCore import ( vtkActor, vtkActor2D, vtkAreaPicker, vtkAssembly, vtkBillboardTextActor3D, vtkCamera, vtkCoordinate, vtkDataSetMapper, vtkFlagpoleLabel, vtkFollower, vtkImageActor, vtkImageProperty, vtkImageSlice, vtkInteractorObserver, vtkLight, vtkLogLookupTable, vtkProp, vtkPropAssembly, vtkPropCollection, vtkPropPicker, vtkProperty, vtkRenderWindow, vtkRenderer, vtkRenderWindowInteractor, vtkTextActor, vtkTextProperty, vtkTexture, vtkViewport, vtkVolume, vtkVolumeProperty, ) for name in [ "vtkActor", "vtkActor2D", "vtkAreaPicker", "vtkAssembly", "vtkBillboardTextActor3D", "vtkCamera", "vtkCameraInterpolator", "vtkColorTransferFunction", "vtkCoordinate", "vtkDataSetMapper", "vtkDistanceToCamera", "vtkFlagpoleLabel", "vtkFollower", "vtkHierarchicalPolyDataMapper", "vtkImageActor", "vtkImageMapper", "vtkImageProperty", "vtkImageSlice", "vtkInteractorEventRecorder", "vtkInteractorObserver", "vtkLight", "vtkLightKit", "vtkLogLookupTable", "vtkMapper", "vtkPointGaussianMapper", "vtkPolyDataMapper", "vtkPolyDataMapper2D", "vtkProp", "vtkProp3D", "vtkPropAssembly", "vtkPropCollection", "vtkPropPicker", "vtkProperty", "vtkRenderWindow", "vtkRenderer", "vtkRenderWindowInteractor", "vtkSelectVisiblePoints", "vtkSkybox", "vtkTextActor", "vtkTextMapper", "vtkTextProperty", "vtkTextRenderer", "vtkTexture", "vtkTransformInterpolator", "vtkViewport", "vtkVolume", "vtkVolumeProperty", "vtkWindowToImageFilter", ]: location[name] = "vtkRenderingCore" location["vtkVectorText"] = "vtkRenderingFreeType" location["vtkImageResliceMapper"] = "vtkRenderingImage" location["vtkLabeledDataMapper"] = "vtkRenderingLabel" for name in [ "vtkDepthOfFieldPass", "vtkCameraPass", "vtkDualDepthPeelingPass", "vtkEquirectangularToCubeMapTexture", "vtkLightsPass", "vtkOpaquePass", "vtkOverlayPass", "vtkRenderPassCollection", "vtkSSAOPass", "vtkSequencePass", "vtkShader", "vtkShadowMapPass", "vtkTranslucentPass", "vtkVolumetricPass", ]: location[name] = "vtkRenderingOpenGL2" for name in [ "vtkFixedPointVolumeRayCastMapper", "vtkGPUVolumeRayCastMapper", ]: location[name] = "vtkRenderingVolume" ########################################################################### # https://vtk.org/doc/nightly/html/vtkCellType_8h.html cell_types = { "EMPTY_CELL": 0, "VERTEX": 1, "POLY_VERTEX": 2, "LINE": 3, "POLY_LINE": 4, "TRIANGLE": 5, "TRIANGLE_STRIP": 6, "POLYGON": 7, "PIXEL": 8, "QUAD": 9, "TETRA": 10, "VOXEL": 11, "HEXAHEDRON": 12, "WEDGE": 13, "PYRAMID": 14, "PENTAGONAL_PRISM": 15, "HEXAGONAL_PRISM": 16, "QUADRATIC_EDGE": 21, "QUADRATIC_TRIANGLE": 22, "QUADRATIC_QUAD": 23, "QUADRATIC_POLYGON": 36, "QUADRATIC_TETRA": 24, "QUADRATIC_HEXAHEDRON": 25, "QUADRATIC_WEDGE": 26, "QUADRATIC_PYRAMID": 27, "BIQUADRATIC_QUAD": 28, "TRIQUADRATIC_HEXAHEDRON": 29, "TRIQUADRATIC_PYRAMID": 37, "QUADRATIC_LINEAR_QUAD": 30, "QUADRATIC_LINEAR_WEDGE": 31, "BIQUADRATIC_QUADRATIC_WEDGE": 32, "BIQUADRATIC_QUADRATIC_HEXAHEDRON": 33, "BIQUADRATIC_TRIANGLE": 34, "CUBIC_LINE": 35, "CONVEX_POINT_SET": 41, "POLYHEDRON": 42, "PARAMETRIC_CURVE": 51, "PARAMETRIC_SURFACE": 52, "PARAMETRIC_TRI_SURFACE": 53, "PARAMETRIC_QUAD_SURFACE": 54, "PARAMETRIC_TETRA_REGION": 55, "PARAMETRIC_HEX_REGION": 56, "HIGHER_ORDER_EDGE": 60, "HIGHER_ORDER_TRIANGLE": 61, "HIGHER_ORDER_QUAD": 62, "HIGHER_ORDER_POLYGON": 63, "HIGHER_ORDER_TETRAHEDRON": 64, "HIGHER_ORDER_WEDGE": 65, "HIGHER_ORDER_PYRAMID": 66, "HIGHER_ORDER_HEXAHEDRON": 67, "LAGRANGE_CURVE": 68, "LAGRANGE_TRIANGLE": 69, "LAGRANGE_QUADRILATERAL": 70, "LAGRANGE_TETRAHEDRON": 71, "LAGRANGE_HEXAHEDRON": 72, "LAGRANGE_WEDGE": 73, "LAGRANGE_PYRAMID": 74, "BEZIER_CURVE": 75, "BEZIER_TRIANGLE": 76, "BEZIER_QUADRILATERAL": 77, "BEZIER_TETRAHEDRON": 78, "BEZIER_HEXAHEDRON": 79, "BEZIER_WEDGE": 80, "BEZIER_PYRAMID": 81, } ########################################################################### array_types = {} array_types[VTK_UNSIGNED_CHAR] = "uint8" array_types[VTK_UNSIGNED_SHORT]= "uint16" array_types[VTK_UNSIGNED_INT] = "uint32" array_types[VTK_UNSIGNED_LONG_LONG] = "uint64" array_types[VTK_CHAR] = "int8" array_types[VTK_SHORT] = "int16" array_types[VTK_INT] = "int32" # array_types[VTK_LONG] # ?? array_types[VTK_LONG_LONG] = "int64" array_types[VTK_FLOAT] = "float32" array_types[VTK_DOUBLE] = "float64" array_types[VTK_SIGNED_CHAR] = "int8" array_types[VTK_ID_TYPE] = "int64" ############ reverse aliases array_types["char"] = VTK_UNSIGNED_CHAR array_types["uint8"] = VTK_UNSIGNED_CHAR array_types["uint16"] = VTK_UNSIGNED_SHORT array_types["uint32"] = VTK_UNSIGNED_INT array_types["uint64"] = VTK_UNSIGNED_LONG_LONG array_types["int8"] = VTK_CHAR array_types["int16"] = VTK_SHORT array_types["int32"] = VTK_INT array_types["int64"] = VTK_LONG_LONG array_types["float32"] = VTK_FLOAT array_types["float64"] = VTK_DOUBLE array_types["int"] = VTK_INT array_types["float"] = VTK_FLOAT ############ reverse aliases array_types["UNSIGNED_CHAR"] = VTK_UNSIGNED_CHAR array_types["UNSIGNED_SHORT"] = VTK_UNSIGNED_SHORT array_types["UNSIGNED_INT"] = VTK_UNSIGNED_INT array_types["UNSIGNED_LONG_LONG"] = VTK_UNSIGNED_LONG_LONG array_types["CHAR"] = VTK_CHAR array_types["SHORT"] = VTK_SHORT array_types["INT"] = VTK_INT array_types["LONG"] = VTK_LONG array_types["LONG_LONG"] = VTK_LONG_LONG array_types["FLOAT"] = VTK_FLOAT array_types["DOUBLE"] = VTK_DOUBLE array_types["SIGNED_CHAR"] = VTK_SIGNED_CHAR array_types["ID_TYPE"] = VTK_ID_TYPE ######################################################### from vedo.settings import Settings if Settings.dry_run_mode < 2: # https://vtk.org/doc/nightly/html # /md__builds_gitlab_kitware_sciviz_ci_Documentation_Doxygen_PythonWrappers.html # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingOpenGL2 # noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingFreeType # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingVolumeOpenGL2 ######################################################### def cell_type_names(): """ Return a dict of cell type names. Eg. `cell_type_names[10]` returns "TETRA". """ # invert the dict above to get a lookup table for cell types return {v: k for k, v in cell_types.items()} ###################################################################### def get_class(name, module_name=""): """ Get a vtk class from its name. Example: ```python from vedo import vtkclasses as vtki print(vtkActor) print(location["vtkActor"]) print(get_class("vtkActor")) print(get_class("vtkActor", "vtkRenderingCore")) ``` """ if name and not name.lower().startswith("vtk"): name = "vtk" + name if not module_name: module_name = location[name] module_name = "vtkmodules." + module_name if module_name not in module_cache: module = import_module(module_name) module_cache[module_name] = module if name: return getattr(module_cache[module_name], name) else: return module_cache[module_name] ###################################################################### def new(cls_name, module_name=""): """ Create a new vtk object instance from its name. Example: ```python from vedo import vtkclasses as vtki a = new("Actor") ``` """ try: instance = get_class(cls_name, module_name)() except NotImplementedError as e: print(e, cls_name) return None return instance ###################################################################### def dump_hierarchy_to_file(fname=""): """ Print all available vtk classes. Dumps the list to a file named `vtkmodules__hierarchy.txt` in the current working directory. Example: ```python from vedo.vtkclasses import dump_hierarchy_to_file dump_hierarchy_to_file() ``` """ try: import pkgutil import vtkmodules from vtkmodules.all import vtkVersion ver = vtkVersion() except AttributeError: print("Unable to detect VTK version.") return major = ver.GetVTKMajorVersion() minor = ver.GetVTKMinorVersion() patch = ver.GetVTKBuildVersion() vtkvers = f"{major}.{minor}.{patch}" if not fname: fname = f"vtkmodules_{vtkvers}_hierarchy.txt" with open(fname,"w") as w: for pkg in pkgutil.walk_packages( vtkmodules.__path__, vtkmodules.__name__ + "."): try: module = import_module(pkg.name) except ImportError: continue for subitem in sorted(dir(module)): if "all" in module.__name__: continue if ".web." in module.__name__: continue if ".test." in module.__name__: continue if ".tk." in module.__name__: continue if "__" in module.__name__ or "__" in subitem: continue w.write(f"{module.__name__}.{subitem}\n") ######################################################### # print("successfully finished importing vtkmodules") #########################################################