pbesa 4.0.23__tar.gz → 4.0.25__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 (115) hide show
  1. {pbesa-4.0.23 → pbesa-4.0.25}/PKG-INFO +1 -1
  2. pbesa-4.0.25/pbesa/celulas/celula_pertinencia.py +66 -0
  3. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/cognitive.py +32 -3
  4. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/dispatcher_team.py +1 -1
  5. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa.egg-info/PKG-INFO +1 -1
  6. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa.egg-info/SOURCES.txt +1 -0
  7. {pbesa-4.0.23 → pbesa-4.0.25}/setup.py +1 -1
  8. {pbesa-4.0.23 → pbesa-4.0.25}/.gitignore +0 -0
  9. {pbesa-4.0.23 → pbesa-4.0.25}/LICENSE +0 -0
  10. {pbesa-4.0.23 → pbesa-4.0.25}/LICENSE.txt +0 -0
  11. {pbesa-4.0.23 → pbesa-4.0.25}/MANIFEST +0 -0
  12. {pbesa-4.0.23 → pbesa-4.0.25}/README.md +0 -0
  13. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/db.sqlite3 +0 -0
  14. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/__init__.py +0 -0
  15. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/__pycache__/__init__.cpython-36.pyc +0 -0
  16. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/__pycache__/pbesa.cpython-36.pyc +0 -0
  17. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/__pycache__/settings.cpython-36.pyc +0 -0
  18. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/__pycache__/urls.cpython-36.pyc +0 -0
  19. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/__pycache__/wsgi.cpython-36.pyc +0 -0
  20. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/asgi.py +0 -0
  21. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/pbesa.py +0 -0
  22. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/settings.py +0 -0
  23. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/urls.py +0 -0
  24. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/helloworld/wsgi.py +0 -0
  25. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/manage.py +0 -0
  26. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/__init__.py +0 -0
  27. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/__pycache__/__init__.cpython-36.pyc +0 -0
  28. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/__pycache__/admin.cpython-36.pyc +0 -0
  29. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/__pycache__/apps.cpython-36.pyc +0 -0
  30. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/__pycache__/models.cpython-36.pyc +0 -0
  31. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/__pycache__/urls.cpython-36.pyc +0 -0
  32. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/__pycache__/views.cpython-36.pyc +0 -0
  33. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/admin.py +0 -0
  34. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/apps.py +0 -0
  35. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/controller/__pycache__/translatecontroller.cpython-36.pyc +0 -0
  36. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/controller/__pycache__/translatedelegate.cpython-36.pyc +0 -0
  37. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/controller/__pycache__/translateresponse.cpython-36.pyc +0 -0
  38. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/controller/translatecontroller.py +0 -0
  39. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/controller/translatedelegate.py +0 -0
  40. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/controller/translateresponse.py +0 -0
  41. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/worker/__pycache__/translatetask.cpython-36.pyc +0 -0
  42. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/worker/__pycache__/workeragent.cpython-36.pyc +0 -0
  43. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/worker/translatetask.py +0 -0
  44. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/mas/worker/workeragent.py +0 -0
  45. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/migrations/__init__.py +0 -0
  46. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/migrations/__pycache__/__init__.cpython-36.pyc +0 -0
  47. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/models.py +0 -0
  48. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/tests.py +0 -0
  49. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/urls.py +0 -0
  50. {pbesa-4.0.23 → pbesa-4.0.25}/examples/django/helloworld/translate/views.py +0 -0
  51. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/__pycache__/countercontroller.cpython-36.pyc +0 -0
  52. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/__pycache__/counterdelegate.cpython-36.pyc +0 -0
  53. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/__pycache__/counterresponse.cpython-36.pyc +0 -0
  54. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/__pycache__/translatecontroller.cpython-36.pyc +0 -0
  55. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/__pycache__/translatedelegate.cpython-36.pyc +0 -0
  56. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/__pycache__/translateresponse.cpython-36.pyc +0 -0
  57. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/countercontroller.py +0 -0
  58. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/counterdelegate.py +0 -0
  59. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/controller/counterresponse.py +0 -0
  60. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/worker/__pycache__/counteragent.cpython-36.pyc +0 -0
  61. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/worker/__pycache__/countertask.cpython-36.pyc +0 -0
  62. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/worker/__pycache__/translatetask.cpython-36.pyc +0 -0
  63. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/worker/__pycache__/workeragent.cpython-36.pyc +0 -0
  64. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/worker/counteragent.py +0 -0
  65. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/mas/worker/countertask.py +0 -0
  66. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/remote_a.py +0 -0
  67. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/remote_b.py +0 -0
  68. {pbesa-4.0.23 → pbesa-4.0.25}/examples/remote/remote_c.py +0 -0
  69. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/__init__.py +0 -0
  70. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/__init__.py +0 -0
  71. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/celula_casos.py +0 -0
  72. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/celula_consultas.py +0 -0
  73. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/celula_datos_identificables.py +0 -0
  74. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/celula_expertos.py +0 -0
  75. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/celula_generar_documento.py +0 -0
  76. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/celula_preguntas.py +0 -0
  77. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/celula_saludos.py +0 -0
  78. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/celula_simulador_ciudadano.py +0 -0
  79. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/data_extraction_cel.py +0 -0
  80. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/celulas/web.py +0 -0
  81. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/__init__.py +0 -0
  82. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/adapter.py +0 -0
  83. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/agent.py +0 -0
  84. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/io/__init__.py +0 -0
  85. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/io/system_file.py +0 -0
  86. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/io/tcp_server.py +0 -0
  87. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/res/__init__.py +0 -0
  88. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/res/__pycache__/__init__.cpython-36.pyc +0 -0
  89. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/res/__pycache__/__init__.cpython-37.pyc +0 -0
  90. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/res/__pycache__/__init__.cpython-38.pyc +0 -0
  91. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/res/__pycache__/__init__.cpython-39.pyc +0 -0
  92. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/res/conf.json +0 -0
  93. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/util.py +0 -0
  94. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/kernel/world.py +0 -0
  95. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/mas.py +0 -0
  96. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/models.py +0 -0
  97. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/remote/__init__.py +0 -0
  98. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/remote/adm_listener.py +0 -0
  99. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/remote/adm_listener_handler.py +0 -0
  100. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/remote/exceptions.py +0 -0
  101. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/remote/remote_adm.py +0 -0
  102. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/remote/remote_adm_handler.py +0 -0
  103. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/__init__.py +0 -0
  104. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/collaborative_team.py +0 -0
  105. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/delegator.py +0 -0
  106. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/delegator_team.py +0 -0
  107. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/dialog.py +0 -0
  108. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/prompts.py +0 -0
  109. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/selected_dispatcher_team.py +0 -0
  110. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/templates.py +0 -0
  111. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa/social/worker.py +0 -0
  112. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa.egg-info/dependency_links.txt +0 -0
  113. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa.egg-info/requires.txt +0 -0
  114. {pbesa-4.0.23 → pbesa-4.0.25}/pbesa.egg-info/top_level.txt +0 -0
  115. {pbesa-4.0.23 → pbesa-4.0.25}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pbesa
3
- Version: 4.0.23
3
+ Version: 4.0.25
4
4
  License-File: LICENSE
5
5
  License-File: LICENSE.txt
6
6
  Requires-Dist: pymongo>=4.6.3
@@ -0,0 +1,66 @@
1
+ import logging
2
+
3
+ SYSTEM_PROMPT = """
4
+
5
+ Eres un clasificador de temas relacionados con funciones jurisdiccionales en Colombia y funcionalidades del sistema Justifacil. Tu tarea es analizar el siguiente texto y determinar si está relacionado con alguno de los siguientes elementos:
6
+
7
+ 1. Temas procesales o jurisdiccionales en Colombia que involucren entidades como:
8
+ - Superintendencia de Industria y Comercio (SIC)
9
+ - Dirección General Marítima (DIMAR)
10
+ - Dirección Nacional de Derecho de Autor (DNDA)
11
+ - Instituto Colombiano Agropecuario (ICA)
12
+ - Superintendencia Financiera de Colombia (SFC)
13
+ - Superintendencia Nacional de Salud (SNS)
14
+ - Superintendencia de Sociedades
15
+
16
+ 2. Funcionalidades del sistema Justifacil, incluyendo:
17
+ - Creación de cuenta
18
+ - Inicio de sesión (login)
19
+ - Recuperación de contraseña
20
+ - Radicación de trámites asociados a procesos
21
+ - Gestión de expedientes
22
+ - Alertas procesales o de Justifiacil
23
+ - Glosario de términos jurídicos
24
+ - Sección de preguntas frecuentes
25
+ - Contacto con soporte técnico
26
+ - Temas de observatorio judicial
27
+
28
+ Responde únicamente con una de estas opciones:
29
+
30
+ - RELACIONADO
31
+ - NO_RELACIONADO
32
+
33
+ **Definición de RELACIONADO**: Un texto es relacionado si aborda directamente alguno de los temas o funcionalidades mencionadas, aunque lo haga con sinónimos o lenguaje cotidiano. Debe tener contexto jurídico, procesal o funcional vinculado a los puntos anteriores.
34
+
35
+ Ejemplos:
36
+
37
+ - "¿Cómo radico un proceso ante la SIC?" → RELACIONADO
38
+ - "No puedo entrar a Justifacil con mi contraseña" → RELACIONADO
39
+ - "Qué entidades pueden sancionar a empresas en Colombia" → RELACIONADO
40
+ - "Necesito registrar mi usuario en la plataforma" → RELACIONADO
41
+ - "¿Cuál es el clima hoy en Bogotá?" → NO_RELACIONADO
42
+ - "Estoy buscando ayuda con mi hoja de vida" → NO_RELACIONADO
43
+ """
44
+
45
+ # Efectua la inferencia del modelo.
46
+ def derive(service, text, max_tkns=4096) -> any:
47
+ try:
48
+ logging.info(f"Procesando: {text}")
49
+ tmp_work_memory = []
50
+ user_prompt = """
51
+ Texto: "%s"
52
+
53
+ Clasificación:
54
+ """ % text
55
+ tmp_work_memory.append({"role": "system", "content": SYSTEM_PROMPT})
56
+ tmp_work_memory.append({"role": "user", "content": user_prompt})
57
+ res = service.generate(tmp_work_memory, max_tokens=max_tkns)
58
+ logging.info(f"[Celula][Saludos][Respuesta]: {res}")
59
+ if not res or res == "":
60
+ res = text
61
+ logging.warning(f"[Celula][Saludos]: No obtener una respuesta.")
62
+ return res
63
+ except Exception as e:
64
+ logging.error(f"[Celula][Saludos]: Error al procesar: {text}")
65
+ logging.error(e)
66
+ return None
@@ -27,7 +27,7 @@ from pbesa.social.dialog import (
27
27
  DialogState, imprimir_grafo, recorrer_interacciones, extraer_diccionario_nodos,
28
28
  ActionNode, DeclarativeNode, GotoNode)
29
29
  from .celulas import (celula_casos, celula_consultas, celula_saludos, celula_datos_identificables,
30
- celula_generar_documento, celula_expertos)
30
+ celula_generar_documento, celula_expertos, celula_pertinencia)
31
31
  from pbesa.social.prompts import ANALIZER_PROMPT, CLASSIFICATION_PROMPT, DERIVE_PROMPT, RECOVERY_PROMPT, ADAPT_PROMPT, SINTETIZER_PROMPT
32
32
 
33
33
  # --------------------------------------------------------
@@ -901,6 +901,8 @@ class Dialog(ABC):
901
901
  eva += 1 if es_consulta else 0
902
902
  eva += 1 if es_caso else 0
903
903
 
904
+ msg = "Lo lamento, no puedo ayudarle con su consulta. Dado que no está relacionada con los servicios que presta Justifacil."
905
+
904
906
  # Verifica los casos
905
907
  if eva > 0 and eva < 3:
906
908
  logging.info("[Stage-1]: Discriminador encontrado")
@@ -910,20 +912,46 @@ class Dialog(ABC):
910
912
  dicriminador = "saluda"
911
913
  elif es_consulta and not es_saludo and not es_caso:
912
914
  dicriminador = "consulta"
915
+ per_res = celula_pertinencia.derive(self.__ai_service, query, max_tkns=10)
916
+ if per_res and not per_res == "":
917
+ if "NO_RELACIONADO" in per_res:
918
+ dicriminador = None
919
+ res = msg
913
920
  elif es_caso and not es_saludo and not es_consulta:
914
921
  dicriminador = "caso"
922
+ per_res = celula_pertinencia.derive(self.__ai_service, query, max_tkns=10)
923
+ if per_res and not per_res == "":
924
+ if "NO_RELACIONADO" in per_res:
925
+ dicriminador = None
926
+ res = msg
915
927
 
916
928
  # Casos ambiguos con saludo
917
929
  elif es_saludo and es_consulta and not es_caso:
918
930
  dicriminador = "consulta"
931
+ per_res = celula_pertinencia.derive(self.__ai_service, query, max_tkns=10)
932
+ if per_res and not per_res == "":
933
+ if "NO_RELACIONADO" in per_res:
934
+ dicriminador = None
935
+ res = msg
919
936
  elif es_saludo and es_caso and not es_consulta:
920
937
  dicriminador = "caso"
938
+ per_res = celula_pertinencia.derive(self.__ai_service, query, max_tkns=10)
939
+ if per_res and not per_res == "":
940
+ if "NO_RELACIONADO" in per_res:
941
+ dicriminador = None
942
+ res = msg
921
943
 
922
944
  # Casos ambiguos con consulta y caso
923
945
  elif es_consulta and es_caso and not es_saludo:
924
- res = "Lo lamento, ¿Desea que le ayude con una Consulta o una Demanda?"
946
+ res = "Lo lamento, puede confirmar si ¿Desea que le ayude con una Consulta o una Demanda?"
925
947
  else:
926
948
  ambiguedad = True
949
+ per_res = celula_pertinencia.derive(self.__ai_service, query, max_tkns=10)
950
+ if per_res and not per_res == "":
951
+ if "NO_RELACIONADO" in per_res:
952
+ dicriminador = None
953
+ res = msg
954
+ ambiguedad = False
927
955
 
928
956
  if dicriminador:
929
957
  self.notify(session_id, f"primera fase se identifica: {dicriminador}.")
@@ -1553,7 +1581,8 @@ class SpecialDispatch():
1553
1581
  self.kusto_open()
1554
1582
 
1555
1583
  attemps = 1
1556
- while attemps <= 3:
1584
+ exit = False
1585
+ while attemps <= 3 and not exit:
1557
1586
  logging.info(f"Intento de selección de agente: {attemps}")
1558
1587
 
1559
1588
  res = self.__ai_service.generate(self.__meta_work_memory, max_tokens=10)
@@ -172,7 +172,7 @@ class SelectedDispatcher(Action):
172
172
  else:
173
173
  logging.info(f"The {agent_id} is not instance of AugmentedGeneration or Dialog")
174
174
  # Check if the mayor agent is the same as the agent
175
- if score_mayor > 0.501:
175
+ if score_mayor < 2:
176
176
  logging.info(f'The agent {mayor_ag.id} will be assigned')
177
177
  exit = False
178
178
  while not exit:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pbesa
3
- Version: 4.0.23
3
+ Version: 4.0.25
4
4
  License-File: LICENSE
5
5
  License-File: LICENSE.txt
6
6
  Requires-Dist: pymongo>=4.6.3
@@ -76,6 +76,7 @@ pbesa/celulas/celula_consultas.py
76
76
  pbesa/celulas/celula_datos_identificables.py
77
77
  pbesa/celulas/celula_expertos.py
78
78
  pbesa/celulas/celula_generar_documento.py
79
+ pbesa/celulas/celula_pertinencia.py
79
80
  pbesa/celulas/celula_preguntas.py
80
81
  pbesa/celulas/celula_saludos.py
81
82
  pbesa/celulas/celula_simulador_ciudadano.py
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
4
4
 
5
5
  setup(
6
6
  name='pbesa',
7
- version='4.0.23',
7
+ version='4.0.25',
8
8
  packages=find_packages(),
9
9
  install_requires=[
10
10
  'pymongo>=4.6.3',
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