annet 0.16.21__tar.gz → 0.16.23__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.

Potentially problematic release.


This version of annet might be problematic. Click here for more details.

Files changed (180) hide show
  1. {annet-0.16.21/annet.egg-info → annet-0.16.23}/PKG-INFO +1 -1
  2. {annet-0.16.21 → annet-0.16.23}/README.md +1 -1
  3. {annet-0.16.21 → annet-0.16.23}/annet/annlib/tabparser.py +31 -10
  4. {annet-0.16.21 → annet-0.16.23}/annet/tabparser.py +10 -1
  5. {annet-0.16.21 → annet-0.16.23/annet.egg-info}/PKG-INFO +1 -1
  6. {annet-0.16.21 → annet-0.16.23}/AUTHORS +0 -0
  7. {annet-0.16.21 → annet-0.16.23}/LICENSE +0 -0
  8. {annet-0.16.21 → annet-0.16.23}/MANIFEST.in +0 -0
  9. {annet-0.16.21 → annet-0.16.23}/annet/__init__.py +0 -0
  10. {annet-0.16.21 → annet-0.16.23}/annet/adapters/__init__.py +0 -0
  11. {annet-0.16.21 → annet-0.16.23}/annet/adapters/fetchers/__init__.py +0 -0
  12. {annet-0.16.21 → annet-0.16.23}/annet/adapters/fetchers/stub/__init__.py +0 -0
  13. {annet-0.16.21 → annet-0.16.23}/annet/adapters/fetchers/stub/fetcher.py +0 -0
  14. {annet-0.16.21 → annet-0.16.23}/annet/adapters/file/__init__.py +0 -0
  15. {annet-0.16.21 → annet-0.16.23}/annet/adapters/file/provider.py +0 -0
  16. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/__init__.py +0 -0
  17. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/common/__init__.py +0 -0
  18. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/common/client.py +0 -0
  19. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/common/manufacturer.py +0 -0
  20. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/common/models.py +0 -0
  21. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/common/query.py +0 -0
  22. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/common/status_client.py +0 -0
  23. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/common/storage_opts.py +0 -0
  24. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/provider.py +0 -0
  25. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/v24/__init__.py +0 -0
  26. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/v24/storage.py +0 -0
  27. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/v37/__init__.py +0 -0
  28. {annet-0.16.21 → annet-0.16.23}/annet/adapters/netbox/v37/storage.py +0 -0
  29. {annet-0.16.21 → annet-0.16.23}/annet/annet.py +0 -0
  30. {annet-0.16.21 → annet-0.16.23}/annet/annlib/__init__.py +0 -0
  31. {annet-0.16.21 → annet-0.16.23}/annet/annlib/command.py +0 -0
  32. {annet-0.16.21 → annet-0.16.23}/annet/annlib/diff.py +0 -0
  33. {annet-0.16.21 → annet-0.16.23}/annet/annlib/errors.py +0 -0
  34. {annet-0.16.21 → annet-0.16.23}/annet/annlib/filter_acl.py +0 -0
  35. {annet-0.16.21 → annet-0.16.23}/annet/annlib/jsontools.py +0 -0
  36. {annet-0.16.21 → annet-0.16.23}/annet/annlib/lib.py +0 -0
  37. {annet-0.16.21 → annet-0.16.23}/annet/annlib/netdev/__init__.py +0 -0
  38. {annet-0.16.21 → annet-0.16.23}/annet/annlib/netdev/db.py +0 -0
  39. {annet-0.16.21 → annet-0.16.23}/annet/annlib/netdev/devdb/__init__.py +0 -0
  40. {annet-0.16.21 → annet-0.16.23}/annet/annlib/netdev/devdb/data/devdb.json +0 -0
  41. {annet-0.16.21 → annet-0.16.23}/annet/annlib/netdev/views/__init__.py +0 -0
  42. {annet-0.16.21 → annet-0.16.23}/annet/annlib/netdev/views/dump.py +0 -0
  43. {annet-0.16.21 → annet-0.16.23}/annet/annlib/netdev/views/hardware.py +0 -0
  44. {annet-0.16.21 → annet-0.16.23}/annet/annlib/output.py +0 -0
  45. {annet-0.16.21 → annet-0.16.23}/annet/annlib/patching.py +0 -0
  46. {annet-0.16.21 → annet-0.16.23}/annet/annlib/rbparser/__init__.py +0 -0
  47. {annet-0.16.21 → annet-0.16.23}/annet/annlib/rbparser/acl.py +0 -0
  48. {annet-0.16.21 → annet-0.16.23}/annet/annlib/rbparser/deploying.py +0 -0
  49. {annet-0.16.21 → annet-0.16.23}/annet/annlib/rbparser/ordering.py +0 -0
  50. {annet-0.16.21 → annet-0.16.23}/annet/annlib/rbparser/platform.py +0 -0
  51. {annet-0.16.21 → annet-0.16.23}/annet/annlib/rbparser/syntax.py +0 -0
  52. {annet-0.16.21 → annet-0.16.23}/annet/annlib/rulebook/__init__.py +0 -0
  53. {annet-0.16.21 → annet-0.16.23}/annet/annlib/rulebook/common.py +0 -0
  54. {annet-0.16.21 → annet-0.16.23}/annet/annlib/types.py +0 -0
  55. {annet-0.16.21 → annet-0.16.23}/annet/api/__init__.py +0 -0
  56. {annet-0.16.21 → annet-0.16.23}/annet/argparse.py +0 -0
  57. {annet-0.16.21 → annet-0.16.23}/annet/bgp_models.py +0 -0
  58. {annet-0.16.21 → annet-0.16.23}/annet/cli.py +0 -0
  59. {annet-0.16.21 → annet-0.16.23}/annet/cli_args.py +0 -0
  60. {annet-0.16.21 → annet-0.16.23}/annet/configs/context.yml +0 -0
  61. {annet-0.16.21 → annet-0.16.23}/annet/configs/logging.yaml +0 -0
  62. {annet-0.16.21 → annet-0.16.23}/annet/connectors.py +0 -0
  63. {annet-0.16.21 → annet-0.16.23}/annet/deploy.py +0 -0
  64. {annet-0.16.21 → annet-0.16.23}/annet/diff.py +0 -0
  65. {annet-0.16.21 → annet-0.16.23}/annet/executor.py +0 -0
  66. {annet-0.16.21 → annet-0.16.23}/annet/filtering.py +0 -0
  67. {annet-0.16.21 → annet-0.16.23}/annet/gen.py +0 -0
  68. {annet-0.16.21 → annet-0.16.23}/annet/generators/__init__.py +0 -0
  69. {annet-0.16.21 → annet-0.16.23}/annet/generators/base.py +0 -0
  70. {annet-0.16.21 → annet-0.16.23}/annet/generators/common/__init__.py +0 -0
  71. {annet-0.16.21 → annet-0.16.23}/annet/generators/common/initial.py +0 -0
  72. {annet-0.16.21 → annet-0.16.23}/annet/generators/entire.py +0 -0
  73. {annet-0.16.21 → annet-0.16.23}/annet/generators/exceptions.py +0 -0
  74. {annet-0.16.21 → annet-0.16.23}/annet/generators/jsonfragment.py +0 -0
  75. {annet-0.16.21 → annet-0.16.23}/annet/generators/partial.py +0 -0
  76. {annet-0.16.21 → annet-0.16.23}/annet/generators/perf.py +0 -0
  77. {annet-0.16.21 → annet-0.16.23}/annet/generators/ref.py +0 -0
  78. {annet-0.16.21 → annet-0.16.23}/annet/generators/result.py +0 -0
  79. {annet-0.16.21 → annet-0.16.23}/annet/hardware.py +0 -0
  80. {annet-0.16.21 → annet-0.16.23}/annet/implicit.py +0 -0
  81. {annet-0.16.21 → annet-0.16.23}/annet/lib.py +0 -0
  82. {annet-0.16.21 → annet-0.16.23}/annet/mesh/__init__.py +0 -0
  83. {annet-0.16.21 → annet-0.16.23}/annet/mesh/basemodel.py +0 -0
  84. {annet-0.16.21 → annet-0.16.23}/annet/mesh/device_models.py +0 -0
  85. {annet-0.16.21 → annet-0.16.23}/annet/mesh/executor.py +0 -0
  86. {annet-0.16.21 → annet-0.16.23}/annet/mesh/match_args.py +0 -0
  87. {annet-0.16.21 → annet-0.16.23}/annet/mesh/models_converter.py +0 -0
  88. {annet-0.16.21 → annet-0.16.23}/annet/mesh/peer_models.py +0 -0
  89. {annet-0.16.21 → annet-0.16.23}/annet/mesh/registry.py +0 -0
  90. {annet-0.16.21 → annet-0.16.23}/annet/output.py +0 -0
  91. {annet-0.16.21 → annet-0.16.23}/annet/parallel.py +0 -0
  92. {annet-0.16.21 → annet-0.16.23}/annet/patching.py +0 -0
  93. {annet-0.16.21 → annet-0.16.23}/annet/reference.py +0 -0
  94. {annet-0.16.21 → annet-0.16.23}/annet/rpl/__init__.py +0 -0
  95. {annet-0.16.21 → annet-0.16.23}/annet/rpl/action.py +0 -0
  96. {annet-0.16.21 → annet-0.16.23}/annet/rpl/condition.py +0 -0
  97. {annet-0.16.21 → annet-0.16.23}/annet/rpl/match_builder.py +0 -0
  98. {annet-0.16.21 → annet-0.16.23}/annet/rpl/policy.py +0 -0
  99. {annet-0.16.21 → annet-0.16.23}/annet/rpl/result.py +0 -0
  100. {annet-0.16.21 → annet-0.16.23}/annet/rpl/routemap.py +0 -0
  101. {annet-0.16.21 → annet-0.16.23}/annet/rpl/statement_builder.py +0 -0
  102. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/__init__.py +0 -0
  103. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/arista/__init__.py +0 -0
  104. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/arista/iface.py +0 -0
  105. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/aruba/__init__.py +0 -0
  106. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/aruba/ap_env.py +0 -0
  107. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/aruba/misc.py +0 -0
  108. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/b4com/__init__.py +0 -0
  109. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/b4com/file.py +0 -0
  110. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/cisco/__init__.py +0 -0
  111. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/cisco/iface.py +0 -0
  112. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/cisco/misc.py +0 -0
  113. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/cisco/vlandb.py +0 -0
  114. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/common.py +0 -0
  115. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/deploying.py +0 -0
  116. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/huawei/__init__.py +0 -0
  117. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/huawei/aaa.py +0 -0
  118. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/huawei/bgp.py +0 -0
  119. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/huawei/iface.py +0 -0
  120. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/huawei/misc.py +0 -0
  121. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/huawei/vlandb.py +0 -0
  122. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/juniper/__init__.py +0 -0
  123. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/nexus/__init__.py +0 -0
  124. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/nexus/iface.py +0 -0
  125. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/patching.py +0 -0
  126. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/ribbon/__init__.py +0 -0
  127. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/routeros/__init__.py +0 -0
  128. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/routeros/file.py +0 -0
  129. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/arista.deploy +0 -0
  130. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/arista.order +0 -0
  131. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/arista.rul +0 -0
  132. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/aruba.deploy +0 -0
  133. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/aruba.order +0 -0
  134. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/aruba.rul +0 -0
  135. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/b4com.deploy +0 -0
  136. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/b4com.order +0 -0
  137. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/b4com.rul +0 -0
  138. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/cisco.deploy +0 -0
  139. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/cisco.order +0 -0
  140. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/cisco.rul +0 -0
  141. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/huawei.deploy +0 -0
  142. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/huawei.order +0 -0
  143. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/huawei.rul +0 -0
  144. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/juniper.rul +0 -0
  145. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/nexus.deploy +0 -0
  146. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/nexus.order +0 -0
  147. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/nexus.rul +0 -0
  148. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/nokia.rul +0 -0
  149. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/optixtrans.deploy +0 -0
  150. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/optixtrans.order +0 -0
  151. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/optixtrans.rul +0 -0
  152. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/pc.deploy +0 -0
  153. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/pc.order +0 -0
  154. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/pc.rul +0 -0
  155. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/ribbon.deploy +0 -0
  156. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/ribbon.rul +0 -0
  157. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/routeros.order +0 -0
  158. {annet-0.16.21 → annet-0.16.23}/annet/rulebook/texts/routeros.rul +0 -0
  159. {annet-0.16.21 → annet-0.16.23}/annet/storage.py +0 -0
  160. {annet-0.16.21 → annet-0.16.23}/annet/text_term_format.py +0 -0
  161. {annet-0.16.21 → annet-0.16.23}/annet/tracing.py +0 -0
  162. {annet-0.16.21 → annet-0.16.23}/annet/types.py +0 -0
  163. {annet-0.16.21 → annet-0.16.23}/annet.egg-info/SOURCES.txt +0 -0
  164. {annet-0.16.21 → annet-0.16.23}/annet.egg-info/dependency_links.txt +0 -0
  165. {annet-0.16.21 → annet-0.16.23}/annet.egg-info/entry_points.txt +0 -0
  166. {annet-0.16.21 → annet-0.16.23}/annet.egg-info/requires.txt +0 -0
  167. {annet-0.16.21 → annet-0.16.23}/annet.egg-info/top_level.txt +0 -0
  168. {annet-0.16.21 → annet-0.16.23}/annet_generators/__init__.py +0 -0
  169. {annet-0.16.21 → annet-0.16.23}/annet_generators/example/__init__.py +0 -0
  170. {annet-0.16.21 → annet-0.16.23}/annet_generators/example/lldp.py +0 -0
  171. {annet-0.16.21 → annet-0.16.23}/annet_generators/mesh_example/__init__.py +0 -0
  172. {annet-0.16.21 → annet-0.16.23}/annet_generators/mesh_example/bgp.py +0 -0
  173. {annet-0.16.21 → annet-0.16.23}/annet_generators/mesh_example/mesh_logic.py +0 -0
  174. {annet-0.16.21 → annet-0.16.23}/annet_generators/rpl_example/__init__.py +0 -0
  175. {annet-0.16.21 → annet-0.16.23}/annet_generators/rpl_example/items.py +0 -0
  176. {annet-0.16.21 → annet-0.16.23}/annet_generators/rpl_example/policy_generator.py +0 -0
  177. {annet-0.16.21 → annet-0.16.23}/annet_generators/rpl_example/route_policy.py +0 -0
  178. {annet-0.16.21 → annet-0.16.23}/requirements.txt +0 -0
  179. {annet-0.16.21 → annet-0.16.23}/setup.cfg +0 -0
  180. {annet-0.16.21 → annet-0.16.23}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annet
3
- Version: 0.16.21
3
+ Version: 0.16.23
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  # Annet - configuration generation and deploying utility for network equipment
2
2
 
3
- Annet is a configuration generator that can translate differences between old and new configurations into sequnce of commands. This feature is vital for CLI-based devices, such as Huawei, Cisco IOS, Cisco NX-OS, Juniper. Devices configured via separate config files, Linux, FreeBSD and Cumulus are also supported.
3
+ Annet is a configuration generator that can translate differences between old and new configurations into sequence of commands. This feature is vital for CLI-based devices, such as Huawei, Cisco IOS, Cisco NX-OS, Juniper. Devices configured via separate config files, Linux, FreeBSD and Cumulus are also supported.
4
4
 
5
5
  It works this way. Annet `gen`erates configuration for a device by running Python code, which usually goes to the Network Source of Truth, like NetBox. Annet then gets the `diff`erence by getting the configuration from the device and comparing it. Finally, Annet translates the difference into a sequence of commands, called a `patch`. After `deploy`ing these commands, the diff will be empty.
6
6
 
@@ -330,15 +330,36 @@ class CiscoFormatter(BlockExitFormatter):
330
330
  yield from super().block_exit(context)
331
331
 
332
332
 
333
- class AristaFormatter(CiscoFormatter):
333
+ class NexusFormatter(BlockExitFormatter):
334
+ def __init__(self, indent=" "):
335
+ super().__init__("exit", indent)
334
336
 
335
- def block_exit(self, context: Optional[FormatterContext]) -> str:
336
- current = context and context.row or ""
337
+ def split(self, text):
338
+ return self.split_remove_spaces(text)
337
339
 
338
- if current.startswith(("address-family")):
339
- yield from block_wrapper("exit")
340
- else:
341
- yield from super().block_exit(context)
340
+
341
+ class B4comFormatter(BlockExitFormatter):
342
+ def __init__(self, indent=" "):
343
+ super().__init__("exit", indent)
344
+
345
+ def split(self, text):
346
+ return self.split_remove_spaces(text)
347
+
348
+
349
+ class ArubaFormatter(BlockExitFormatter):
350
+ def __init__(self, indent=" "):
351
+ super().__init__("exit", indent)
352
+
353
+ def split(self, text):
354
+ return self.split_remove_spaces(text)
355
+
356
+
357
+ class AristaFormatter(BlockExitFormatter):
358
+ def __init__(self, indent=" "):
359
+ super().__init__("exit", indent)
360
+
361
+ def split(self, text):
362
+ return self.split_remove_spaces(text)
342
363
 
343
364
 
344
365
  class AsrFormatter(BlockExitFormatter):
@@ -713,16 +734,16 @@ def make_formatter(vendor, **kwargs):
713
734
  formatters = {
714
735
  "juniper": JuniperFormatter,
715
736
  "cisco": CiscoFormatter,
716
- "nexus": CiscoFormatter,
737
+ "nexus": NexusFormatter,
717
738
  "huawei": HuaweiFormatter,
718
739
  "optixtrans": OptixtransFormatter,
719
740
  "arista": AristaFormatter,
720
741
  "nokia": NokiaFormatter,
721
742
  "routeros": RosFormatter,
722
- "aruba": CiscoFormatter,
743
+ "aruba": ArubaFormatter,
723
744
  "pc": CommonFormatter,
724
745
  "ribbon": RibbonFormatter,
725
- "b4com": CiscoFormatter,
746
+ "b4com": B4comFormatter,
726
747
  }
727
748
  return formatters[vendor](**kwargs)
728
749
 
@@ -12,6 +12,9 @@ from annet.annlib.tabparser import ( # pylint: disable=unused-import
12
12
  RosFormatter,
13
13
  parse_to_tree,
14
14
  AristaFormatter,
15
+ NexusFormatter,
16
+ B4comFormatter,
17
+ ArubaFormatter,
15
18
  )
16
19
 
17
20
 
@@ -22,8 +25,14 @@ def make_formatter(hw, **kwargs):
22
25
  cls = HuaweiFormatter
23
26
  elif hw.Cisco.ASR or hw.Cisco.XRV:
24
27
  cls = AsrFormatter
25
- elif hw.Nexus or hw.Cisco or hw.Aruba or hw.B4com:
28
+ elif hw.Nexus:
29
+ cls = NexusFormatter
30
+ elif hw.Cisco:
26
31
  cls = CiscoFormatter
32
+ elif hw.B4com:
33
+ cls = B4comFormatter
34
+ elif hw.Aruba:
35
+ cls = ArubaFormatter
27
36
  elif hw.Juniper:
28
37
  cls = JuniperFormatter
29
38
  elif hw.Nokia:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annet
3
- Version: 0.16.21
3
+ Version: 0.16.23
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
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
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
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