tutanus 0.12.2 → 0.12.4

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 (309) hide show
  1. package/README.md +7 -7
  2. package/dist/analysts/converters/converter-base.js.map +1 -1
  3. package/dist/analysts/converters/engines/converter-gha-to-gitlab.js.map +1 -1
  4. package/dist/analysts/converters/index.js.map +1 -1
  5. package/dist/analysts/corrections/map-reversion.js +2 -2
  6. package/dist/analysts/corrections/map-reversion.js.map +1 -1
  7. package/dist/analysts/corrections/pruning.js +3 -3
  8. package/dist/analysts/corrections/pruning.js.map +1 -1
  9. package/dist/analysts/detectors/detector-recommendation-architecture.js +2 -2
  10. package/dist/analysts/detectors/detector-recommendation-architecture.js.map +1 -1
  11. package/dist/analysts/github-actions/detectors/org-verified.js.map +1 -1
  12. package/dist/analysts/github-actions/reports/generator-report-github-actions.js +4 -4
  13. package/dist/analysts/github-actions/reports/generator-report-github-actions.js.map +1 -1
  14. package/dist/analysts/js-ts/detectors/detector-context-smart.js +10 -10
  15. package/dist/analysts/js-ts/detectors/detector-context-smart.js.map +1 -1
  16. package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +3 -3
  17. package/dist/analysts/js-ts/detectors/detector-types-unsafe.js.map +1 -1
  18. package/dist/analysts/plugins/detector-documentation.js.map +1 -1
  19. package/dist/analysts/plugins/index.js.map +1 -1
  20. package/dist/analysts/scorers/scorer.js +67 -67
  21. package/dist/analysts/scorers/scorer.js.map +1 -1
  22. package/dist/app/github/app/repo-downloader.d.ts +2 -0
  23. package/dist/app/github/app/repo-downloader.d.ts.map +1 -1
  24. package/dist/app/github/app/repo-downloader.js +2 -2
  25. package/dist/app/github/app/repo-downloader.js.map +1 -1
  26. package/dist/app/github/jobs/auto-fix-job.d.ts.map +1 -1
  27. package/dist/app/github/jobs/auto-fix-job.js +19 -3
  28. package/dist/app/github/jobs/auto-fix-job.js.map +1 -1
  29. package/dist/app/github/push-analysis/push-analysis-service.d.ts.map +1 -1
  30. package/dist/app/github/push-analysis/push-analysis-service.js +19 -7
  31. package/dist/app/github/push-analysis/push-analysis-service.js.map +1 -1
  32. package/dist/app/github/push-analysis/push-report.js +2 -2
  33. package/dist/app/github/push-analysis/push-report.js.map +1 -1
  34. package/dist/bin/index.d.ts.map +1 -1
  35. package/dist/bin/index.js +5 -0
  36. package/dist/bin/index.js.map +1 -1
  37. package/dist/cli/commands/command-azure.js +1 -1
  38. package/dist/cli/commands/command-azure.js.map +1 -1
  39. package/dist/cli/commands/command-circleci.js +1 -1
  40. package/dist/cli/commands/command-circleci.js.map +1 -1
  41. package/dist/cli/commands/command-convert.js.map +1 -1
  42. package/dist/cli/commands/command-github-actions.js +1 -1
  43. package/dist/cli/commands/command-github-actions.js.map +1 -1
  44. package/dist/cli/commands/command-gitlab-ci.js +1 -1
  45. package/dist/cli/commands/command-gitlab-ci.js.map +1 -1
  46. package/dist/cli/commands/command-jenkins.js +1 -1
  47. package/dist/cli/commands/command-jenkins.js.map +1 -1
  48. package/dist/cli/diagnostic/exporters/compliance-exporter.js +2 -2
  49. package/dist/cli/diagnostic/exporters/compliance-exporter.js.map +1 -1
  50. package/dist/cli/diagnostic/exporters/markdown-exporter.js +7 -7
  51. package/dist/cli/diagnostic/exporters/markdown-exporter.js.map +1 -1
  52. package/dist/cli/diagnostic/handlers/archetype-handler.js.map +1 -1
  53. package/dist/cli/diagnostic/handlers/guardian-handler.js.map +1 -1
  54. package/dist/cli/diagnostic/processing-diagnostic.d.ts.map +1 -1
  55. package/dist/cli/diagnostic/processing-diagnostic.js +2 -3
  56. package/dist/cli/diagnostic/processing-diagnostic.js.map +1 -1
  57. package/dist/core/config/auto/fix-config.js.map +1 -1
  58. package/dist/core/execution/executor.js +4 -4
  59. package/dist/core/execution/executor.js.map +1 -1
  60. package/dist/core/execution/inquisitor.js +6 -6
  61. package/dist/core/execution/inquisitor.js.map +1 -1
  62. package/dist/core/execution/scanner.js.map +1 -1
  63. package/dist/core/messages/en/analysts/archetypes-extra-messages.d.ts +2 -2
  64. package/dist/core/messages/en/analysts/archetypes-extra-messages.js +2 -2
  65. package/dist/core/messages/en/analysts/archetypes-extra-messages.js.map +1 -1
  66. package/dist/core/messages/en/analysts/detector-clean-arch-messages.d.ts +4 -4
  67. package/dist/core/messages/en/analysts/detector-clean-arch-messages.js +4 -4
  68. package/dist/core/messages/en/analysts/detector-clean-arch-messages.js.map +1 -1
  69. package/dist/core/messages/en/analysts/detector-js-ts-messages.d.ts +2 -2
  70. package/dist/core/messages/en/analysts/detector-js-ts-messages.js +2 -2
  71. package/dist/core/messages/en/analysts/detector-js-ts-messages.js.map +1 -1
  72. package/dist/core/messages/en/analysts/map-reversion-extra-messages.d.ts +6 -6
  73. package/dist/core/messages/en/analysts/map-reversion-extra-messages.js +6 -6
  74. package/dist/core/messages/en/analysts/map-reversion-extra-messages.js.map +1 -1
  75. package/dist/core/messages/en/analysts/report-github-actions-messages.d.ts +2 -2
  76. package/dist/core/messages/en/analysts/report-github-actions-messages.js +2 -2
  77. package/dist/core/messages/en/analysts/report-github-actions-messages.js.map +1 -1
  78. package/dist/core/messages/en/analysts/scorer-messages.d.ts +45 -45
  79. package/dist/core/messages/en/analysts/scorer-messages.js +49 -49
  80. package/dist/core/messages/en/analysts/scorer-messages.js.map +1 -1
  81. package/dist/core/messages/en/cli/cli-command-convert-messages.d.ts +1 -1
  82. package/dist/core/messages/en/cli/cli-command-convert-messages.js +1 -1
  83. package/dist/core/messages/en/cli/cli-command-convert-messages.js.map +1 -1
  84. package/dist/core/messages/en/cli/cli-command-format-messages.d.ts +1 -1
  85. package/dist/core/messages/en/cli/cli-command-format-messages.js +1 -1
  86. package/dist/core/messages/en/cli/cli-command-format-messages.js.map +1 -1
  87. package/dist/core/messages/en/cli/cli-command-github-actions-messages.d.ts +1 -1
  88. package/dist/core/messages/en/cli/cli-command-github-actions-messages.js +4 -4
  89. package/dist/core/messages/en/cli/cli-command-github-actions-messages.js.map +1 -1
  90. package/dist/core/messages/en/cli/cli-command-update-messages.d.ts +2 -2
  91. package/dist/core/messages/en/cli/cli-command-update-messages.js +2 -2
  92. package/dist/core/messages/en/cli/cli-command-update-messages.js.map +1 -1
  93. package/dist/core/messages/en/cli/cli-flags-validator-messages.d.ts +3 -3
  94. package/dist/core/messages/en/cli/cli-flags-validator-messages.js +3 -3
  95. package/dist/core/messages/en/cli/cli-flags-validator-messages.js.map +1 -1
  96. package/dist/core/messages/en/core/correcoes-messages.js +2 -2
  97. package/dist/core/messages/en/core/correcoes-messages.js.map +1 -1
  98. package/dist/core/messages/en/core/inquisitor-extra-messages.d.ts +2 -2
  99. package/dist/core/messages/en/core/inquisitor-extra-messages.js +2 -2
  100. package/dist/core/messages/en/core/inquisitor-extra-messages.js.map +1 -1
  101. package/dist/core/messages/en/core/parser-extra-messages.d.ts +3 -3
  102. package/dist/core/messages/en/core/parser-extra-messages.js +3 -3
  103. package/dist/core/messages/en/core/parser-extra-messages.js.map +1 -1
  104. package/dist/core/messages/en/guardian/guardian-messages.d.ts +2 -2
  105. package/dist/core/messages/en/guardian/guardian-messages.js +2 -2
  106. package/dist/core/messages/en/guardian/guardian-messages.js.map +1 -1
  107. package/dist/core/messages/en/guardian/watcher-hidden-messages.d.ts +2 -2
  108. package/dist/core/messages/en/guardian/watcher-hidden-messages.js +2 -2
  109. package/dist/core/messages/en/guardian/watcher-hidden-messages.js.map +1 -1
  110. package/dist/core/messages/en/log/log-helper.js.map +1 -1
  111. package/dist/core/messages/en/reports/report-async-patterns-messages.d.ts +3 -3
  112. package/dist/core/messages/en/reports/report-async-patterns-messages.js +3 -3
  113. package/dist/core/messages/en/reports/report-async-patterns-messages.js.map +1 -1
  114. package/dist/core/messages/en/shared/plugin-core-messages.d.ts +2 -2
  115. package/dist/core/messages/en/shared/plugin-core-messages.js +2 -2
  116. package/dist/core/messages/en/shared/plugin-core-messages.js.map +1 -1
  117. package/dist/core/messages/en/shared/plugin-registry-messages.d.ts +4 -4
  118. package/dist/core/messages/en/shared/plugin-registry-messages.js +4 -4
  119. package/dist/core/messages/en/shared/plugin-registry-messages.js.map +1 -1
  120. package/dist/core/messages/ja/analysts/archetypes-extra-messages.d.ts +2 -2
  121. package/dist/core/messages/ja/analysts/archetypes-extra-messages.js +2 -2
  122. package/dist/core/messages/ja/analysts/archetypes-extra-messages.js.map +1 -1
  123. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.d.ts +4 -4
  124. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js +4 -4
  125. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js.map +1 -1
  126. package/dist/core/messages/ja/analysts/detector-js-ts-messages.d.ts +2 -2
  127. package/dist/core/messages/ja/analysts/detector-js-ts-messages.js +2 -2
  128. package/dist/core/messages/ja/analysts/detector-js-ts-messages.js.map +1 -1
  129. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.d.ts +6 -6
  130. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js +6 -6
  131. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js.map +1 -1
  132. package/dist/core/messages/ja/analysts/report-github-actions-messages.d.ts +2 -2
  133. package/dist/core/messages/ja/analysts/report-github-actions-messages.js +2 -2
  134. package/dist/core/messages/ja/analysts/report-github-actions-messages.js.map +1 -1
  135. package/dist/core/messages/ja/analysts/scorer-messages.d.ts +45 -45
  136. package/dist/core/messages/ja/analysts/scorer-messages.js +49 -49
  137. package/dist/core/messages/ja/analysts/scorer-messages.js.map +1 -1
  138. package/dist/core/messages/ja/cli/cli-command-analysts-messages.d.ts +2 -2
  139. package/dist/core/messages/ja/cli/cli-command-analysts-messages.js +2 -2
  140. package/dist/core/messages/ja/cli/cli-command-analysts-messages.js.map +1 -1
  141. package/dist/core/messages/ja/cli/cli-command-convert-messages.d.ts +1 -1
  142. package/dist/core/messages/ja/cli/cli-command-convert-messages.js +1 -1
  143. package/dist/core/messages/ja/cli/cli-command-convert-messages.js.map +1 -1
  144. package/dist/core/messages/ja/cli/cli-command-format-messages.d.ts +1 -1
  145. package/dist/core/messages/ja/cli/cli-command-format-messages.js +1 -1
  146. package/dist/core/messages/ja/cli/cli-command-format-messages.js.map +1 -1
  147. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.d.ts +1 -1
  148. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js +4 -4
  149. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js.map +1 -1
  150. package/dist/core/messages/ja/cli/cli-command-update-messages.d.ts +2 -2
  151. package/dist/core/messages/ja/cli/cli-command-update-messages.js +2 -2
  152. package/dist/core/messages/ja/cli/cli-command-update-messages.js.map +1 -1
  153. package/dist/core/messages/ja/cli/cli-flags-validator-messages.d.ts +3 -3
  154. package/dist/core/messages/ja/cli/cli-flags-validator-messages.js +3 -3
  155. package/dist/core/messages/ja/cli/cli-flags-validator-messages.js.map +1 -1
  156. package/dist/core/messages/ja/core/correcoes-messages.js +2 -2
  157. package/dist/core/messages/ja/core/correcoes-messages.js.map +1 -1
  158. package/dist/core/messages/ja/core/inquisitor-extra-messages.d.ts +2 -2
  159. package/dist/core/messages/ja/core/inquisitor-extra-messages.js +2 -2
  160. package/dist/core/messages/ja/core/inquisitor-extra-messages.js.map +1 -1
  161. package/dist/core/messages/ja/core/parser-extra-messages.d.ts +3 -3
  162. package/dist/core/messages/ja/core/parser-extra-messages.js +3 -3
  163. package/dist/core/messages/ja/core/parser-extra-messages.js.map +1 -1
  164. package/dist/core/messages/ja/guardian/guardian-messages.d.ts +2 -2
  165. package/dist/core/messages/ja/guardian/guardian-messages.js +2 -2
  166. package/dist/core/messages/ja/guardian/guardian-messages.js.map +1 -1
  167. package/dist/core/messages/ja/guardian/watcher-hidden-messages.d.ts +2 -2
  168. package/dist/core/messages/ja/guardian/watcher-hidden-messages.js +2 -2
  169. package/dist/core/messages/ja/guardian/watcher-hidden-messages.js.map +1 -1
  170. package/dist/core/messages/ja/log/log-helper.js.map +1 -1
  171. package/dist/core/messages/ja/reports/report-async-patterns-messages.d.ts +3 -3
  172. package/dist/core/messages/ja/reports/report-async-patterns-messages.js +3 -3
  173. package/dist/core/messages/ja/reports/report-async-patterns-messages.js.map +1 -1
  174. package/dist/core/messages/ja/shared/plugin-core-messages.d.ts +2 -2
  175. package/dist/core/messages/ja/shared/plugin-core-messages.js +2 -2
  176. package/dist/core/messages/ja/shared/plugin-core-messages.js.map +1 -1
  177. package/dist/core/messages/ja/shared/plugin-registry-messages.d.ts +4 -4
  178. package/dist/core/messages/ja/shared/plugin-registry-messages.js +4 -4
  179. package/dist/core/messages/ja/shared/plugin-registry-messages.js.map +1 -1
  180. package/dist/core/messages/pt/analysts/archetypes-extra-messages.d.ts +2 -2
  181. package/dist/core/messages/pt/analysts/archetypes-extra-messages.js +2 -2
  182. package/dist/core/messages/pt/analysts/archetypes-extra-messages.js.map +1 -1
  183. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.d.ts +4 -4
  184. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js +4 -4
  185. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js.map +1 -1
  186. package/dist/core/messages/pt/analysts/detector-js-ts-messages.d.ts +2 -2
  187. package/dist/core/messages/pt/analysts/detector-js-ts-messages.js +2 -2
  188. package/dist/core/messages/pt/analysts/detector-js-ts-messages.js.map +1 -1
  189. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.d.ts +6 -6
  190. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js +6 -6
  191. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js.map +1 -1
  192. package/dist/core/messages/pt/analysts/report-github-actions-messages.d.ts +2 -2
  193. package/dist/core/messages/pt/analysts/report-github-actions-messages.js +2 -2
  194. package/dist/core/messages/pt/analysts/report-github-actions-messages.js.map +1 -1
  195. package/dist/core/messages/pt/analysts/scorer-messages.d.ts +45 -45
  196. package/dist/core/messages/pt/analysts/scorer-messages.js +49 -49
  197. package/dist/core/messages/pt/analysts/scorer-messages.js.map +1 -1
  198. package/dist/core/messages/pt/cli/cli-command-convert-messages.d.ts +1 -1
  199. package/dist/core/messages/pt/cli/cli-command-convert-messages.js +1 -1
  200. package/dist/core/messages/pt/cli/cli-command-convert-messages.js.map +1 -1
  201. package/dist/core/messages/pt/cli/cli-command-format-messages.d.ts +1 -1
  202. package/dist/core/messages/pt/cli/cli-command-format-messages.js +1 -1
  203. package/dist/core/messages/pt/cli/cli-command-format-messages.js.map +1 -1
  204. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.d.ts +1 -1
  205. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js +4 -4
  206. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js.map +1 -1
  207. package/dist/core/messages/pt/cli/cli-command-update-messages.d.ts +2 -2
  208. package/dist/core/messages/pt/cli/cli-command-update-messages.js +2 -2
  209. package/dist/core/messages/pt/cli/cli-command-update-messages.js.map +1 -1
  210. package/dist/core/messages/pt/cli/cli-flags-validator-messages.d.ts +3 -3
  211. package/dist/core/messages/pt/cli/cli-flags-validator-messages.js +3 -3
  212. package/dist/core/messages/pt/cli/cli-flags-validator-messages.js.map +1 -1
  213. package/dist/core/messages/pt/core/correcoes-messages.js +2 -2
  214. package/dist/core/messages/pt/core/correcoes-messages.js.map +1 -1
  215. package/dist/core/messages/pt/core/inquisitor-extra-messages.d.ts +2 -2
  216. package/dist/core/messages/pt/core/inquisitor-extra-messages.js +2 -2
  217. package/dist/core/messages/pt/core/inquisitor-extra-messages.js.map +1 -1
  218. package/dist/core/messages/pt/core/parser-extra-messages.d.ts +3 -3
  219. package/dist/core/messages/pt/core/parser-extra-messages.js +3 -3
  220. package/dist/core/messages/pt/core/parser-extra-messages.js.map +1 -1
  221. package/dist/core/messages/pt/guardian/guardian-messages.d.ts +2 -2
  222. package/dist/core/messages/pt/guardian/guardian-messages.js +2 -2
  223. package/dist/core/messages/pt/guardian/guardian-messages.js.map +1 -1
  224. package/dist/core/messages/pt/guardian/watcher-hidden-messages.d.ts +2 -2
  225. package/dist/core/messages/pt/guardian/watcher-hidden-messages.js +2 -2
  226. package/dist/core/messages/pt/guardian/watcher-hidden-messages.js.map +1 -1
  227. package/dist/core/messages/pt/log/log-helper.js.map +1 -1
  228. package/dist/core/messages/pt/reports/report-async-patterns-messages.d.ts +3 -3
  229. package/dist/core/messages/pt/reports/report-async-patterns-messages.js +3 -3
  230. package/dist/core/messages/pt/reports/report-async-patterns-messages.js.map +1 -1
  231. package/dist/core/messages/pt/shared/plugin-core-messages.d.ts +2 -2
  232. package/dist/core/messages/pt/shared/plugin-core-messages.js +2 -2
  233. package/dist/core/messages/pt/shared/plugin-core-messages.js.map +1 -1
  234. package/dist/core/messages/pt/shared/plugin-registry-messages.d.ts +4 -4
  235. package/dist/core/messages/pt/shared/plugin-registry-messages.js +4 -4
  236. package/dist/core/messages/pt/shared/plugin-registry-messages.js.map +1 -1
  237. package/dist/core/messages/zh/analysts/archetypes-extra-messages.d.ts +2 -2
  238. package/dist/core/messages/zh/analysts/archetypes-extra-messages.js +2 -2
  239. package/dist/core/messages/zh/analysts/archetypes-extra-messages.js.map +1 -1
  240. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.d.ts +4 -4
  241. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js +4 -4
  242. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js.map +1 -1
  243. package/dist/core/messages/zh/analysts/detector-js-ts-messages.d.ts +2 -2
  244. package/dist/core/messages/zh/analysts/detector-js-ts-messages.js +2 -2
  245. package/dist/core/messages/zh/analysts/detector-js-ts-messages.js.map +1 -1
  246. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.d.ts +6 -6
  247. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js +6 -6
  248. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js.map +1 -1
  249. package/dist/core/messages/zh/analysts/report-github-actions-messages.d.ts +2 -2
  250. package/dist/core/messages/zh/analysts/report-github-actions-messages.js +2 -2
  251. package/dist/core/messages/zh/analysts/report-github-actions-messages.js.map +1 -1
  252. package/dist/core/messages/zh/analysts/scorer-messages.d.ts +45 -45
  253. package/dist/core/messages/zh/analysts/scorer-messages.js +49 -49
  254. package/dist/core/messages/zh/analysts/scorer-messages.js.map +1 -1
  255. package/dist/core/messages/zh/cli/cli-command-analysts-messages.d.ts +2 -2
  256. package/dist/core/messages/zh/cli/cli-command-analysts-messages.js +2 -2
  257. package/dist/core/messages/zh/cli/cli-command-analysts-messages.js.map +1 -1
  258. package/dist/core/messages/zh/cli/cli-command-convert-messages.d.ts +1 -1
  259. package/dist/core/messages/zh/cli/cli-command-convert-messages.js +1 -1
  260. package/dist/core/messages/zh/cli/cli-command-convert-messages.js.map +1 -1
  261. package/dist/core/messages/zh/cli/cli-command-format-messages.d.ts +1 -1
  262. package/dist/core/messages/zh/cli/cli-command-format-messages.js +1 -1
  263. package/dist/core/messages/zh/cli/cli-command-format-messages.js.map +1 -1
  264. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.d.ts +1 -1
  265. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js +4 -4
  266. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js.map +1 -1
  267. package/dist/core/messages/zh/cli/cli-command-update-messages.d.ts +2 -2
  268. package/dist/core/messages/zh/cli/cli-command-update-messages.js +2 -2
  269. package/dist/core/messages/zh/cli/cli-command-update-messages.js.map +1 -1
  270. package/dist/core/messages/zh/cli/cli-flags-validator-messages.d.ts +3 -3
  271. package/dist/core/messages/zh/cli/cli-flags-validator-messages.js +3 -3
  272. package/dist/core/messages/zh/cli/cli-flags-validator-messages.js.map +1 -1
  273. package/dist/core/messages/zh/core/correcoes-messages.js +2 -2
  274. package/dist/core/messages/zh/core/correcoes-messages.js.map +1 -1
  275. package/dist/core/messages/zh/core/inquisitor-extra-messages.d.ts +2 -2
  276. package/dist/core/messages/zh/core/inquisitor-extra-messages.js +2 -2
  277. package/dist/core/messages/zh/core/inquisitor-extra-messages.js.map +1 -1
  278. package/dist/core/messages/zh/core/parser-extra-messages.d.ts +3 -3
  279. package/dist/core/messages/zh/core/parser-extra-messages.js +3 -3
  280. package/dist/core/messages/zh/core/parser-extra-messages.js.map +1 -1
  281. package/dist/core/messages/zh/guardian/guardian-messages.d.ts +2 -2
  282. package/dist/core/messages/zh/guardian/guardian-messages.js +2 -2
  283. package/dist/core/messages/zh/guardian/guardian-messages.js.map +1 -1
  284. package/dist/core/messages/zh/guardian/watcher-hidden-messages.d.ts +2 -2
  285. package/dist/core/messages/zh/guardian/watcher-hidden-messages.js +2 -2
  286. package/dist/core/messages/zh/guardian/watcher-hidden-messages.js.map +1 -1
  287. package/dist/core/messages/zh/log/log-helper.js.map +1 -1
  288. package/dist/core/messages/zh/reports/report-async-patterns-messages.d.ts +3 -3
  289. package/dist/core/messages/zh/reports/report-async-patterns-messages.js +3 -3
  290. package/dist/core/messages/zh/reports/report-async-patterns-messages.js.map +1 -1
  291. package/dist/core/messages/zh/shared/plugin-core-messages.d.ts +2 -2
  292. package/dist/core/messages/zh/shared/plugin-core-messages.js +2 -2
  293. package/dist/core/messages/zh/shared/plugin-core-messages.js.map +1 -1
  294. package/dist/core/messages/zh/shared/plugin-registry-messages.d.ts +4 -4
  295. package/dist/core/messages/zh/shared/plugin-registry-messages.js +4 -4
  296. package/dist/core/messages/zh/shared/plugin-registry-messages.js.map +1 -1
  297. package/dist/core/parsing/utils.d.ts +3 -3
  298. package/dist/core/workers/worker-pool.js +1 -1
  299. package/dist/core/workers/worker-pool.js.map +1 -1
  300. package/dist/guardian/baseline.js.map +1 -1
  301. package/dist/guardian/constants.js.map +1 -1
  302. package/dist/guardian/diff.js.map +1 -1
  303. package/dist/reports/analise-async-patterns.js +1 -1
  304. package/dist/reports/analise-async-patterns.js.map +1 -1
  305. package/dist/reports/filter-smart.js.map +1 -1
  306. package/dist/reports/report-caretaker-health.js +1 -1
  307. package/dist/reports/report-caretaker-health.js.map +1 -1
  308. package/dist/shared/plugins/init.js.map +1 -1
  309. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"fix-config.js","sourceRoot":"","sources":["../../../../src/core/config/auto/fix-config.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { otimizarSvgLikeSvgo, shouldSugerirOtimizacaoSvg } from '@shared/formatters';\n\nimport type { AutoFixConfig, PatternBasedQuickFix } from '@';\n\nimport { hasMinimumConfidence, isCategoryAllowed, shouldExcludeFile } from './auto-fix-config.js';\n// Re-exporta os tipos para compatibilidade\nexport type { PatternBasedQuickFix };\n// Small textual helpers used by some heuristics\nfunction _isInComment(match: RegExpMatchArray, fullCode: string): boolean {\n const lines = fullCode.split('\\n');\n const matchInicio = typeof match.index === 'number' ? match.index : fullCode.indexOf(match[0]);\n let pos = 0;\n for (let indice = 0; indice < lines.length; indice++) {\n const line = lines[indice];\n const lineInicio = pos;\n const lineFim = pos + line.length;\n if (matchInicio >= lineInicio && matchInicio <= lineFim) {\n const before = line.substring(0, Math.max(0, matchInicio - lineInicio));\n if (/\\/\\//.test(before)) return true;\n const blockInicio = fullCode.lastIndexOf('/*', matchInicio);\n const blockFim = fullCode.indexOf('*/', matchInicio);\n if (blockInicio !== -1 && (blockFim === -1 || blockFim > matchInicio)) return true;\n }\n pos = lineFim + 1;\n }\n return false;\n}\nfunction _isInTodoComment(match: RegExpMatchArray, fullCode: string): boolean {\n const lines = fullCode.split('\\n');\n const matchInicio = typeof match.index === 'number' ? match.index : fullCode.indexOf(match[0]);\n let pos = 0;\n for (let indice = 0; indice < lines.length; indice++) {\n const line = lines[indice];\n const lineInicio = pos;\n const lineFim = pos + line.length;\n if (matchInicio >= lineInicio && matchInicio <= lineFim) {\n if (/TODO|FIXME|XXX|HACK/i.test(line)) return true;\n }\n pos = lineFim + 1;\n }\n return false;\n}\nfunction _isCriticalSystemFile(fullCode: string): boolean {\n const criticalIndicators = ['SPDX-License-Identifier', '@core/configuracao', 'operario-estrutura', 'corretor-estrutura', 'config.js', 'executor.js', 'quick-fix-registry', 'mapa-reversao', 'persistence/persistencia'];\n return criticalIndicators.some(indice => fullCode.includes(indice));\n}\n// 🚨 REGISTRY SEGURO - APENAS QUICK FIXES QUE NÃO QUEBRAM CÓDIGO\nexport const quickCorrecaoRegistro: PatternBasedQuickFix[] = [\n// [OK] Quick fixes reintroduzidos de forma conservadora:\n// Começamos por SVGs, pois a transformação é determinística e segura.\n{\n id: 'svg-optimize-svgo-like',\n title: 'Otimizar SVG (Tutanus)',\n description: 'Remove prolog/doctype/comentários/metadata e colapsa whitespace entre tags para reduzir tamanho do SVG.',\n // Match único do arquivo inteiro\n pattern: /^[\\s\\S]+$/,\n category: 'performance',\n confidence: 95,\n shouldApply: (_match: RegExpMatchArray, fullCode: string, _lineContext: string, fileCaminho?: string): boolean => {\n // Aceita apenas SVGs (por path ou, como fallback, por conteúdo)\n const pareceSvg = /<svg\\b/i.test(fullCode);\n const isSvgCaminho = typeof fileCaminho === 'string' ? /\\.svg$/i.test(fileCaminho) : false;\n if (!isSvgCaminho && !pareceSvg) return false;\n const opt = otimizarSvgLikeSvgo({\n svg: fullCode\n });\n if (!opt.changed) return false;\n if (!shouldSugerirOtimizacaoSvg(opt.originalBytes, opt.optimizedBytes)) return false;\n return true;\n },\n fix: (_match: RegExpMatchArray, fullCode: string): string => {\n const opt = otimizarSvgLikeSvgo({\n svg: fullCode\n });\n return opt.data;\n }\n}, {\n id: 'svg-add-viewbox-safe',\n title: 'Adicionar viewBox (quando seguro)',\n description: 'Quando o SVG tem width/height numéricos e não tem viewBox, adiciona viewBox=\"0 0 width height\".',\n pattern: /^[\\s\\S]+$/,\n category: 'performance',\n confidence: 92,\n shouldApply: (_match: RegExpMatchArray, fullCode: string, _lineContext: string, fileCaminho?: string): boolean => {\n const pareceSvg = /<svg\\b/i.test(fullCode);\n const isSvgCaminho = typeof fileCaminho === 'string' ? /\\.svg$/i.test(fileCaminho) : false;\n if (!isSvgCaminho && !pareceSvg) return false;\n if (/\\bviewBox\\s*=\\s*['\"][^'\"]+['\"]/i.test(fullCode)) return false;\n // Só aplica quando width/height são numéricos (ou px), evitando %/em/etc.\n const width = fullCode.match(/\\bwidth\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const height = fullCode.match(/\\bheight\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const parse = (valor: string): number | null => {\n const metrica = /^\\s*(\\d+(?:\\.\\d+)?)(?:px)?\\s*$/i.exec(valor);\n return metrica ? Number(metrica[1]) : null;\n };\n const dimensaoLargura = parse(width);\n const hash = parse(height);\n return dimensaoLargura !== null && hash !== null && dimensaoLargura > 0 && hash > 0;\n },\n fix: (_match: RegExpMatchArray, fullCode: string): string => {\n // Insere viewBox no start tag do SVG\n const tagMatch = /<svg\\b[^>]*>/i.exec(fullCode);\n if (!tagMatch) return fullCode;\n const tag = tagMatch[0];\n if (/\\bviewBox\\s*=\\s*['\"][^'\"]+['\"]/i.test(tag)) return fullCode;\n const width = fullCode.match(/\\bwidth\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const height = fullCode.match(/\\bheight\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const parse = (valor: string): string | null => {\n const metrica = /^\\s*(\\d+(?:\\.\\d+)?)(?:px)?\\s*$/i.exec(valor);\n return metrica ? metrica[1] : null;\n };\n const dimensaoLargura = parse(width);\n const hash = parse(height);\n if (!dimensaoLargura || !hash) return fullCode;\n const viewBoxAttr = ` viewBox=\"0 0 ${dimensaoLargura} ${hash}\"`;\n const updatedTag = tag.replace(/<svg\\b/i, `<svg${viewBoxAttr}`);\n return fullCode.replace(tag, updatedTag);\n }\n}];\nexport function findQuickFixes(code: string, problemTipo?: string, config?: AutoFixConfig, fileCaminho?: string): Array<PatternBasedQuickFix & {\n matches: RegExpMatchArray[];\n}> {\n const results: Array<PatternBasedQuickFix & {\n matches: RegExpMatchArray[];\n }> = [];\n if (config && fileCaminho && shouldExcludeFile(fileCaminho, config)) return results;\n for (const fix of quickCorrecaoRegistro) {\n if (config && !isCategoryAllowed(fix.category, config)) continue;\n if (config && !hasMinimumConfidence(fix.confidence, config)) continue;\n if (problemTipo && !fix.id.includes(problemTipo)) continue;\n const matches: RegExpMatchArray[] = [];\n fix.pattern.lastIndex = 0;\n let match: RegExpMatchArray | null;\n while ((match = fix.pattern.exec(code)) !== null) {\n if (fix.shouldApply) {\n const lines = code.split('\\n');\n const matchPos = match.index ?? 0;\n const linesBefore = code.substring(0, matchPos).split('\\n');\n const lineContext = lines[linesBefore.length - 1] || '';\n const ok = fix.shouldApply(match, code, lineContext, fileCaminho);\n if (!ok) {\n if (!fix.pattern.global) break;\n continue;\n }\n }\n matches.push(match);\n if (config && typeof config.maxFixesPerArquivo === 'number' && matches.length >= config.maxFixesPerArquivo) break;\n if (!fix.pattern.global) break;\n }\n if (matches.length > 0) results.push({\n ...fix,\n matches\n });\n }\n return results;\n}\nexport function applyQuickFix(code: string, fix: PatternBasedQuickFix, match: RegExpMatchArray): string {\n return fix.fix(match, code);\n}"]}
1
+ {"version":3,"file":"fix-config.js","sourceRoot":"","sources":["../../../../src/core/config/auto/fix-config.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { otimizarSvgLikeSvgo, shouldSugerirOtimizacaoSvg } from '@shared/formatters';\n\nimport type { AutoFixConfig, PatternBasedQuickFix } from '@';\n\nimport { hasMinimumConfidence, isCategoryAllowed, shouldExcludeFile } from './auto-fix-config.js';\n// Re-exporta os tipos para compatibilidade\nexport type { PatternBasedQuickFix };\n// Small textual helpers used by some heuristics\nfunction _isInComment(match: RegExpMatchArray, fullCode: string): boolean {\n const lines = fullCode.split('\\n');\n const matchInicio = typeof match.index === 'number' ? match.index : fullCode.indexOf(match[0]);\n let pos = 0;\n for (let indice = 0; indice < lines.length; indice++) {\n const line = lines[indice];\n const lineInicio = pos;\n const lineFim = pos + line.length;\n if (matchInicio >= lineInicio && matchInicio <= lineFim) {\n const before = line.substring(0, Math.max(0, matchInicio - lineInicio));\n if (/\\/\\//.test(before)) return true;\n const blockInicio = fullCode.lastIndexOf('/*', matchInicio);\n const blockFim = fullCode.indexOf('*/', matchInicio);\n if (blockInicio !== -1 && (blockFim === -1 || blockFim > matchInicio)) return true;\n }\n pos = lineFim + 1;\n }\n return false;\n}\nfunction _isInTodoComment(match: RegExpMatchArray, fullCode: string): boolean {\n const lines = fullCode.split('\\n');\n const matchInicio = typeof match.index === 'number' ? match.index : fullCode.indexOf(match[0]);\n let pos = 0;\n for (let indice = 0; indice < lines.length; indice++) {\n const line = lines[indice];\n const lineInicio = pos;\n const lineFim = pos + line.length;\n if (matchInicio >= lineInicio && matchInicio <= lineFim) {\n if (/TODO|FIXME|XXX|HACK/i.test(line)) return true;\n }\n pos = lineFim + 1;\n }\n return false;\n}\nfunction _isCriticalSystemFile(fullCode: string): boolean {\n const criticalIndicators = ['SPDX-License-Identifier', '@core/configuracao', 'operario-estrutura', 'corretor-estrutura', 'config.js', 'executor.js', 'quick-fix-registry', 'mapa-reversao', 'persistence/persistencia'];\n return criticalIndicators.some(indice => fullCode.includes(indice));\n}\n// [ALERT] REGISTRY SEGURO - APENAS QUICK FIXES QUE NÃO QUEBRAM CÓDIGO\nexport const quickCorrecaoRegistro: PatternBasedQuickFix[] = [\n// [OK] Quick fixes reintroduzidos de forma conservadora:\n// Começamos por SVGs, pois a transformação é determinística e segura.\n{\n id: 'svg-optimize-svgo-like',\n title: 'Otimizar SVG (Tutanus)',\n description: 'Remove prolog/doctype/comentários/metadata e colapsa whitespace entre tags para reduzir tamanho do SVG.',\n // Match único do arquivo inteiro\n pattern: /^[\\s\\S]+$/,\n category: 'performance',\n confidence: 95,\n shouldApply: (_match: RegExpMatchArray, fullCode: string, _lineContext: string, fileCaminho?: string): boolean => {\n // Aceita apenas SVGs (por path ou, como fallback, por conteúdo)\n const pareceSvg = /<svg\\b/i.test(fullCode);\n const isSvgCaminho = typeof fileCaminho === 'string' ? /\\.svg$/i.test(fileCaminho) : false;\n if (!isSvgCaminho && !pareceSvg) return false;\n const opt = otimizarSvgLikeSvgo({\n svg: fullCode\n });\n if (!opt.changed) return false;\n if (!shouldSugerirOtimizacaoSvg(opt.originalBytes, opt.optimizedBytes)) return false;\n return true;\n },\n fix: (_match: RegExpMatchArray, fullCode: string): string => {\n const opt = otimizarSvgLikeSvgo({\n svg: fullCode\n });\n return opt.data;\n }\n}, {\n id: 'svg-add-viewbox-safe',\n title: 'Adicionar viewBox (quando seguro)',\n description: 'Quando o SVG tem width/height numéricos e não tem viewBox, adiciona viewBox=\"0 0 width height\".',\n pattern: /^[\\s\\S]+$/,\n category: 'performance',\n confidence: 92,\n shouldApply: (_match: RegExpMatchArray, fullCode: string, _lineContext: string, fileCaminho?: string): boolean => {\n const pareceSvg = /<svg\\b/i.test(fullCode);\n const isSvgCaminho = typeof fileCaminho === 'string' ? /\\.svg$/i.test(fileCaminho) : false;\n if (!isSvgCaminho && !pareceSvg) return false;\n if (/\\bviewBox\\s*=\\s*['\"][^'\"]+['\"]/i.test(fullCode)) return false;\n // Só aplica quando width/height são numéricos (ou px), evitando %/em/etc.\n const width = fullCode.match(/\\bwidth\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const height = fullCode.match(/\\bheight\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const parse = (valor: string): number | null => {\n const metrica = /^\\s*(\\d+(?:\\.\\d+)?)(?:px)?\\s*$/i.exec(valor);\n return metrica ? Number(metrica[1]) : null;\n };\n const dimensaoLargura = parse(width);\n const hash = parse(height);\n return dimensaoLargura !== null && hash !== null && dimensaoLargura > 0 && hash > 0;\n },\n fix: (_match: RegExpMatchArray, fullCode: string): string => {\n // Insere viewBox no start tag do SVG\n const tagMatch = /<svg\\b[^>]*>/i.exec(fullCode);\n if (!tagMatch) return fullCode;\n const tag = tagMatch[0];\n if (/\\bviewBox\\s*=\\s*['\"][^'\"]+['\"]/i.test(tag)) return fullCode;\n const width = fullCode.match(/\\bwidth\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const height = fullCode.match(/\\bheight\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const parse = (valor: string): string | null => {\n const metrica = /^\\s*(\\d+(?:\\.\\d+)?)(?:px)?\\s*$/i.exec(valor);\n return metrica ? metrica[1] : null;\n };\n const dimensaoLargura = parse(width);\n const hash = parse(height);\n if (!dimensaoLargura || !hash) return fullCode;\n const viewBoxAttr = ` viewBox=\"0 0 ${dimensaoLargura} ${hash}\"`;\n const updatedTag = tag.replace(/<svg\\b/i, `<svg${viewBoxAttr}`);\n return fullCode.replace(tag, updatedTag);\n }\n}];\nexport function findQuickFixes(code: string, problemTipo?: string, config?: AutoFixConfig, fileCaminho?: string): Array<PatternBasedQuickFix & {\n matches: RegExpMatchArray[];\n}> {\n const results: Array<PatternBasedQuickFix & {\n matches: RegExpMatchArray[];\n }> = [];\n if (config && fileCaminho && shouldExcludeFile(fileCaminho, config)) return results;\n for (const fix of quickCorrecaoRegistro) {\n if (config && !isCategoryAllowed(fix.category, config)) continue;\n if (config && !hasMinimumConfidence(fix.confidence, config)) continue;\n if (problemTipo && !fix.id.includes(problemTipo)) continue;\n const matches: RegExpMatchArray[] = [];\n fix.pattern.lastIndex = 0;\n let match: RegExpMatchArray | null;\n while ((match = fix.pattern.exec(code)) !== null) {\n if (fix.shouldApply) {\n const lines = code.split('\\n');\n const matchPos = match.index ?? 0;\n const linesBefore = code.substring(0, matchPos).split('\\n');\n const lineContext = lines[linesBefore.length - 1] || '';\n const ok = fix.shouldApply(match, code, lineContext, fileCaminho);\n if (!ok) {\n if (!fix.pattern.global) break;\n continue;\n }\n }\n matches.push(match);\n if (config && typeof config.maxFixesPerArquivo === 'number' && matches.length >= config.maxFixesPerArquivo) break;\n if (!fix.pattern.global) break;\n }\n if (matches.length > 0) results.push({\n ...fix,\n matches\n });\n }\n return results;\n}\nexport function applyQuickFix(code: string, fix: PatternBasedQuickFix, match: RegExpMatchArray): string {\n return fix.fix(match, code);\n}"]}
@@ -145,7 +145,7 @@ export async function executarInquisicao(fileEntriesComAst, tecnicas, baseDir, g
145
145
  const err = error instanceof Error ? error : new Error(String(error));
146
146
  const isTempoLimite = err.message.includes('Timeout: analista global');
147
147
  const nivelLog = isTempoLimite ? 'aviso' : 'erro';
148
- const prefixo = isTempoLimite ? '' : '[ERRO]';
148
+ const prefixo = isTempoLimite ? '[CLOCK]' : '[ERRO]';
149
149
  if (nivelLog === 'aviso') {
150
150
  log.aviso(`${prefixo} ${err.message}`);
151
151
  }
@@ -373,7 +373,7 @@ export async function executarInquisicao(fileEntriesComAst, tecnicas, baseDir, g
373
373
  });
374
374
  }
375
375
  catch (err) {
376
- log.aviso(`⏰ Falha na travessia otimizada para ${entry.relPath}: ${err instanceof Error ? err.message : String(err)}`);
376
+ log.aviso(`[CLOCK] Falha na travessia otimizada para ${entry.relPath}: ${err instanceof Error ? err.message : String(err)}`);
377
377
  }
378
378
  }
379
379
  for (const tecnica of tecnicas) {
@@ -415,7 +415,7 @@ export async function executarInquisicao(fileEntriesComAst, tecnicas, baseDir, g
415
415
  const ocorrenciasContagem = Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0;
416
416
  logAnalistas.concluido(tecnica.nome || 'analista-desconhecido', entry.relPath, ocorrenciasContagem, duracaoMs);
417
417
  if (detalharPorArquivo) {
418
- log.info(`📄 '${tecnica.nome}' analisou ${entry.relPath} em ${formatMs(duracaoMs)}`);
418
+ log.info(`[FILE] '${tecnica.nome}' analisou ${entry.relPath} em ${formatMs(duracaoMs)}`);
419
419
  }
420
420
  if (config.LOG_ESTRUTURADO) {
421
421
  log.info(JSON.stringify({
@@ -431,7 +431,7 @@ export async function executarInquisicao(fileEntriesComAst, tecnicas, baseDir, g
431
431
  const err = error instanceof Error ? error : new Error(String(error));
432
432
  const isTempoLimite = err.message.includes('Timeout: analista');
433
433
  const nivelLog = isTempoLimite ? 'aviso' : 'erro';
434
- const prefixo = isTempoLimite ? '' : '[ERRO]';
434
+ const prefixo = isTempoLimite ? '[CLOCK]' : '[ERRO]';
435
435
  if (isTempoLimite) {
436
436
  const duracaoEstimada = config.ANALISE_TIMEOUT_POR_ANALISTA_MS || 30000;
437
437
  logAnalistas.timeout(tecnica.nome || 'analista-desconhecido', duracaoEstimada);
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/core/execution/executor.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,GAAG,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,EACJ,GAAG,EACH,OAAO,EACP,sBAAsB,EACtB,YAAY,EACb,GAAG,QAAQ,CAAC;AAGb,KAAK,UAAU,WAAW,CAAI,KAAqB,EAAE,SAAiB,EAAE,YAAoB;IAC1F,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YACtB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAOD,SAAS,aAAa;IACpB,OAAO,UAAyC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,QAAyB;IAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC,+BAA+B,CAAC;IAChE,IAAI,CAAC,gBAAgB;QAAE,OAAO;IAE9B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAU,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAe,CAAC,CAAC;IACzF,MAAM,KAAK,GAAwB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAA+B,CAAC,CAAC,CAAC,EAAE,CAAC;IAClG,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,8BAA8B,IAAI,GAAG,CAAC;IACzD,MAAM,YAAY,CAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,SAAS,GAAG,GAAwE,CAAC;IAC3F,IAAI,OAAO,SAAS,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACjD,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AACD,SAAS,gBAAgB,CAAC,QAAmB;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAuD,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;IAC/G,MAAM,gBAAgB,GAA4B,EAAE,CAAC;IACrD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,SAAS;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,gBAAgB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBACnC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAa,EAAE,KAAc,EAAE,EAAE;oBACxD,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC/B,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACpB,CAAC;yBAAM,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBACnG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC1B,CAAC;oBACD,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;wBAC9B,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACnB,CAAC;yBAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBAC/F,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,iBAAqC,EAAE,QAAmB,EAAE,OAAe,EAAE,iBAAiC,EAAE,IAWxJ;IACC,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,iBAAiB,GAAsB,EAAE,CAAC;IAChD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,EAAE,MAAM,CAAC;IAC7B,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,CAAC;IACxC,MAAM,cAAc,GAAG,CAAC,GAAG,KAAmB,EAAE,EAAE;QAChD,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC3B,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,kBAAkB,GAAqB;QAC3C,OAAO;QACP,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE;YACR,kBAAkB;YAClB,QAAQ,EAAE,iBAAiB;SAC5B;KACF,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAIzC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,SAAS,WAAW,CAAC,CAAU;QAC7B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,KAAK,GAAG,CAAuB,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChE,OAAO,MAAM,IAAK,KAAK,CAAC,IAAgC,CAAC;IAC3D,CAAC;IAED,KAAK,UAAU,uBAAuB,CACpC,QAAmB,EACnB,GAAqB,EACrB,MAAwC,EACxC,WAA8B,EAC9B,IAA4B;QAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,+BAA+B,CAAC;QACzD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,SAAS;YAC9B,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC;oBAC1B,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,SAAS,EACxE,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;oBACnI,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBACxD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;gBACrD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;oBACpC,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc;wBACpC,SAAS;wBACT,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnE,MAAM,EAAE,IAAI;qBACb,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,EAAE,OAAO;oBAAE,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC;gBACvH,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBAChJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;gBACvE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC/C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,sBAAsB,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAClL,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpD,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;wBAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,sBAAsB,CAAC;oBAC5B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,8BAA8B,OAAO,CAAC,IAAI,MAAM,SAAS,aAAa,CAAC,CAAC,CAAC,4BAA4B,OAAO,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE;oBAC9J,OAAO,EAAE,mBAAmB;oBAC5B,MAAM,EAAE,OAAO,CAAC,IAAI;oBACpB,KAAK,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAGD,IAAI,iBAAiB,GAA6B,IAAI,CAAC;IACvD,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAoB,MAAM,CAAC,8BAA8B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACzG,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,2BAA2B;YAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3F,CAAC;IACD,MAAM,UAAU,GAAsB;QACpC,MAAM,EAAE,MAAM,CAAC,2BAA2B;QAC1C,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE;YACZ,sBAAsB,EAAE,CAAC;YACzB,wBAAwB,EAAE,CAAC;YAC3B,eAAe,EAAE,CAAC;SACnB;KACF,CAAC;IACF,SAAS,YAAY,CAAC,IAAY;QAChC,IAAI,CAAC;YAEH,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YAIP,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAErG,KAAK,UAAU,mBAAmB;QAChC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC;YACxB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,MAAM,CAAC,uBAAuB,IAAI,SAAS;YACvD,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,MAAM,CAAC,+BAA+B;SAClD,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,YAAY,CACrC,iBAAiB,EACjB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAC/B,kBAAkB,CACnB,CAAC;QACF,cAAc,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QACzC,iBAAiB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;QACnD,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,sBAAsB,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE3J,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC/C,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;gBACxF,CAAC;gBACD,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;oBAC5B,UAAU,CAAC,YAAY,CAAC,wBAAwB,GAAG,iBAAiB,CAAC,MAAM,CAAC;oBAC5E,UAAU,CAAC,YAAY,CAAC,eAAe,GAAG,OAAO,CAAC;gBACpD,CAAC;gBACD,MAAM,YAAY,CAAC,MAAM,CAAC,8BAA8B,EAAE,UAAU,CAAC,CAAC;YACxE,CAAC;YAAC,MAAM,CAAC,CAAmC,CAAC;QAC/C,CAAC;QAED,MAAM,gBAAgB,GAAoB;YACxC,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,UAAU,EAAE,OAAO;YACnB,sBAAsB,EAAE,WAAW,CAAC,MAAM;YAC1C,SAAS,EAAE,iBAAiB;YAC5B,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,QAAQ,EAAE;SAC5F,CAAC;QACF,MAAM,aAAa,GAAwB;YACzC,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzD,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,OAAO;YAClB,QAAQ,EAAE,gBAAgB;SAC3B,CAAC;QACF,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;QAC9D,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;QAC3B,IAAI,IAAI,EAAE,UAAU;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAC/C,OAAO,MAAM,CAAC,mBAAmB,IAAI,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC,0BAA0B,CAAC;IACpG,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,cAAc,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAGD,MAAM,cAAc,GAAqB;QACvC,GAAG,kBAAkB;QACrB,MAAM,EAAE,KAAK,CAAC,EAAE;YACd,IAAI,CAAC;gBACH,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBAEd,cAAc,CAAC,sBAAsB,CAAC;oBACpC,QAAQ,EAAE,sBAAsB,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;oBACrF,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,UAAU;oBACrC,MAAM,EAAE,UAAU;iBACnB,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;KACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAE/C,MAAM,oBAAoB,GAAG,GAAG,CAAC;IACjC,MAAM,2BAA2B,GAAG,GAAG,CAAC;IAGxC,SAAS,UAAU,CAAC,KAAa;QAE/B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,CAAC,CAAC;QAC3B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;IACjD,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,IAAI,aAAa,IAAI,oBAAoB,CAAC;IAC7F,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,IAAI,aAAa,IAAI,2BAA2B,CAAC;IAGnG,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAGzC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,YAAY,EAAE,CAAC;QACf,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAClB,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAEzB,IAAI,iBAAiB,EAAE,CAAC;gBACtB,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,GAAG,WAAW,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;oBAC7F,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;oBAClD,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC/L,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,GAAG,WAAW,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;oBAC7F,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAChI,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,YAAY,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;YAErE,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;gBACnC,YAAY,CAAC,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACpI,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,KAA8B,EAAE,GAAG,CAAC,CAAC;QACvF,MAAM,UAAU,GAAG,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC;QAE3C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,MAAM,CAAC,2BAA2B,IAAI,aAAa,EAAE,CAAC;YACxD,IAAI,aAAa,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAEhC,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;iBAAM,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;gBAExC,MAAM,cAAc,GAAG,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACpE,IAAI,cAAc,IAAI,cAAc,KAAK,aAAa,CAAC,cAAc,EAAE,CAAC;oBACtE,YAAY,GAAG,IAAI,CAAC;oBACpB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;wBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;gBAC7C,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;gBAC9G,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,kBAAkB,GAAG,CAAC,aAAa,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;oBAC5B,UAAU,CAAC,YAAY,CAAC,sBAAsB,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,sBAAsB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC7G,CAAC;gBACD,IAAI,kBAAkB;oBAAE,OAAO,CAAC,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACxE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBACtB,IAAI,EAAE,mBAAmB;wBACzB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,MAAM;qBAC9C,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,YAAY;YAAE,SAAS;QAG3B,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC3E,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,cAAc,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC1B,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;oBACnC,IAAI;oBACJ,WAAW,EAAE,MAAM;oBACnB,kBAAkB,EAAE,CAAC;iBACtB,CAAC;gBACF,IAAI,kBAAkB;oBAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;gBAC9F,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxG,CAAC;gBACD,SAAS;YACX,CAAC;QACH,CAAC;QAGD,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;gBACxE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE;oBAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,cAAc;oBACxB,UAAU,EAAE,oBAAoB;iBACjC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,uCAAuC,KAAK,CAAC,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzH,CAAC;QACH,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM;gBAAE,SAAS;YAC7B,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,SAAS;YAE3D,MAAM,SAAS,GAAG,MAAM,CAAC,+BAA+B,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAGzC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAEvG,IAAI,SAAkE,CAAC;gBACvE,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjE,MAAM,UAAU,GAAG,SAAS,IAAI,OAAO,CAAC;gBACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC;oBAC5B,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;iBACoB,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;gBACrH,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBAClB,SAAS,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,SAAS,EAClD,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1K,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,MAAM,WAAW,CAAC;gBAChC,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,cAAc,CAAC,GAAG,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;gBACrD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;oBACpC,iBAAiB,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc;wBACpC,SAAS;wBACT,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5E,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC;gBACL,CAAC;gBAGD,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5F,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;gBAC/G,IAAI,kBAAkB,EAAE,CAAC;oBACvB,GAAG,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,IAAI,cAAc,KAAK,CAAC,OAAO,OAAO,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACvF,CAAC;gBACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBACtB,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,SAAS;wBACT,WAAW,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW;qBACnD,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAG/C,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,eAAe,GAAG,MAAM,CAAC,+BAA+B,IAAI,KAAK,CAAC;oBACxE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,eAAe,CAAC,CAAC;gBACjF,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1E,CAAC;gBAGD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,aAAa,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAEvF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;wBACd,IAAI,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;4BACrC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;4BAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAGD,cAAc,CAAC,sBAAsB,CAAC;oBACpC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,uBAAuB,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,SAAS,aAAa,CAAC,CAAC,CAAC,qBAAqB,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE;oBAC5L,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,OAAO,CAAC,IAAI;oBACpB,KAAK,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjC,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/E,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACjF,CAAC;QAGD,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAExF,MAAM,gBAAgB,GAGjB,EAAE,CAAC;YACR,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3E,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;oBAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC;YACJ,CAAC;YACD,MAAM,cAAc,GAAG,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACpE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;gBACnC,IAAI;gBACJ,cAAc,EAAE,cAAc,IAAI,SAAS;gBAC3C,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,gBAAgB;gBAC3B,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC5B,kBAAkB,EAAE,CAAC;aACtB,CAAC;YACF,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC5B,UAAU,CAAC,YAAY,CAAC,wBAAwB,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,wBAAwB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;QAGD,YAAY,CAAC,iBAAiB,EAAE,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,WAAW,EAAE,YAAY,CAAC,MAAM;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC,CAAC;IAE3D,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,gBAAgB,GAA2B,IAAI,CAAC;IACpD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;QACpC,MAAM,eAAe,GAAG,aAAa,EAAE,CAAC,oBAAoB,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACjH,MAAM,eAAe,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;QACnD,gBAAgB,GAAG;YACjB,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC;YACzD,cAAc,EAAE,SAAS;YACzB,YAAY,EAAE,eAAe,CAAC,SAAS;YACvC,YAAY,EAAE,eAAe,CAAC,SAAS;YACvC,SAAS,EAAE,iBAAiB;YAC5B,QAAQ,EAAE;gBACR,IAAI,EAAE,eAAe,CAAC,IAAI;gBAC1B,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC;gBACpD,WAAW,EAAE,eAAe,CAAC,WAAW;aACzC;SACF,CAAC;QACF,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC;YACH,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,6CAA6C,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YAC5B,UAAU,CAAC,YAAY,CAAC,eAAe,GAAG,SAAS,CAAC;QACtD,CAAC;QACD,MAAM,YAAY,CAAC,MAAM,CAAC,8BAA8B,EAAE,UAAU,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBACtB,IAAI,EAAE,mBAAmB;gBACzB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM;gBACjD,sBAAsB,EAAE,UAAU,CAAC,YAAY,EAAE,sBAAsB;gBACvE,WAAW,EAAE,UAAU,CAAC,YAAY,EAAE,wBAAwB;aAC/D,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAwB;QACrC,aAAa,EAAE,iBAAiB,CAAC,MAAM;QACvC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACzD,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,gBAAgB,IAAI,SAAS;KACxC,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAqC;IAC5E,IAAI,CAAC;QACH,aAAa,EAAE,CAAC,4BAA4B,GAAG,QAAQ,IAAI,IAAI,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport crypto from 'node:crypto';\nimport path from 'node:path';\n\nimport { config, formatMs, traverse } from '@core/config';\nimport { messages } from '@core/messages';\nimport { createDefaultReporter } from '@core/reporting';\nimport { WorkerPool } from '@core/workers';\nimport { calcularHashEstrutural } from '@shared/helpers';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\nimport XXH from 'xxhashjs';\n\nimport type { ContextoExecucao, EstadoIncremental, FileEntryWithAst, GuardianResult, MetricaAnalista, MetricaExecucao, MetricasGlobais, Ocorrencia, ResultadoInquisicao, Tecnica } from '@';\nimport { ocorrenciaErroAnalista } from '@';\n\nimport type { ExecutorEventEmitter } from '../../types/core/config/config.js';\nimport { analysisCache } from './analysis-cache.js';\nimport { ScopeAstCache } from './ast-cache.js';\n\nconst {\n log,\n logCore,\n ExecutorExtraMensagens,\n logAnalistas\n} = messages;\nexport type { ExecutorEventEmitter };\n\nasync function withTimeout<T>(value: T | Promise<T>, timeoutMs: number, errorMessage: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n return await Promise.race([\n Promise.resolve(value),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(errorMessage)), timeoutMs);\n })\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\ninterface TutanusExecStore {\n __TUTANUS_METRICAS__?: MetricasGlobais;\n __ULTIMAS_METRICAS_TUTANUS__?: MetricaExecucao | null;\n}\n\nfunction getGlobalExec(): TutanusExecStore {\n return globalThis as unknown as TutanusExecStore;\n}\n\nasync function persistMetricHistory(metricas: MetricaExecucao): Promise<void> {\n const historicoCaminho = config.ANALISE_METRICAS_HISTORICO_PATH;\n if (!historicoCaminho) return;\n type RegistroHistorico = MetricaExecucao & { timestamp: number };\n const anterior = await lerEstado<unknown>(historicoCaminho).catch(() => [] as unknown[]);\n const lista: RegistroHistorico[] = Array.isArray(anterior) ? anterior as RegistroHistorico[] : [];\n lista.push({ ...metricas, timestamp: Date.now() });\n const max = config.ANALISE_METRICAS_HISTORICO_MAX || 200;\n await salvarEstado(historicoCaminho, lista.slice(-max));\n}\n\nfunction infoDestaque(msg: string): void {\n const logCasted = log as { infoDestaque?: (m: string) => void; info: (m: string) => void };\n if (typeof logCasted.infoDestaque === 'function') {\n logCasted.infoDestaque(msg);\n } else {\n logCasted.info(msg);\n }\n}\nfunction combinarVisitors(tecnicas: Tecnica[]): Record<string, unknown> {\n const visitantes = tecnicas.filter((t): t is Tecnica & { visitor: Record<string, unknown> } => 'visitor' in t);\n const visitorCombinado: Record<string, unknown> = {};\n if (visitantes.length === 0) return visitorCombinado;\n for (const item of visitantes) {\n if (!item.visitor) continue;\n for (const [key, val] of Object.entries(item.visitor)) {\n if (!visitorCombinado[key]) {\n visitorCombinado[key] = val;\n } else {\n const prev = visitorCombinado[key];\n visitorCombinado[key] = (path: unknown, state: unknown) => {\n if (typeof prev === 'function') {\n prev(path, state);\n } else if (prev && typeof prev === 'object' && 'enter' in prev && typeof prev.enter === 'function') {\n prev.enter(path, state);\n }\n if (typeof val === 'function') {\n val(path, state);\n } else if (val && typeof val === 'object' && 'enter' in val && typeof val.enter === 'function') {\n val.enter(path, state);\n }\n };\n }\n }\n }\n return visitorCombinado;\n}\n\nexport async function executarInquisicao(fileEntriesComAst: FileEntryWithAst[], tecnicas: Tecnica[], baseDir: string, guardianResultado: GuardianResult, opts?: {\n verbose?: boolean;\n compact?: boolean;\n /** true: força worker pool, false: força sequencial, undefined: auto */\n fast?: boolean;\n /** true: força sequencial (sobrepõe fast/auto) */\n sequential?: boolean;\n /** Opcional: emissor de eventos para file:processed e analysis:complete */\n events?: ExecutorEventEmitter;\n /** Opcional: callback chamado para cada ocorrência encontrada (streaming) */\n onOcorrencia?: (ocorrencia: Ocorrencia) => void;\n}): Promise<ResultadoInquisicao> {\n const ocorrencias: Ocorrencia[] = [];\n const metricasAnalistas: MetricaAnalista[] = [];\n const arquivosValidosSet = new Set(fileEntriesComAst.map(arquivo => arquivo.relPath));\n const emitter = opts?.events;\n const onOcorrencia = opts?.onOcorrencia;\n const pushOcorrencia = (...items: Ocorrencia[]) => {\n ocorrencias.push(...items);\n if (onOcorrencia) {\n for (const item of items) {\n onOcorrencia(item);\n }\n }\n };\n const contextoGlobalBase: ContextoExecucao = {\n baseDir,\n arquivos: fileEntriesComAst,\n ambiente: {\n arquivosValidosSet,\n guardian: guardianResultado\n }\n };\n const reporter = createDefaultReporter();\n const inicioExecucao = performance.now();\n\n // Cache de AST compartilhado entre analistas no mesmo escopo\n // Parsing lazy: ASTs são parseados sob demanda via getOrParse\n const scopeAstCache = new ScopeAstCache();\n\n function hasNodeType(x: unknown): x is { node: { type: string } } {\n if (typeof x !== 'object' || x === null) return false;\n const maybe = x as { node?: unknown };\n if (!maybe.node || typeof maybe.node !== 'object') return false;\n return 'type' in (maybe.node as Record<string, unknown>);\n }\n\n async function processGlobalTechniques(\n tecnicas: Tecnica[],\n ctx: ContextoExecucao,\n pushFn: (...items: Ocorrencia[]) => void,\n metricaList: MetricaAnalista[],\n opts?: { verbose?: boolean }\n ): Promise<void> {\n const timeoutMs = config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n for (const tecnica of tecnicas) {\n if (!tecnica.global) continue;\n try {\n const inicioAnalista = performance.now();\n const result = timeoutMs > 0\n ? await withTimeout(tecnica.aplicar('', '', null, undefined, ctx), timeoutMs,\n ExecutorExtraMensagens.timeoutGlobal.replace('{nome}', tecnica.nome || 'desconhecido').replace('{timeout}', String(timeoutMs)))\n : await tecnica.aplicar('', '', null, undefined, ctx);\n if (Array.isArray(result)) pushFn(...result);\n const duracaoMs = performance.now() - inicioAnalista;\n if (config.ANALISE_METRICAS_ENABLED) {\n metricaList.push({\n nome: tecnica.nome || 'desconhecido',\n duracaoMs,\n ocorrencias: Array.isArray(result) ? result.length : result ? 1 : 0,\n global: true\n });\n }\n if (opts?.verbose) log.sucesso(ExecutorExtraMensagens.tecnicaGlobal.replace('{nome}', tecnica.nome || 'desconhecido'));\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'analista', escopo: 'global', nome: tecnica.nome, duracaoMs, ocorrencias: metricaList.at(-1)?.ocorrencias }));\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const isTempoLimite = err.message.includes('Timeout: analista global');\n const nivelLog = isTempoLimite ? 'aviso' : 'erro';\n const prefixo = isTempoLimite ? '⏰' : '[ERRO]';\n if (nivelLog === 'aviso') {\n log.aviso(`${prefixo} ${err.message}`);\n } else {\n log.erro(`${prefixo} ${ExecutorExtraMensagens.erroTecnicaGlobal.replace('{prefixo}', prefixo).replace('{nome}', tecnica.nome || 'desconhecido').replace('{erro}', err.message)}`);\n if (err.stack && (opts?.verbose || config.DEV_MODE)) {\n log.info(ExecutorExtraMensagens.stackTrace);\n log.info(err.stack);\n }\n }\n pushFn(ocorrenciaErroAnalista({\n mensagem: isTempoLimite ? `Timeout na técnica global '${tecnica.nome}': ${timeoutMs}ms excedido` : `Falha na técnica global '${tecnica.nome}': ${err.message}`,\n relPath: '[execução global]',\n origem: tecnica.nome,\n stack: !isTempoLimite && err.stack ? err.stack : undefined\n }));\n }\n }\n }\n\n // Incremental: carregar estado anterior (tipo importado de @types)\n let estadoIncremental: EstadoIncremental | null = null;\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n const lido = await lerEstado<EstadoIncremental>(config.ANALISE_INCREMENTAL_STATE_PATH).catch(() => null);\n if (lido && lido.versao === config.ANALISE_INCREMENTAL_VERSION) estadoIncremental = lido;\n }\n const novoEstado: EstadoIncremental = {\n versao: config.ANALISE_INCREMENTAL_VERSION,\n arquivos: {},\n estatisticas: {\n totalReaproveitamentos: 0,\n totalArquivosProcessados: 0,\n ultimaDuracaoMs: 0\n }\n };\n function hashConteudo(elem: string) {\n try {\n // Usa xxhash64 (seed arbitrária) para performance\n return XXH.h64(elem, 0xabcd).toString(16);\n } catch {\n // Fallback para SHA1 se algo der errado\n // SHA1 usado apenas para cache de AST (fingerprinting de conteúdo)\n // Não é usado para segurança/criptografia - contexto: deduplicação de parsing\n return crypto.createHash('sha1').update(elem).digest('hex');\n }\n }\n\n await processGlobalTechniques(tecnicas, contextoGlobalBase, pushOcorrencia, metricasAnalistas, opts);\n\n async function processarWorkerPool(): Promise<ResultadoInquisicao> {\n log.info(ExecutorExtraMensagens.modoRapido);\n const wp = new WorkerPool({\n enabled: true,\n maxWorkers: config.WORKER_POOL_MAX_WORKERS || undefined,\n batchSize: 10,\n timeoutMs: config.ANALISE_TIMEOUT_POR_ANALISTA_MS\n });\n const resultado = await wp.processFiles(\n fileEntriesComAst,\n tecnicas.filter(t => !t.global),\n contextoGlobalBase\n );\n pushOcorrencia(...resultado.occurrences);\n metricasAnalistas.push(...resultado.metrics);\n const duracao = performance.now() - inicioExecucao;\n log.sucesso(ExecutorExtraMensagens.analiseRapidaConcluida.replace('{arquivos}', String(fileEntriesComAst.length)).replace('{duracao}', formatMs(duracao)));\n\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n try {\n for (const entry of fileEntriesComAst) {\n const hash = hashConteudo(entry.content ?? '');\n novoEstado.arquivos[entry.relPath] = { hash, ocorrencias: [], reaproveitadoCount: 0 };\n }\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalArquivosProcessados = fileEntriesComAst.length;\n novoEstado.estatisticas.ultimaDuracaoMs = duracao;\n }\n await salvarEstado(config.ANALISE_INCREMENTAL_STATE_PATH, novoEstado);\n } catch { /* Ignora erro ao salvar cache */ }\n }\n\n const metricasExecucao: MetricaExecucao = {\n totalArquivos: fileEntriesComAst.length,\n tempoTotal: duracao,\n ocorrenciasEncontradas: ocorrencias.length,\n analistas: metricasAnalistas,\n workerPool: { workersAtivos: resultado.totalProcessed, duracaoTotalMs: resultado.duration }\n };\n const resultadoFast: ResultadoInquisicao = {\n totalArquivos: fileEntriesComAst.length,\n arquivosAnalisados: fileEntriesComAst.map(e => e.relPath),\n ocorrencias,\n timestamp: Date.now(),\n duracaoMs: duracao,\n metricas: metricasExecucao\n };\n if (emitter) emitter.emit('analysis:complete', resultadoFast);\n return resultadoFast;\n }\n\n const usarWorkerPool = (() => {\n if (opts?.sequential) return false;\n if (opts?.fast !== undefined) return opts.fast;\n return config.WORKER_POOL_ENABLED && fileEntriesComAst.length > config.WORKER_POOL_AUTO_THRESHOLD;\n })();\n\n if (usarWorkerPool && fileEntriesComAst.length > 0) {\n return processarWorkerPool();\n }\n\n // Técnicas por arquivo (modo sequencial padrão)\n const contextoGlobal: ContextoExecucao = {\n ...contextoGlobalBase,\n report: event => {\n try {\n pushOcorrencia(reporter(event));\n } catch (erro) {\n // Reporter nunca deve quebrar a análise; se falhar, emite ocorrência genérica.\n pushOcorrencia(ocorrenciaErroAnalista({\n mensagem: `Falha no reporter: ${erro instanceof Error ? erro.message : String(erro)}`,\n relPath: event?.relPath || '[report]',\n origem: 'reporter'\n }));\n }\n }\n };\n\n const visitorCombinado = combinarVisitors(tecnicas);\n let arquivoAtual = 0;\n const totalArquivos = fileEntriesComAst.length;\n // Limiar para logs detalhados por arquivo\n const LIMIAR_DETALHE_TOTAL = 100; // até aqui permite detalhar por arquivo\n const LIMIAR_DETALHE_LIMITADO_MAX = 250; // até aqui permite \"Arquivo X/Y\" com throttle\n // Define passo de logging quando em modo verbose para evitar spam massivo\n\n function passoDeLog(total: number): number {\n // Assumimos faixas: até 100 => cada arquivo; 101-250 => a cada 10; 251-500 => a cada 25; >500 => a cada 100\n if (total <= 100) return 1;\n if (total <= 250) return 10;\n if (total <= 500) return 25;\n return 100;\n }\n const frames = ['->', '=>', '>>', '=>'] as const;\n const stepVerbose = passoDeLog(totalArquivos);\n const detalharPorArquivo = (opts?.verbose ?? false) && totalArquivos <= LIMIAR_DETALHE_TOTAL;\n const permitirArquivoXY = (opts?.verbose ?? false) && totalArquivos <= LIMIAR_DETALHE_LIMITADO_MAX;\n\n // Inicializa sistema de logs inteligente\n logAnalistas.iniciarBatch(totalArquivos);\n\n // Pool de objetos reutilizáveis entre arquivos (reduz GC pressure)\n const resultadosOtimizados = new Map<string, unknown[]>();\n\n for (const entry of fileEntriesComAst) {\n arquivoAtual++;\n resultadosOtimizados.clear();\n if (opts?.compact) {\n if (arquivoAtual === totalArquivos) {\n log.info(ExecutorExtraMensagens.arquivosAnalisados.replace('{total}', String(totalArquivos)));\n }\n } else if (opts?.verbose) {\n // Em verbose: detalha por arquivo somente até o limiar; entre 101-250 mostra \"Arquivo X/Y\" com throttle; acima disso, só resumo de progresso.\n if (permitirArquivoXY) {\n if (arquivoAtual === 1 || arquivoAtual % stepVerbose === 0 || arquivoAtual === totalArquivos) {\n const seta = frames[arquivoAtual % frames.length];\n log.info(ExecutorExtraMensagens.arquivoAtual.replace('{seta}', seta).replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)).replace('{arquivo}', entry.relPath));\n }\n } else {\n if (arquivoAtual === 1 || arquivoAtual % stepVerbose === 0 || arquivoAtual === totalArquivos) {\n log.info(ExecutorExtraMensagens.progresso.replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)));\n }\n }\n } else if (arquivoAtual % 50 === 0 || arquivoAtual === totalArquivos) {\n // Modo padrão: log apenas a cada 50 arquivos para reduzir ruído\n if (arquivoAtual === totalArquivos) {\n infoDestaque(ExecutorExtraMensagens.progresso.replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)));\n }\n }\n // Resolve AST via cache compartilhado do escopo\n const ext = path.extname(entry.relPath);\n const astDoCache = await scopeAstCache.getOrParse(entry as import('@').FileEntry, ext);\n const astParaUso = astDoCache ?? entry.ast;\n // Verifica incremento com fallback para diff estrutural\n const conteudo = entry.content ?? '';\n const hash = hashConteudo(conteudo);\n const cacheAnterior = estadoIncremental?.arquivos[entry.relPath];\n let reaproveitou = false;\n if (config.ANALISE_INCREMENTAL_ENABLED && cacheAnterior) {\n if (cacheAnterior.hash === hash) {\n // Conteúdo exato igual → reuso total\n reaproveitou = true;\n } else if (cacheAnterior.hashEstrutural) {\n // Conteúdo mudou, verifica se apenas formatação/comentários mudaram\n const hashEstrutural = calcularHashEstrutural(astParaUso, conteudo);\n if (hashEstrutural && hashEstrutural === cacheAnterior.hashEstrutural) {\n reaproveitou = true;\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'structural-reuse', arquivo: entry.relPath }));\n }\n }\n }\n if (reaproveitou) {\n pushOcorrencia(...cacheAnterior.ocorrencias);\n novoEstado.arquivos[entry.relPath] = { ...cacheAnterior, hash, hashEstrutural: cacheAnterior.hashEstrutural };\n novoEstado.arquivos[entry.relPath].reaproveitadoCount = (cacheAnterior.reaproveitadoCount || 0) + 1;\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalReaproveitamentos = (novoEstado.estatisticas.totalReaproveitamentos || 0) + 1;\n }\n if (detalharPorArquivo) logCore.reaproveitadoIncremental(entry.relPath);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'incremental-reuse',\n arquivo: entry.relPath,\n ocorrencias: cacheAnterior.ocorrencias.length\n }));\n }\n }\n }\n if (reaproveitou) continue; // pula analistas\n\n // Cache de análise entre execuções\n if (config.ANALISE_CACHE_ENABLED) {\n const cached = await analysisCache.get(entry.relPath, entry.content ?? '');\n if (cached !== null) {\n pushOcorrencia(...cached);\n novoEstado.arquivos[entry.relPath] = {\n hash,\n ocorrencias: cached,\n reaproveitadoCount: 1\n };\n if (detalharPorArquivo) logCore.reaproveitadoIncremental(`${entry.relPath} (analysis cache)`);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'cache-reuse', arquivo: entry.relPath, ocorrencias: cached.length }));\n }\n continue;\n }\n }\n\n // Otimização: Travessia única para analistas com visitor\n if (Object.keys(visitorCombinado).length > 0 && astParaUso) {\n try {\n const astParam = hasNodeType(astParaUso) ? astParaUso.node : astParaUso;\n traverse(astParam, visitorCombinado, undefined, {\n relPath: entry.relPath,\n contexto: contextoGlobal,\n resultados: resultadosOtimizados // Mapa de analista -> achados\n });\n } catch (err) {\n log.aviso(`⏰ Falha na travessia otimizada para ${entry.relPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n for (const tecnica of tecnicas) {\n if (tecnica.global) continue;\n if (tecnica.test && !tecnica.test(entry.relPath)) continue;\n // início medido apenas por analista específico (inicioAnalista)\n const timeoutMs = config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n try {\n const inicioAnalista = performance.now();\n\n // Log adaptativo: início da análise\n const tamanhoArquivo = entry.content ? Math.round(entry.content.length / 1024) : 0;\n logAnalistas.iniciandoAnalista(tecnica.nome || 'analista-desconhecido', entry.relPath, tamanhoArquivo);\n\n let resultado: Awaited<ReturnType<typeof tecnica.aplicar>> | undefined;\n const astNode = hasNodeType(astParaUso) ? astParaUso.node : null;\n const temVisitor = 'visitor' in tecnica;\n const astParam = temVisitor ? {\n node: astNode,\n preColetado: resultadosOtimizados.get(tecnica.nome || '')\n } as unknown as import('@babel/traverse').NodePath<import('@babel/types').Node> : null;\n const execPromise = tecnica.aplicar(entry.content ?? '', entry.relPath, astParam, entry.fullCaminho, contextoGlobal);\n if (timeoutMs > 0) {\n resultado = await withTimeout(execPromise, timeoutMs,\n ExecutorExtraMensagens.timeoutAnalista.replace('{nome}', tecnica.nome || 'desconhecido').replace('{timeout}', String(timeoutMs)).replace('{arquivo}', entry.relPath));\n } else {\n resultado = await execPromise;\n }\n if (Array.isArray(resultado)) {\n pushOcorrencia(...resultado);\n }\n const duracaoMs = performance.now() - inicioAnalista;\n if (config.ANALISE_METRICAS_ENABLED) {\n metricasAnalistas.push({\n nome: tecnica.nome || 'desconhecido',\n duracaoMs,\n ocorrencias: Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0,\n global: false\n });\n }\n\n // Log adaptativo: conclusão da análise\n const ocorrenciasContagem = Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0;\n logAnalistas.concluido(tecnica.nome || 'analista-desconhecido', entry.relPath, ocorrenciasContagem, duracaoMs);\n if (detalharPorArquivo) {\n log.info(`📄 '${tecnica.nome}' analisou ${entry.relPath} em ${formatMs(duracaoMs)}`);\n }\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'analista',\n arquivo: entry.relPath,\n nome: tecnica.nome,\n duracaoMs,\n ocorrencias: metricasAnalistas.at(-1)?.ocorrencias\n }));\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const isTempoLimite = err.message.includes('Timeout: analista');\n const nivelLog = isTempoLimite ? 'aviso' : 'erro';\n const prefixo = isTempoLimite ? '⏰' : '[ERRO]';\n\n // Log adaptativo para erros e timeouts\n if (isTempoLimite) {\n const duracaoEstimada = config.ANALISE_TIMEOUT_POR_ANALISTA_MS || 30000;\n logAnalistas.timeout(tecnica.nome || 'analista-desconhecido', duracaoEstimada);\n } else {\n logAnalistas.erro(tecnica.nome || 'analista-desconhecido', err.message);\n }\n\n // Log apropriado baseado no tipo de erro\n if (nivelLog === 'aviso') {\n log.aviso(`${prefixo} ${err.message}`);\n } else {\n log.erro(`${prefixo} Erro em '${tecnica.nome}' para ${entry.relPath}: ${err.message}`);\n // Exibe stack trace em modo verbose ou debug\n if (err.stack) {\n if (opts?.verbose || config.DEV_MODE) {\n log.info(ExecutorExtraMensagens.stackTrace);\n log.info(err.stack);\n }\n }\n }\n\n // Registra ocorrência de erro/timeout com stack trace\n pushOcorrencia(ocorrenciaErroAnalista({\n mensagem: isTempoLimite ? `Timeout na técnica '${tecnica.nome}' para ${entry.relPath}: ${timeoutMs}ms excedido` : `Falha na técnica '${tecnica.nome}' para ${entry.relPath}: ${err.message}`,\n relPath: entry.relPath,\n origem: tecnica.nome,\n stack: !isTempoLimite && err.stack ? err.stack : undefined\n }));\n }\n }\n // Salva no cache de análise entre execuções\n if (config.ANALISE_CACHE_ENABLED) {\n const ocorrArquivoCache = ocorrencias.filter(o => o.relPath === entry.relPath);\n await analysisCache.set(entry.relPath, entry.content ?? '', ocorrArquivoCache);\n }\n\n // Salva estado incremental do arquivo processado\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n const ocorrArq = ocorrencias.filter(ocorrencia => ocorrencia.relPath === entry.relPath);\n // Extrai métricas por analista específicas do arquivo\n const analistasArquivo: Record<string, {\n ocorrencias: number;\n duracaoMs: number;\n }> = {};\n for (const metrica of metricasAnalistas.filter(metrica => !metrica.global)) {\n analistasArquivo[metrica.nome] = {\n ocorrencias: metrica.ocorrencias,\n duracaoMs: metrica.duracaoMs\n };\n }\n const hashEstrutural = calcularHashEstrutural(astParaUso, conteudo);\n novoEstado.arquivos[entry.relPath] = {\n hash,\n hashEstrutural: hashEstrutural || undefined,\n ocorrencias: ocorrArq,\n analistas: analistasArquivo,\n ultimaExecucaoMs: Date.now(),\n reaproveitadoCount: 0\n };\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalArquivosProcessados = (novoEstado.estatisticas.totalArquivosProcessados || 0) + 1;\n }\n }\n\n // NOVO: Atualiza progresso por arquivo (não por analista)\n logAnalistas.arquivoProcessado();\n if (emitter) {\n const ocorrArquivo = ocorrencias.filter(ocorrencia => ocorrencia.relPath === entry.relPath);\n emitter.emit('file:processed', {\n relPath: entry.relPath,\n ocorrencias: ocorrArquivo.length\n });\n }\n }\n const fimExecucao = performance.now();\n const duracaoMs = Math.round(fimExecucao - inicioExecucao);\n\n logAnalistas.finalizarBatch(ocorrencias.length, duracaoMs);\n\n let metricasExecucao: MetricaExecucao | null = null;\n if (config.ANALISE_METRICAS_ENABLED) {\n const metricasGlobais = getGlobalExec().__TUTANUS_METRICAS__ || { parsingTimeMs: 0, cacheHits: 0, cacheMiss: 0 };\n const astCacheMetrics = scopeAstCache.getMetrics();\n metricasExecucao = {\n totalArquivos: fileEntriesComAst.length,\n tempoParsingMs: Math.round(metricasGlobais.parsingTimeMs),\n tempoAnaliseMs: duracaoMs,\n cacheAstHits: metricasGlobais.cacheHits,\n cacheAstMiss: metricasGlobais.cacheMiss,\n analistas: metricasAnalistas,\n astCache: {\n hits: astCacheMetrics.hits,\n misses: astCacheMetrics.misses,\n parseTimeMs: Math.round(astCacheMetrics.parseTimeMs),\n cachedFiles: astCacheMetrics.cachedFiles,\n },\n };\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'metricas', ...metricasExecucao }));\n }\n try {\n await persistMetricHistory(metricasExecucao);\n } catch (erro) {\n log.erro(`Falha ao persistir histórico de métricas: ${erro instanceof Error ? erro.message : String(erro)}`);\n }\n }\n\n if (config.ANALISE_CACHE_ENABLED) {\n await analysisCache.persistir().catch(() => {});\n }\n\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.ultimaDuracaoMs = duracaoMs;\n }\n await salvarEstado(config.ANALISE_INCREMENTAL_STATE_PATH, novoEstado);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'incremental-salvo',\n arquivos: Object.keys(novoEstado.arquivos).length,\n totalReaproveitamentos: novoEstado.estatisticas?.totalReaproveitamentos,\n processados: novoEstado.estatisticas?.totalArquivosProcessados\n }));\n }\n }\n const resultado: ResultadoInquisicao = {\n totalArquivos: fileEntriesComAst.length,\n arquivosAnalisados: fileEntriesComAst.map(e => e.relPath),\n ocorrencias,\n timestamp: Date.now(),\n duracaoMs,\n metricas: metricasExecucao || undefined\n };\n if (emitter) {\n emitter.emit('analysis:complete', resultado);\n }\n return resultado;\n}\n\nexport function registrarUltimasMetricas(metricas: MetricaExecucao | undefined): void {\n try {\n getGlobalExec().__ULTIMAS_METRICAS_TUTANUS__ = metricas || null;\n } catch {\n /* ignore */\n }\n}"]}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/core/execution/executor.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,GAAG,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,EACJ,GAAG,EACH,OAAO,EACP,sBAAsB,EACtB,YAAY,EACb,GAAG,QAAQ,CAAC;AAGb,KAAK,UAAU,WAAW,CAAI,KAAqB,EAAE,SAAiB,EAAE,YAAoB;IAC1F,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YACtB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAOD,SAAS,aAAa;IACpB,OAAO,UAAyC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,QAAyB;IAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC,+BAA+B,CAAC;IAChE,IAAI,CAAC,gBAAgB;QAAE,OAAO;IAE9B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAU,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAe,CAAC,CAAC;IACzF,MAAM,KAAK,GAAwB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAA+B,CAAC,CAAC,CAAC,EAAE,CAAC;IAClG,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,8BAA8B,IAAI,GAAG,CAAC;IACzD,MAAM,YAAY,CAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,SAAS,GAAG,GAAwE,CAAC;IAC3F,IAAI,OAAO,SAAS,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACjD,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AACD,SAAS,gBAAgB,CAAC,QAAmB;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAuD,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;IAC/G,MAAM,gBAAgB,GAA4B,EAAE,CAAC;IACrD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,SAAS;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,gBAAgB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBACnC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAa,EAAE,KAAc,EAAE,EAAE;oBACxD,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC/B,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACpB,CAAC;yBAAM,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBACnG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC1B,CAAC;oBACD,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;wBAC9B,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACnB,CAAC;yBAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBAC/F,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,iBAAqC,EAAE,QAAmB,EAAE,OAAe,EAAE,iBAAiC,EAAE,IAWxJ;IACC,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,iBAAiB,GAAsB,EAAE,CAAC;IAChD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,EAAE,MAAM,CAAC;IAC7B,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,CAAC;IACxC,MAAM,cAAc,GAAG,CAAC,GAAG,KAAmB,EAAE,EAAE;QAChD,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC3B,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,kBAAkB,GAAqB;QAC3C,OAAO;QACP,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE;YACR,kBAAkB;YAClB,QAAQ,EAAE,iBAAiB;SAC5B;KACF,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAIzC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,SAAS,WAAW,CAAC,CAAU;QAC7B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,KAAK,GAAG,CAAuB,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChE,OAAO,MAAM,IAAK,KAAK,CAAC,IAAgC,CAAC;IAC3D,CAAC;IAED,KAAK,UAAU,uBAAuB,CACpC,QAAmB,EACnB,GAAqB,EACrB,MAAwC,EACxC,WAA8B,EAC9B,IAA4B;QAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,+BAA+B,CAAC;QACzD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,SAAS;YAC9B,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC;oBAC1B,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,SAAS,EACxE,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;oBACnI,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBACxD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;gBACrD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;oBACpC,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc;wBACpC,SAAS;wBACT,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnE,MAAM,EAAE,IAAI;qBACb,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,EAAE,OAAO;oBAAE,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC;gBACvH,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBAChJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;gBACvE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACrD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,sBAAsB,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAClL,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpD,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;wBAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,sBAAsB,CAAC;oBAC5B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,8BAA8B,OAAO,CAAC,IAAI,MAAM,SAAS,aAAa,CAAC,CAAC,CAAC,4BAA4B,OAAO,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE;oBAC9J,OAAO,EAAE,mBAAmB;oBAC5B,MAAM,EAAE,OAAO,CAAC,IAAI;oBACpB,KAAK,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAGD,IAAI,iBAAiB,GAA6B,IAAI,CAAC;IACvD,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAoB,MAAM,CAAC,8BAA8B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACzG,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,2BAA2B;YAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3F,CAAC;IACD,MAAM,UAAU,GAAsB;QACpC,MAAM,EAAE,MAAM,CAAC,2BAA2B;QAC1C,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE;YACZ,sBAAsB,EAAE,CAAC;YACzB,wBAAwB,EAAE,CAAC;YAC3B,eAAe,EAAE,CAAC;SACnB;KACF,CAAC;IACF,SAAS,YAAY,CAAC,IAAY;QAChC,IAAI,CAAC;YAEH,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YAIP,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAErG,KAAK,UAAU,mBAAmB;QAChC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC;YACxB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,MAAM,CAAC,uBAAuB,IAAI,SAAS;YACvD,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,MAAM,CAAC,+BAA+B;SAClD,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,YAAY,CACrC,iBAAiB,EACjB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAC/B,kBAAkB,CACnB,CAAC;QACF,cAAc,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QACzC,iBAAiB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;QACnD,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,sBAAsB,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE3J,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC/C,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;gBACxF,CAAC;gBACD,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;oBAC5B,UAAU,CAAC,YAAY,CAAC,wBAAwB,GAAG,iBAAiB,CAAC,MAAM,CAAC;oBAC5E,UAAU,CAAC,YAAY,CAAC,eAAe,GAAG,OAAO,CAAC;gBACpD,CAAC;gBACD,MAAM,YAAY,CAAC,MAAM,CAAC,8BAA8B,EAAE,UAAU,CAAC,CAAC;YACxE,CAAC;YAAC,MAAM,CAAC,CAAmC,CAAC;QAC/C,CAAC;QAED,MAAM,gBAAgB,GAAoB;YACxC,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,UAAU,EAAE,OAAO;YACnB,sBAAsB,EAAE,WAAW,CAAC,MAAM;YAC1C,SAAS,EAAE,iBAAiB;YAC5B,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,QAAQ,EAAE;SAC5F,CAAC;QACF,MAAM,aAAa,GAAwB;YACzC,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzD,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,OAAO;YAClB,QAAQ,EAAE,gBAAgB;SAC3B,CAAC;QACF,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;QAC9D,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;QAC3B,IAAI,IAAI,EAAE,UAAU;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAC/C,OAAO,MAAM,CAAC,mBAAmB,IAAI,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC,0BAA0B,CAAC;IACpG,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,cAAc,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAGD,MAAM,cAAc,GAAqB;QACvC,GAAG,kBAAkB;QACrB,MAAM,EAAE,KAAK,CAAC,EAAE;YACd,IAAI,CAAC;gBACH,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBAEd,cAAc,CAAC,sBAAsB,CAAC;oBACpC,QAAQ,EAAE,sBAAsB,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;oBACrF,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,UAAU;oBACrC,MAAM,EAAE,UAAU;iBACnB,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;KACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAE/C,MAAM,oBAAoB,GAAG,GAAG,CAAC;IACjC,MAAM,2BAA2B,GAAG,GAAG,CAAC;IAGxC,SAAS,UAAU,CAAC,KAAa;QAE/B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,CAAC,CAAC;QAC3B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;IACjD,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,IAAI,aAAa,IAAI,oBAAoB,CAAC;IAC7F,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,IAAI,aAAa,IAAI,2BAA2B,CAAC;IAGnG,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAGzC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,YAAY,EAAE,CAAC;QACf,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAClB,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAEzB,IAAI,iBAAiB,EAAE,CAAC;gBACtB,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,GAAG,WAAW,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;oBAC7F,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;oBAClD,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC/L,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,GAAG,WAAW,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;oBAC7F,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAChI,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,YAAY,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;YAErE,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;gBACnC,YAAY,CAAC,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACpI,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,KAA8B,EAAE,GAAG,CAAC,CAAC;QACvF,MAAM,UAAU,GAAG,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC;QAE3C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,MAAM,CAAC,2BAA2B,IAAI,aAAa,EAAE,CAAC;YACxD,IAAI,aAAa,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAEhC,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;iBAAM,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;gBAExC,MAAM,cAAc,GAAG,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACpE,IAAI,cAAc,IAAI,cAAc,KAAK,aAAa,CAAC,cAAc,EAAE,CAAC;oBACtE,YAAY,GAAG,IAAI,CAAC;oBACpB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;wBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;gBAC7C,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;gBAC9G,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,kBAAkB,GAAG,CAAC,aAAa,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;oBAC5B,UAAU,CAAC,YAAY,CAAC,sBAAsB,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,sBAAsB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC7G,CAAC;gBACD,IAAI,kBAAkB;oBAAE,OAAO,CAAC,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACxE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBACtB,IAAI,EAAE,mBAAmB;wBACzB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,MAAM;qBAC9C,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,YAAY;YAAE,SAAS;QAG3B,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC3E,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,cAAc,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC1B,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;oBACnC,IAAI;oBACJ,WAAW,EAAE,MAAM;oBACnB,kBAAkB,EAAE,CAAC;iBACtB,CAAC;gBACF,IAAI,kBAAkB;oBAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;gBAC9F,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxG,CAAC;gBACD,SAAS;YACX,CAAC;QACH,CAAC;QAGD,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;gBACxE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE;oBAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,cAAc;oBACxB,UAAU,EAAE,oBAAoB;iBACjC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,6CAA6C,KAAK,CAAC,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/H,CAAC;QACH,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM;gBAAE,SAAS;YAC7B,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,SAAS;YAE3D,MAAM,SAAS,GAAG,MAAM,CAAC,+BAA+B,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAGzC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAEvG,IAAI,SAAkE,CAAC;gBACvE,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjE,MAAM,UAAU,GAAG,SAAS,IAAI,OAAO,CAAC;gBACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC;oBAC5B,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;iBACoB,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;gBACrH,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBAClB,SAAS,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,SAAS,EAClD,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1K,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,MAAM,WAAW,CAAC;gBAChC,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,cAAc,CAAC,GAAG,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;gBACrD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;oBACpC,iBAAiB,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc;wBACpC,SAAS;wBACT,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5E,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC;gBACL,CAAC;gBAGD,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5F,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;gBAC/G,IAAI,kBAAkB,EAAE,CAAC;oBACvB,GAAG,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,IAAI,cAAc,KAAK,CAAC,OAAO,OAAO,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAC3F,CAAC;gBACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBACtB,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,SAAS;wBACT,WAAW,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW;qBACnD,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAGrD,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,eAAe,GAAG,MAAM,CAAC,+BAA+B,IAAI,KAAK,CAAC;oBACxE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,eAAe,CAAC,CAAC;gBACjF,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1E,CAAC;gBAGD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,aAAa,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAEvF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;wBACd,IAAI,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;4BACrC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;4BAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAGD,cAAc,CAAC,sBAAsB,CAAC;oBACpC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,uBAAuB,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,SAAS,aAAa,CAAC,CAAC,CAAC,qBAAqB,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE;oBAC5L,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,OAAO,CAAC,IAAI;oBACpB,KAAK,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjC,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/E,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACjF,CAAC;QAGD,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAExF,MAAM,gBAAgB,GAGjB,EAAE,CAAC;YACR,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3E,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;oBAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC;YACJ,CAAC;YACD,MAAM,cAAc,GAAG,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACpE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;gBACnC,IAAI;gBACJ,cAAc,EAAE,cAAc,IAAI,SAAS;gBAC3C,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,gBAAgB;gBAC3B,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC5B,kBAAkB,EAAE,CAAC;aACtB,CAAC;YACF,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC5B,UAAU,CAAC,YAAY,CAAC,wBAAwB,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,wBAAwB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;QAGD,YAAY,CAAC,iBAAiB,EAAE,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,WAAW,EAAE,YAAY,CAAC,MAAM;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC,CAAC;IAE3D,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,gBAAgB,GAA2B,IAAI,CAAC;IACpD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;QACpC,MAAM,eAAe,GAAG,aAAa,EAAE,CAAC,oBAAoB,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACjH,MAAM,eAAe,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;QACnD,gBAAgB,GAAG;YACjB,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC;YACzD,cAAc,EAAE,SAAS;YACzB,YAAY,EAAE,eAAe,CAAC,SAAS;YACvC,YAAY,EAAE,eAAe,CAAC,SAAS;YACvC,SAAS,EAAE,iBAAiB;YAC5B,QAAQ,EAAE;gBACR,IAAI,EAAE,eAAe,CAAC,IAAI;gBAC1B,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC;gBACpD,WAAW,EAAE,eAAe,CAAC,WAAW;aACzC;SACF,CAAC;QACF,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC;YACH,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,6CAA6C,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YAC5B,UAAU,CAAC,YAAY,CAAC,eAAe,GAAG,SAAS,CAAC;QACtD,CAAC;QACD,MAAM,YAAY,CAAC,MAAM,CAAC,8BAA8B,EAAE,UAAU,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBACtB,IAAI,EAAE,mBAAmB;gBACzB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM;gBACjD,sBAAsB,EAAE,UAAU,CAAC,YAAY,EAAE,sBAAsB;gBACvE,WAAW,EAAE,UAAU,CAAC,YAAY,EAAE,wBAAwB;aAC/D,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAwB;QACrC,aAAa,EAAE,iBAAiB,CAAC,MAAM;QACvC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACzD,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,gBAAgB,IAAI,SAAS;KACxC,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAqC;IAC5E,IAAI,CAAC;QACH,aAAa,EAAE,CAAC,4BAA4B,GAAG,QAAQ,IAAI,IAAI,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport crypto from 'node:crypto';\nimport path from 'node:path';\n\nimport { config, formatMs, traverse } from '@core/config';\nimport { messages } from '@core/messages';\nimport { createDefaultReporter } from '@core/reporting';\nimport { WorkerPool } from '@core/workers';\nimport { calcularHashEstrutural } from '@shared/helpers';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\nimport XXH from 'xxhashjs';\n\nimport type { ContextoExecucao, EstadoIncremental, FileEntryWithAst, GuardianResult, MetricaAnalista, MetricaExecucao, MetricasGlobais, Ocorrencia, ResultadoInquisicao, Tecnica } from '@';\nimport { ocorrenciaErroAnalista } from '@';\n\nimport type { ExecutorEventEmitter } from '../../types/core/config/config.js';\nimport { analysisCache } from './analysis-cache.js';\nimport { ScopeAstCache } from './ast-cache.js';\n\nconst {\n log,\n logCore,\n ExecutorExtraMensagens,\n logAnalistas\n} = messages;\nexport type { ExecutorEventEmitter };\n\nasync function withTimeout<T>(value: T | Promise<T>, timeoutMs: number, errorMessage: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n return await Promise.race([\n Promise.resolve(value),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(errorMessage)), timeoutMs);\n })\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\ninterface TutanusExecStore {\n __TUTANUS_METRICAS__?: MetricasGlobais;\n __ULTIMAS_METRICAS_TUTANUS__?: MetricaExecucao | null;\n}\n\nfunction getGlobalExec(): TutanusExecStore {\n return globalThis as unknown as TutanusExecStore;\n}\n\nasync function persistMetricHistory(metricas: MetricaExecucao): Promise<void> {\n const historicoCaminho = config.ANALISE_METRICAS_HISTORICO_PATH;\n if (!historicoCaminho) return;\n type RegistroHistorico = MetricaExecucao & { timestamp: number };\n const anterior = await lerEstado<unknown>(historicoCaminho).catch(() => [] as unknown[]);\n const lista: RegistroHistorico[] = Array.isArray(anterior) ? anterior as RegistroHistorico[] : [];\n lista.push({ ...metricas, timestamp: Date.now() });\n const max = config.ANALISE_METRICAS_HISTORICO_MAX || 200;\n await salvarEstado(historicoCaminho, lista.slice(-max));\n}\n\nfunction infoDestaque(msg: string): void {\n const logCasted = log as { infoDestaque?: (m: string) => void; info: (m: string) => void };\n if (typeof logCasted.infoDestaque === 'function') {\n logCasted.infoDestaque(msg);\n } else {\n logCasted.info(msg);\n }\n}\nfunction combinarVisitors(tecnicas: Tecnica[]): Record<string, unknown> {\n const visitantes = tecnicas.filter((t): t is Tecnica & { visitor: Record<string, unknown> } => 'visitor' in t);\n const visitorCombinado: Record<string, unknown> = {};\n if (visitantes.length === 0) return visitorCombinado;\n for (const item of visitantes) {\n if (!item.visitor) continue;\n for (const [key, val] of Object.entries(item.visitor)) {\n if (!visitorCombinado[key]) {\n visitorCombinado[key] = val;\n } else {\n const prev = visitorCombinado[key];\n visitorCombinado[key] = (path: unknown, state: unknown) => {\n if (typeof prev === 'function') {\n prev(path, state);\n } else if (prev && typeof prev === 'object' && 'enter' in prev && typeof prev.enter === 'function') {\n prev.enter(path, state);\n }\n if (typeof val === 'function') {\n val(path, state);\n } else if (val && typeof val === 'object' && 'enter' in val && typeof val.enter === 'function') {\n val.enter(path, state);\n }\n };\n }\n }\n }\n return visitorCombinado;\n}\n\nexport async function executarInquisicao(fileEntriesComAst: FileEntryWithAst[], tecnicas: Tecnica[], baseDir: string, guardianResultado: GuardianResult, opts?: {\n verbose?: boolean;\n compact?: boolean;\n /** true: força worker pool, false: força sequencial, undefined: auto */\n fast?: boolean;\n /** true: força sequencial (sobrepõe fast/auto) */\n sequential?: boolean;\n /** Opcional: emissor de eventos para file:processed e analysis:complete */\n events?: ExecutorEventEmitter;\n /** Opcional: callback chamado para cada ocorrência encontrada (streaming) */\n onOcorrencia?: (ocorrencia: Ocorrencia) => void;\n}): Promise<ResultadoInquisicao> {\n const ocorrencias: Ocorrencia[] = [];\n const metricasAnalistas: MetricaAnalista[] = [];\n const arquivosValidosSet = new Set(fileEntriesComAst.map(arquivo => arquivo.relPath));\n const emitter = opts?.events;\n const onOcorrencia = opts?.onOcorrencia;\n const pushOcorrencia = (...items: Ocorrencia[]) => {\n ocorrencias.push(...items);\n if (onOcorrencia) {\n for (const item of items) {\n onOcorrencia(item);\n }\n }\n };\n const contextoGlobalBase: ContextoExecucao = {\n baseDir,\n arquivos: fileEntriesComAst,\n ambiente: {\n arquivosValidosSet,\n guardian: guardianResultado\n }\n };\n const reporter = createDefaultReporter();\n const inicioExecucao = performance.now();\n\n // Cache de AST compartilhado entre analistas no mesmo escopo\n // Parsing lazy: ASTs são parseados sob demanda via getOrParse\n const scopeAstCache = new ScopeAstCache();\n\n function hasNodeType(x: unknown): x is { node: { type: string } } {\n if (typeof x !== 'object' || x === null) return false;\n const maybe = x as { node?: unknown };\n if (!maybe.node || typeof maybe.node !== 'object') return false;\n return 'type' in (maybe.node as Record<string, unknown>);\n }\n\n async function processGlobalTechniques(\n tecnicas: Tecnica[],\n ctx: ContextoExecucao,\n pushFn: (...items: Ocorrencia[]) => void,\n metricaList: MetricaAnalista[],\n opts?: { verbose?: boolean }\n ): Promise<void> {\n const timeoutMs = config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n for (const tecnica of tecnicas) {\n if (!tecnica.global) continue;\n try {\n const inicioAnalista = performance.now();\n const result = timeoutMs > 0\n ? await withTimeout(tecnica.aplicar('', '', null, undefined, ctx), timeoutMs,\n ExecutorExtraMensagens.timeoutGlobal.replace('{nome}', tecnica.nome || 'desconhecido').replace('{timeout}', String(timeoutMs)))\n : await tecnica.aplicar('', '', null, undefined, ctx);\n if (Array.isArray(result)) pushFn(...result);\n const duracaoMs = performance.now() - inicioAnalista;\n if (config.ANALISE_METRICAS_ENABLED) {\n metricaList.push({\n nome: tecnica.nome || 'desconhecido',\n duracaoMs,\n ocorrencias: Array.isArray(result) ? result.length : result ? 1 : 0,\n global: true\n });\n }\n if (opts?.verbose) log.sucesso(ExecutorExtraMensagens.tecnicaGlobal.replace('{nome}', tecnica.nome || 'desconhecido'));\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'analista', escopo: 'global', nome: tecnica.nome, duracaoMs, ocorrencias: metricaList.at(-1)?.ocorrencias }));\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const isTempoLimite = err.message.includes('Timeout: analista global');\n const nivelLog = isTempoLimite ? 'aviso' : 'erro';\n const prefixo = isTempoLimite ? '[CLOCK]' : '[ERRO]';\n if (nivelLog === 'aviso') {\n log.aviso(`${prefixo} ${err.message}`);\n } else {\n log.erro(`${prefixo} ${ExecutorExtraMensagens.erroTecnicaGlobal.replace('{prefixo}', prefixo).replace('{nome}', tecnica.nome || 'desconhecido').replace('{erro}', err.message)}`);\n if (err.stack && (opts?.verbose || config.DEV_MODE)) {\n log.info(ExecutorExtraMensagens.stackTrace);\n log.info(err.stack);\n }\n }\n pushFn(ocorrenciaErroAnalista({\n mensagem: isTempoLimite ? `Timeout na técnica global '${tecnica.nome}': ${timeoutMs}ms excedido` : `Falha na técnica global '${tecnica.nome}': ${err.message}`,\n relPath: '[execução global]',\n origem: tecnica.nome,\n stack: !isTempoLimite && err.stack ? err.stack : undefined\n }));\n }\n }\n }\n\n // Incremental: carregar estado anterior (tipo importado de @types)\n let estadoIncremental: EstadoIncremental | null = null;\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n const lido = await lerEstado<EstadoIncremental>(config.ANALISE_INCREMENTAL_STATE_PATH).catch(() => null);\n if (lido && lido.versao === config.ANALISE_INCREMENTAL_VERSION) estadoIncremental = lido;\n }\n const novoEstado: EstadoIncremental = {\n versao: config.ANALISE_INCREMENTAL_VERSION,\n arquivos: {},\n estatisticas: {\n totalReaproveitamentos: 0,\n totalArquivosProcessados: 0,\n ultimaDuracaoMs: 0\n }\n };\n function hashConteudo(elem: string) {\n try {\n // Usa xxhash64 (seed arbitrária) para performance\n return XXH.h64(elem, 0xabcd).toString(16);\n } catch {\n // Fallback para SHA1 se algo der errado\n // SHA1 usado apenas para cache de AST (fingerprinting de conteúdo)\n // Não é usado para segurança/criptografia - contexto: deduplicação de parsing\n return crypto.createHash('sha1').update(elem).digest('hex');\n }\n }\n\n await processGlobalTechniques(tecnicas, contextoGlobalBase, pushOcorrencia, metricasAnalistas, opts);\n\n async function processarWorkerPool(): Promise<ResultadoInquisicao> {\n log.info(ExecutorExtraMensagens.modoRapido);\n const wp = new WorkerPool({\n enabled: true,\n maxWorkers: config.WORKER_POOL_MAX_WORKERS || undefined,\n batchSize: 10,\n timeoutMs: config.ANALISE_TIMEOUT_POR_ANALISTA_MS\n });\n const resultado = await wp.processFiles(\n fileEntriesComAst,\n tecnicas.filter(t => !t.global),\n contextoGlobalBase\n );\n pushOcorrencia(...resultado.occurrences);\n metricasAnalistas.push(...resultado.metrics);\n const duracao = performance.now() - inicioExecucao;\n log.sucesso(ExecutorExtraMensagens.analiseRapidaConcluida.replace('{arquivos}', String(fileEntriesComAst.length)).replace('{duracao}', formatMs(duracao)));\n\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n try {\n for (const entry of fileEntriesComAst) {\n const hash = hashConteudo(entry.content ?? '');\n novoEstado.arquivos[entry.relPath] = { hash, ocorrencias: [], reaproveitadoCount: 0 };\n }\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalArquivosProcessados = fileEntriesComAst.length;\n novoEstado.estatisticas.ultimaDuracaoMs = duracao;\n }\n await salvarEstado(config.ANALISE_INCREMENTAL_STATE_PATH, novoEstado);\n } catch { /* Ignora erro ao salvar cache */ }\n }\n\n const metricasExecucao: MetricaExecucao = {\n totalArquivos: fileEntriesComAst.length,\n tempoTotal: duracao,\n ocorrenciasEncontradas: ocorrencias.length,\n analistas: metricasAnalistas,\n workerPool: { workersAtivos: resultado.totalProcessed, duracaoTotalMs: resultado.duration }\n };\n const resultadoFast: ResultadoInquisicao = {\n totalArquivos: fileEntriesComAst.length,\n arquivosAnalisados: fileEntriesComAst.map(e => e.relPath),\n ocorrencias,\n timestamp: Date.now(),\n duracaoMs: duracao,\n metricas: metricasExecucao\n };\n if (emitter) emitter.emit('analysis:complete', resultadoFast);\n return resultadoFast;\n }\n\n const usarWorkerPool = (() => {\n if (opts?.sequential) return false;\n if (opts?.fast !== undefined) return opts.fast;\n return config.WORKER_POOL_ENABLED && fileEntriesComAst.length > config.WORKER_POOL_AUTO_THRESHOLD;\n })();\n\n if (usarWorkerPool && fileEntriesComAst.length > 0) {\n return processarWorkerPool();\n }\n\n // Técnicas por arquivo (modo sequencial padrão)\n const contextoGlobal: ContextoExecucao = {\n ...contextoGlobalBase,\n report: event => {\n try {\n pushOcorrencia(reporter(event));\n } catch (erro) {\n // Reporter nunca deve quebrar a análise; se falhar, emite ocorrência genérica.\n pushOcorrencia(ocorrenciaErroAnalista({\n mensagem: `Falha no reporter: ${erro instanceof Error ? erro.message : String(erro)}`,\n relPath: event?.relPath || '[report]',\n origem: 'reporter'\n }));\n }\n }\n };\n\n const visitorCombinado = combinarVisitors(tecnicas);\n let arquivoAtual = 0;\n const totalArquivos = fileEntriesComAst.length;\n // Limiar para logs detalhados por arquivo\n const LIMIAR_DETALHE_TOTAL = 100; // até aqui permite detalhar por arquivo\n const LIMIAR_DETALHE_LIMITADO_MAX = 250; // até aqui permite \"Arquivo X/Y\" com throttle\n // Define passo de logging quando em modo verbose para evitar spam massivo\n\n function passoDeLog(total: number): number {\n // Assumimos faixas: até 100 => cada arquivo; 101-250 => a cada 10; 251-500 => a cada 25; >500 => a cada 100\n if (total <= 100) return 1;\n if (total <= 250) return 10;\n if (total <= 500) return 25;\n return 100;\n }\n const frames = ['->', '=>', '>>', '=>'] as const;\n const stepVerbose = passoDeLog(totalArquivos);\n const detalharPorArquivo = (opts?.verbose ?? false) && totalArquivos <= LIMIAR_DETALHE_TOTAL;\n const permitirArquivoXY = (opts?.verbose ?? false) && totalArquivos <= LIMIAR_DETALHE_LIMITADO_MAX;\n\n // Inicializa sistema de logs inteligente\n logAnalistas.iniciarBatch(totalArquivos);\n\n // Pool de objetos reutilizáveis entre arquivos (reduz GC pressure)\n const resultadosOtimizados = new Map<string, unknown[]>();\n\n for (const entry of fileEntriesComAst) {\n arquivoAtual++;\n resultadosOtimizados.clear();\n if (opts?.compact) {\n if (arquivoAtual === totalArquivos) {\n log.info(ExecutorExtraMensagens.arquivosAnalisados.replace('{total}', String(totalArquivos)));\n }\n } else if (opts?.verbose) {\n // Em verbose: detalha por arquivo somente até o limiar; entre 101-250 mostra \"Arquivo X/Y\" com throttle; acima disso, só resumo de progresso.\n if (permitirArquivoXY) {\n if (arquivoAtual === 1 || arquivoAtual % stepVerbose === 0 || arquivoAtual === totalArquivos) {\n const seta = frames[arquivoAtual % frames.length];\n log.info(ExecutorExtraMensagens.arquivoAtual.replace('{seta}', seta).replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)).replace('{arquivo}', entry.relPath));\n }\n } else {\n if (arquivoAtual === 1 || arquivoAtual % stepVerbose === 0 || arquivoAtual === totalArquivos) {\n log.info(ExecutorExtraMensagens.progresso.replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)));\n }\n }\n } else if (arquivoAtual % 50 === 0 || arquivoAtual === totalArquivos) {\n // Modo padrão: log apenas a cada 50 arquivos para reduzir ruído\n if (arquivoAtual === totalArquivos) {\n infoDestaque(ExecutorExtraMensagens.progresso.replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)));\n }\n }\n // Resolve AST via cache compartilhado do escopo\n const ext = path.extname(entry.relPath);\n const astDoCache = await scopeAstCache.getOrParse(entry as import('@').FileEntry, ext);\n const astParaUso = astDoCache ?? entry.ast;\n // Verifica incremento com fallback para diff estrutural\n const conteudo = entry.content ?? '';\n const hash = hashConteudo(conteudo);\n const cacheAnterior = estadoIncremental?.arquivos[entry.relPath];\n let reaproveitou = false;\n if (config.ANALISE_INCREMENTAL_ENABLED && cacheAnterior) {\n if (cacheAnterior.hash === hash) {\n // Conteúdo exato igual → reuso total\n reaproveitou = true;\n } else if (cacheAnterior.hashEstrutural) {\n // Conteúdo mudou, verifica se apenas formatação/comentários mudaram\n const hashEstrutural = calcularHashEstrutural(astParaUso, conteudo);\n if (hashEstrutural && hashEstrutural === cacheAnterior.hashEstrutural) {\n reaproveitou = true;\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'structural-reuse', arquivo: entry.relPath }));\n }\n }\n }\n if (reaproveitou) {\n pushOcorrencia(...cacheAnterior.ocorrencias);\n novoEstado.arquivos[entry.relPath] = { ...cacheAnterior, hash, hashEstrutural: cacheAnterior.hashEstrutural };\n novoEstado.arquivos[entry.relPath].reaproveitadoCount = (cacheAnterior.reaproveitadoCount || 0) + 1;\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalReaproveitamentos = (novoEstado.estatisticas.totalReaproveitamentos || 0) + 1;\n }\n if (detalharPorArquivo) logCore.reaproveitadoIncremental(entry.relPath);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'incremental-reuse',\n arquivo: entry.relPath,\n ocorrencias: cacheAnterior.ocorrencias.length\n }));\n }\n }\n }\n if (reaproveitou) continue; // pula analistas\n\n // Cache de análise entre execuções\n if (config.ANALISE_CACHE_ENABLED) {\n const cached = await analysisCache.get(entry.relPath, entry.content ?? '');\n if (cached !== null) {\n pushOcorrencia(...cached);\n novoEstado.arquivos[entry.relPath] = {\n hash,\n ocorrencias: cached,\n reaproveitadoCount: 1\n };\n if (detalharPorArquivo) logCore.reaproveitadoIncremental(`${entry.relPath} (analysis cache)`);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'cache-reuse', arquivo: entry.relPath, ocorrencias: cached.length }));\n }\n continue;\n }\n }\n\n // Otimização: Travessia única para analistas com visitor\n if (Object.keys(visitorCombinado).length > 0 && astParaUso) {\n try {\n const astParam = hasNodeType(astParaUso) ? astParaUso.node : astParaUso;\n traverse(astParam, visitorCombinado, undefined, {\n relPath: entry.relPath,\n contexto: contextoGlobal,\n resultados: resultadosOtimizados // Mapa de analista -> achados\n });\n } catch (err) {\n log.aviso(`[CLOCK] Falha na travessia otimizada para ${entry.relPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n for (const tecnica of tecnicas) {\n if (tecnica.global) continue;\n if (tecnica.test && !tecnica.test(entry.relPath)) continue;\n // início medido apenas por analista específico (inicioAnalista)\n const timeoutMs = config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n try {\n const inicioAnalista = performance.now();\n\n // Log adaptativo: início da análise\n const tamanhoArquivo = entry.content ? Math.round(entry.content.length / 1024) : 0;\n logAnalistas.iniciandoAnalista(tecnica.nome || 'analista-desconhecido', entry.relPath, tamanhoArquivo);\n\n let resultado: Awaited<ReturnType<typeof tecnica.aplicar>> | undefined;\n const astNode = hasNodeType(astParaUso) ? astParaUso.node : null;\n const temVisitor = 'visitor' in tecnica;\n const astParam = temVisitor ? {\n node: astNode,\n preColetado: resultadosOtimizados.get(tecnica.nome || '')\n } as unknown as import('@babel/traverse').NodePath<import('@babel/types').Node> : null;\n const execPromise = tecnica.aplicar(entry.content ?? '', entry.relPath, astParam, entry.fullCaminho, contextoGlobal);\n if (timeoutMs > 0) {\n resultado = await withTimeout(execPromise, timeoutMs,\n ExecutorExtraMensagens.timeoutAnalista.replace('{nome}', tecnica.nome || 'desconhecido').replace('{timeout}', String(timeoutMs)).replace('{arquivo}', entry.relPath));\n } else {\n resultado = await execPromise;\n }\n if (Array.isArray(resultado)) {\n pushOcorrencia(...resultado);\n }\n const duracaoMs = performance.now() - inicioAnalista;\n if (config.ANALISE_METRICAS_ENABLED) {\n metricasAnalistas.push({\n nome: tecnica.nome || 'desconhecido',\n duracaoMs,\n ocorrencias: Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0,\n global: false\n });\n }\n\n // Log adaptativo: conclusão da análise\n const ocorrenciasContagem = Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0;\n logAnalistas.concluido(tecnica.nome || 'analista-desconhecido', entry.relPath, ocorrenciasContagem, duracaoMs);\n if (detalharPorArquivo) {\n log.info(`[FILE] '${tecnica.nome}' analisou ${entry.relPath} em ${formatMs(duracaoMs)}`);\n }\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'analista',\n arquivo: entry.relPath,\n nome: tecnica.nome,\n duracaoMs,\n ocorrencias: metricasAnalistas.at(-1)?.ocorrencias\n }));\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const isTempoLimite = err.message.includes('Timeout: analista');\n const nivelLog = isTempoLimite ? 'aviso' : 'erro';\n const prefixo = isTempoLimite ? '[CLOCK]' : '[ERRO]';\n\n // Log adaptativo para erros e timeouts\n if (isTempoLimite) {\n const duracaoEstimada = config.ANALISE_TIMEOUT_POR_ANALISTA_MS || 30000;\n logAnalistas.timeout(tecnica.nome || 'analista-desconhecido', duracaoEstimada);\n } else {\n logAnalistas.erro(tecnica.nome || 'analista-desconhecido', err.message);\n }\n\n // Log apropriado baseado no tipo de erro\n if (nivelLog === 'aviso') {\n log.aviso(`${prefixo} ${err.message}`);\n } else {\n log.erro(`${prefixo} Erro em '${tecnica.nome}' para ${entry.relPath}: ${err.message}`);\n // Exibe stack trace em modo verbose ou debug\n if (err.stack) {\n if (opts?.verbose || config.DEV_MODE) {\n log.info(ExecutorExtraMensagens.stackTrace);\n log.info(err.stack);\n }\n }\n }\n\n // Registra ocorrência de erro/timeout com stack trace\n pushOcorrencia(ocorrenciaErroAnalista({\n mensagem: isTempoLimite ? `Timeout na técnica '${tecnica.nome}' para ${entry.relPath}: ${timeoutMs}ms excedido` : `Falha na técnica '${tecnica.nome}' para ${entry.relPath}: ${err.message}`,\n relPath: entry.relPath,\n origem: tecnica.nome,\n stack: !isTempoLimite && err.stack ? err.stack : undefined\n }));\n }\n }\n // Salva no cache de análise entre execuções\n if (config.ANALISE_CACHE_ENABLED) {\n const ocorrArquivoCache = ocorrencias.filter(o => o.relPath === entry.relPath);\n await analysisCache.set(entry.relPath, entry.content ?? '', ocorrArquivoCache);\n }\n\n // Salva estado incremental do arquivo processado\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n const ocorrArq = ocorrencias.filter(ocorrencia => ocorrencia.relPath === entry.relPath);\n // Extrai métricas por analista específicas do arquivo\n const analistasArquivo: Record<string, {\n ocorrencias: number;\n duracaoMs: number;\n }> = {};\n for (const metrica of metricasAnalistas.filter(metrica => !metrica.global)) {\n analistasArquivo[metrica.nome] = {\n ocorrencias: metrica.ocorrencias,\n duracaoMs: metrica.duracaoMs\n };\n }\n const hashEstrutural = calcularHashEstrutural(astParaUso, conteudo);\n novoEstado.arquivos[entry.relPath] = {\n hash,\n hashEstrutural: hashEstrutural || undefined,\n ocorrencias: ocorrArq,\n analistas: analistasArquivo,\n ultimaExecucaoMs: Date.now(),\n reaproveitadoCount: 0\n };\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalArquivosProcessados = (novoEstado.estatisticas.totalArquivosProcessados || 0) + 1;\n }\n }\n\n // NOVO: Atualiza progresso por arquivo (não por analista)\n logAnalistas.arquivoProcessado();\n if (emitter) {\n const ocorrArquivo = ocorrencias.filter(ocorrencia => ocorrencia.relPath === entry.relPath);\n emitter.emit('file:processed', {\n relPath: entry.relPath,\n ocorrencias: ocorrArquivo.length\n });\n }\n }\n const fimExecucao = performance.now();\n const duracaoMs = Math.round(fimExecucao - inicioExecucao);\n\n logAnalistas.finalizarBatch(ocorrencias.length, duracaoMs);\n\n let metricasExecucao: MetricaExecucao | null = null;\n if (config.ANALISE_METRICAS_ENABLED) {\n const metricasGlobais = getGlobalExec().__TUTANUS_METRICAS__ || { parsingTimeMs: 0, cacheHits: 0, cacheMiss: 0 };\n const astCacheMetrics = scopeAstCache.getMetrics();\n metricasExecucao = {\n totalArquivos: fileEntriesComAst.length,\n tempoParsingMs: Math.round(metricasGlobais.parsingTimeMs),\n tempoAnaliseMs: duracaoMs,\n cacheAstHits: metricasGlobais.cacheHits,\n cacheAstMiss: metricasGlobais.cacheMiss,\n analistas: metricasAnalistas,\n astCache: {\n hits: astCacheMetrics.hits,\n misses: astCacheMetrics.misses,\n parseTimeMs: Math.round(astCacheMetrics.parseTimeMs),\n cachedFiles: astCacheMetrics.cachedFiles,\n },\n };\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'metricas', ...metricasExecucao }));\n }\n try {\n await persistMetricHistory(metricasExecucao);\n } catch (erro) {\n log.erro(`Falha ao persistir histórico de métricas: ${erro instanceof Error ? erro.message : String(erro)}`);\n }\n }\n\n if (config.ANALISE_CACHE_ENABLED) {\n await analysisCache.persistir().catch(() => {});\n }\n\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.ultimaDuracaoMs = duracaoMs;\n }\n await salvarEstado(config.ANALISE_INCREMENTAL_STATE_PATH, novoEstado);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'incremental-salvo',\n arquivos: Object.keys(novoEstado.arquivos).length,\n totalReaproveitamentos: novoEstado.estatisticas?.totalReaproveitamentos,\n processados: novoEstado.estatisticas?.totalArquivosProcessados\n }));\n }\n }\n const resultado: ResultadoInquisicao = {\n totalArquivos: fileEntriesComAst.length,\n arquivosAnalisados: fileEntriesComAst.map(e => e.relPath),\n ocorrencias,\n timestamp: Date.now(),\n duracaoMs,\n metricas: metricasExecucao || undefined\n };\n if (emitter) {\n emitter.emit('analysis:complete', resultado);\n }\n return resultado;\n}\n\nexport function registrarUltimasMetricas(metricas: MetricaExecucao | undefined): void {\n try {\n getGlobalExec().__ULTIMAS_METRICAS_TUTANUS__ = metricas || null;\n } catch {\n /* ignore */\n }\n}"]}
@@ -34,16 +34,16 @@ function getSimbolosLog() {
34
34
  if (s && typeof s === 'object')
35
35
  return s;
36
36
  return {
37
- info: 'i️',
37
+ info: '[INFO]',
38
38
  sucesso: '[OK]',
39
39
  erro: '[ERRO]',
40
40
  aviso: '[AVISO]',
41
- debug: '🐞',
42
- fase: '🔶',
43
- passo: '▫️',
41
+ debug: '[BUG]',
42
+ fase: '[ORANGE]',
43
+ passo: '[.]',
44
44
  scan: '[BUSCA]',
45
- guardian: '🛡️',
46
- pasta: '📂'
45
+ guardian: '[SHIELD]',
46
+ pasta: '[FOLDER]'
47
47
  };
48
48
  }
49
49
  const simbolosLogExec = getSimbolosLog();
@@ -1 +1 @@
1
- {"version":3,"file":"inquisitor.js","sourceRoot":"","sources":["../../../src/core/execution/inquisitor.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { config, isMetaPath } from '@core/config';\nimport { messages } from '@core/messages';\nimport { lerEstado } from '@shared/persistence';\nimport pLimit from 'p-limit';\nimport * as path from 'path';\n\nimport type { CacheValor, EstadoIncArquivo, FileEntry, FileEntryWithAst, InquisicaoOptions, MetricasGlobais, OcorrenciaParseErro, ResultadoInquisicaoCompleto, SimbolosLog, Tecnica } from '@';\nimport { ocorrenciaParseErro } from '@';\n\nimport { executarInquisicao as executarExecucao, registrarUltimasMetricas } from './executor.js';\nimport { scanRepository } from './scanner.js';\n\n// @tutanus-disable interface-inline-exportada\n// Justificativa: interface acoplada ao escopo global do Node, move-la para types/ causaria\n// conflitos de resolucao com OcorrenciaParseErro e CacheValor que sao importados de modulos diferentes\ninterface TutanusGlobalStore {\n __TUTANUS_AST_CACHE__?: Map<string, CacheValor>;\n __TUTANUS_METRICAS__?: MetricasGlobais;\n __TUTANUS_PARSE_ERROS__?: OcorrenciaParseErro[];\n __TUTANUS_PARSE_ERROS_ORIGINAIS__?: number;\n __TUTANUS_DIR_COUNT__?: number;\n __TUTANUS_DIR_SAMPLES__?: string[];\n}\n\nfunction getGlobal(): TutanusGlobalStore {\n return globalThis as unknown as TutanusGlobalStore;\n}\n\nconst {\n log,\n InquisidorExtraMensagens\n} = messages;\n\nfunction getObjectKeysLen(value: object | null): number {\n if (typeof value === 'object' && value !== null) {\n return Object.keys(value).length;\n }\n return 0;\n}\n\nfunction detalheErro(erro: unknown): { mensagem: string; linha?: number; coluna?: number; detalhe?: string } {\n if (!erro || typeof erro !== 'object') {\n return { mensagem: String(erro) };\n }\n const errObj = erro as { message?: string; loc?: { line?: number; column?: number } };\n return {\n mensagem: errObj.message ?? '',\n linha: errObj.loc?.line,\n coluna: errObj.loc?.column,\n detalhe: errObj.message\n };\n}\n\nfunction getSimbolosLog(): SimbolosLog {\n const logAny = log as unknown as { simbolos?: SimbolosLog };\n const s = logAny.simbolos;\n if (s && typeof s === 'object') return s;\n return {\n info: 'i️',\n sucesso: '[OK]',\n erro: '[ERRO]',\n aviso: '[AVISO]',\n debug: '🐞',\n fase: '🔶',\n passo: '▫️',\n scan: '[BUSCA]',\n guardian: '🛡️',\n pasta: '📂'\n };\n}\nconst simbolosLogExec = getSimbolosLog();\n\nfunction infoDestaque(mensagem: string): void {\n const logInfo = log as unknown as { infoDestaque?: (m: string) => void; info: (m: string) => void };\n if (typeof logInfo.infoDestaque === 'function') {\n logInfo.infoDestaque(mensagem);\n } else {\n logInfo.info(mensagem);\n }\n}\n\nasync function handleParseError(entry: FileEntry): Promise<void> {\n const g = getGlobal();\n const lista: OcorrenciaParseErro[] = g.__TUTANUS_PARSE_ERROS__ || [];\n try {\n const babel = await import('@babel/parser');\n try {\n babel.parse(entry.content || '', {\n sourceType: 'unambiguous',\n plugins: ['typescript', 'jsx', 'decorators-legacy', 'classProperties']\n } as import('@babel/parser').ParserOptions);\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseAstNaoGerada,\n relPath: entry.relPath,\n origem: 'parser'\n }));\n } catch (erro) {\n const { mensagem, linha, coluna, detalhe } = detalheErro(erro);\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErro(mensagem || messages.InquisidorMensagens.parseAstNaoGerada),\n relPath: entry.relPath,\n origem: 'parser',\n linha,\n coluna,\n detalhe\n }));\n }\n } catch {\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseAstNaoGerada,\n relPath: entry.relPath,\n origem: 'parser'\n }));\n }\n g.__TUTANUS_PARSE_ERROS__ = lista;\n}\n\nasync function aplicarPriorizacao(entries: FileEntry[], metaSet: Set<string>): Promise<FileEntry[]> {\n if (!config.ANALISE_PRIORIZACAO_ENABLED || !config.ANALISE_INCREMENTAL_STATE_PATH) return entries;\n try {\n type EstadoIncremental = { arquivos: Record<string, EstadoIncArquivo> };\n const inc = await lerEstado<EstadoIncremental>(config.ANALISE_INCREMENTAL_STATE_PATH).catch(() => null);\n if (!inc?.arquivos) return entries;\n const pesos = {\n duracaoMs: config.ANALISE_PRIORIZACAO_PESOS?.duracaoMs ?? 1,\n ocorrencias: config.ANALISE_PRIORIZACAO_PESOS?.ocorrencias ?? 2,\n penalidadeReuso: config.ANALISE_PRIORIZACAO_PESOS?.penalidadeReuso ?? 0.5\n };\n const scored = entries.map(entry => {\n const hist = inc.arquivos[entry.relPath];\n let score = 0;\n if (hist) {\n let dur = 0;\n let occ = 0;\n if (hist.analistas) {\n for (const a of Object.values(hist.analistas)) {\n dur += a.duracaoMs;\n occ += a.ocorrencias;\n }\n } else {\n occ = hist.ocorrencias?.length || 0;\n }\n score = dur * pesos.duracaoMs + occ * pesos.ocorrencias - (hist.reaproveitadoCount || 0) * pesos.penalidadeReuso;\n }\n return { entry, score };\n });\n scored.sort((a, b) => b.score - a.score);\n const prioritarios = scored.filter(s => !metaSet.has(s.entry.relPath)).map(s => s.entry);\n const metas = scored.filter(s => metaSet.has(s.entry.relPath)).map(s => s.entry);\n const result = [...prioritarios, ...metas];\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'priorizacao',\n estrategia: 'historico-incremental',\n top: prioritarios.slice(0, 10).map(e => ({ arq: e.relPath, score: scored.find(s => s.entry.relPath === e.relPath)?.score })),\n metaEmpurrados: metas.length\n }));\n } else {\n const exibidos = prioritarios.slice(0, 5).map(e => e.relPath).join(', ') || '-';\n log.info(InquisidorExtraMensagens.priorizacaoAplicada.replace('{exibidos}', exibidos));\n if (metas.length) {\n log.info(InquisidorExtraMensagens.arquivosMetaMovidos.replace('{icone}', simbolosLogExec.info).replace('{total}', String(metas.length)));\n }\n }\n return result;\n } catch (erro) {\n if (config.DEV_MODE) log.erro(`Falha priorização: ${erro instanceof Error ? erro.message : String(erro)}`);\n return entries;\n }\n}\n\nconst EXTENSOES_COM_AST = new Set(Array.isArray(config.SCANNER_EXTENSOES_COM_AST) ? config.SCANNER_EXTENSOES_COM_AST : ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs']);\nexport async function prepararComAst(entries: FileEntry[], baseDir: string): Promise<FileEntryWithAst[]> {\n const g = getGlobal();\n const cache: Map<string, CacheValor> = g.__TUTANUS_AST_CACHE__ || new Map();\n if (!g.__TUTANUS_AST_CACHE__) g.__TUTANUS_AST_CACHE__ = cache;\n const metricas: MetricasGlobais = g.__TUTANUS_METRICAS__ || { parsingTimeMs: 0, cacheHits: 0, cacheMiss: 0 };\n metricas.parsingTimeMs = 0;\n metricas.cacheHits = 0;\n metricas.cacheMiss = 0;\n g.__TUTANUS_METRICAS__ = metricas;\n const CONCURRENCY = Number(config.AUTOANALISE_CONCURRENCY ?? 50);\n const limit = pLimit(CONCURRENCY);\n return Promise.all(entries.map(entry => limit(async (): Promise<FileEntryWithAst> => {\n let ast: import('@babel/traverse').NodePath<import('@babel/types').Node> | undefined;\n const ext = path.extname(entry.relPath);\n const mtimeMs = entry.ultimaModificacao ?? 0;\n const cacheValido = mtimeMs > 0;\n const nomeLower = entry.relPath.toLowerCase();\n const extEfetiva = nomeLower.endsWith('.d.ts') ? '.d.ts' : nomeLower.endsWith('.map') ? '.map' : ext;\n if (entry.content && EXTENSOES_COM_AST.has(extEfetiva)) {\n if (config.ANALISE_AST_CACHE_ENABLED && cacheValido) {\n const anterior = cache.get(entry.relPath);\n if (anterior && anterior.mtimeMs === mtimeMs) {\n ast = anterior.ast;\n metricas.cacheHits++;\n }\n }\n try {\n if (!ast) {\n const inicioParse = performance.now();\n const parsed = await import('@core/parsing').then(mod => mod.decifrarSintaxe(entry.content || '', extEfetiva, { relPath: entry.relPath }));\n if (parsed && typeof parsed === 'object' && getObjectKeysLen(parsed) > 0) {\n ast = undefined;\n } else if (parsed == null) {\n if (/(^|\\/)node_modules(\\/|\\\\)/.test(entry.relPath)) {\n ast = undefined;\n } else {\n await handleParseError(entry);\n }\n }\n metricas.parsingTimeMs += performance.now() - inicioParse;\n metricas.cacheMiss++;\n if (config.ANALISE_AST_CACHE_ENABLED && cacheValido) {\n cache.set(entry.relPath, { mtimeMs, size: 0, ast });\n }\n }\n } catch (erro) {\n const err = erro instanceof Error ? erro : new Error(String(erro));\n log.erro(messages.InquisidorMensagens.falhaGerarAst(entry.relPath, err.message));\n const lista: OcorrenciaParseErro[] = g.__TUTANUS_PARSE_ERROS__ || [];\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErro(err.message),\n relPath: entry.relPath,\n origem: 'parser'\n }));\n g.__TUTANUS_PARSE_ERROS__ = lista;\n }\n }\n return {\n ...entry,\n ast,\n content: entry.content ?? null,\n fullCaminho: typeof entry.fullCaminho === 'string' ? entry.fullCaminho : path.resolve(baseDir, entry.relPath)\n } as FileEntryWithAst;\n })));\n}\nexport async function iniciarInquisicao(baseDir: string = process.cwd(), options: InquisicaoOptions = {}, tecnicas?: Tecnica[]): Promise<ResultadoInquisicaoCompleto> {\n const {\n includeContent = true,\n incluirMetadados: _incluirMetadados = true,\n skipExec = false\n } = options;\n log.info(InquisidorExtraMensagens.iniciandoInquisicao.replace('{icone}', simbolosLogExec.scan).replace('{diretorio}', baseDir));\n\n function onScanProgress(msg: string): void {\n try {\n const progressData = JSON.parse(msg);\n if (progressData.tipo === 'diretorio') {\n const g = getGlobal();\n g.__TUTANUS_DIR_COUNT__ = (g.__TUTANUS_DIR_COUNT__ || 0) + 1;\n if (!g.__TUTANUS_DIR_SAMPLES__) g.__TUTANUS_DIR_SAMPLES__ = [];\n if (g.__TUTANUS_DIR_SAMPLES__.length < 5) {\n g.__TUTANUS_DIR_SAMPLES__.push(progressData.caminho);\n }\n } else if (progressData.tipo === 'erro') {\n log.erro(`Erro ao ${progressData.acao} ${progressData.caminho}: ${progressData.mensagem}`);\n }\n } catch {\n if (msg && msg.includes('[AVISO]')) log.aviso(msg);\n }\n }\n\n const fileMap = await scanRepository(baseDir, {\n includeContent,\n onProgress: onScanProgress\n });\n let entriesBase = Object.values(fileMap);\n // Filtra arquivos meta com helper central: tudo fora de src/ é meta por padrão\n const metaSet = new Set(entriesBase.filter(erro => isMetaPath(erro.relPath)).map(erro => erro.relPath));\n entriesBase = await aplicarPriorizacao(entriesBase, metaSet);\n\n const fileEntries = entriesBase.map(entry => ({\n ...entry,\n ast: undefined,\n fullCaminho: typeof entry.fullCaminho === 'string' ? entry.fullCaminho : path.resolve(baseDir, entry.relPath)\n }));\n\n try {\n const g = getGlobal();\n const totalDirs = g.__TUTANUS_DIR_COUNT__ || 0;\n const amostra = Array.isArray(g.__TUTANUS_DIR_SAMPLES__) ? g.__TUTANUS_DIR_SAMPLES__ : [];\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'varredura_preliminar',\n totalDiretorios: totalDirs,\n amostraDiretorios: amostra\n }));\n }\n } catch {\n /* ignore */\n }\n\n // Agora fileEntries é FileEntryWithAst[]\n let totalArquivos = fileEntries.length;\n let ocorrencias: Array<OcorrenciaParseErro | import('@').Ocorrencia> = [];\n if (!skipExec) {\n // Inversão de Controle: tecnicas devem ser fornecidas pelo chamador sempre que skipExec=false.\n // Para compatibilidade retroativa, se não vierem definidas carregamos dinamicamente o registro.\n let tecnicasEfetivas = tecnicas;\n if (!tecnicasEfetivas) {\n const mod = await import('../../analysts/registry/registry.js');\n tecnicasEfetivas = mod.registroAnalistas;\n }\n const execRes = await executarExecucao(fileEntries, tecnicasEfetivas, baseDir, undefined);\n totalArquivos = execRes.totalArquivos;\n ocorrencias = execRes.ocorrencias;\n }\n\n const parseErros: OcorrenciaParseErro[] = getGlobal().__TUTANUS_PARSE_ERROS__ || [];\n if (parseErros.length) {\n getGlobal().__TUTANUS_PARSE_ERROS_ORIGINAIS__ = parseErros.length;\n if (config.PARSE_ERRO_AGRUPAR) {\n const porArquivo: Record<string, OcorrenciaParseErro[]> = {};\n for (const pe of parseErros) {\n const chave = pe.relPath || '__desconhecido__';\n (porArquivo[chave] = porArquivo[chave] || []).push(pe);\n }\n for (const [arq, lista] of Object.entries(porArquivo)) {\n if (lista.length <= (config.PARSE_ERRO_MAX_POR_ARQUIVO || 1)) {\n ocorrencias.push(...lista);\n } else {\n ocorrencias.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErrosAgregados(lista.length),\n relPath: arq || '',\n origem: 'parser'\n }));\n }\n }\n } else {\n ocorrencias.push(...parseErros);\n }\n }\n if (!skipExec) {\n log.sucesso(InquisidorExtraMensagens.inquisicaoConcluida.replace('{total}', String(ocorrencias.length)));\n } else if (!config.COMPACT_MODE) {\n infoDestaque(`Varredura concluída: total de arquivos: ${fileEntries.length}`);\n }\n return {\n totalArquivos,\n ocorrencias,\n arquivosAnalisados: fileEntries.map(arquivo => arquivo.relPath),\n timestamp: Date.now(),\n duracaoMs: 0,\n fileEntries,\n guardian: undefined\n };\n}\nexport { executarExecucao as executarInquisicao, registrarUltimasMetricas };"]}
1
+ {"version":3,"file":"inquisitor.js","sourceRoot":"","sources":["../../../src/core/execution/inquisitor.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { config, isMetaPath } from '@core/config';\nimport { messages } from '@core/messages';\nimport { lerEstado } from '@shared/persistence';\nimport pLimit from 'p-limit';\nimport * as path from 'path';\n\nimport type { CacheValor, EstadoIncArquivo, FileEntry, FileEntryWithAst, InquisicaoOptions, MetricasGlobais, OcorrenciaParseErro, ResultadoInquisicaoCompleto, SimbolosLog, Tecnica } from '@';\nimport { ocorrenciaParseErro } from '@';\n\nimport { executarInquisicao as executarExecucao, registrarUltimasMetricas } from './executor.js';\nimport { scanRepository } from './scanner.js';\n\n// @tutanus-disable interface-inline-exportada\n// Justificativa: interface acoplada ao escopo global do Node, move-la para types/ causaria\n// conflitos de resolucao com OcorrenciaParseErro e CacheValor que sao importados de modulos diferentes\ninterface TutanusGlobalStore {\n __TUTANUS_AST_CACHE__?: Map<string, CacheValor>;\n __TUTANUS_METRICAS__?: MetricasGlobais;\n __TUTANUS_PARSE_ERROS__?: OcorrenciaParseErro[];\n __TUTANUS_PARSE_ERROS_ORIGINAIS__?: number;\n __TUTANUS_DIR_COUNT__?: number;\n __TUTANUS_DIR_SAMPLES__?: string[];\n}\n\nfunction getGlobal(): TutanusGlobalStore {\n return globalThis as unknown as TutanusGlobalStore;\n}\n\nconst {\n log,\n InquisidorExtraMensagens\n} = messages;\n\nfunction getObjectKeysLen(value: object | null): number {\n if (typeof value === 'object' && value !== null) {\n return Object.keys(value).length;\n }\n return 0;\n}\n\nfunction detalheErro(erro: unknown): { mensagem: string; linha?: number; coluna?: number; detalhe?: string } {\n if (!erro || typeof erro !== 'object') {\n return { mensagem: String(erro) };\n }\n const errObj = erro as { message?: string; loc?: { line?: number; column?: number } };\n return {\n mensagem: errObj.message ?? '',\n linha: errObj.loc?.line,\n coluna: errObj.loc?.column,\n detalhe: errObj.message\n };\n}\n\nfunction getSimbolosLog(): SimbolosLog {\n const logAny = log as unknown as { simbolos?: SimbolosLog };\n const s = logAny.simbolos;\n if (s && typeof s === 'object') return s;\n return {\n info: '[INFO]',\n sucesso: '[OK]',\n erro: '[ERRO]',\n aviso: '[AVISO]',\n debug: '[BUG]',\n fase: '[ORANGE]',\n passo: '[.]',\n scan: '[BUSCA]',\n guardian: '[SHIELD]',\n pasta: '[FOLDER]'\n };\n}\nconst simbolosLogExec = getSimbolosLog();\n\nfunction infoDestaque(mensagem: string): void {\n const logInfo = log as unknown as { infoDestaque?: (m: string) => void; info: (m: string) => void };\n if (typeof logInfo.infoDestaque === 'function') {\n logInfo.infoDestaque(mensagem);\n } else {\n logInfo.info(mensagem);\n }\n}\n\nasync function handleParseError(entry: FileEntry): Promise<void> {\n const g = getGlobal();\n const lista: OcorrenciaParseErro[] = g.__TUTANUS_PARSE_ERROS__ || [];\n try {\n const babel = await import('@babel/parser');\n try {\n babel.parse(entry.content || '', {\n sourceType: 'unambiguous',\n plugins: ['typescript', 'jsx', 'decorators-legacy', 'classProperties']\n } as import('@babel/parser').ParserOptions);\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseAstNaoGerada,\n relPath: entry.relPath,\n origem: 'parser'\n }));\n } catch (erro) {\n const { mensagem, linha, coluna, detalhe } = detalheErro(erro);\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErro(mensagem || messages.InquisidorMensagens.parseAstNaoGerada),\n relPath: entry.relPath,\n origem: 'parser',\n linha,\n coluna,\n detalhe\n }));\n }\n } catch {\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseAstNaoGerada,\n relPath: entry.relPath,\n origem: 'parser'\n }));\n }\n g.__TUTANUS_PARSE_ERROS__ = lista;\n}\n\nasync function aplicarPriorizacao(entries: FileEntry[], metaSet: Set<string>): Promise<FileEntry[]> {\n if (!config.ANALISE_PRIORIZACAO_ENABLED || !config.ANALISE_INCREMENTAL_STATE_PATH) return entries;\n try {\n type EstadoIncremental = { arquivos: Record<string, EstadoIncArquivo> };\n const inc = await lerEstado<EstadoIncremental>(config.ANALISE_INCREMENTAL_STATE_PATH).catch(() => null);\n if (!inc?.arquivos) return entries;\n const pesos = {\n duracaoMs: config.ANALISE_PRIORIZACAO_PESOS?.duracaoMs ?? 1,\n ocorrencias: config.ANALISE_PRIORIZACAO_PESOS?.ocorrencias ?? 2,\n penalidadeReuso: config.ANALISE_PRIORIZACAO_PESOS?.penalidadeReuso ?? 0.5\n };\n const scored = entries.map(entry => {\n const hist = inc.arquivos[entry.relPath];\n let score = 0;\n if (hist) {\n let dur = 0;\n let occ = 0;\n if (hist.analistas) {\n for (const a of Object.values(hist.analistas)) {\n dur += a.duracaoMs;\n occ += a.ocorrencias;\n }\n } else {\n occ = hist.ocorrencias?.length || 0;\n }\n score = dur * pesos.duracaoMs + occ * pesos.ocorrencias - (hist.reaproveitadoCount || 0) * pesos.penalidadeReuso;\n }\n return { entry, score };\n });\n scored.sort((a, b) => b.score - a.score);\n const prioritarios = scored.filter(s => !metaSet.has(s.entry.relPath)).map(s => s.entry);\n const metas = scored.filter(s => metaSet.has(s.entry.relPath)).map(s => s.entry);\n const result = [...prioritarios, ...metas];\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'priorizacao',\n estrategia: 'historico-incremental',\n top: prioritarios.slice(0, 10).map(e => ({ arq: e.relPath, score: scored.find(s => s.entry.relPath === e.relPath)?.score })),\n metaEmpurrados: metas.length\n }));\n } else {\n const exibidos = prioritarios.slice(0, 5).map(e => e.relPath).join(', ') || '-';\n log.info(InquisidorExtraMensagens.priorizacaoAplicada.replace('{exibidos}', exibidos));\n if (metas.length) {\n log.info(InquisidorExtraMensagens.arquivosMetaMovidos.replace('{icone}', simbolosLogExec.info).replace('{total}', String(metas.length)));\n }\n }\n return result;\n } catch (erro) {\n if (config.DEV_MODE) log.erro(`Falha priorização: ${erro instanceof Error ? erro.message : String(erro)}`);\n return entries;\n }\n}\n\nconst EXTENSOES_COM_AST = new Set(Array.isArray(config.SCANNER_EXTENSOES_COM_AST) ? config.SCANNER_EXTENSOES_COM_AST : ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs']);\nexport async function prepararComAst(entries: FileEntry[], baseDir: string): Promise<FileEntryWithAst[]> {\n const g = getGlobal();\n const cache: Map<string, CacheValor> = g.__TUTANUS_AST_CACHE__ || new Map();\n if (!g.__TUTANUS_AST_CACHE__) g.__TUTANUS_AST_CACHE__ = cache;\n const metricas: MetricasGlobais = g.__TUTANUS_METRICAS__ || { parsingTimeMs: 0, cacheHits: 0, cacheMiss: 0 };\n metricas.parsingTimeMs = 0;\n metricas.cacheHits = 0;\n metricas.cacheMiss = 0;\n g.__TUTANUS_METRICAS__ = metricas;\n const CONCURRENCY = Number(config.AUTOANALISE_CONCURRENCY ?? 50);\n const limit = pLimit(CONCURRENCY);\n return Promise.all(entries.map(entry => limit(async (): Promise<FileEntryWithAst> => {\n let ast: import('@babel/traverse').NodePath<import('@babel/types').Node> | undefined;\n const ext = path.extname(entry.relPath);\n const mtimeMs = entry.ultimaModificacao ?? 0;\n const cacheValido = mtimeMs > 0;\n const nomeLower = entry.relPath.toLowerCase();\n const extEfetiva = nomeLower.endsWith('.d.ts') ? '.d.ts' : nomeLower.endsWith('.map') ? '.map' : ext;\n if (entry.content && EXTENSOES_COM_AST.has(extEfetiva)) {\n if (config.ANALISE_AST_CACHE_ENABLED && cacheValido) {\n const anterior = cache.get(entry.relPath);\n if (anterior && anterior.mtimeMs === mtimeMs) {\n ast = anterior.ast;\n metricas.cacheHits++;\n }\n }\n try {\n if (!ast) {\n const inicioParse = performance.now();\n const parsed = await import('@core/parsing').then(mod => mod.decifrarSintaxe(entry.content || '', extEfetiva, { relPath: entry.relPath }));\n if (parsed && typeof parsed === 'object' && getObjectKeysLen(parsed) > 0) {\n ast = undefined;\n } else if (parsed == null) {\n if (/(^|\\/)node_modules(\\/|\\\\)/.test(entry.relPath)) {\n ast = undefined;\n } else {\n await handleParseError(entry);\n }\n }\n metricas.parsingTimeMs += performance.now() - inicioParse;\n metricas.cacheMiss++;\n if (config.ANALISE_AST_CACHE_ENABLED && cacheValido) {\n cache.set(entry.relPath, { mtimeMs, size: 0, ast });\n }\n }\n } catch (erro) {\n const err = erro instanceof Error ? erro : new Error(String(erro));\n log.erro(messages.InquisidorMensagens.falhaGerarAst(entry.relPath, err.message));\n const lista: OcorrenciaParseErro[] = g.__TUTANUS_PARSE_ERROS__ || [];\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErro(err.message),\n relPath: entry.relPath,\n origem: 'parser'\n }));\n g.__TUTANUS_PARSE_ERROS__ = lista;\n }\n }\n return {\n ...entry,\n ast,\n content: entry.content ?? null,\n fullCaminho: typeof entry.fullCaminho === 'string' ? entry.fullCaminho : path.resolve(baseDir, entry.relPath)\n } as FileEntryWithAst;\n })));\n}\nexport async function iniciarInquisicao(baseDir: string = process.cwd(), options: InquisicaoOptions = {}, tecnicas?: Tecnica[]): Promise<ResultadoInquisicaoCompleto> {\n const {\n includeContent = true,\n incluirMetadados: _incluirMetadados = true,\n skipExec = false\n } = options;\n log.info(InquisidorExtraMensagens.iniciandoInquisicao.replace('{icone}', simbolosLogExec.scan).replace('{diretorio}', baseDir));\n\n function onScanProgress(msg: string): void {\n try {\n const progressData = JSON.parse(msg);\n if (progressData.tipo === 'diretorio') {\n const g = getGlobal();\n g.__TUTANUS_DIR_COUNT__ = (g.__TUTANUS_DIR_COUNT__ || 0) + 1;\n if (!g.__TUTANUS_DIR_SAMPLES__) g.__TUTANUS_DIR_SAMPLES__ = [];\n if (g.__TUTANUS_DIR_SAMPLES__.length < 5) {\n g.__TUTANUS_DIR_SAMPLES__.push(progressData.caminho);\n }\n } else if (progressData.tipo === 'erro') {\n log.erro(`Erro ao ${progressData.acao} ${progressData.caminho}: ${progressData.mensagem}`);\n }\n } catch {\n if (msg && msg.includes('[AVISO]')) log.aviso(msg);\n }\n }\n\n const fileMap = await scanRepository(baseDir, {\n includeContent,\n onProgress: onScanProgress\n });\n let entriesBase = Object.values(fileMap);\n // Filtra arquivos meta com helper central: tudo fora de src/ é meta por padrão\n const metaSet = new Set(entriesBase.filter(erro => isMetaPath(erro.relPath)).map(erro => erro.relPath));\n entriesBase = await aplicarPriorizacao(entriesBase, metaSet);\n\n const fileEntries = entriesBase.map(entry => ({\n ...entry,\n ast: undefined,\n fullCaminho: typeof entry.fullCaminho === 'string' ? entry.fullCaminho : path.resolve(baseDir, entry.relPath)\n }));\n\n try {\n const g = getGlobal();\n const totalDirs = g.__TUTANUS_DIR_COUNT__ || 0;\n const amostra = Array.isArray(g.__TUTANUS_DIR_SAMPLES__) ? g.__TUTANUS_DIR_SAMPLES__ : [];\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'varredura_preliminar',\n totalDiretorios: totalDirs,\n amostraDiretorios: amostra\n }));\n }\n } catch {\n /* ignore */\n }\n\n // Agora fileEntries é FileEntryWithAst[]\n let totalArquivos = fileEntries.length;\n let ocorrencias: Array<OcorrenciaParseErro | import('@').Ocorrencia> = [];\n if (!skipExec) {\n // Inversão de Controle: tecnicas devem ser fornecidas pelo chamador sempre que skipExec=false.\n // Para compatibilidade retroativa, se não vierem definidas carregamos dinamicamente o registro.\n let tecnicasEfetivas = tecnicas;\n if (!tecnicasEfetivas) {\n const mod = await import('../../analysts/registry/registry.js');\n tecnicasEfetivas = mod.registroAnalistas;\n }\n const execRes = await executarExecucao(fileEntries, tecnicasEfetivas, baseDir, undefined);\n totalArquivos = execRes.totalArquivos;\n ocorrencias = execRes.ocorrencias;\n }\n\n const parseErros: OcorrenciaParseErro[] = getGlobal().__TUTANUS_PARSE_ERROS__ || [];\n if (parseErros.length) {\n getGlobal().__TUTANUS_PARSE_ERROS_ORIGINAIS__ = parseErros.length;\n if (config.PARSE_ERRO_AGRUPAR) {\n const porArquivo: Record<string, OcorrenciaParseErro[]> = {};\n for (const pe of parseErros) {\n const chave = pe.relPath || '__desconhecido__';\n (porArquivo[chave] = porArquivo[chave] || []).push(pe);\n }\n for (const [arq, lista] of Object.entries(porArquivo)) {\n if (lista.length <= (config.PARSE_ERRO_MAX_POR_ARQUIVO || 1)) {\n ocorrencias.push(...lista);\n } else {\n ocorrencias.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErrosAgregados(lista.length),\n relPath: arq || '',\n origem: 'parser'\n }));\n }\n }\n } else {\n ocorrencias.push(...parseErros);\n }\n }\n if (!skipExec) {\n log.sucesso(InquisidorExtraMensagens.inquisicaoConcluida.replace('{total}', String(ocorrencias.length)));\n } else if (!config.COMPACT_MODE) {\n infoDestaque(`Varredura concluída: total de arquivos: ${fileEntries.length}`);\n }\n return {\n totalArquivos,\n ocorrencias,\n arquivosAnalisados: fileEntries.map(arquivo => arquivo.relPath),\n timestamp: Date.now(),\n duracaoMs: 0,\n fileEntries,\n guardian: undefined\n };\n}\nexport { executarExecucao as executarInquisicao, registrarUltimasMetricas };"]}