@mcpassure/mcp-anvisa-bulario 0.0.1 → 2.0.0

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 (128) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +196 -0
  3. package/README.md +192 -5
  4. package/dist/bootstrap.d.ts +11 -0
  5. package/dist/bootstrap.d.ts.map +1 -0
  6. package/dist/bootstrap.js +120 -0
  7. package/dist/bootstrap.js.map +1 -0
  8. package/dist/cache/sqlite-cache.d.ts +13 -0
  9. package/dist/cache/sqlite-cache.d.ts.map +1 -0
  10. package/dist/cache/sqlite-cache.js +58 -0
  11. package/dist/cache/sqlite-cache.js.map +1 -0
  12. package/dist/cache/types.d.ts +17 -0
  13. package/dist/cache/types.d.ts.map +1 -0
  14. package/dist/cache/types.js +7 -0
  15. package/dist/cache/types.js.map +1 -0
  16. package/dist/config.d.ts +15 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +16 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/db/dataset.d.ts +15 -0
  21. package/dist/db/dataset.d.ts.map +1 -0
  22. package/dist/db/dataset.js +168 -0
  23. package/dist/db/dataset.js.map +1 -0
  24. package/dist/db/schema.d.ts +11 -0
  25. package/dist/db/schema.d.ts.map +1 -0
  26. package/dist/db/schema.js +48 -0
  27. package/dist/db/schema.js.map +1 -0
  28. package/dist/domain/repository.d.ts +53 -0
  29. package/dist/domain/repository.d.ts.map +1 -0
  30. package/dist/domain/repository.js +68 -0
  31. package/dist/domain/repository.js.map +1 -0
  32. package/dist/domain/types.d.ts +2 -0
  33. package/dist/domain/types.d.ts.map +1 -0
  34. package/dist/domain/types.js +2 -0
  35. package/dist/domain/types.js.map +1 -0
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +38 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/prompts/handlers.d.ts +24 -0
  41. package/dist/prompts/handlers.d.ts.map +1 -0
  42. package/dist/prompts/handlers.js +267 -0
  43. package/dist/prompts/handlers.js.map +1 -0
  44. package/dist/prompts/index.d.ts +4 -0
  45. package/dist/prompts/index.d.ts.map +1 -0
  46. package/dist/prompts/index.js +35 -0
  47. package/dist/prompts/index.js.map +1 -0
  48. package/dist/prompts/schemas.d.ts +22 -0
  49. package/dist/prompts/schemas.d.ts.map +1 -0
  50. package/dist/prompts/schemas.js +15 -0
  51. package/dist/prompts/schemas.js.map +1 -0
  52. package/dist/resources/handlers.d.ts +5 -0
  53. package/dist/resources/handlers.d.ts.map +1 -0
  54. package/dist/resources/handlers.js +145 -0
  55. package/dist/resources/handlers.js.map +1 -0
  56. package/dist/resources/index.d.ts +4 -0
  57. package/dist/resources/index.d.ts.map +1 -0
  58. package/dist/resources/index.js +48 -0
  59. package/dist/resources/index.js.map +1 -0
  60. package/dist/schemas/tools.d.ts +134 -0
  61. package/dist/schemas/tools.d.ts.map +1 -0
  62. package/dist/schemas/tools.js +106 -0
  63. package/dist/schemas/tools.js.map +1 -0
  64. package/dist/server.d.ts +4 -0
  65. package/dist/server.d.ts.map +1 -0
  66. package/dist/server.js +25 -0
  67. package/dist/server.js.map +1 -0
  68. package/dist/sources/anvisa-api.d.ts +25 -0
  69. package/dist/sources/anvisa-api.d.ts.map +1 -0
  70. package/dist/sources/anvisa-api.js +153 -0
  71. package/dist/sources/anvisa-api.js.map +1 -0
  72. package/dist/sources/anvisa-dados-abertos.d.ts +12 -0
  73. package/dist/sources/anvisa-dados-abertos.d.ts.map +1 -0
  74. package/dist/sources/anvisa-dados-abertos.js +27 -0
  75. package/dist/sources/anvisa-dados-abertos.js.map +1 -0
  76. package/dist/sources/anvisa-portal.d.ts +12 -0
  77. package/dist/sources/anvisa-portal.d.ts.map +1 -0
  78. package/dist/sources/anvisa-portal.js +27 -0
  79. package/dist/sources/anvisa-portal.js.map +1 -0
  80. package/dist/sources/types.d.ts +56 -0
  81. package/dist/sources/types.d.ts.map +1 -0
  82. package/dist/sources/types.js +2 -0
  83. package/dist/sources/types.js.map +1 -0
  84. package/dist/tools/buscar-por-classe-terapeutica.d.ts +4 -0
  85. package/dist/tools/buscar-por-classe-terapeutica.d.ts.map +1 -0
  86. package/dist/tools/buscar-por-classe-terapeutica.js +30 -0
  87. package/dist/tools/buscar-por-classe-terapeutica.js.map +1 -0
  88. package/dist/tools/buscar-por-nome.d.ts +4 -0
  89. package/dist/tools/buscar-por-nome.d.ts.map +1 -0
  90. package/dist/tools/buscar-por-nome.js +25 -0
  91. package/dist/tools/buscar-por-nome.js.map +1 -0
  92. package/dist/tools/buscar-por-principio-ativo.d.ts +4 -0
  93. package/dist/tools/buscar-por-principio-ativo.d.ts.map +1 -0
  94. package/dist/tools/buscar-por-principio-ativo.js +25 -0
  95. package/dist/tools/buscar-por-principio-ativo.js.map +1 -0
  96. package/dist/tools/consultar-bula.d.ts +14 -0
  97. package/dist/tools/consultar-bula.d.ts.map +1 -0
  98. package/dist/tools/consultar-bula.js +60 -0
  99. package/dist/tools/consultar-bula.js.map +1 -0
  100. package/dist/tools/filtrar-por-tarja.d.ts +4 -0
  101. package/dist/tools/filtrar-por-tarja.d.ts.map +1 -0
  102. package/dist/tools/filtrar-por-tarja.js +29 -0
  103. package/dist/tools/filtrar-por-tarja.js.map +1 -0
  104. package/dist/tools/listar-apresentacoes.d.ts +11 -0
  105. package/dist/tools/listar-apresentacoes.d.ts.map +1 -0
  106. package/dist/tools/listar-apresentacoes.js +52 -0
  107. package/dist/tools/listar-apresentacoes.js.map +1 -0
  108. package/dist/tools/shared.d.ts +106 -0
  109. package/dist/tools/shared.d.ts.map +1 -0
  110. package/dist/tools/shared.js +74 -0
  111. package/dist/tools/shared.js.map +1 -0
  112. package/dist/utils/backoff.d.ts +8 -0
  113. package/dist/utils/backoff.d.ts.map +1 -0
  114. package/dist/utils/backoff.js +37 -0
  115. package/dist/utils/backoff.js.map +1 -0
  116. package/dist/utils/http.d.ts +24 -0
  117. package/dist/utils/http.d.ts.map +1 -0
  118. package/dist/utils/http.js +23 -0
  119. package/dist/utils/http.js.map +1 -0
  120. package/dist/utils/meta.d.ts +8 -0
  121. package/dist/utils/meta.d.ts.map +1 -0
  122. package/dist/utils/meta.js +13 -0
  123. package/dist/utils/meta.js.map +1 -0
  124. package/dist/utils/playwright-http.d.ts +2 -0
  125. package/dist/utils/playwright-http.d.ts.map +1 -0
  126. package/dist/utils/playwright-http.js +4 -0
  127. package/dist/utils/playwright-http.js.map +1 -0
  128. package/package.json +68 -6
@@ -0,0 +1,267 @@
1
+ const DISCLAIMER = "\n\n⚠️ **Aviso ANVISA:** Informações de consulta oficial. Decisões clínicas ou regulatórias " +
2
+ "devem ser baseadas na fonte ANVISA atualizada. Medicamentos sob Tarja Preta estão sujeitos " +
3
+ "à Portaria 344/98 — controle especial obrigatório.";
4
+ export async function handleVerificarMedicamentoCompleto(input, repository) {
5
+ const { termo, incluir_apresentacoes, incluir_bula } = input;
6
+ let medicamentos = [];
7
+ let fonteUsada = "";
8
+ try {
9
+ const result = await repository.searchByName({ nome: termo, count: 5 });
10
+ medicamentos = result.data;
11
+ fonteUsada = "buscar_por_nome";
12
+ }
13
+ catch {
14
+ try {
15
+ const result = await repository.searchByPrincipalAtivo({ principioAtivo: termo, count: 5 });
16
+ medicamentos = result.data;
17
+ fonteUsada = "buscar_por_principio_ativo";
18
+ }
19
+ catch (err) {
20
+ const message = err instanceof Error ? err.message : String(err);
21
+ return [
22
+ {
23
+ role: "assistant",
24
+ content: {
25
+ type: "text",
26
+ text: `Não foi possível localizar medicamentos para o termo "${termo}": ${message}${DISCLAIMER}`,
27
+ },
28
+ },
29
+ ];
30
+ }
31
+ }
32
+ if (medicamentos.length === 0) {
33
+ return [
34
+ {
35
+ role: "assistant",
36
+ content: {
37
+ type: "text",
38
+ text: `Nenhum medicamento encontrado para o termo "${termo}" no Bulário ANVISA.${DISCLAIMER}`,
39
+ },
40
+ },
41
+ ];
42
+ }
43
+ const sections = [
44
+ `## Medicamentos encontrados para "${termo}" (via ${fonteUsada})`,
45
+ `Total de resultados: ${medicamentos.length}`,
46
+ ];
47
+ for (const med of medicamentos) {
48
+ const linhas = [
49
+ `\n### ${med.nomeProduto}`,
50
+ `- **Empresa:** ${med.empresa}`,
51
+ `- **Nº Processo ANVISA:** ${med.numProcesso}`,
52
+ ];
53
+ if (med.dataAtualizacao)
54
+ linhas.push(`- **Última atualização:** ${med.dataAtualizacao}`);
55
+ if (incluir_apresentacoes && med.numProcesso) {
56
+ try {
57
+ const ap = await repository.getApresentacoes(med.numProcesso);
58
+ if (ap.data.length > 0) {
59
+ linhas.push(`- **Apresentações (${ap.data.length}):**`);
60
+ for (const a of ap.data.slice(0, 5)) {
61
+ linhas.push(` - ${a.descricao}`);
62
+ }
63
+ if (ap.data.length > 5)
64
+ linhas.push(` - ... (+${ap.data.length - 5} apresentações)`);
65
+ }
66
+ }
67
+ catch {
68
+ linhas.push(`- **Apresentações:** não disponível`);
69
+ }
70
+ }
71
+ if (incluir_bula && med.idBulaPacienteProtegido) {
72
+ try {
73
+ const bula = await repository.getBulaLink(med.idBulaPacienteProtegido);
74
+ if (bula.data.urlPdf) {
75
+ linhas.push(`- **Bula (paciente):** ${bula.data.urlPdf}`);
76
+ }
77
+ }
78
+ catch {
79
+ linhas.push(`- **Bula:** não disponível`);
80
+ }
81
+ }
82
+ sections.push(linhas.join("\n"));
83
+ }
84
+ sections.push(DISCLAIMER);
85
+ return [
86
+ {
87
+ role: "user",
88
+ content: { type: "text", text: `Verificar medicamento: ${termo}` },
89
+ },
90
+ {
91
+ role: "assistant",
92
+ content: { type: "text", text: sections.join("\n") },
93
+ },
94
+ ];
95
+ }
96
+ export async function handleCompararTarjasPorClasse(input, repository) {
97
+ const { classe_terapeutica, limite } = input;
98
+ let medicamentos = [];
99
+ try {
100
+ const result = await repository.searchByClasseTerapeutica({
101
+ classeTerapeutica: classe_terapeutica,
102
+ count: limite,
103
+ });
104
+ medicamentos = result.data;
105
+ }
106
+ catch (err) {
107
+ const message = err instanceof Error ? err.message : String(err);
108
+ return [
109
+ {
110
+ role: "assistant",
111
+ content: {
112
+ type: "text",
113
+ text: `Erro ao buscar classe terapêutica "${classe_terapeutica}": ${message}${DISCLAIMER}`,
114
+ },
115
+ },
116
+ ];
117
+ }
118
+ const grupos = {
119
+ LIVRE: [],
120
+ VERMELHA: [],
121
+ PRETA: [],
122
+ DESCONHECIDA: [],
123
+ };
124
+ for (const med of medicamentos) {
125
+ if (med.numProcesso) {
126
+ try {
127
+ const det = await repository.getDetalhes(med.numProcesso);
128
+ const tarja = det.data.tarja ?? "DESCONHECIDA";
129
+ const grupo = tarja in grupos ? tarja : "DESCONHECIDA";
130
+ grupos[grupo].push(med.nomeProduto);
131
+ }
132
+ catch {
133
+ grupos.DESCONHECIDA.push(med.nomeProduto);
134
+ }
135
+ }
136
+ }
137
+ const total = medicamentos.length;
138
+ const lines = [
139
+ `## Classe Terapêutica: ${classe_terapeutica}`,
140
+ `**Total analisado:** ${total} medicamento(s)`,
141
+ "",
142
+ `- **Sem Tarja (Venda Livre):** ${grupos.LIVRE.length}`,
143
+ `- **Tarja Amarela (controle leve/antibióticos):** — *não categorizado pelo Bulário ANVISA*`,
144
+ `- **Tarja Vermelha (prescrição obrigatória):** ${grupos.VERMELHA.length}`,
145
+ `- **Tarja Preta (controle especial — Portaria 344/98):** ${grupos.PRETA.length}`,
146
+ `- **Não categorizado:** ${grupos.DESCONHECIDA.length}`,
147
+ ];
148
+ if (grupos.PRETA.length > 0) {
149
+ lines.push("", `⚠️ **Tarja Preta identificados (${grupos.PRETA.length}):** ${grupos.PRETA.slice(0, 10).join(", ")}`);
150
+ }
151
+ lines.push(DISCLAIMER);
152
+ return [
153
+ {
154
+ role: "user",
155
+ content: {
156
+ type: "text",
157
+ text: `Comparar tarjas para classe terapêutica: ${classe_terapeutica}`,
158
+ },
159
+ },
160
+ {
161
+ role: "assistant",
162
+ content: { type: "text", text: lines.join("\n") },
163
+ },
164
+ ];
165
+ }
166
+ export async function handleAnalisarApresentacoes(input, repository) {
167
+ const { nome_medicamento, agrupar_por } = input;
168
+ let medicamentos = [];
169
+ try {
170
+ const result = await repository.searchByName({ nome: nome_medicamento, count: 10 });
171
+ medicamentos = result.data;
172
+ }
173
+ catch (err) {
174
+ const message = err instanceof Error ? err.message : String(err);
175
+ return [
176
+ {
177
+ role: "assistant",
178
+ content: {
179
+ type: "text",
180
+ text: `Erro ao buscar "${nome_medicamento}": ${message}${DISCLAIMER}`,
181
+ },
182
+ },
183
+ ];
184
+ }
185
+ if (medicamentos.length === 0) {
186
+ return [
187
+ {
188
+ role: "assistant",
189
+ content: {
190
+ type: "text",
191
+ text: `Nenhum medicamento encontrado para "${nome_medicamento}".${DISCLAIMER}`,
192
+ },
193
+ },
194
+ ];
195
+ }
196
+ const agrupado = {};
197
+ for (const med of medicamentos.slice(0, 5)) {
198
+ if (!med.numProcesso)
199
+ continue;
200
+ try {
201
+ const apResult = await repository.getApresentacoes(med.numProcesso);
202
+ for (const ap of apResult.data) {
203
+ let chave = "Outros";
204
+ const desc = ap.descricao ?? "";
205
+ if (agrupar_por === "concentracao") {
206
+ const match = desc.match(/\d+[\s,.]?\d*\s*(mg|mcg|g|ml|%|UI|mEq)/i);
207
+ chave = match ? match[0].trim() : "Concentração não identificada";
208
+ }
209
+ else if (agrupar_por === "forma_farmaceutica") {
210
+ const formas = [
211
+ "comprimido",
212
+ "cápsula",
213
+ "xarope",
214
+ "solução",
215
+ "injetável",
216
+ "pomada",
217
+ "gel",
218
+ "spray",
219
+ "supositório",
220
+ "adesivo",
221
+ ];
222
+ const forma = formas.find((f) => desc.toLowerCase().includes(f));
223
+ chave = forma ? forma.charAt(0).toUpperCase() + forma.slice(1) : "Forma não identificada";
224
+ }
225
+ else if (agrupar_por === "fabricante") {
226
+ chave = med.empresa ?? "Fabricante desconhecido";
227
+ }
228
+ if (!agrupado[chave])
229
+ agrupado[chave] = [];
230
+ agrupado[chave].push(`${med.nomeProduto} — ${desc}`);
231
+ }
232
+ }
233
+ catch {
234
+ // ignora erros individuais de apresentações
235
+ }
236
+ }
237
+ const totalApresentacoes = Object.values(agrupado).flat().length;
238
+ const lines = [
239
+ `## Apresentações de "${nome_medicamento}" agrupadas por ${agrupar_por}`,
240
+ `**Total de apresentações analisadas:** ${totalApresentacoes}`,
241
+ "",
242
+ ];
243
+ for (const [grupo, items] of Object.entries(agrupado).sort()) {
244
+ lines.push(`### ${grupo} (${items.length})`);
245
+ for (const item of items.slice(0, 5)) {
246
+ lines.push(`- ${item}`);
247
+ }
248
+ if (items.length > 5)
249
+ lines.push(`- ... (+${items.length - 5} itens)`);
250
+ lines.push("");
251
+ }
252
+ lines.push(DISCLAIMER);
253
+ return [
254
+ {
255
+ role: "user",
256
+ content: {
257
+ type: "text",
258
+ text: `Analisar apresentações de ${nome_medicamento} agrupando por ${agrupar_por}`,
259
+ },
260
+ },
261
+ {
262
+ role: "assistant",
263
+ content: { type: "text", text: lines.join("\n") },
264
+ },
265
+ ];
266
+ }
267
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/prompts/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { IBularioRepository } from "../domain/repository.js";
3
+ export declare function registerPrompts(server: McpServer, repository: IBularioRepository): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAYlE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAgDvF"}
@@ -0,0 +1,35 @@
1
+ import { handleAnalisarApresentacoes, handleCompararTarjasPorClasse, handleVerificarMedicamentoCompleto, } from "./handlers.js";
2
+ import { AnalisarApresentacoesInput, CompararTarjasPorClasseInput, VerificarMedicamentoCompletoInput, } from "./schemas.js";
3
+ export function registerPrompts(server, repository) {
4
+ server.registerPrompt("verificar_medicamento_completo", {
5
+ title: "Verificar Medicamento Completo",
6
+ description: "Consolida nome, princípio ativo, classe terapêutica, tarja, apresentações e (opcional) bula " +
7
+ "para um termo de busca. Tenta busca por nome e fallback por princípio ativo.",
8
+ argsSchema: VerificarMedicamentoCompletoInput.shape,
9
+ }, async (args) => {
10
+ const parsed = VerificarMedicamentoCompletoInput.parse(args);
11
+ const messages = await handleVerificarMedicamentoCompleto(parsed, repository);
12
+ return { messages };
13
+ });
14
+ server.registerPrompt("comparar_tarjas_por_classe", {
15
+ title: "Comparar Tarjas por Classe Terapêutica",
16
+ description: "Agrupa medicamentos de uma classe terapêutica por tarja regulatória. " +
17
+ "Útil para entender o perfil de prescrição e controle de uma classe.",
18
+ argsSchema: CompararTarjasPorClasseInput.shape,
19
+ }, async (args) => {
20
+ const parsed = CompararTarjasPorClasseInput.parse(args);
21
+ const messages = await handleCompararTarjasPorClasse(parsed, repository);
22
+ return { messages };
23
+ });
24
+ server.registerPrompt("analisar_apresentacoes", {
25
+ title: "Analisar Apresentações de Medicamento",
26
+ description: "Agrupa as apresentações comerciais de um medicamento por concentração, " +
27
+ "forma farmacêutica ou fabricante.",
28
+ argsSchema: AnalisarApresentacoesInput.shape,
29
+ }, async (args) => {
30
+ const parsed = AnalisarApresentacoesInput.parse(args);
31
+ const messages = await handleAnalisarApresentacoes(parsed, repository);
32
+ return { messages };
33
+ });
34
+ }
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,iCAAiC,GAClC,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,UAA8B;IAC/E,MAAM,CAAC,cAAc,CACnB,gCAAgC,EAChC;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,8FAA8F;YAC9F,8EAA8E;QAChF,UAAU,EAAE,iCAAiC,CAAC,KAAK;KACpD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,iCAAiC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,kCAAkC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9E,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,cAAc,CACnB,4BAA4B,EAC5B;QACE,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EACT,uEAAuE;YACvE,qEAAqE;QACvE,UAAU,EAAE,4BAA4B,CAAC,KAAK;KAC/C,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,6BAA6B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACzE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,cAAc,CACnB,wBAAwB,EACxB;QACE,KAAK,EAAE,uCAAuC;QAC9C,WAAW,EACT,yEAAyE;YACzE,mCAAmC;QACrC,UAAU,EAAE,0BAA0B,CAAC,KAAK;KAC7C,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACvE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ export declare const VerificarMedicamentoCompletoInput: z.ZodObject<{
3
+ termo: z.ZodString;
4
+ incluir_apresentacoes: z.ZodDefault<z.ZodBoolean>;
5
+ incluir_bula: z.ZodDefault<z.ZodBoolean>;
6
+ }, z.core.$strip>;
7
+ export type VerificarMedicamentoCompletoInputType = z.infer<typeof VerificarMedicamentoCompletoInput>;
8
+ export declare const CompararTarjasPorClasseInput: z.ZodObject<{
9
+ classe_terapeutica: z.ZodString;
10
+ limite: z.ZodDefault<z.ZodNumber>;
11
+ }, z.core.$strip>;
12
+ export type CompararTarjasPorClasseInputType = z.infer<typeof CompararTarjasPorClasseInput>;
13
+ export declare const AnalisarApresentacoesInput: z.ZodObject<{
14
+ nome_medicamento: z.ZodString;
15
+ agrupar_por: z.ZodDefault<z.ZodEnum<{
16
+ concentracao: "concentracao";
17
+ forma_farmaceutica: "forma_farmaceutica";
18
+ fabricante: "fabricante";
19
+ }>>;
20
+ }, z.core.$strip>;
21
+ export type AnalisarApresentacoesInputType = z.infer<typeof AnalisarApresentacoesInput>;
22
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/prompts/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iCAAiC;;;;iBAI5C,CAAC;AACH,MAAM,MAAM,qCAAqC,GAAG,CAAC,CAAC,KAAK,CACzD,OAAO,iCAAiC,CACzC,CAAC;AAEF,eAAO,MAAM,4BAA4B;;;iBAGvC,CAAC;AACH,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAE5F,eAAO,MAAM,0BAA0B;;;;;;;iBAGrC,CAAC;AACH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ export const VerificarMedicamentoCompletoInput = z.object({
3
+ termo: z.string().min(2, "Nome comercial, princípio ativo ou parte"),
4
+ incluir_apresentacoes: z.boolean().default(true),
5
+ incluir_bula: z.boolean().default(false).describe("Se true, inclui resumo da bula (mais caro)"),
6
+ });
7
+ export const CompararTarjasPorClasseInput = z.object({
8
+ classe_terapeutica: z.string().min(3),
9
+ limite: z.number().int().min(1).max(100).default(50),
10
+ });
11
+ export const AnalisarApresentacoesInput = z.object({
12
+ nome_medicamento: z.string().min(2),
13
+ agrupar_por: z.enum(["concentracao", "forma_farmaceutica", "fabricante"]).default("concentracao"),
14
+ });
15
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/prompts/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAC,MAAM,CAAC;IACxD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,0CAA0C,CAAC;IACpE,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;CAChG,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;CAClG,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { IBularioRepository } from "../domain/repository.js";
2
+ export declare const TARJAS_JSON: string;
3
+ export declare function getClassesTerapeuticasJson(_repository: IBularioRepository): Promise<string>;
4
+ export declare const SCOPE_MARKDOWN = "# Escopo do MCP @mcpassure/mcp-anvisa-bulario\n\n## \uD83C\uDDE7\uD83C\uDDF7 Portugu\u00EAs (BR)\n\n### O que este MCP faz\n\nConsulta ao **Bul\u00E1rio Eletr\u00F4nico da ANVISA** (Ag\u00EAncia Nacional de Vigil\u00E2ncia Sanit\u00E1ria), incluindo:\n\n- Busca de medicamentos por nome comercial, princ\u00EDpio ativo, classe terap\u00EAutica ou tarja\n- Recupera\u00E7\u00E3o de bulas (paciente e profissional) em PDF via n\u00FAmero de registro ANVISA\n- Listagem de apresenta\u00E7\u00F5es comerciais (concentra\u00E7\u00E3o, forma farmac\u00EAutica, fabricante)\n- Filtragem por tarja regulat\u00F3ria (Livre, Vermelha, Preta)\n- Transport Playwright resistente a prote\u00E7\u00E3o Cloudflare do portal ANVISA\n- Cache local SQLite para redu\u00E7\u00E3o de lat\u00EAncia e requisi\u00E7\u00F5es repetidas\n\n### O que este MCP N\u00C3O faz\n\n- \u274C N\u00E3o substitui consulta direta \u00E0 ANVISA para fins regulat\u00F3rios oficiais\n- \u274C N\u00E3o fornece pre\u00E7os de medicamentos (consulte CMED/ANVISA)\n- \u274C N\u00E3o verifica intera\u00E7\u00F5es medicamentosas\n- \u274C N\u00E3o emite receitas ou laudos m\u00E9dicos\n- \u274C N\u00E3o cobre medicamentos fitoter\u00E1picos, cosm\u00E9ticos ou saneantes\n- \u274C N\u00E3o acessa dados de farmacovigil\u00E2ncia ou notifica\u00E7\u00F5es de eventos adversos\n\n### \u26A0\uFE0F Disclaimer regulat\u00F3rio\n\nDados obtidos do Bul\u00E1rio Eletr\u00F4nico ANVISA com lat\u00EAncia de cache configur\u00E1vel.\n**Decis\u00F5es cl\u00EDnicas ou regulat\u00F3rias devem sempre utilizar a fonte ANVISA oficial e atualizada.**\n\nMedicamentos sob **Tarja Preta** (Portaria SVS/MS 344/1998) est\u00E3o sujeitos a controle especial \u2014\npsicotr\u00F3picos, entorpecentes, precursores e outras subst\u00E2ncias de controle especial.\nO uso inadequado \u00E9 crime previsto em lei.\n\n---\n\n## \uD83C\uDDFA\uD83C\uDDF8 English\n\n### What this MCP does\n\nQueries the **ANVISA Electronic Drug Information Database** (Brazilian Health Regulatory Agency), including:\n\n- Search medications by trade name, active ingredient (INN/DCB), therapeutic class, or controlled-substance tier\n- Retrieve patient and prescriber leaflets (bulas) in PDF via ANVISA registration number\n- List commercial presentations (dosage, pharmaceutical form, manufacturer)\n- Filter by regulatory tier (Sem Tarja/OTC, Tarja Vermelha/Rx, Tarja Preta/controlled)\n- Cloudflare-resistant Playwright transport for the ANVISA portal\n- Local SQLite cache to reduce latency on repeated queries\n\n### What this MCP does NOT do\n\n- \u274C Does not replace official ANVISA consultation for regulatory compliance\n- \u274C Does not provide drug pricing (see CMED/ANVISA)\n- \u274C Does not check drug interactions\n- \u274C Does not issue prescriptions or medical reports\n- \u274C Does not cover phytotherapeutics, cosmetics, or sanitizers\n- \u274C Does not access pharmacovigilance data or adverse event reports\n\n### \u26A0\uFE0F Regulatory disclaimer\n\nData sourced from the ANVISA Electronic Drug Information Database with configurable cache latency.\n**Clinical or regulatory decisions must always use the official and up-to-date ANVISA source.**\n\nMedications classified as **Tarja Preta** (Black-banded \u2014 controlled substance under Brazilian\nOrdinance SVS/MS 344/1998) are subject to special control \u2014 psychotropics, narcotics, precursors,\nand other controlled substances. Misuse is a criminal offense under Brazilian law.\n";
5
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/resources/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,eAAO,MAAM,WAAW,QA4BvB,CAAC;AAgDF,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWjG;AAED,eAAO,MAAM,cAAc,m6GAiE1B,CAAC"}
@@ -0,0 +1,145 @@
1
+ export const TARJAS_JSON = JSON.stringify({
2
+ tarjas: [
3
+ {
4
+ codigo: "sem_tarja",
5
+ nome: "Sem tarja",
6
+ descricao: "Venda livre — sem retenção de receita.",
7
+ },
8
+ {
9
+ codigo: "amarela",
10
+ nome: "Tarja Amarela",
11
+ descricao: "Venda sob prescrição — antibióticos e outros medicamentos sujeitos a controle.",
12
+ },
13
+ {
14
+ codigo: "vermelha",
15
+ nome: "Tarja Vermelha",
16
+ descricao: "Venda sob prescrição médica — receita simples retida.",
17
+ },
18
+ {
19
+ codigo: "preta",
20
+ nome: "Tarja Preta",
21
+ descricao: "Controle especial — Portaria 344/98 (psicotrópicos, entorpecentes).",
22
+ },
23
+ ],
24
+ fonte: "RDC ANVISA 357/2020 e Portaria SVS/MS 344/1998",
25
+ }, null, 2);
26
+ const CLASSES_TERAPEUTICAS_HARDCODED = [
27
+ "Analgésico",
28
+ "Anti-inflamatório",
29
+ "Antibiótico",
30
+ "Antifúngico",
31
+ "Antiviral",
32
+ "Antiparasitário",
33
+ "Anti-hipertensivo",
34
+ "Antidiabético",
35
+ "Anticoagulante",
36
+ "Antiarrítmico",
37
+ "Diurético",
38
+ "Broncodilatador",
39
+ "Corticosteroide",
40
+ "Imunossupressor",
41
+ "Antineoplásico",
42
+ "Ansiolítico",
43
+ "Antidepressivo",
44
+ "Antipsicótico",
45
+ "Antiepiléptico",
46
+ "Antiparkinsônico",
47
+ "Opiáceo",
48
+ "Psicotrópico",
49
+ "Hormônio",
50
+ "Anticoncepcional",
51
+ "Vitamina e Suplemento",
52
+ "Gastroprotetores",
53
+ "Antiácido",
54
+ "Antiemético",
55
+ "Laxante",
56
+ "Antidiarreico",
57
+ "Hipnótico",
58
+ "Relaxante Muscular",
59
+ "Imunomodulador",
60
+ "Vacina",
61
+ "Hemostático",
62
+ "Antialérgico",
63
+ "Descongestionante",
64
+ "Mucolítico",
65
+ "Antitussígeno",
66
+ "Dermatológico",
67
+ "Oftálmico",
68
+ "Otológico",
69
+ "Antisséptico",
70
+ ];
71
+ export async function getClassesTerapeuticasJson(_repository) {
72
+ return JSON.stringify({
73
+ classes_terapeuticas: CLASSES_TERAPEUTICAS_HARDCODED.sort(),
74
+ total: CLASSES_TERAPEUTICAS_HARDCODED.length,
75
+ fonte: "Bulário Eletrônico ANVISA — principais classes indexadas",
76
+ nota: "Lista representativa. Consulte o Bulário ANVISA para listagem completa atualizada.",
77
+ }, null, 2);
78
+ }
79
+ export const SCOPE_MARKDOWN = `# Escopo do MCP @mcpassure/mcp-anvisa-bulario
80
+
81
+ ## 🇧🇷 Português (BR)
82
+
83
+ ### O que este MCP faz
84
+
85
+ Consulta ao **Bulário Eletrônico da ANVISA** (Agência Nacional de Vigilância Sanitária), incluindo:
86
+
87
+ - Busca de medicamentos por nome comercial, princípio ativo, classe terapêutica ou tarja
88
+ - Recuperação de bulas (paciente e profissional) em PDF via número de registro ANVISA
89
+ - Listagem de apresentações comerciais (concentração, forma farmacêutica, fabricante)
90
+ - Filtragem por tarja regulatória (Livre, Vermelha, Preta)
91
+ - Transport Playwright resistente a proteção Cloudflare do portal ANVISA
92
+ - Cache local SQLite para redução de latência e requisições repetidas
93
+
94
+ ### O que este MCP NÃO faz
95
+
96
+ - ❌ Não substitui consulta direta à ANVISA para fins regulatórios oficiais
97
+ - ❌ Não fornece preços de medicamentos (consulte CMED/ANVISA)
98
+ - ❌ Não verifica interações medicamentosas
99
+ - ❌ Não emite receitas ou laudos médicos
100
+ - ❌ Não cobre medicamentos fitoterápicos, cosméticos ou saneantes
101
+ - ❌ Não acessa dados de farmacovigilância ou notificações de eventos adversos
102
+
103
+ ### ⚠️ Disclaimer regulatório
104
+
105
+ Dados obtidos do Bulário Eletrônico ANVISA com latência de cache configurável.
106
+ **Decisões clínicas ou regulatórias devem sempre utilizar a fonte ANVISA oficial e atualizada.**
107
+
108
+ Medicamentos sob **Tarja Preta** (Portaria SVS/MS 344/1998) estão sujeitos a controle especial —
109
+ psicotrópicos, entorpecentes, precursores e outras substâncias de controle especial.
110
+ O uso inadequado é crime previsto em lei.
111
+
112
+ ---
113
+
114
+ ## 🇺🇸 English
115
+
116
+ ### What this MCP does
117
+
118
+ Queries the **ANVISA Electronic Drug Information Database** (Brazilian Health Regulatory Agency), including:
119
+
120
+ - Search medications by trade name, active ingredient (INN/DCB), therapeutic class, or controlled-substance tier
121
+ - Retrieve patient and prescriber leaflets (bulas) in PDF via ANVISA registration number
122
+ - List commercial presentations (dosage, pharmaceutical form, manufacturer)
123
+ - Filter by regulatory tier (Sem Tarja/OTC, Tarja Vermelha/Rx, Tarja Preta/controlled)
124
+ - Cloudflare-resistant Playwright transport for the ANVISA portal
125
+ - Local SQLite cache to reduce latency on repeated queries
126
+
127
+ ### What this MCP does NOT do
128
+
129
+ - ❌ Does not replace official ANVISA consultation for regulatory compliance
130
+ - ❌ Does not provide drug pricing (see CMED/ANVISA)
131
+ - ❌ Does not check drug interactions
132
+ - ❌ Does not issue prescriptions or medical reports
133
+ - ❌ Does not cover phytotherapeutics, cosmetics, or sanitizers
134
+ - ❌ Does not access pharmacovigilance data or adverse event reports
135
+
136
+ ### ⚠️ Regulatory disclaimer
137
+
138
+ Data sourced from the ANVISA Electronic Drug Information Database with configurable cache latency.
139
+ **Clinical or regulatory decisions must always use the official and up-to-date ANVISA source.**
140
+
141
+ Medications classified as **Tarja Preta** (Black-banded — controlled substance under Brazilian
142
+ Ordinance SVS/MS 344/1998) are subject to special control — psychotropics, narcotics, precursors,
143
+ and other controlled substances. Misuse is a criminal offense under Brazilian law.
144
+ `;
145
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/resources/handlers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CACvC;IACE,MAAM,EAAE;QACN;YACE,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,wCAAwC;SACpD;QACD;YACE,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,gFAAgF;SAC5F;QACD;YACE,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,uDAAuD;SACnE;QACD;YACE,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,qEAAqE;SACjF;KACF;IACD,KAAK,EAAE,gDAAgD;CACxD,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AAEF,MAAM,8BAA8B,GAAG;IACrC,YAAY;IACZ,mBAAmB;IACnB,aAAa;IACb,aAAa;IACb,WAAW;IACX,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,uBAAuB;IACvB,kBAAkB;IAClB,WAAW;IACX,aAAa;IACb,SAAS;IACT,eAAe;IACf,WAAW;IACX,oBAAoB;IACpB,gBAAgB;IAChB,QAAQ;IACR,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,YAAY;IACZ,eAAe;IACf,eAAe;IACf,WAAW;IACX,WAAW;IACX,cAAc;CACf,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,WAA+B;IAC9E,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,oBAAoB,EAAE,8BAA8B,CAAC,IAAI,EAAE;QAC3D,KAAK,EAAE,8BAA8B,CAAC,MAAM;QAC5C,KAAK,EAAE,0DAA0D;QACjE,IAAI,EAAE,oFAAoF;KAC3F,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiE7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { IBularioRepository } from "../domain/repository.js";
3
+ export declare function registerResources(server: McpServer, repository: IBularioRepository): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAiEzF"}
@@ -0,0 +1,48 @@
1
+ import { getClassesTerapeuticasJson, SCOPE_MARKDOWN, TARJAS_JSON } from "./handlers.js";
2
+ export function registerResources(server, repository) {
3
+ server.registerResource("bulario://tarjas", "bulario://tarjas", {
4
+ title: "Taxonomia de Tarjas ANVISA",
5
+ description: "Taxonomia regulatória de tarjas (RDC 357/2020, Portaria 344/98). " +
6
+ "Lista todas as categorias de controle de venda de medicamentos no Brasil.",
7
+ mimeType: "application/json",
8
+ }, async () => ({
9
+ contents: [
10
+ {
11
+ uri: "bulario://tarjas",
12
+ mimeType: "application/json",
13
+ text: TARJAS_JSON,
14
+ },
15
+ ],
16
+ }));
17
+ server.registerResource("bulario://classes_terapeuticas", "bulario://classes_terapeuticas", {
18
+ title: "Classes Terapêuticas Indexadas",
19
+ description: "Lista das principais classes terapêuticas indexadas no Bulário Eletrônico ANVISA.",
20
+ mimeType: "application/json",
21
+ }, async () => {
22
+ const json = await getClassesTerapeuticasJson(repository);
23
+ return {
24
+ contents: [
25
+ {
26
+ uri: "bulario://classes_terapeuticas",
27
+ mimeType: "application/json",
28
+ text: json,
29
+ },
30
+ ],
31
+ };
32
+ });
33
+ server.registerResource("bulario://scope", "bulario://scope", {
34
+ title: "Escopo do MCP (PT/EN)",
35
+ description: "Escopo do MCP (PT/EN): o que faz, o que não faz, disclaimer regulatório " +
36
+ "e atenção especial a Tarja Preta (Portaria 344/98).",
37
+ mimeType: "text/markdown",
38
+ }, async () => ({
39
+ contents: [
40
+ {
41
+ uri: "bulario://scope",
42
+ mimeType: "text/markdown",
43
+ text: SCOPE_MARKDOWN,
44
+ },
45
+ ],
46
+ }));
47
+ }
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAExF,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,UAA8B;IACjF,MAAM,CAAC,gBAAgB,CACrB,kBAAkB,EAClB,kBAAkB,EAClB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,mEAAmE;YACnE,2EAA2E;QAC7E,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,kBAAkB;gBACvB,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,WAAW;aAClB;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,gCAAgC,EAChC,gCAAgC,EAChC;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,mFAAmF;QACrF,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAC1D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,gCAAgC;oBACrC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI;iBACX;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,iBAAiB,EACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,0EAA0E;YAC1E,qDAAqD;QACvD,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,iBAAiB;gBACtB,QAAQ,EAAE,eAAe;gBACzB,IAAI,EAAE,cAAc;aACrB;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}