fg-tracker-sdk 0.13.0 → 0.14.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.
package/dist/normalize.js CHANGED
@@ -46,43 +46,233 @@ export function httpClientSemconv(url) {
46
46
  const port = url.port ? Number(url.port) : url.protocol === 'https:' ? 443 : url.protocol === 'http:' ? 80 : undefined;
47
47
  return { 'url.full': redactedUrl(url), 'server.address': url.hostname, ...(port ? { 'server.port': port } : {}) };
48
48
  }
49
- /**
50
- * Normaliza SQL para agrupar queries com o mesmo "shape":
51
- * números → `?`, strings → `'?'`, `IN (...)` → `IN (?)`, espaços colapsados,
52
- * minúsculas, no máximo 200 caracteres.
53
- */
49
+ /** `postgresql`/`postgres`/`pg`, `mysql`/`mariadb`, `sqlite`/`sqlite3`; o resto é `other`. Sem sistema, PostgreSQL. */
50
+ export function sqlDialect(system) {
51
+ if (system === undefined || system === null)
52
+ return 'postgresql';
53
+ const name = String(system).trim().toLowerCase();
54
+ if (name === 'postgresql' || name === 'postgres' || name === 'pg')
55
+ return 'postgresql';
56
+ if (name === 'mysql' || name === 'mariadb')
57
+ return 'mysql';
58
+ if (name === 'sqlite' || name === 'sqlite3')
59
+ return 'sqlite';
60
+ return 'other';
61
+ }
54
62
  /**
55
63
  * Abertura de dollar-quoting: `$$` ou `$tag$`, com a tag nas regras de identificador do Postgres
56
64
  * (letra, `_` ou qualquer caractere não ASCII no início; depois também dígitos; nunca `$`). Tags
57
65
  * com acento (`$é$`) são válidas e precisam ser reconhecidas, senão o conteúdo sai como texto.
58
66
  * Sticky (`y`): testada na posição do `$`, sem copiar o resto do texto.
59
67
  */
60
- const DOLLAR_TAG = /\$(?:[A-Za-z_\u0080-\uffff][A-Za-z_0-9\u0080-\uffff]*)?\$/y;
68
+ const DOLLAR_TAG = /\$(?:[A-Za-z_\u0080-￿][A-Za-z_0-9\u0080-￿]*)?\$/y;
61
69
  /**
62
70
  * Identificador (e palavra-chave) inteiro, com os `$` internos (`a$b$c`), e parâmetro (`$1`), como
63
71
  * no analisador do Postgres: o `$` só abre dollar-quoting no início de um token. Depois de um
64
- * parâmetro ele abre (`$1$t$…$t$`), e o conteúdo é ocultado.
72
+ * parâmetro ele abre (`$1$t$…$t$`), e o conteúdo é ocultado. No MySQL o `$` também pode começar um
73
+ * identificador.
65
74
  */
66
- const IDENTIFIER = /[A-Za-z_\u0080-\uffff][A-Za-z0-9_$\u0080-\uffff]*/y;
75
+ const IDENTIFIER = /[A-Za-z_\u0080-￿][A-Za-z0-9_$\u0080-￿]*/y;
76
+ const MYSQL_IDENTIFIER = /[A-Za-z_$\u0080-￿][A-Za-z0-9_$\u0080-￿]*/y;
67
77
  const PARAM = /\$[0-9]+/y;
78
+ /** `?`, `?1` (SQLite, MySQL e outros): o número faz parte do marcador. */
79
+ const QUESTION_PARAM = /\?[0-9]+/y;
80
+ /**
81
+ * Antes de um destes, `"…"` do MySQL/SQLite só pode ser identificador (nunca valor). `FROM` não
82
+ * entra: também faz parte de expressões (`IS NOT DISTINCT FROM "x"`, `TRIM(BOTH "x" FROM "y")`,
83
+ * `EXTRACT(YEAR FROM "…")`), onde `"…"` pode ser texto.
84
+ */
85
+ const IDENTIFIER_ONLY_AFTER = new Set(['join', 'into', 'update', 'table', 'exists', 'index', 'view', 'as']);
68
86
  function sticky(pattern, text, at) {
69
87
  pattern.lastIndex = at;
70
88
  return pattern.exec(text)?.[0];
71
89
  }
90
+ function isDigit(code) {
91
+ return code >= 48 && code <= 57;
92
+ }
93
+ /** Letra, dígito, `_` ou não ASCII: continua um número colado (`0x1F`, `1_000`, `1e5`, `2d`). */
94
+ function isWordCode(code) {
95
+ return (code >= 48 && code <= 57) || (code >= 65 && code <= 90) || (code >= 97 && code <= 122) || code === 95 || code >= 0x80;
96
+ }
97
+ /**
98
+ * Fim de um literal numérico a partir de `start` (um dígito, ou `.` seguido de dígito): decimal,
99
+ * `0x`/`0o`/`0b`, separador `_`, expoente com sinal (`4.1e-15`) e sufixos colados (`1.5f`, junk
100
+ * como `123abc`). Tudo vira um `?`; dígitos dentro de identificadores (`t1`, `col_2`) nunca chegam
101
+ * aqui, porque o identificador é consumido inteiro.
102
+ */
103
+ function numberEnd(sql, start) {
104
+ const prefixed = sql.charCodeAt(start) === 48 && /[xXoObB]/.test(sql[start + 1] ?? '');
105
+ let i = start;
106
+ while (i < sql.length) {
107
+ const code = sql.charCodeAt(i);
108
+ if (isWordCode(code) || code === 46) {
109
+ i++;
110
+ continue;
111
+ }
112
+ // Sinal do expoente (`1e-5`, `2.5E+3`), só em número decimal e seguido de dígito.
113
+ if ((code === 43 || code === 45) && !prefixed && (sql[i - 1] === 'e' || sql[i - 1] === 'E') && isDigit(sql.charCodeAt(i + 1))) {
114
+ i++;
115
+ continue;
116
+ }
117
+ break;
118
+ }
119
+ return i;
120
+ }
121
+ /** Fim do comentário de linha que começa em `start`: o primeiro caractere de `ends`, ou o fim do texto. */
122
+ function lineCommentEnd(sql, start, ends) {
123
+ for (let i = start; i < sql.length; i++)
124
+ if (ends.includes(sql[i]))
125
+ return i;
126
+ return sql.length;
127
+ }
128
+ /**
129
+ * Espaço para os lexers SQL: só ASCII (espaço, `\t`, `\n`, `\v`, `\f`, `\r`). MySQL, SQLite e
130
+ * PostgreSQL leem espaços Unicode (U+00A0, U+2003…) como parte de identificador, não como espaço.
131
+ */
132
+ function isSqlSpace(code) {
133
+ return code === 32 || (code >= 9 && code <= 13);
134
+ }
135
+ /** Posição do próximo caractere que não é espaço a partir de `start`. */
136
+ function nextNonSpace(sql, start) {
137
+ let i = start;
138
+ while (i < sql.length && isSqlSpace(sql.charCodeAt(i)))
139
+ i++;
140
+ return i;
141
+ }
142
+ /** Caractere de identificador do SQLite (`IdChar`): letra, dígito, `_`, `$` e qualquer não ASCII. */
143
+ function isSqliteIdChar(code) {
144
+ return isWordCode(code) || code === 36;
145
+ }
146
+ /**
147
+ * Parâmetro do SQLite com nome (`$x`, `@x`, `:x`, `#x`, inclusive `$a::b`) e o sufixo do Tcl entre
148
+ * parênteses (`$x(qualquer texto)`), que vai até o `)` ou o primeiro espaço, como no `tokenize.c`:
149
+ * fim do parâmetro, `-1` quando o sufixo não fecha (o SQLite recusa o texto), ou `start` quando não é
150
+ * parâmetro.
151
+ */
152
+ function sqliteVariableEnd(sql, start) {
153
+ let i = start + 1;
154
+ let named = 0;
155
+ while (i < sql.length) {
156
+ const code = sql.charCodeAt(i);
157
+ if (isSqliteIdChar(code)) {
158
+ named++;
159
+ i++;
160
+ continue;
161
+ }
162
+ if (code === 40 && named > 0) {
163
+ i++;
164
+ while (i < sql.length && !isSqlSpace(sql.charCodeAt(i)) && sql[i] !== ')')
165
+ i++;
166
+ return sql[i] === ')' ? i + 1 : -1;
167
+ }
168
+ if (code === 58 && sql.charCodeAt(i + 1) === 58) {
169
+ i += 2;
170
+ continue;
171
+ }
172
+ break;
173
+ }
174
+ return named > 0 ? i : start;
175
+ }
176
+ /** MySQL: `--` só abre comentário seguido de espaço ou controle ASCII (byte a byte), ou no fim do texto. */
177
+ const MYSQL_DASH_COMMENT_NEXT = /[\x00-\x20\x7f]/;
72
178
  /**
73
- * `stopAtAmbiguous`: o texto que sai do processo para no literal comum com barra invertida (ver
74
- * abaixo); a análise local dos comandos (transações) lê até o fim, pela leitura padrão do servidor.
179
+ * Lexer SQL linear por dialeto. Cada posição é lida uma vez (os `indexOf` saltam para o fim do
180
+ * trecho que acharam).
181
+ *
182
+ * - PostgreSQL: `'…'` (`E'…'` com escape; literal comum com barra é ambíguo, porque depende de
183
+ * `standard_conforming_strings`), dollar-quoting, `"identificador"` copiado (em `analysis`,
184
+ * mascarado como `""`), `--` até `\n` ou `\r`, `/* … *\/` aninhado.
185
+ * - MySQL: `'…'` e `"…"` são texto (com `ANSI_QUOTES`, `"…"` é identificador; nos dois casos sai
186
+ * como `'?'`, salvo onde só cabe identificador: depois de JOIN, INTO, UPDATE, TABLE, EXISTS,
187
+ * INDEX, VIEW, AS ou junto de `.`), barra é ambígua (`NO_BACKSLASH_ESCAPES`), crase
188
+ * é identificador, `#` e `-- ` (com espaço ou controle depois) até `\n`, `/* … *\/` sem
189
+ * aninhamento e `/*! … *\/` (código executado) corta o texto.
190
+ * - SQLite: `'…'` sem escape, `"…"` é identificador ou, com DQS, texto (sai como `'?'`, salvo onde
191
+ * só cabe identificador), crase e `[…]` são identificadores, `--` até `\n`, `/* … *\/` sem
192
+ * aninhamento.
193
+ * - `other` (Oracle, SQL Server e sistemas desconhecidos): corta no primeiro caractere que pode
194
+ * abrir literal, identificador delimitado ou comentário em algum dialeto: `'` (inclusive `q'`,
195
+ * `N'`, `x'`), `"`, crase, `[`, `#`, `\`, `--`, `/*` e `$` que não é parâmetro.
75
196
  */
76
- function redactSqlLiterals(sql, stopAtAmbiguous = true) {
197
+ function scanSql(sql, options) {
198
+ const { dialect } = options;
199
+ const send = options.mode === 'send';
200
+ const postgres = dialect === 'postgresql';
201
+ const mysql = dialect === 'mysql';
202
+ const sqlite = dialect === 'sqlite';
203
+ const other = dialect === 'other';
204
+ const identifierPattern = mysql ? MYSQL_IDENTIFIER : IDENTIFIER;
205
+ const lineEnds = postgres ? '\n\r' : '\n';
77
206
  let result = '';
78
207
  let i = 0;
79
208
  /** Fim do último identificador e se ele era só `E`: `E'…'` colado é o literal com escape. */
80
209
  let identifierEnd = -1;
81
210
  let identifierIsE = false;
211
+ /** Último token significativo (espaço e comentário não contam): decide `"…"` e o `.` de número. */
212
+ let previous = 'other';
213
+ let previousWord = '';
214
+ const cut = () => { result += ' …'; };
82
215
  while (i < sql.length) {
83
- // Identificador entre aspas duplas ("a'b"): copiado como está, para uma aspa simples dentro dele
84
- // não abrir um literal.
85
- if (sql[i] === '"') {
216
+ const ch = sql[i];
217
+ const code = sql.charCodeAt(i);
218
+ if (isSqlSpace(code)) {
219
+ result += ch;
220
+ i++;
221
+ continue;
222
+ }
223
+ if (other) {
224
+ if (ch === "'" || ch === '"' || ch === '`' || ch === '[' || ch === '#' || ch === '\\' || sql.startsWith('--', i) || sql.startsWith('/*', i)) {
225
+ cut();
226
+ break;
227
+ }
228
+ if (ch === '$' && !isDigit(sql.charCodeAt(i + 1))) {
229
+ cut();
230
+ break;
231
+ }
232
+ }
233
+ // Comentários.
234
+ // No MySQL, `--` seguido de outro caractere (inclusive espaço Unicode, como U+2003) é subtração dupla.
235
+ if (sql.startsWith('--', i) && (!mysql || i + 2 >= sql.length || MYSQL_DASH_COMMENT_NEXT.test(sql[i + 2]))) {
236
+ i = lineCommentEnd(sql, i + 2, lineEnds);
237
+ result += ' ';
238
+ continue;
239
+ }
240
+ if (mysql && ch === '#') {
241
+ i = lineCommentEnd(sql, i + 1, '\n');
242
+ result += ' ';
243
+ continue;
244
+ }
245
+ if (sql.startsWith('/*', i)) {
246
+ // `/*! … *\/` do MySQL é código executado (pode ter literais): o resto não sai.
247
+ if (mysql && sql[i + 2] === '!' && send) {
248
+ cut();
249
+ break;
250
+ }
251
+ if (postgres) {
252
+ let depth = 1;
253
+ i += 2;
254
+ while (i < sql.length && depth) {
255
+ if (sql.startsWith('/*', i)) {
256
+ depth++;
257
+ i += 2;
258
+ }
259
+ else if (sql.startsWith('*/', i)) {
260
+ depth--;
261
+ i += 2;
262
+ }
263
+ else
264
+ i++;
265
+ }
266
+ }
267
+ else {
268
+ const end = sql.indexOf('*/', i + 2);
269
+ i = end < 0 ? sql.length : end + 2;
270
+ }
271
+ result += ' ';
272
+ continue;
273
+ }
274
+ // Identificadores delimitados.
275
+ if (ch === '"' && postgres) {
86
276
  let end = i + 1;
87
277
  let closed = false;
88
278
  while (end < sql.length) {
@@ -96,104 +286,143 @@ function redactSqlLiterals(sql, stopAtAmbiguous = true) {
96
286
  }
97
287
  }
98
288
  // Sem fechamento, o resto pode conter literais que o servidor nunca leu como tais: corta.
99
- if (!closed && stopAtAmbiguous) {
100
- result += ' …';
289
+ if (!closed && send) {
290
+ cut();
101
291
  break;
102
292
  }
103
- result += sql.slice(i, end);
293
+ // Na análise local o conteúdo some: `"; BEGIN"` não pode virar outro comando.
294
+ result += send ? sql.slice(i, end) : '""';
104
295
  i = end;
296
+ previous = 'word';
297
+ previousWord = '';
105
298
  continue;
106
299
  }
107
- if (sql.startsWith('--', i)) {
108
- const end = sql.indexOf('\n', i);
109
- i = end < 0 ? sql.length : end;
110
- result += ' ';
111
- continue;
112
- }
113
- if (sql.startsWith('/*', i)) {
114
- let depth = 1;
115
- i += 2;
116
- while (i < sql.length && depth) {
117
- if (sql.startsWith('/*', i)) {
118
- depth++;
119
- i += 2;
300
+ if ((ch === '`' && (mysql || sqlite)) || (ch === '[' && sqlite)) {
301
+ const close = ch === '[' ? ']' : '`';
302
+ let end = i + 1;
303
+ let closed = false;
304
+ while (end < sql.length) {
305
+ if (close === '`' && sql[end] === '`' && sql[end + 1] === '`') {
306
+ end += 2;
307
+ continue;
120
308
  }
121
- else if (sql.startsWith('*/', i)) {
122
- depth--;
123
- i += 2;
309
+ if (sql[end++] === close) {
310
+ closed = true;
311
+ break;
124
312
  }
125
- else
126
- i++;
127
313
  }
128
- result += ' ';
314
+ if (!closed) {
315
+ cut();
316
+ break;
317
+ }
318
+ result += sql.slice(i, end);
319
+ i = end;
320
+ previous = 'word';
321
+ previousWord = '';
129
322
  continue;
130
323
  }
131
- if (sql[i] === "'") {
132
- // `E'...'`: a barra invertida escapa. Num literal comum ela é um caractere como outro
133
- // (standard_conforming_strings, padrão desde o PostgreSQL 9.1), mas com a opção desligada
134
- // escapa: o fim do literal depende da configuração do servidor.
324
+ // Literais de texto.
325
+ if (ch === "'" || (ch === '"' && (mysql || sqlite))) {
326
+ const quote = ch;
327
+ // PostgreSQL: só `E'…'` escapa sempre; o literal comum escapa com standard_conforming_strings
328
+ // desligado (a análise lê as duas formas). MySQL: escapa salvo NO_BACKSLASH_ESCAPES. SQLite: nunca.
329
+ const escapeString = postgres && identifierIsE && identifierEnd === i;
330
+ const escapes = mysql || escapeString || (postgres && options.escapeReading === true);
135
331
  // Lido da entrada, não do `result` acumulado: ler o fim de uma string concatenada a materializa
136
332
  // inteira, e isso a cada literal tornava um INSERT em lote quadrático (40 mil linhas: 2 s).
137
- const escaped = identifierIsE && identifierEnd === i;
138
- i++;
333
+ let end = i + 1;
139
334
  let backslash = false;
140
- while (i < sql.length) {
141
- if (sql[i] === '\\') {
335
+ let closed = false;
336
+ while (end < sql.length) {
337
+ const c = sql[end];
338
+ if (c === '\\' && !sqlite) {
142
339
  backslash = true;
143
- if (escaped) {
144
- i += 2;
340
+ if (escapes) {
341
+ end += 2;
145
342
  continue;
146
343
  }
147
344
  }
148
- if (sql[i] === "'" && sql[i + 1] === "'") {
149
- i += 2;
345
+ if (c === quote && sql[end + 1] === quote) {
346
+ end += 2;
150
347
  continue;
151
348
  }
152
- if (sql[i++] === "'")
349
+ end++;
350
+ if (c === quote) {
351
+ closed = true;
153
352
  break;
353
+ }
154
354
  }
155
- result += "'?'";
156
- // Literal comum com barra invertida: as duas leituras dão fins diferentes, e o que vem depois
157
- // pode ser outro literal. Para nunca expor um valor, o resto do texto não é enviado.
158
- if (backslash && !escaped && stopAtAmbiguous) {
159
- result += ' …';
355
+ // `"…"` sem barra no MySQL/SQLite: onde só cabe identificador (depois de JOIN, INTO, UPDATE,
356
+ // AS…, ou junto de um `.`), é identificador e fica; no resto pode ser texto e sai como `'?'`.
357
+ const keepIdentifier = quote === '"' && closed && !backslash
358
+ && (previous === 'dot' || (previous === 'word' && IDENTIFIER_ONLY_AFTER.has(previousWord)) || sql[nextNonSpace(sql, end)] === '.');
359
+ result += keepIdentifier ? sql.slice(i, end) : "'?'";
360
+ i = end;
361
+ previous = keepIdentifier ? 'word' : 'other';
362
+ previousWord = '';
363
+ // Literal com barra invertida cujo fim depende da configuração do servidor (literal comum do
364
+ // PostgreSQL, qualquer literal do MySQL): as duas leituras dão fins diferentes, e o que vem
365
+ // depois pode ser outro literal. Para nunca expor um valor, o resto do texto não é enviado.
366
+ if (backslash && !escapeString && send && (postgres || mysql)) {
367
+ cut();
160
368
  break;
161
369
  }
162
370
  continue;
163
371
  }
164
- const identifier = sticky(IDENTIFIER, sql, i);
372
+ // SQLite: parâmetro com nome, inclusive o sufixo `(…)` do Tcl, que pode ter apóstrofo.
373
+ if (sqlite && (ch === '$' || ch === '@' || ch === ':' || ch === '#')) {
374
+ const end = sqliteVariableEnd(sql, i);
375
+ if (end < 0) {
376
+ cut();
377
+ break;
378
+ }
379
+ if (end > i) {
380
+ const variable = sql.slice(i, end);
381
+ result += variable.includes('(') ? '?' : variable;
382
+ i = end;
383
+ previous = 'other';
384
+ continue;
385
+ }
386
+ }
387
+ const identifier = sticky(identifierPattern, sql, i);
165
388
  if (identifier) {
166
389
  result += identifier;
167
390
  i += identifier.length;
168
391
  identifierEnd = i;
169
- identifierIsE = identifier === 'E' || identifier === 'e';
392
+ identifierIsE = postgres && (identifier === 'E' || identifier === 'e');
393
+ previous = 'word';
394
+ previousWord = identifier.toLowerCase();
170
395
  continue;
171
396
  }
172
- // `$1`: parâmetro. Um `$` logo depois dele começa outro token e pode abrir dollar-quoting.
173
- const param = sql[i] === '$' ? sticky(PARAM, sql, i) : undefined;
397
+ // Parâmetros: `$1` (o `$` logo depois dele começa outro token e pode abrir dollar-quoting) e `?1`.
398
+ const param = ch === '$' && !mysql && !sqlite ? sticky(PARAM, sql, i) : ch === '?' && !postgres ? sticky(QUESTION_PARAM, sql, i) : undefined;
174
399
  if (param) {
175
- result += param;
400
+ result += send ? '?' : param;
176
401
  i += param.length;
402
+ previous = 'other';
177
403
  continue;
178
404
  }
179
- const dollar = sql[i] === '$' ? sticky(DOLLAR_TAG, sql, i) : undefined;
405
+ const dollar = ch === '$' && postgres ? sticky(DOLLAR_TAG, sql, i) : undefined;
180
406
  if (dollar) {
181
407
  const end = sql.indexOf(dollar, i + dollar.length);
182
408
  i = end < 0 ? sql.length : end + dollar.length;
183
409
  result += "'?'";
410
+ previous = 'other';
411
+ continue;
412
+ }
413
+ // Números (no envio): o literal inteiro vira `?`. Um `.` depois de identificador é qualificação.
414
+ if (send && (isDigit(code) || (ch === '.' && previous !== 'word' && isDigit(sql.charCodeAt(i + 1))))) {
415
+ i = numberEnd(sql, i);
416
+ result += '?';
417
+ previous = 'other';
184
418
  continue;
185
419
  }
186
- result += sql[i++];
420
+ result += ch;
421
+ i++;
422
+ previous = ch === '.' ? 'dot' : 'other';
187
423
  }
188
424
  return result;
189
425
  }
190
- /**
191
- * Comandos do SQL, sem literais, para a análise local (BEGIN/COMMIT/ROLLBACK em vários comandos).
192
- * Lê o texto inteiro pela leitura padrão (`standard_conforming_strings`); nunca é enviado.
193
- */
194
- export function sqlCommandText(sql) {
195
- return redactSqlLiterals(sql, false).replace(/\s+/g, ' ').trim().toLowerCase();
196
- }
197
426
  /**
198
427
  * `IN (?, ?, '?')` → `IN (?)`: itens separados por espaço e no máximo uma vírgula, vírgula final
199
428
  * opcional. Escrita sem ambiguidade: depois de cada item o espaço só tem um jeito de ser consumido.
@@ -203,16 +432,19 @@ export function sqlCommandText(sql) {
203
432
  * loop da aplicação a cada query (26 itens: 2,6 s).
204
433
  */
205
434
  const IN_LIST = /\bin\s*\(\s*(?:(?:\?|'\?')\s*(?:,\s*)?)+\)/gi;
206
- /** SQL normalizado inteiro (sem o corte de 200 caracteres do nome do span). */
207
- export function normalizeSqlFull(sql) {
208
- let s = redactSqlLiterals(sql);
209
- s = s.replace(/\$\d+/g, '?');
210
- s = s.replace(/\b\d+(?:\.\d+)?\b/g, '?');
211
- s = s.replace(IN_LIST, 'IN (?)');
435
+ /**
436
+ * SQL normalizado inteiro (sem o corte de 200 caracteres do nome do span): literais → `'?'`,
437
+ * números e parâmetros → `?`, `IN (...)` → `IN (?)`, comentários fora, espaços colapsados,
438
+ * minúsculas. `system` escolhe o dialeto (padrão PostgreSQL; desconhecido corta no primeiro
439
+ * delimitador que pode abrir literal).
440
+ */
441
+ export function normalizeSqlFull(sql, system) {
442
+ const s = scanSql(sql, { dialect: sqlDialect(system), mode: 'send' }).replace(IN_LIST, 'IN (?)');
212
443
  return s.replace(/\s+/g, ' ').trim().toLowerCase();
213
444
  }
214
- export function normalizeSql(sql) {
215
- const s = normalizeSqlFull(sql);
445
+ /** {@link normalizeSqlFull} com no máximo 200 caracteres (nome do span). */
446
+ export function normalizeSql(sql, system) {
447
+ const s = normalizeSqlFull(sql, system);
216
448
  return s.length > 200 ? s.slice(0, 200) : s;
217
449
  }
218
450
  /** `db.query.text` vai até este tamanho (o resto é cortado); o fingerprint usa o texto inteiro. */
@@ -221,10 +453,11 @@ export const MAX_DB_QUERY_TEXT = 2048;
221
453
  * Nome do span e atributos semconv de uma query: `db.query.text` (SQL normalizado, sem
222
454
  * literais), `db.query.fingerprint` (16 hex do SHA-256 do SQL normalizado **inteiro**, calculado
223
455
  * antes do corte de 200 caracteres do nome: duas queries com o mesmo prefixo não se fundem) e
224
- * `db.operation.name` (primeira palavra: SELECT, INSERT, BEGIN…).
456
+ * `db.operation.name` (primeira palavra: SELECT, INSERT, BEGIN…). O nome e o `db.query.text` saem
457
+ * do mesmo lexer, o do dialeto de `system`.
225
458
  */
226
- export function sqlSpanFields(sql) {
227
- const full = normalizeSqlFull(sql);
459
+ export function sqlSpanFields(sql, system) {
460
+ const full = normalizeSqlFull(sql, system);
228
461
  const operation = /^[a-z]+/.exec(full)?.[0]?.toUpperCase();
229
462
  return {
230
463
  name: full.length > 200 ? full.slice(0, 200) : full,
@@ -235,6 +468,77 @@ export function sqlSpanFields(sql) {
235
468
  },
236
469
  };
237
470
  }
471
+ /**
472
+ * Comandos do SQL (PostgreSQL), sem literais, comentários nem o conteúdo de identificadores entre
473
+ * aspas, para a análise local de transações. Lê o texto inteiro; `escapeReading` lê o literal comum
474
+ * como com `standard_conforming_strings = off`. Nunca sai do processo.
475
+ */
476
+ export function sqlCommandText(sql, escapeReading = false) {
477
+ return scanSql(sql, { dialect: 'postgresql', mode: 'analysis', escapeReading }).replace(/[ \t\n\v\f\r]+/g, ' ').trim().toLowerCase();
478
+ }
479
+ export function sqlTransactionCommand(statement) {
480
+ const s = statement.trim();
481
+ const chained = () => /\band\s+chain\b/.test(s) && !/\band\s+no\s+chain\b/.test(s);
482
+ if (/^(begin|start\s+transaction)\b/.test(s))
483
+ return 'begin';
484
+ if (/^(commit|end)\b/.test(s)) {
485
+ if (/^commit\s+prepared\b/.test(s))
486
+ return null;
487
+ return chained() ? 'chain' : 'commit';
488
+ }
489
+ if (/^(rollback|abort)\b/.test(s)) {
490
+ if (/^rollback(\s+(work|transaction))?\s+(to|prepared)\b/.test(s))
491
+ return null;
492
+ return chained() ? 'chain' : 'rollback';
493
+ }
494
+ if (/^prepare\s+transaction\b/.test(s))
495
+ return 'prepare';
496
+ return null;
497
+ }
498
+ /** Sem nenhuma destas palavras não há comando de transação: a análise nem roda (O1). */
499
+ const TRANSACTION_WORDS = /begin|start|commit|end|rollback|abort|prepare/i;
500
+ const NO_TRANSACTION = { count: 1, transaction: [], closes: false, ends: false, startsWithBegin: false };
501
+ /**
502
+ * Comandos de transação do texto. Com barra invertida no texto (só ela faz as leituras divergirem),
503
+ * lê pelas duas regras de `standard_conforming_strings`: o valor da sessão pode mudar por um `SET`
504
+ * ainda em voo, ou no próprio texto. `closes`/`ends` valem se qualquer leitura encerra: é o lado
505
+ * seguro para quem decide se outra query ainda roda dentro da transação. O valor conhecido da
506
+ * sessão só escolhe a leitura principal (a do servidor).
507
+ */
508
+ export function analyzeSqlCommands(sql, standardConformingStrings) {
509
+ if (!TRANSACTION_WORDS.test(sql))
510
+ return NO_TRANSACTION;
511
+ const changesSetting = /standard_conforming_strings/i.test(sql);
512
+ const readings = sql.includes('\\') ? [false, true] : [false];
513
+ let primary = null;
514
+ let closes = false;
515
+ let ends = false;
516
+ for (const escapeReading of readings) {
517
+ const statements = sqlCommandText(sql, escapeReading).split(';').filter((statement) => statement.trim());
518
+ const transaction = [];
519
+ for (const statement of statements) {
520
+ const command = sqlTransactionCommand(statement);
521
+ if (!command)
522
+ continue;
523
+ transaction.push(command);
524
+ if (command !== 'begin')
525
+ closes = true;
526
+ if (command === 'commit' || command === 'rollback' || command === 'prepare')
527
+ ends = true;
528
+ }
529
+ // A leitura do servidor (`off` só quando ele disse) é a principal; desconhecido = padrão.
530
+ const isPrimary = escapeReading === (standardConformingStrings === 'off' && !changesSetting);
531
+ if (isPrimary || !primary)
532
+ primary = { count: statements.length, transaction, first: statements.length > 0 ? sqlTransactionCommand(statements[0]) : null };
533
+ }
534
+ return {
535
+ count: primary.count,
536
+ transaction: primary.transaction,
537
+ closes,
538
+ ends,
539
+ startsWithBegin: primary.first === 'begin',
540
+ };
541
+ }
238
542
  const LOCK_OUTCOMES = {
239
543
  '40P01': 'deadlock',
240
544
  '55P03': 'lock_not_available',
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,GAAG,gEAAgE,CAAC;AACjF,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAClC,MAAM,MAAM,GAAG,OAAO,CAAC;AAEvB;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgC;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC;IACvB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3C,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,GAAG,CAAC;QAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IACtC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAQ;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5F,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC;AAChE,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAAC,GAAQ;IACxC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACvH,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACpH,CAAC;AAUD,uHAAuH;AACvH,MAAM,UAAU,UAAU,CAAC,MAAsB;IAC/C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IACvF,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IAC3D,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC7D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,GAAG,kDAAkD,CAAC;AACtE;;;;;GAKG;AACH,MAAM,UAAU,GAAG,0CAA0C,CAAC;AAC9D,MAAM,gBAAgB,GAAG,2CAA2C,CAAC;AACrE,MAAM,KAAK,GAAG,WAAW,CAAC;AAC1B,0EAA0E;AAC1E,MAAM,cAAc,GAAG,WAAW,CAAC;AACnC;;;;GAIG;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAE5G,SAAS,MAAM,CAAC,OAAe,EAAE,IAAY,EAAE,EAAU;IACvD,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,iGAAiG;AACjG,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC;AAChI,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,KAAa;IAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACvD,kFAAkF;QAClF,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACjJ,MAAM;IACR,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2GAA2G;AAC3G,SAAS,cAAc,CAAC,GAAW,EAAE,KAAa,EAAE,IAAY;IAC9D,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9E,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,yEAAyE;AACzE,SAAS,YAAY,CAAC,GAAW,EAAE,KAAa;IAC9C,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;IAC5D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,qGAAqG;AACrG,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,GAAW,EAAE,KAAa;IACnD,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAClB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACrD,IAAI,IAAI,KAAK,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC7B,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,EAAE,CAAC;YAC/E,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,IAAI,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACtE,MAAM;IACR,CAAC;IACD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,CAAC;AAED,4GAA4G;AAC5G,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAelD;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,OAAO,CAAC,GAAW,EAAE,OAAoB;IAChD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,KAAK,YAAY,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,KAAK,OAAO,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC;IACpC,MAAM,KAAK,GAAG,OAAO,KAAK,OAAO,CAAC;IAClC,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC;IAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,6FAA6F;IAC7F,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,mGAAmG;IACnG,IAAI,QAAQ,GAA6B,OAAO,CAAC;IACjD,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAEtD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAAC,GAAG,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC9J,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,GAAG,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;QACtE,CAAC;QAED,eAAe;QACf,uGAAuG;QACvG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,EAAE,CAAC;YAC5G,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YAAC,MAAM,IAAI,GAAG,CAAC;YAAC,SAAS;QACpE,CAAC;QACD,IAAI,KAAK,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACxB,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAAC,MAAM,IAAI,GAAG,CAAC;YAAC,SAAS;QAChE,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5B,gFAAgF;YAChF,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;gBAAC,GAAG,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC1D,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,KAAK,GAAG,CAAC,CAAC;gBAAC,CAAC,IAAI,CAAC,CAAC;gBACtB,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;oBAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;wBAAC,KAAK,EAAE,CAAC;wBAAC,CAAC,IAAI,CAAC,CAAC;oBAAC,CAAC;yBAC5C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;wBAAC,KAAK,EAAE,CAAC;wBAAC,CAAC,IAAI,CAAC,CAAC;oBAAC,CAAC;;wBACjD,CAAC,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,IAAI,GAAG,CAAC;YAAC,SAAS;QAC1B,CAAC;QAED,+BAA+B;QAC/B,IAAI,EAAE,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBACxB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAAC,GAAG,IAAI,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACrE,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC;oBAAC,MAAM;gBAAC,CAAC;YACnD,CAAC;YACD,0FAA0F;YAC1F,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBAAC,GAAG,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YACtC,8EAA8E;YAC9E,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1C,CAAC,GAAG,GAAG,CAAC;YAAC,QAAQ,GAAG,MAAM,CAAC;YAAC,YAAY,GAAG,EAAE,CAAC;YAAC,SAAS;QAC1D,CAAC;QACD,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;YAChE,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACrC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBACxB,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAAC,GAAG,IAAI,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACtF,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC;oBAAC,MAAM;gBAAC,CAAC;YACrD,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,GAAG,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAAC,CAAC,GAAG,GAAG,CAAC;YAAC,QAAQ,GAAG,MAAM,CAAC;YAAC,YAAY,GAAG,EAAE,CAAC;YAAC,SAAS;QACvF,CAAC;QAED,qBAAqB;QACrB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,8FAA8F;YAC9F,oGAAoG;YACpG,MAAM,YAAY,GAAG,QAAQ,IAAI,aAAa,IAAI,aAAa,KAAK,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,KAAK,IAAI,YAAY,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;YACtF,gGAAgG;YAChG,4FAA4F;YAC5F,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC1B,SAAS,GAAG,IAAI,CAAC;oBACjB,IAAI,OAAO,EAAE,CAAC;wBAAC,GAAG,IAAI,CAAC,CAAC;wBAAC,SAAS;oBAAC,CAAC;gBACtC,CAAC;gBACD,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;oBAAC,GAAG,IAAI,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAClE,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC;oBAAC,MAAM;gBAAC,CAAC;YAC5C,CAAC;YACD,6FAA6F;YAC7F,8FAA8F;YAC9F,MAAM,cAAc,GAAY,KAAK,KAAK,GAAG,IAAI,MAAM,IAAI,CAAC,SAAS;mBAChE,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YACrI,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACrD,CAAC,GAAG,GAAG,CAAC;YACR,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAAC,YAAY,GAAG,EAAE,CAAC;YAChE,6FAA6F;YAC7F,4FAA4F;YAC5F,4FAA4F;YAC5F,IAAI,SAAS,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC;gBAAC,GAAG,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAChF,SAAS;QACX,CAAC;QAED,uFAAuF;QACvF,IAAI,MAAM,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBAAC,GAAG,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACnC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAClD,CAAC,GAAG,GAAG,CAAC;gBAAC,QAAQ,GAAG,OAAO,CAAC;gBAAC,SAAS;YACxC,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,UAAU,CAAC;YACrB,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC;YACvB,aAAa,GAAG,CAAC,CAAC;YAClB,aAAa,GAAG,QAAQ,IAAI,CAAC,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,CAAC,CAAC;YACvE,QAAQ,GAAG,MAAM,CAAC;YAAC,YAAY,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YAC3D,SAAS;QACX,CAAC;QAED,mGAAmG;QACnG,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7I,IAAI,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC;YAAC,QAAQ,GAAG,OAAO,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,EAAE,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;YACnG,MAAM,IAAI,KAAK,CAAC;YAAC,QAAQ,GAAG,OAAO,CAAC;YAAC,SAAS;QAChD,CAAC;QAED,iGAAiG;QACjG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAC,MAAM,IAAI,GAAG,CAAC;YAAC,QAAQ,GAAG,OAAO,CAAC;YAAC,SAAS;QACrE,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;QACb,CAAC,EAAE,CAAC;QACJ,QAAQ,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG,8CAA8C,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAsB;IAClE,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjG,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACrD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,MAAsB;IAC9D,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAsB;IAC/D,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3D,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QACnD,UAAU,EAAE;YACV,eAAe,EAAE,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI;YAC1F,sBAAsB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACpF,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,aAAa,GAAG,KAAK;IAC/D,OAAO,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACvI,CAAC;AAcD,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnF,IAAI,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7D,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxC,CAAC;IACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,IAAI,qDAAqD,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/E,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IAC1C,CAAC;IACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAgBD,wFAAwF;AACxF,MAAM,iBAAiB,GAAG,gDAAgD,CAAC;AAC3E,MAAM,cAAc,GAAuB,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;AAE7H;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,yBAAwC;IACtF,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,cAAc,CAAC;IACxD,MAAM,cAAc,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAc,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzE,IAAI,OAAO,GAAwG,IAAI,CAAC;IACxH,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,KAAK,MAAM,aAAa,IAAI,QAAQ,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACzG,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,IAAI,OAAO,KAAK,OAAO;gBAAE,MAAM,GAAG,IAAI,CAAC;YACvC,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,SAAS;gBAAE,IAAI,GAAG,IAAI,CAAC;QAC3F,CAAC;QACD,0FAA0F;QAC1F,MAAM,SAAS,GAAG,aAAa,KAAK,CAAC,yBAAyB,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7F,IAAI,SAAS,IAAI,CAAC,OAAO;YAAE,OAAO,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9J,CAAC;IACD,OAAO;QACL,KAAK,EAAE,OAAQ,CAAC,KAAK;QACrB,WAAW,EAAE,OAAQ,CAAC,WAAW;QACjC,MAAM;QACN,IAAI;QACJ,eAAe,EAAE,OAAQ,CAAC,KAAK,KAAK,OAAO;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAA2B;IAC5C,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,oBAAoB;IAC7B,OAAO,EAAE,uBAAuB;IAChC,OAAO,EAAE,gBAAgB;CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAE,KAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3E,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACzH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAsD,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QACnH,IAAI,GAAG,CAAC,KAAK;YAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,GAA4C,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACjD,CAAC"}