iplotx 1.4.0__tar.gz → 1.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. {iplotx-1.4.0 → iplotx-1.4.2}/PKG-INFO +1 -1
  2. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/installing.md +9 -31
  3. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/sg_execution_times.rst +12 -3
  4. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_arcs.py +10 -5
  5. iplotx-1.4.2/gallery/other/plot_filled_edges.py +36 -0
  6. iplotx-1.4.2/gallery/other/plot_multiarc.py +24 -0
  7. iplotx-1.4.2/gallery/style/plot_edge_geometries.py +61 -0
  8. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/edge/__init__.py +1 -1
  9. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/edge/geometry.py +8 -6
  10. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/version.py +1 -1
  11. iplotx-1.4.2/tests/baseline_images/test_igraph/arcs.png +0 -0
  12. iplotx-1.4.2/tests/baseline_images/test_igraph/directed_arcs.png +0 -0
  13. iplotx-1.4.2/tests/baseline_images/test_igraph/large_arcs.png +0 -0
  14. iplotx-1.4.2/tests/baseline_images/test_igraph/multiarc45.png +0 -0
  15. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_igraph.py +30 -0
  16. iplotx-1.4.0/tests/baseline_images/test_igraph/arcs.png +0 -0
  17. iplotx-1.4.0/tests/baseline_images/test_igraph/large_arcs.png +0 -0
  18. {iplotx-1.4.0 → iplotx-1.4.2}/.github/workflows/publish.yml +0 -0
  19. {iplotx-1.4.0 → iplotx-1.4.2}/.github/workflows/test.yml +0 -0
  20. {iplotx-1.4.0 → iplotx-1.4.2}/.gitignore +0 -0
  21. {iplotx-1.4.0 → iplotx-1.4.2}/.pre-commit-config.yaml +0 -0
  22. {iplotx-1.4.0 → iplotx-1.4.2}/.readthedocs.yaml +0 -0
  23. {iplotx-1.4.0 → iplotx-1.4.2}/LICENSE +0 -0
  24. {iplotx-1.4.0 → iplotx-1.4.2}/MANIFEST.in +0 -0
  25. {iplotx-1.4.0 → iplotx-1.4.2}/README.md +0 -0
  26. {iplotx-1.4.0 → iplotx-1.4.2}/assets/pylint.svg +0 -0
  27. {iplotx-1.4.0 → iplotx-1.4.2}/docs/Makefile +0 -0
  28. {iplotx-1.4.0 → iplotx-1.4.2}/docs/make.bat +0 -0
  29. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/_static/banner.png +0 -0
  30. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/_static/custom-icons.js +0 -0
  31. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/_static/custom.css +0 -0
  32. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/_static/graph_basic.png +0 -0
  33. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/_templates/layout.html +0 -0
  34. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/api/artists.md +0 -0
  35. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/api/complete_style_specification.md +0 -0
  36. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/api/plotting.md +0 -0
  37. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/api/providers.md +0 -0
  38. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/api/style.md +0 -0
  39. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/api.md +0 -0
  40. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/code_of_conduct.rst +0 -0
  41. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/conf.py +0 -0
  42. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/images/sphx_glr_plot_basic_001.png +0 -0
  43. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/images/thumb/sphx_glr_plot_basic_thumb.png +0 -0
  44. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/index.md +0 -0
  45. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/providers.md +0 -0
  46. {iplotx-1.4.0 → iplotx-1.4.2}/docs/source/style.md +0 -0
  47. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/GALLERY_HEADER.rst +0 -0
  48. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/GALLERY_HEADER.rst +0 -0
  49. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_3d.py +0 -0
  50. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_basic.py +0 -0
  51. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_big_curves.py +0 -0
  52. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_dag.py +0 -0
  53. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_directed.py +0 -0
  54. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_grouping.py +0 -0
  55. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_house.py +0 -0
  56. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_loops.py +0 -0
  57. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/basic/plot_simple_path.py +0 -0
  58. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/GALLERY_HEADER.rst +0 -0
  59. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/data/80201010000000001.mst +0 -0
  60. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/data/GN-tree.json +0 -0
  61. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/data/breast_cancer_string_interactions_short.tsv +0 -0
  62. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/data/breast_cancer_string_network_coordinates.tsv +0 -0
  63. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/data/cell_cycle_arrest_string_interactions_short.tsv +0 -0
  64. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/data/cell_cycle_arrest_string_network_coordinates.tsv +0 -0
  65. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/data/fevo-08-588430_DataSheet1_S1.csv +0 -0
  66. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_animal_phylogeny.py +0 -0
  67. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_antibody_clone.py +0 -0
  68. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_breast_cancer_ppi.py +0 -0
  69. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_cell_cycle_arrest.py +0 -0
  70. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_food_network.py +0 -0
  71. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_foraging_table.py +0 -0
  72. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_pollinators.py +0 -0
  73. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_ppi.py +0 -0
  74. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/biology/plot_tca_cycle.py +0 -0
  75. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/GALLERY_HEADER.rst +0 -0
  76. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/data/chess_masters_WCC.pgn.bz2 +0 -0
  77. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/data/knuth_miles.txt.gz +0 -0
  78. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_arrowlawn.py +0 -0
  79. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_chess_masters.py +0 -0
  80. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_cliques.py +0 -0
  81. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_cluster_layout.py +0 -0
  82. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_company_structure.py +0 -0
  83. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_complex.py +0 -0
  84. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_financial_network.py +0 -0
  85. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_knuth_miles.py +0 -0
  86. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_labels_and_colors.py +0 -0
  87. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_max_bipartite_matching.py +0 -0
  88. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_minimum_spanning_trees.py +0 -0
  89. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_multipartite_layout.py +0 -0
  90. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_parallel_igraph_networkx.py +0 -0
  91. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_redblack.py +0 -0
  92. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_shortest_path.py +0 -0
  93. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_simple_networkx.py +0 -0
  94. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_social_network_circles.py +0 -0
  95. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_traveling_salesman.py +0 -0
  96. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/network_science/plot_with_colorbar.py +0 -0
  97. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/other/GALLERY_HEADER.rst +0 -0
  98. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/other/plot_animation.py +0 -0
  99. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/other/plot_edit_artists.py +0 -0
  100. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/other/plot_feedbacks.py +0 -0
  101. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/other/plot_graph.py +0 -0
  102. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/other/plot_mouse_hover.py +0 -0
  103. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/other/plot_train.py +0 -0
  104. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/GALLERY_HEADER.rst +0 -0
  105. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_arrows.py +0 -0
  106. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_depthshade.py +0 -0
  107. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_edgepadding.py +0 -0
  108. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_elements.py +0 -0
  109. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_four_grids.py +0 -0
  110. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_halfarrows.py +0 -0
  111. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_multistyle.py +0 -0
  112. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_ports.py +0 -0
  113. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_style.py +0 -0
  114. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_tension.py +0 -0
  115. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_vertexmarkers.py +0 -0
  116. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_voronoi.py +0 -0
  117. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/style/plot_waypoints.py +0 -0
  118. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/GALLERY_HEADER.rst +0 -0
  119. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/data/tree-with-support.json +0 -0
  120. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_angular_waypoints.py +0 -0
  121. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_biopython_tree.py +0 -0
  122. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_cladeedges.py +0 -0
  123. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_cogent3_layouts.py +0 -0
  124. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_cogent3_tree.py +0 -0
  125. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_dendropy.py +0 -0
  126. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_double_tree.py +0 -0
  127. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_elements_tree.py +0 -0
  128. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_equalangle.py +0 -0
  129. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_ete4.py +0 -0
  130. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_leafedges.py +0 -0
  131. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_leafedges_and_cascades.py +0 -0
  132. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_scalebar.py +0 -0
  133. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_skbio_tree.py +0 -0
  134. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_split_edges.py +0 -0
  135. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_style_tree.py +0 -0
  136. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_support.py +0 -0
  137. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_tree_node_background.py +0 -0
  138. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_tree_style_clades.py +0 -0
  139. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/tree/plot_trees_of_trees.py +0 -0
  140. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/zero_dependency/GALLERY_HEADER.rst +0 -0
  141. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/zero_dependency/plot_simplenetworkdataprovider.py +0 -0
  142. {iplotx-1.4.0 → iplotx-1.4.2}/gallery/zero_dependency/plot_simpletreedataprovider.py +0 -0
  143. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/__init__.py +0 -0
  144. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/art3d/edge/__init__.py +0 -0
  145. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/art3d/edge/arrow.py +0 -0
  146. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/art3d/edge/geometry.py +0 -0
  147. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/art3d/vertex.py +0 -0
  148. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/artists.py +0 -0
  149. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/edge/arrow.py +0 -0
  150. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/edge/leaf.py +0 -0
  151. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/edge/ports.py +0 -0
  152. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/__init__.py +0 -0
  153. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/heuristics.py +0 -0
  154. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/network/graph_tool.py +0 -0
  155. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/network/igraph.py +0 -0
  156. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/network/networkx.py +0 -0
  157. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/network/simple.py +0 -0
  158. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/tree/biopython.py +0 -0
  159. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/tree/cogent3.py +0 -0
  160. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/tree/dendropy.py +0 -0
  161. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/tree/ete4.py +0 -0
  162. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/tree/simple.py +0 -0
  163. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/providers/tree/skbio.py +0 -0
  164. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/ingest/typing.py +0 -0
  165. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/label.py +0 -0
  166. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/layout/__init__.py +0 -0
  167. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/layout/tree/__init__.py +0 -0
  168. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/layout/tree/rooted.py +0 -0
  169. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/layout/tree/unrooted.py +0 -0
  170. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/network/__init__.py +0 -0
  171. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/network/groups.py +0 -0
  172. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/plotting.py +0 -0
  173. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/style/__init__.py +0 -0
  174. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/style/leaf_info.py +0 -0
  175. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/style/library.py +0 -0
  176. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/tree/__init__.py +0 -0
  177. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/tree/cascades.py +0 -0
  178. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/tree/scalebar.py +0 -0
  179. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/typing.py +0 -0
  180. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/utils/geometry.py +0 -0
  181. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/utils/internal.py +0 -0
  182. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/utils/matplotlib.py +0 -0
  183. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/utils/style.py +0 -0
  184. {iplotx-1.4.0 → iplotx-1.4.2}/iplotx/vertex.py +0 -0
  185. {iplotx-1.4.0 → iplotx-1.4.2}/pyproject.toml +0 -0
  186. {iplotx-1.4.0 → iplotx-1.4.2}/scripts/copy_github_release_into_version.sh +0 -0
  187. {iplotx-1.4.0 → iplotx-1.4.2}/scripts/make_banner.py +0 -0
  188. {iplotx-1.4.0 → iplotx-1.4.2}/scripts/update_pylint_badge.sh +0 -0
  189. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_biopython/cascades.png +0 -0
  190. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_biopython/directed_child.png +0 -0
  191. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_biopython/leaf_labels.png +0 -0
  192. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_biopython/leaf_labels_hmargin.png +0 -0
  193. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_biopython/leafedges.png +0 -0
  194. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_biopython/show_support.png +0 -0
  195. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_biopython/tree_basic.png +0 -0
  196. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_biopython/tree_radial.png +0 -0
  197. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_cogent3/leaf_labels.png +0 -0
  198. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_cogent3/leaf_labels_hmargin.png +0 -0
  199. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_cogent3/tree_basic.png +0 -0
  200. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_cogent3/tree_radial.png +0 -0
  201. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_dendropy/cascades.png +0 -0
  202. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_dendropy/directed_child.png +0 -0
  203. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_dendropy/leaf_labels.png +0 -0
  204. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_dendropy/leaf_labels_hmargin.png +0 -0
  205. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_dendropy/leafedges.png +0 -0
  206. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_dendropy/tree_basic.png +0 -0
  207. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_dendropy/tree_radial.png +0 -0
  208. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_doubletree/tree_gap.png +0 -0
  209. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_doubletree/tree_nogap.png +0 -0
  210. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_ete4/equalangle_layout.png +0 -0
  211. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_ete4/leaf_labels.png +0 -0
  212. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_ete4/leaf_labels_hmargin.png +0 -0
  213. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_ete4/split_edges.png +0 -0
  214. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_ete4/tree_basic.png +0 -0
  215. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_ete4/tree_radial.png +0 -0
  216. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_graph_tool/graph_basic.png +0 -0
  217. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_graph_tool/graph_directed.png +0 -0
  218. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/clustering_directed.png +0 -0
  219. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/clustering_directed_large.png +0 -0
  220. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_basic.png +0 -0
  221. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_directed.png +0 -0
  222. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_directed_curved_loops.png +0 -0
  223. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_edit_children.png +0 -0
  224. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_labels.png +0 -0
  225. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_layout_attribute.png +0 -0
  226. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_null.png +0 -0
  227. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_squares_directed.png +0 -0
  228. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_vertexsize.png +0 -0
  229. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/graph_with_curved_edges.png +0 -0
  230. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/igraph_layout_object.png +0 -0
  231. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph/multigraph_with_curved_edges_undirected.png +0 -0
  232. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph_3d/directed.png +0 -0
  233. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph_3d/undirected.png +0 -0
  234. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_igraph_3d/vertex_labels.png +0 -0
  235. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/cluster-layout.png +0 -0
  236. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/complex.png +0 -0
  237. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/complex_rotatelabels.png +0 -0
  238. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/directed_graph.png +0 -0
  239. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/directed_graph_with_colorbar.png +0 -0
  240. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/empty_graph.png +0 -0
  241. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/flat_style.png +0 -0
  242. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/house_with_colors.png +0 -0
  243. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/labels_and_colors.png +0 -0
  244. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/shortest_path.png +0 -0
  245. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_networkx/simple_graph.png +0 -0
  246. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_simple_network_provider/graph_basic.png +0 -0
  247. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_simple_network_provider/graph_directed.png +0 -0
  248. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_simple_network_provider/graph_labels.png +0 -0
  249. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_skbio/leaf_labels.png +0 -0
  250. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_skbio/leaf_labels_hmargin.png +0 -0
  251. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_skbio/tree_basic.png +0 -0
  252. {iplotx-1.4.0 → iplotx-1.4.2}/tests/baseline_images/test_skbio/tree_radial.png +0 -0
  253. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_arrows.py +0 -0
  254. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_biopython.py +0 -0
  255. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_cascades.py +0 -0
  256. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_cogent3.py +0 -0
  257. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_dendropy.py +0 -0
  258. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_doubletree.py +0 -0
  259. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_edge.py +0 -0
  260. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_edge_geometry.py +0 -0
  261. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_ete4.py +0 -0
  262. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_geometry.py +0 -0
  263. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_graph_tool.py +0 -0
  264. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_heuristics.py +0 -0
  265. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_igraph_3d.py +0 -0
  266. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_ingest_protocols.py +0 -0
  267. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_matplotlib_utils.py +0 -0
  268. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_network_hotload.py +0 -0
  269. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_networkx.py +0 -0
  270. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_ports.py +0 -0
  271. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_simple_network_provider.py +0 -0
  272. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_simple_tree_provider.py +0 -0
  273. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_skbio.py +0 -0
  274. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_style.py +0 -0
  275. {iplotx-1.4.0 → iplotx-1.4.2}/tests/test_vertex.py +0 -0
  276. {iplotx-1.4.0 → iplotx-1.4.2}/tests/utils.py +0 -0
  277. {iplotx-1.4.0 → iplotx-1.4.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iplotx
3
- Version: 1.4.0
3
+ Version: 1.4.2
4
4
  Summary: Plot networkx from igraph and networkx.
5
5
  Project-URL: Homepage, https://github.com/fabilab/iplotx
6
6
  Project-URL: Documentation, https://readthedocs.org/iplotx
@@ -11,13 +11,11 @@ pip install iplotx
11
11
 
12
12
  ```
13
13
  import igraph as ig
14
- import matplotlib.pyplot as plt
15
14
  import iplotx as ipx
16
15
 
17
16
  g = ig.Graph.Ring(5)
18
17
  layout = g.layout("circle").coords
19
- fig, ax = plt.subplots(figsize=(3, 3))
20
- ipx.plot(g, ax=ax, layout=layout)
18
+ ipx.network(g, layout)
21
19
  ```
22
20
 
23
21
 
@@ -27,13 +25,11 @@ ipx.plot(g, ax=ax, layout=layout)
27
25
  :::{tab-item} networkx
28
26
  ```
29
27
  import networkx as nx
30
- import matplotlib.pyplot as plt
31
28
  import iplotx as ipx
32
29
 
33
30
  g = nx.Graph([(0, 1), (1, 2), (2, 3), (3, 4), (4, 0)])
34
31
  layout = nx.layout.circular_layout(g)
35
- fig, ax = plt.subplots(figsize=(3, 3))
36
- ipx.plot(g, ax=ax, layout=layout)
32
+ ipx.network(g, layout)
37
33
  ```
38
34
 
39
35
  :::
@@ -44,9 +40,6 @@ Either way, the result is the same:
44
40
 
45
41
  ![graph_basic](_static/graph_basic.png)
46
42
 
47
- ## Gallery
48
- See <project:gallery/index.rst> for examples of plots made with `iplotx`. Feel free to suggest new examples on GitHub by opening a new issue or pull request!
49
-
50
43
  ## Features
51
44
  `iplotx`'s features' include:
52
45
  - per-edge and per-vertex styling using sequences or dictionaries
@@ -72,32 +65,17 @@ See <project:gallery/index.rst> for examples of plots made with `iplotx`. Feel f
72
65
  - animations (see <project:gallery/other/plot_animation.rst>)
73
66
  - 3D visualisations
74
67
  - mouse/keyboard interaction and events (e.g. hover, click, see <project:gallery/other/plot_mouse_hover.rst>)
75
- - ... and probably more by the time you read this.
68
+ - ... and many more.
76
69
 
77
- ## Styles
78
- `iplotx` is designed to produce publication-quality figures using **styles**, which are dictionaries specifying the visual properties of each graph element, including vertices, edges, arrows, labels, and groupings.
70
+ ## Rationale
71
+ We believe graph **analysis**, graph **layouting**, and graph **visualisation** to be three separate tasks. `iplotx` currently focuses on visualisation. It can also compute simple tree layouts and might expand towards network layouts in the future.
79
72
 
80
- An example of style specification is as follows:
73
+ ## Citation
74
+ If you use `iplotx` for publication figures, please cite the [zenodo preprint](https://doi.org/10.5281/zenodo.16599333):
81
75
 
82
- ```python
83
- import iplotx as ipx
84
- with ipx.style.context({
85
- 'vertex': {
86
- 'size': 30,
87
- 'facecolor': 'red',
88
- 'edgecolor': 'none',
89
- }
90
- }):
91
- ipx.plot(...)
92
76
  ```
93
-
94
- See <project:style.md> for more info.
95
-
96
- ## Reference API
97
- See <project:api.md> for reference documentation of all functions and classes in `iplotx`.
98
-
99
- ## Rationale
100
- We believe graph **analysis**, graph **layouting**, and graph **visualisation** to be three separate tasks. `iplotx` currently focuses on visualisation. It can also compute simple tree layouts and might expand towards network layouts in the future.
77
+ F. Zanini. (2025). Unified network visualisation in Python. Zenodo [PREPRINT]. https://doi.org/10.5281/zenodo.16599333
78
+ ```
101
79
 
102
80
  ## Contributing
103
81
  Open an [issue on GitHub](https://github.com/fabilab/iplotx/issues) to request features, report bugs, or show intention in contributing. Pull requests are very welcome.
@@ -6,7 +6,7 @@
6
6
 
7
7
  Computation times
8
8
  =================
9
- **00:00.117** total execution time for 79 files **from all galleries**:
9
+ **00:00.092** total execution time for 82 files **from all galleries**:
10
10
 
11
11
  .. container::
12
12
 
@@ -32,12 +32,18 @@ Computation times
32
32
  * - Example
33
33
  - Time
34
34
  - Mem (MB)
35
- * - :ref:`sphx_glr_gallery_basic_plot_arcs.py` (``../../gallery/basic/plot_arcs.py``)
36
- - 00:00.117
35
+ * - :ref:`sphx_glr_gallery_other_plot_multiarc.py` (``../../gallery/other/plot_multiarc.py``)
36
+ - 00:00.060
37
+ - 0.0
38
+ * - :ref:`sphx_glr_gallery_other_plot_filled_edges.py` (``../../gallery/other/plot_filled_edges.py``)
39
+ - 00:00.032
37
40
  - 0.0
38
41
  * - :ref:`sphx_glr_gallery_basic_plot_3d.py` (``../../gallery/basic/plot_3d.py``)
39
42
  - 00:00.000
40
43
  - 0.0
44
+ * - :ref:`sphx_glr_gallery_basic_plot_arcs.py` (``../../gallery/basic/plot_arcs.py``)
45
+ - 00:00.000
46
+ - 0.0
41
47
  * - :ref:`sphx_glr_gallery_basic_plot_basic.py` (``../../gallery/basic/plot_basic.py``)
42
48
  - 00:00.000
43
49
  - 0.0
@@ -170,6 +176,9 @@ Computation times
170
176
  * - :ref:`sphx_glr_gallery_style_plot_depthshade.py` (``../../gallery/style/plot_depthshade.py``)
171
177
  - 00:00.000
172
178
  - 0.0
179
+ * - :ref:`sphx_glr_gallery_style_plot_edge_geometries.py` (``../../gallery/style/plot_edge_geometries.py``)
180
+ - 00:00.000
181
+ - 0.0
173
182
  * - :ref:`sphx_glr_gallery_style_plot_edgepadding.py` (``../../gallery/style/plot_edgepadding.py``)
174
183
  - 00:00.000
175
184
  - 0.0
@@ -23,11 +23,8 @@ ipx.plot(
23
23
  )
24
24
 
25
25
  # %%
26
- # ..tip::
27
- # Specifically, tension is defined as the tangent of the quarter of the angle spanned by the arc. A tension of 0 gives
28
- # a straight line, a tension of 1 gives a semicircle, and higher tensions give increasingly larger arcs. A tension of
29
- # infinity would give you a straight line away from the target vertex, but is not accepted by the library. Negative
30
- # tensions result in arcs curving in the opposite direction.
26
+ #
27
+ # Other values of tension can be used to create different arc shapes:
31
28
 
32
29
  fig, axs = plt.subplots(2, 2, figsize=(8, 8))
33
30
  for tension, ax in zip([0.5, 2.5, -0.5, -2.5], axs.ravel()):
@@ -40,3 +37,11 @@ for tension, ax in zip([0.5, 2.5, -0.5, -2.5], axs.ravel()):
40
37
  margins=0.15,
41
38
  title=f"Edge tension = {tension:.2f}",
42
39
  )
40
+
41
+ # %%
42
+ # .. tip::
43
+ # Tension is defined as the tangent of the quarter of the angle spanned by the arc. A tension of 0 gives
44
+ # a straight line, a tension of 1 gives a semicircle, and higher tensions give increasingly larger arcs. A tension of
45
+ # infinity would give you a straight line away from the target vertex, but is not accepted by the library. Negative
46
+ # tensions result in arcs curving in the opposite direction.
47
+ #
@@ -0,0 +1,36 @@
1
+ """
2
+ Filled edges
3
+ ============
4
+
5
+ Most of the time edges have no "filling", but what if they did? Then you would
6
+ get this crazy example.
7
+
8
+ .. tip::
9
+ Edges are not supposed to be filled, use at your own risk!
10
+ """
11
+
12
+ import networkx as nx
13
+ import matplotlib.pyplot as plt
14
+ import iplotx as ipx
15
+
16
+ g = nx.Graph()
17
+ g.add_edges_from([(0, 1), (1, 2), (0, 2)])
18
+
19
+ layout = [(0, 0), (1, 0), (2, 0)]
20
+
21
+ artist = ipx.network(
22
+ g,
23
+ layout,
24
+ edge_arc=True,
25
+ edge_tension=-1,
26
+ vertex_facecolor="#005F73",
27
+ vertex_edgecolor="#001219",
28
+ vertex_linewidth=2,
29
+ )[0]
30
+
31
+ edge_artist = artist.get_edges()
32
+ edge_artist.set_facecolors([
33
+ "#94D2BD66",
34
+ "#EE9B0066",
35
+ "#AE201266",
36
+ ])
@@ -0,0 +1,24 @@
1
+ """
2
+ Multiarc
3
+ ========
4
+
5
+ This example shows how to plot a bunch of arcs.
6
+ """
7
+
8
+ import igraph as ig
9
+ import matplotlib.pyplot as plt
10
+ import iplotx as ipx
11
+
12
+ g = ig.Graph.Ring(4, directed=True)
13
+ layout = [[1, 0], [0, 1], [-1, 0], [0, -1]]
14
+
15
+ ipx.network(
16
+ g,
17
+ layout,
18
+ vertex_labels=True,
19
+ aspect=1,
20
+ edge_tension=1,
21
+ edge_arc=True,
22
+ edge_arrow={"marker": ">","width": 6},
23
+ edge_linewidth=3,
24
+ )
@@ -0,0 +1,61 @@
1
+ """
2
+ Edge geometries
3
+ ===============
4
+
5
+ This example shows how to use edge geometries and tension to achieve different visualisation styles.
6
+ """
7
+
8
+
9
+ import igraph as ig
10
+ import matplotlib.pyplot as plt
11
+ import iplotx as ipx
12
+
13
+
14
+ g = ig.Graph.Full(2)
15
+ layout = [[0, 0], [1, 0]]
16
+
17
+ fig, axs = plt.subplots(3, 3, figsize=(6, 6), sharex=True, sharey=True)
18
+ tensions = [
19
+ [1, 5, 10],
20
+ [0.2, 1, 2],
21
+ ]
22
+ for edge_arc, axrow, tensionrow in zip([False, True], axs, tensions):
23
+ kwargs = {}
24
+ if not edge_arc:
25
+ kwargs["edge_curved"] = True
26
+ for tension, ax in zip(tensionrow, axrow):
27
+ ipx.plot(
28
+ g,
29
+ layout=layout,
30
+ ax=ax,
31
+ edge_arc=edge_arc,
32
+ edge_tension=tension,
33
+ title=f"Tension {tension:.1f}",
34
+ node_size=10,
35
+ **kwargs,
36
+ )
37
+ axs[0, 0].set_ylabel("Bezier", fontsize=12)
38
+ axs[1, 0].set_ylabel("Arc", fontsize=12)
39
+ ipx.plot(
40
+ g,
41
+ layout,
42
+ ax=axs[2, 0],
43
+ node_size=10,
44
+ )
45
+ axs[2, 0].set_ylabel("Straight", fontsize=12)
46
+ ipx.plot(
47
+ g,
48
+ layout,
49
+ ax=axs[2, 1],
50
+ node_size=10,
51
+ edge_waypoints=[[0.5, -0.15]],
52
+ )
53
+ ipx.plot(
54
+ g,
55
+ layout,
56
+ ax=axs[2, 2],
57
+ node_size=10,
58
+ edge_waypoints=[[[0.25, -0.15], [0.75, -0.15]]],
59
+ )
60
+ axs[2, 1].set_ylabel("Waypoints", fontsize=12)
61
+ fig.tight_layout()
@@ -453,7 +453,7 @@ class EdgeCollection(mpl.collections.PatchCollection):
453
453
  # If none found, empty the dictionary already
454
454
  if (len(parallel_edges) == 0) or (max(parallel_edges.values(), key=len) == 1):
455
455
  parallel_edges = {}
456
- if not self._style.get("curved", False):
456
+ if (not self._style.get("curved", False)) and (not self._style.get("arc", False)):
457
457
  while len(parallel_edges) > 0:
458
458
  (v1, v2), indices = parallel_edges.popitem()
459
459
  indices_inv = parallel_edges.pop((v2, v1), [])
@@ -466,15 +466,17 @@ def _compute_edge_path_arc(
466
466
  )
467
467
  angle_start = atan2(*(vs[0] - center)[::-1])
468
468
  angle_end = atan2(*(vs[1] - center)[::-1])
469
- if (np.abs(tension) > 1) and (np.abs(angle_end - angle_start) < np.pi):
470
- if angle_end > angle_start:
471
- angle_start += 2 * np.pi
472
- else:
473
- angle_end += 2 * np.pi
469
+
470
+ # Figure out how to draw the correct arc of the two
471
+ if (tension > 0) and (angle_end < angle_start):
472
+ angle_end += 2 * np.pi
473
+ elif (tension < 0) and (angle_end > angle_start):
474
+ angle_start += 2 * np.pi
475
+
474
476
  # print(f"angle_start: {np.degrees(angle_start):.2f}")
475
477
  # print(f"angle_end: {np.degrees(angle_end):.2f}")
476
478
 
477
- naux = 30
479
+ naux = max(30, int(np.ceil(np.degrees(np.abs(angle_end - angle_start)))) // 3)
478
480
  angles = np.linspace(angle_start, angle_end, naux + 2)[1:-1]
479
481
  auxs = center + np.array([np.cos(angles), np.sin(angles)]).T * np.linalg.norm(
480
482
  vs[0] - center
@@ -2,4 +2,4 @@
2
2
  iplotx version information module.
3
3
  """
4
4
 
5
- __version__ = "1.4.0"
5
+ __version__ = "1.4.2"
@@ -233,6 +233,36 @@ class GraphTestRunner(unittest.TestCase):
233
233
  margins=0.2,
234
234
  )
235
235
 
236
+ @image_comparison(baseline_images=["directed_arcs"])
237
+ def test_directed_arcs(self):
238
+ g = ig.Graph.Full(4, directed=True)
239
+ layout = [[0, 0], [1, 0], [2, 0], [3, 0]]
240
+
241
+ fig, ax = plt.subplots()
242
+ ipx.graph(
243
+ g,
244
+ layout=layout,
245
+ ax=ax,
246
+ edge_arc=True,
247
+ edge_tension=-3,
248
+ margins=0.2,
249
+ )
250
+
251
+ @image_comparison(baseline_images=["multiarc45"])
252
+ def test_multiarc(self):
253
+ g = ig.Graph.Ring(4, directed=True)
254
+ layout = [[1, 0], [0, 1], [-1, 0], [0, -1]]
255
+
256
+ fig, ax = plt.subplots()
257
+ ipx.graph(
258
+ g,
259
+ layout,
260
+ ax=ax,
261
+ edge_arc=True,
262
+ edge_tension=1,
263
+ aspect=1,
264
+ )
265
+
236
266
 
237
267
  class ClusteringTestRunner(unittest.TestCase):
238
268
  @property
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes