beswarm 0.2.77__tar.gz → 0.2.78__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 (132) hide show
  1. {beswarm-0.2.77 → beswarm-0.2.78}/PKG-INFO +1 -1
  2. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/models/chatgpt.py +6 -1
  3. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/core.py +7 -2
  4. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/subtasks.py +6 -1
  5. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/worker.py +7 -1
  6. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm.egg-info/PKG-INFO +1 -1
  7. {beswarm-0.2.77 → beswarm-0.2.78}/pyproject.toml +1 -1
  8. {beswarm-0.2.77 → beswarm-0.2.78}/MANIFEST.in +0 -0
  9. {beswarm-0.2.77 → beswarm-0.2.78}/README.md +0 -0
  10. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/__init__.py +0 -0
  11. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/agents/chatgroup.py +0 -0
  12. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/agents/planact.py +0 -0
  13. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/__init__.py +0 -0
  14. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/__init__.py +0 -0
  15. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/log_config.py +0 -0
  16. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/models.py +0 -0
  17. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/request.py +0 -0
  18. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/response.py +0 -0
  19. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/test/test_base_api.py +0 -0
  20. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/test/test_geminimask.py +0 -0
  21. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/test/test_image.py +0 -0
  22. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/test/test_payload.py +0 -0
  23. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/core/utils.py +0 -0
  24. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/models/__init__.py +0 -0
  25. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/models/audio.py +0 -0
  26. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/models/base.py +0 -0
  27. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/__init__.py +0 -0
  28. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/arXiv.py +0 -0
  29. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/config.py +0 -0
  30. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/excute_command.py +0 -0
  31. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/get_time.py +0 -0
  32. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/image.py +0 -0
  33. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/list_directory.py +0 -0
  34. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/read_file.py +0 -0
  35. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/read_image.py +0 -0
  36. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/readonly.py +0 -0
  37. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/registry.py +0 -0
  38. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/run_python.py +0 -0
  39. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/websearch.py +0 -0
  40. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/plugins/write_file.py +0 -0
  41. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/utils/__init__.py +0 -0
  42. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/utils/prompt.py +0 -0
  43. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/aient/utils/scripts.py +0 -0
  44. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_Web_crawler.py +0 -0
  45. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_ddg_search.py +0 -0
  46. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_google_search.py +0 -0
  47. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_ollama.py +0 -0
  48. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_plugin.py +0 -0
  49. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_search.py +0 -0
  50. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_url.py +0 -0
  51. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_whisper.py +0 -0
  52. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/aient/test/test_yjh.py +0 -0
  53. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/bemcp/bemcp/__init__.py +0 -0
  54. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/bemcp/bemcp/decorator.py +0 -0
  55. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/bemcp/bemcp/main.py +0 -0
  56. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/bemcp/bemcp/utils.py +0 -0
  57. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/bemcp/test/client.py +0 -0
  58. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/bemcp/test/server.py +0 -0
  59. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/broker.py +0 -0
  60. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/knowledge_graph.py +0 -0
  61. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/prompt.py +0 -0
  62. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
  63. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  64. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  65. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  66. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  67. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  68. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  69. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  70. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  71. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  72. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  73. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  74. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  75. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  76. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  77. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  78. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  79. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  80. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  81. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  82. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  83. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  84. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  85. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  86. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  87. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  88. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  89. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/README.md +0 -0
  90. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
  91. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  92. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  93. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
  94. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  95. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  96. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
  97. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
  98. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  99. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
  100. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  101. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  102. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  103. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
  104. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
  105. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
  106. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  107. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
  108. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
  109. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  110. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/taskmanager.py +0 -0
  111. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/__init__.py +0 -0
  112. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/click.py +0 -0
  113. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/completion.py +0 -0
  114. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/edit_file.py +0 -0
  115. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/graph.py +0 -0
  116. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/planner.py +0 -0
  117. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/repomap.py +0 -0
  118. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/request_input.py +0 -0
  119. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/screenshot.py +0 -0
  120. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/search_arxiv.py +0 -0
  121. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/search_web.py +0 -0
  122. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/tools/write_csv.py +0 -0
  123. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm/utils.py +0 -0
  124. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm.egg-info/SOURCES.txt +0 -0
  125. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm.egg-info/dependency_links.txt +0 -0
  126. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm.egg-info/requires.txt +0 -0
  127. {beswarm-0.2.77 → beswarm-0.2.78}/beswarm.egg-info/top_level.txt +0 -0
  128. {beswarm-0.2.77 → beswarm-0.2.78}/setup.cfg +0 -0
  129. {beswarm-0.2.77 → beswarm-0.2.78}/test/test_TaskManager.py +0 -0
  130. {beswarm-0.2.77 → beswarm-0.2.78}/test/test_broker.py +0 -0
  131. {beswarm-0.2.77 → beswarm-0.2.78}/test/test_graph.py +0 -0
  132. {beswarm-0.2.77 → beswarm-0.2.78}/test/test_new_TaskManager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.77
3
+ Version: 0.2.78
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -757,6 +757,7 @@ class chatgpt(BaseLLM):
757
757
 
758
758
  # 发送请求并处理响应
759
759
  retry_times = 0
760
+ error_to_raise = None
760
761
  while True:
761
762
  tmp_post_json = copy.deepcopy(json_post)
762
763
  if need_done_prompt:
@@ -840,7 +841,8 @@ class chatgpt(BaseLLM):
840
841
  continue
841
842
  except InputTokenCountExceededError as e:
842
843
  self.logger.error(f"The request body is too long: {e}")
843
- raise
844
+ error_to_raise = e
845
+ break
844
846
  except BadRequestError as e:
845
847
  self.logger.error(f"Bad request error: {e}")
846
848
  raise
@@ -873,6 +875,9 @@ class chatgpt(BaseLLM):
873
875
  if retry_times == 9:
874
876
  raise RetryFailedError(str(e))
875
877
 
878
+ if error_to_raise:
879
+ raise error_to_raise
880
+
876
881
  def ask_stream(
877
882
  self,
878
883
  prompt: list,
@@ -1,3 +1,4 @@
1
+ import contextvars
1
2
  from .broker import MessageBroker
2
3
  from .bemcp.bemcp import MCPManager
3
4
  from .taskmanager import TaskManager
@@ -9,5 +10,9 @@ from .knowledge_graph import KnowledgeGraphManager
9
10
 
10
11
  broker = MessageBroker()
11
12
  mcp_manager = MCPManager()
12
- task_manager = TaskManager()
13
- kgm = KnowledgeGraphManager(broker=broker)
13
+ kgm = KnowledgeGraphManager(broker=broker)
14
+ current_task_manager = contextvars.ContextVar('current_task_manager')
15
+
16
+ def get_task_manager():
17
+ """Creates a new, isolated TaskManager instance."""
18
+ return TaskManager()
@@ -1,6 +1,6 @@
1
1
  import ast
2
2
  from pathlib import Path
3
- from ..core import task_manager
3
+ from ..core import current_task_manager
4
4
  from ..aient.aient.plugins import register_tool, registry
5
5
 
6
6
  worker_fun = registry.tools["worker"]
@@ -23,6 +23,7 @@ def create_task(goal, tools, work_dir):
23
23
  Returns:
24
24
  str: 当任务成功完成时,返回字符串 "任务已完成"。
25
25
  """
26
+ task_manager = current_task_manager.get()
26
27
  # 获取 worker 函数,这是正确的
27
28
  worker_fun = registry.tools["worker"]
28
29
 
@@ -50,6 +51,7 @@ def resume_task(task_id, goal):
50
51
  """
51
52
  恢复一个子任务。
52
53
  """
54
+ task_manager = current_task_manager.get()
53
55
  if task_id not in task_manager.tasks_cache:
54
56
  return f"任务 {task_id} 不存在"
55
57
  tasks_params = task_manager.tasks_cache[task_id]["args"]
@@ -67,6 +69,7 @@ def get_all_tasks_status():
67
69
  Returns:
68
70
  str: 所有任务的状态。每个任务的id,状态,结果。
69
71
  """
72
+ task_manager = current_task_manager.get()
70
73
  return task_manager.tasks_cache
71
74
 
72
75
  @register_tool()
@@ -91,6 +94,7 @@ async def get_task_result(reduce: bool = False):
91
94
  - 当 `reduce=False` 时,返回单个子任务的执行结果。
92
95
  - 当 `reduce=True` 时,返回一个包含所有任务最终状态和结果的汇总字符串。
93
96
  """
97
+ task_manager = current_task_manager.get()
94
98
  def get_running_tasks_count():
95
99
  return len([
96
100
  task_id for task_id, task in task_manager.tasks_cache.items()
@@ -155,6 +159,7 @@ def create_tasks_from_csv(goal_template: str, csv_file_path: str, tools_json_str
155
159
  Returns:
156
160
  str: 批量创建任务的执行摘要,或在发生错误时返回错误信息。
157
161
  """
162
+ task_manager = current_task_manager.get()
158
163
  # 1. 校验输入参数
159
164
  if not os.path.exists(csv_file_path):
160
165
  return f"<tool_error>CSV文件不存在: {csv_file_path}</tool_error>"
@@ -1,7 +1,7 @@
1
1
  from datetime import datetime
2
2
  from typing import List, Dict, Union
3
3
 
4
- from ..core import mcp_manager, broker, task_manager, kgm
4
+ from ..core import mcp_manager, broker, kgm, get_task_manager, current_task_manager
5
5
  from ..agents.planact import BrokerWorker
6
6
  from ..agents.chatgroup import ChatGroupWorker
7
7
  from ..aient.aient.plugins import register_tool
@@ -10,6 +10,8 @@ from ..aient.aient.plugins import register_tool
10
10
  @register_tool()
11
11
  async def worker(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
12
12
  start_time = datetime.now()
13
+ task_manager = get_task_manager()
14
+ current_task_manager.set(task_manager)
13
15
  worker_instance = BrokerWorker(goal, tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
14
16
  result = await worker_instance.run()
15
17
  end_time = datetime.now()
@@ -21,6 +23,8 @@ async def worker(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_
21
23
  @register_tool()
22
24
  async def worker_gen(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
23
25
  start_time = datetime.now()
26
+ task_manager = get_task_manager()
27
+ current_task_manager.set(task_manager)
24
28
  worker_instance = BrokerWorker(goal, tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
25
29
  async for result in worker_instance.stream_run():
26
30
  yield result
@@ -32,6 +36,8 @@ async def worker_gen(goal: str, tools: List[Union[str, Dict]], work_dir: str, ca
32
36
  @register_tool()
33
37
  async def chatgroup(tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
34
38
  start_time = datetime.now()
39
+ task_manager = get_task_manager()
40
+ current_task_manager.set(task_manager)
35
41
  worker_instance = ChatGroupWorker(tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
36
42
  result = await worker_instance.run()
37
43
  end_time = datetime.now()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.77
3
+ Version: 0.2.78
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "beswarm"
3
- version = "0.2.77"
3
+ version = "0.2.78"
4
4
  description = "MAS"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
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