diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1ab760f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,56 @@ +# Lo que nunca debe entrar al contexto de construcción. +# Cada línea aquí es menos peso, menos invalidación de caché y menos riesgo de +# hornear un secreto o la base de datos de alguien dentro de la imagen. + +# --- dependencias y salidas: se reconstruyen dentro de la imagen --- +node_modules +.next +out +build +dist +*.tsbuildinfo +next-env.d.ts + +# --- control de versiones --- +.git +.gitignore +.gitattributes +.github + +# --- base de datos: JAMÁS dentro de la imagen --- +# La base vive en el volumen /app/data. Copiar la local metería datos de +# desarrollo en producción y, peor, los volvería el punto de partida. +data +*.db +*.db-journal +*.sqlite +*.sqlite3 + +# --- entorno: los secretos se pasan al contenedor, no se hornean --- +.env +.env.* +!.env.example + +# --- documentación y notas de trabajo --- +# No hacen falta dentro de la imagen; DESPLIEGUE.md se lee en el repositorio. +docs +*.md + +# --- editor y sistema operativo --- +.vscode +.idea +.claude +*.swp +*.swo +.DS_Store +Thumbs.db +desktop.ini + +# --- el propio empaquetado --- +Dockerfile +.dockerignore +docker-compose.yml +docker-compose.*.yml + +# nota: docker-entrypoint.sh NO va aquí. El Dockerfile lo necesita en el +# contexto para copiarlo al contenedor. diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ee5067a --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +# Base de datos (SQLite en volumen) +DATABASE_URL="file:../data/fspm.db" + +# Secreto de sesión del panel — cambiar en cada despliegue +AUTH_SECRET="cambia-esto-por-un-secreto-largo-y-aleatorio" + +# URL pública canónica (SEO, sitemap, Open Graph) +NEXT_PUBLIC_SITE_URL="https://fspm-demo.urieljareth.org" + +# WhatsApp comercial en formato internacional sin signos +NEXT_PUBLIC_WHATSAPP="525540348395" + +# Acceso rapido de demostracion en /admin/login (entrar de un clic como cualquier perfil). +# Ponlo en "false" para apagarlo en produccion. +DEMO_ACCESO_RAPIDO="true" diff --git a/.gitignore b/.gitignore index 6c8e375..e21ea53 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ node_modules/ *.db-journal .env .env.local +.env.coolify +tests/reporte/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ec2546f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,183 @@ +# check=skip=SecretsUsedInArgOrEnv + +# La directiva de arriba tiene que ser la primera línea del archivo. Silencia la +# advertencia de BuildKit por el AUTH_SECRET de la etapa de construcción, que es +# un relleno para que `next build` no falle: no llega a la imagen final ni se +# usa en ejecución. Sin esto, cada construcción sale con una advertencia y se +# acaba aprendiendo a ignorar también las advertencias de verdad. + +# ============================================================================= +# FSPM — imagen de producción +# +# Tres etapas sobre node:22-alpine, aprovechando output: "standalone" de +# next.config.ts. La idea de cada etapa: +# +# deps instala las dependencias en su propia capa, así un cambio de código +# no vuelve a bajar node_modules. +# build genera el cliente de Prisma, hornea una base de demostración y +# compila Next. +# runner imagen mínima que solo sabe arrancar el servidor, con usuario no +# root y la base de datos en un volumen. +# +# OJO CON LAS VARIABLES NEXT_PUBLIC_* +# Next las sustituye literalmente durante `next build`, no las lee al arrancar. +# Por eso NEXT_PUBLIC_SITE_URL y NEXT_PUBLIC_WHATSAPP van como ARG de +# construcción: cambiar el dominio exige reconstruir la imagen, no basta con +# editar el entorno del contenedor. Está explicado en docs/DESPLIEGUE.md. +# ============================================================================= + + +# --- etapa 1: dependencias ----------------------------------------------------- +FROM node:22-alpine AS deps + +# libc6-compat y openssl: Prisma los necesita en Alpine para sus motores. +RUN apk add --no-cache libc6-compat openssl + +WORKDIR /app + +# El esquema entra antes de npm ci porque el postinstall de @prisma/client +# intenta generar el cliente y sin esquema deja una advertencia. +COPY package.json package-lock.json ./ +COPY prisma/schema.prisma ./prisma/schema.prisma + +# Aquí NO se define NODE_ENV=production: hacen falta las dependencias de +# desarrollo (prisma, tsx, typescript, tailwind) para construir y para sembrar. +RUN npm ci + +# CLI de Prisma aislada, con sus dependencias propias resueltas en su propio +# árbol. El punto de entrada del contenedor la necesita para aplicar el esquema +# al arrancar, y copiar paquetes suelto por suelto no funciona: la CLI arrastra +# dependencias transitivas (effect, entre otras) que no son evidentes. +# La versión se lee de package.json, así que no puede desincronizarse. +# +# Después de instalarla se le quitan dos cosas que no va a usar nunca: los +# mapas de código fuente y el motor de consultas. Esta CLI solo ejecuta +# `db push`, que usa el motor de esquema; el motor de consultas que la +# aplicación necesita es el que viene dentro de la salida standalone. Son unos +# 40 MB menos en la imagen final. +RUN npm install --no-save --no-audit --no-fund --prefix /prisma-cli \ + "prisma@$(node -p "require('/app/package.json').devDependencies.prisma")" \ + && find /prisma-cli/node_modules -type f -name "*.map" -delete \ + && rm -f /prisma-cli/node_modules/@prisma/engines/libquery_engine-*.so.node + + +# --- etapa 2: construcción ----------------------------------------------------- +FROM node:22-alpine AS build + +RUN apk add --no-cache libc6-compat openssl + +WORKDIR /app + +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Valores por omisión iguales a .env.example: si nadie pasa --build-arg, la +# imagen queda coherente en vez de quedar con la cadena vacía, que rompería +# `new URL(SITIO_URL)` en el layout raíz. +ARG NEXT_PUBLIC_SITE_URL="https://fspm-demo.urieljareth.org" +ARG NEXT_PUBLIC_WHATSAPP="525540348395" +ENV NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL} +ENV NEXT_PUBLIC_WHATSAPP=${NEXT_PUBLIC_WHATSAPP} + +ENV NEXT_TELEMETRY_DISABLED=1 +ENV NODE_ENV=production + +# `next build` y `prisma generate` exigen que DATABASE_URL exista, aunque no se +# conecten a la base real. Este valor es solo de compilación: apunta a la base +# de demostración que se hornea aquí mismo y nunca se usa en ejecución. +ENV DATABASE_URL="file:/semilla/fspm.db" +# Igual con el secreto de sesión: existe para que el build no falle. El +# contenedor recibe el suyo por entorno. +ENV AUTH_SECRET="secreto-de-compilacion-sin-valor-en-ejecucion" + +RUN npx prisma generate + +# --- base de demostración horneada en la imagen --- +# +# El seed es DESTRUCTIVO: `prisma/seed.ts` hace deleteMany() de todas las tablas +# antes de reconstruir. Ejecutarlo dentro del contenedor de producción borraría +# los leads capturados en cada reinicio. Por eso se ejecuta aquí, una sola vez, +# contra una base que queda dentro de la imagen; el contenedor solo la copia al +# volumen cuando el volumen está vacío. Ese es el motivo real por el que `tsx`, +# que es dependencia de desarrollo, nunca se instala en la imagen final. +RUN mkdir -p /semilla \ + && npx prisma db push --skip-generate \ + && if [ -f prisma/seed.ts ]; then \ + npx tsx prisma/seed.ts; \ + else \ + echo "AVISO: no existe prisma/seed.ts. La imagen queda con el esquema pero sin datos de demostración."; \ + fi + +RUN npm run build + + +# --- etapa 3: ejecución -------------------------------------------------------- +FROM node:22-alpine AS runner + +# openssl y libc6-compat también aquí: el cliente de Prisma los carga en +# ejecución, no solo al construir. +RUN apk add --no-cache libc6-compat openssl + +WORKDIR /app + +ENV NODE_ENV=production +ENV HOSTNAME=0.0.0.0 +ENV PORT=3000 +ENV NEXT_TELEMETRY_DISABLED=1 +# El aviso de "hay una versión nueva de Prisma" sale en cada arranque y solo +# entrena a nadie a leer los registros. La versión se actualiza cuando el +# proyecto lo decida, no cuando el contenedor lo sugiera. +ENV PRISMA_HIDE_UPDATE_MESSAGE=true + +# Ruta absoluta a propósito. Una relativa como "file:../data/fspm.db" se +# resuelve contra la carpeta del esquema y es justo el tipo de detalle que +# funciona en local y falla en el contenedor. +ENV DATABASE_URL="file:/app/data/fspm.db" + +RUN addgroup --system --gid 1001 nodejs \ + && adduser --system --uid 1001 --ingroup nodejs nextjs + +# CLI de Prisma, en su propio árbol para que el punto de entrada pueda aplicar +# el esquema al arrancar. Va en /app/prisma-cli, aparte del node_modules de la +# aplicación: así no puede pisar el @prisma/client generado que trae la salida +# standalone, que es el que la aplicación usa en ejecución. +COPY --from=deps /prisma-cli/node_modules ./prisma-cli/node_modules + +# El esquema tiene que estar presente en ejecución: `prisma db push` lo lee. +COPY --from=build /app/prisma/schema.prisma ./prisma/schema.prisma + +# Base de demostración horneada. Solo se copia al volumen si el volumen no +# tiene una base todavía. +COPY --from=build /semilla/fspm.db ./semilla/fspm.db + +# Salida de Next. El standalone va al final para que su @prisma/client, que es +# el que la aplicación usa, gane sobre cualquier otro. +COPY --from=build /app/public ./public +COPY --from=build /app/.next/standalone ./ +COPY --from=build /app/.next/static ./.next/static + +COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +# El directorio de datos nace con dueño nextjs: si el volumen se crea vacío, +# Docker hereda estos permisos y el proceso no root puede escribir la base. +RUN mkdir -p /app/data \ + && chown -R nextjs:nodejs /app/data /app/semilla /app/.next + +USER nextjs + +# Aquí vive el SQLite y TIENE que sobrevivir a los redespliegues. Si no se +# monta, cada nueva versión de la imagen empieza con la base de demostración y +# los leads capturados se pierden. Está explicado en docs/DESPLIEGUE.md. +VOLUME ["/app/data"] + +EXPOSE 3000 + +# La sonda toca /api/salud, que a su vez consulta la base: así un volumen no +# escribible se reporta como contenedor enfermo en vez de pasar por sano. +# --start-period cubre el `prisma db push` del arranque más el boot de Next. +HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \ + CMD wget --quiet --tries=1 --spider "http://127.0.0.1:${PORT}/api/salud" || exit 1 + +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["node", "server.js"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..6786d40 --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# FSPM — sitio comercial y micro CRM + +Demostración construida por **Consultoría E3** para Fire Service Plus México. +Sitio público orientado a venta consultiva, con un CRM interno que registra cada +envío de formulario y de widget de WhatsApp como oportunidad, con su atribución +de campaña. + +No es un maquetado: los formularios escriben en base de datos, el panel lee de +ella, y las reglas de asignación reparten los leads entre vendedores. + +## De dónde salió el contenido + +El sitio implementa las recomendaciones de una auditoría de marca y mercado +previa. Los hallazgos que dirigieron el diseño: + +| Hallazgo de la auditoría | Cómo se resuelve aquí | +|---|---| +| Propuesta demasiado amplia, ocho categorías sin rutas | Inicio con tres rutas —industria, riesgo y cumplimiento— y cinco páginas por segmento prioritario | +| El visitante debe inferir qué solución le toca | Clasificador de riesgo en el héroe: elige operación y clases de fuego, y el sitio lo enruta | +| Claims sin condiciones ni evidencia por modelo | Aislados en `claimsPorVerificar` y presentados como compromiso de documentación, nunca como característica | +| Sin meta description ni Open Graph | Metadatos por página, sitemap derivado de los datos, JSON-LD y tarjeta social generada | +| Conversión poco consultiva | El formulario pide lo que un ingeniero necesita para cotizar, no "solicita información" | +| Sin forma de medir efectividad comercial | Atribución de primer toque que sobrevive a la navegación, y analítica por campaña en el panel | + +Los datos de producto provienen de la extracción del sitio público de FSPM. Lo +que la fuente no sostiene está marcado como pendiente de verificar; nada se +inventó para rellenar. + +## Stack + +Next.js 15 App Router · React 19 · TypeScript estricto · Tailwind CSS v4 · +Prisma 6 + SQLite · sesiones propias con `jose` · Playwright para pruebas. +Sin librería de gráficas: el tablero dibuja SVG a mano. + +## Arrancar en local + +```bash +npm install +cp .env.example .env # ajusta AUTH_SECRET +npx prisma db push +npm run db:seed # datos de demostración +npm run dev +``` + +Sitio en `http://localhost:3000`. El panel en `/admin/login` — **no está +enlazado desde el sitio público**, es intencional. + +Las credenciales del seed se imprimen al final de `npm run db:seed`. En la +pantalla de acceso hay además entrada rápida por perfil para la demostración, +que se apaga con `DEMO_ACCESO_RAPIDO=false`. + +## Estructura + +``` +src/app/(sitio)/ páginas públicas +src/app/admin/ panel comercial, con noindex y fuera del sitemap +src/app/api/leads/ captura: deduplica contacto, crea oportunidad, asigna +src/data/ catálogo, industrias, clases de fuego, datos de empresa +src/lib/crm/ dominio, sesiones, consultas, acciones, asignación +src/components/marca/RielClases.tsx el elemento firma del diseño +tests/ Playwright, incluidos dos proyectos WebKit +docs/CONTRATO.md sistema de diseño y reglas de contenido +docs/DESPLIEGUE.md variables, Docker y despliegue +``` + +## Cómo funciona la captura + +1. El visitante llega con parámetros de campaña. `src/lib/utm.ts` guarda el + **primer toque** y no lo sobreescribe. +2. Navega. Envía el formulario en una ficha de producto, ya sin parámetros en + la URL. +3. `POST /api/leads` deduplica el contacto por correo o teléfono normalizado, + crea una **oportunidad nueva** —un mismo contacto acumula varias— y guarda + la campaña del primer toque junto con el producto y la URL exactos. +4. Las reglas de asignación eligen vendedor; si ninguna coincide, se reparte por + turno entre los activos. +5. El widget de WhatsApp hace lo mismo **antes** de abrir la conversación, así + el lead existe aunque la persona nunca mande el mensaje. + +## Pruebas + +```bash +npm run test:e2e # todos los proyectos +npm run test:webkit # solo Safari e iOS +``` + +Cubren rutas y metadatos, responsividad de 320 a 1440 sin desborde horizontal, +el circuito de captura con atribución, el aislamiento entre roles del panel y +accesibilidad básica. + +## Alcance + +Los datos del panel son ficticios. Los logotipos de clientes se muestran sin +atribuirles testimonio ni resultado: la auditoría pide confirmar la relación +antes de usarlos comercialmente. La información normativa es de referencia y no +sustituye dictamen técnico ni jurídico. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c869526 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,63 @@ +# ============================================================================= +# Prueba local de la imagen de producción. +# +# docker compose up --build +# → http://localhost:3000 +# +# No es el archivo con el que se despliega en Coolify: allá la plataforma +# construye la imagen y administra el volumen. Esto sirve para comprobar, antes +# de subir, que la imagen arranca, que la base sobrevive a un reinicio y que la +# sonda de salud responde. Ver docs/DESPLIEGUE.md. +# ============================================================================= + +services: + web: + build: + context: . + dockerfile: Dockerfile + # Estas dos se hornean en el bundle durante `next build`: pasarlas solo + # como environment no tendría efecto en el sitio. + args: + NEXT_PUBLIC_SITE_URL: "http://localhost:3000" + NEXT_PUBLIC_WHATSAPP: "525540348395" + + image: fspm-web:local + container_name: fspm-web + + ports: + - "3000:3000" + + environment: + # Ruta absoluta dentro del contenedor. Debe caer dentro del volumen. + DATABASE_URL: "file:/app/data/fspm.db" + # Solo para la prueba local. En producción se genera uno nuevo: + # openssl rand -base64 48 + AUTH_SECRET: "secreto-de-prueba-local-cambialo-en-produccion-por-favor" + # Repetidas aquí para que el servidor las tenga; el bundle del navegador + # ya las trae horneadas desde build.args. + NEXT_PUBLIC_SITE_URL: "http://localhost:3000" + NEXT_PUBLIC_WHATSAPP: "525540348395" + # Acceso rápido de demostración en /admin/login. En un despliegue real + # que alguien vaya a ver, ponlo en "false". + DEMO_ACCESO_RAPIDO: "true" + + volumes: + # Volumen nombrado: es lo que hace que los leads capturados sobrevivan a + # `docker compose up --build`. Si esta línea se borra, cada + # reconstrucción empieza otra vez con la base de demostración. + - fspm-datos:/app/data + + restart: unless-stopped + + # La sonda del Dockerfile ya cubre esto; se repite aquí para que + # `docker compose ps` muestre el estado sin depender de la imagen. + healthcheck: + test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://127.0.0.1:3000/api/salud || exit 1"] + interval: 30s + timeout: 5s + start_period: 60s + retries: 3 + +volumes: + fspm-datos: + name: fspm-datos diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..9f72ffa --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,85 @@ +#!/bin/sh +# ============================================================================= +# Punto de entrada del contenedor de FSPM. +# +# Hace tres cosas antes de arrancar el servidor, en este orden: +# +# 1. Asegura que exista la base de datos en el volumen. Si el volumen viene +# vacío, copia la base de demostración que se horneó en la imagen durante +# la construcción. +# 2. Aplica el esquema con `prisma db push`. +# 3. Entrega el control al servidor de Next con `exec`, para que Next quede +# como PID 1 y reciba las señales de parada de Docker. +# +# CÓMO DETECTA QUE YA ESTÁ SEMBRADA +# +# Por la existencia del archivo de base de datos en el volumen ($BD). +# Si existe, no se toca su contenido: ni se copia la base de demostración +# encima, ni se ejecuta ningún seed. +# +# Y no puede duplicar el seed por una razón más fuerte que una comprobación: +# el seed no se ejecuta aquí. `prisma/seed.ts` es destructivo —borra todas las +# tablas antes de reconstruirlas— y `tsx`, que lo ejecuta, es dependencia de +# desarrollo y no está en esta imagen. La siembra ocurrió una única vez, en la +# etapa de construcción. Lo que hace este script es copiar un archivo. +# +# $MARCADOR es solo una traza legible con la fecha del primer arranque, para +# que quien opere el servidor pueda distinguir una base heredada de una nueva. +# No se usa como condición. +# ============================================================================= + +set -e + +DIR_DATOS="/app/data" +BD="${DIR_DATOS}/fspm.db" +MARCADOR="${DIR_DATOS}/.sembrado" +SEMILLA="/app/semilla/fspm.db" + +log() { + echo "[fspm] $1" +} + +# --- 1. base de datos en el volumen ------------------------------------------ + +if [ ! -d "$DIR_DATOS" ]; then + log "el directorio de datos no existe, se crea: ${DIR_DATOS}" + mkdir -p "$DIR_DATOS" +fi + +if [ ! -w "$DIR_DATOS" ]; then + log "ERROR: ${DIR_DATOS} no es escribible por el usuario $(id -un) (uid $(id -u))." + log " Si montaste una carpeta del anfitrión, dale permisos: chown -R 1001:1001 " + exit 1 +fi + +if [ -f "$BD" ]; then + log "ya existe ${BD}: su contenido no se toca." + if [ -f "$MARCADOR" ]; then + log "primer arranque de este volumen: $(cat "$MARCADOR")" + fi +elif [ -f "$SEMILLA" ]; then + log "volumen vacío: se copia la base de demostración horneada en la imagen." + cp "$SEMILLA" "$BD" + date -u '+%Y-%m-%dT%H:%M:%SZ' > "$MARCADOR" 2>/dev/null || true + log "listo. Los datos del panel son de demostración; los leads que capture el sitio se suman a esta base." +else + log "volumen vacío y la imagen no trae base de demostración: se creará vacía." + log "El panel no tendrá usuarios y no se podrá iniciar sesión en /admin/login." +fi + +# --- 2. esquema --------------------------------------------------------------- +# +# Idempotente: si el esquema del código y el de la base ya coinciden, no hace +# nada. A propósito NO se pasa --accept-data-loss: si una versión nueva exigiera +# eliminar una columna o una tabla con filas, se prefiere que el arranque falle +# y quede en los registros antes que borrar leads capturados en silencio. + +log "aplicando el esquema (prisma db push)" +node /app/prisma-cli/node_modules/prisma/build/index.js db push \ + --schema=/app/prisma/schema.prisma \ + --skip-generate + +# --- 3. servidor -------------------------------------------------------------- + +log "arrancando Next en ${HOSTNAME}:${PORT}" +exec "$@" diff --git a/docs/CONTRATO.md b/docs/CONTRATO.md new file mode 100644 index 0000000..1618a03 --- /dev/null +++ b/docs/CONTRATO.md @@ -0,0 +1,162 @@ +# Contrato del proyecto — léelo completo antes de escribir código + +Sitio + micro CRM para **FSPM (Fire Service Plus México)**, protección contra incendios. +Es una **demo comercial** de Consultoría E3: tiene que verse y funcionar como producción. + +Raíz: `H:\MegaSync\Proyectos\fspm\fspm-web` + +## Stack ya instalado — no cambies versiones, no agregues dependencias + +Next.js 15.5.4 (App Router) · React 19 · TypeScript estricto · Tailwind CSS **v4** +(sin `tailwind.config`, los tokens viven en `@theme` dentro de `src/app/globals.css`) · +Prisma 6.16 + SQLite · zod 4 · jose · bcryptjs. + +Si crees que necesitas una dependencia nueva, **no la instales**: resuélvelo con lo que hay +o dilo en tu reporte final. + +## Regla de propiedad de archivos — la más importante + +Trabajas en paralelo con otros agentes sobre el mismo árbol. **Solo puedes crear y editar +los archivos de tu lote.** Si necesitas cambiar un archivo ajeno, no lo toques: descríbelo +en tu reporte final y el orquestador lo integra. + +Archivos del orquestador, **de solo lectura para ti**: + +``` +src/app/globals.css src/app/layout.tsx +src/data/*.ts src/lib/db.ts +src/lib/utm.ts src/lib/crm/constantes.ts +src/lib/leads/esquema.ts src/components/marca/RielClases.tsx +src/components/site/Encabezado.tsx src/components/site/Pie.tsx +prisma/schema.prisma package.json next.config.ts .env +``` + +## Sistema de diseño — deriva todo de aquí, no improvises color ni tipografía + +Los tokens están en `src/app/globals.css` bajo `@theme`. Úsalos como clases de Tailwind +(`bg-ink`, `text-muted`, `border-rule`, `text-signal`) o como `var(--color-…)`. + +**Dos mundos, y el contraste entre ellos es la idea:** + +- **Oscuro = el riesgo y la operación.** `bg-ink` (#0C1116, acero-humo azulado), paneles + `bg-ink-2` / `bg-ink-3`, filetes `border-rule`. +- **Claro = la evidencia y el documento.** `bg-paper` (#EEF1F3, blanco de plano de + ingeniería — **no** es crema), texto `text-deep`. + +Alterna secciones entre los dos mundos. Es la traducción visual del diagnóstico del +estudio: convertir autoridad técnica en confianza comprable. + +**Señal:** `text-signal` / `bg-signal` = #DB042B, el rojo real de FSPM extraído de su CSS. +Es señal, no relleno: úsalo en el CTA, en el riel de clases y en acentos puntuales. +`text-ember` (#F2B705) es el amarillo del traje de bombero de su propia fotografía: +**solo para estados de riesgo, advertencia y atención**, nunca decorativo. + +**Tipografía**, ya cargada en el layout raíz: + +- `font-display` — Archivo 800/900. Encabezados. Versalitas y tracking cerrado. Es + rotulación de equipo industrial. +- `font-sans` — IBM Plex Sans. Cuerpo. +- `font-mono` — IBM Plex Mono. **La capa de datos**: etiquetas, especificaciones, folios, + cifras, códigos, UTMs. Todo dato numérico lleva `font-variant-numeric: tabular-nums` + (ya aplicado a `.font-mono` y a `table`). + +Radios casi rectos: `rounded-[3px]` / `rounded-[2px]`. Es una herramienta, no una app de consumo. + +**Utilidades ya escritas — reúsalas en vez de reinventar:** `.shell` `.shell-wide` +`.eyebrow` `.btn .btn-signal .btn-ghost .btn-deep .btn-sm` `.field .field-lite +.field-label .field-error` `.panel .panel-lite` `.spec .spec-cell .spec-key .spec-val` +`.hair .hair-lite` `.grid-bg .grid-bg-lite` `.hazard` `.badge .badge-signal .badge-ember +.badge-ok` `.link` `.skip` `.anim-rise` `.anim-ignite` `.reveal`. + +### Elemento firma: el riel de clases de fuego + +`src/components/marca/RielClases.tsx` — cinco celdas fijas `A B C D K`, se encienden solo +las que ese producto/solución/lead cubre. Aparece en el sitio **y** en el panel. Úsalo +siempre que haya clases de fuego; no dibujes otra variante. + +### Movimiento + +Contenido. Una secuencia orquestada en el héroe y revelados discretos al hacer scroll con +`.reveal` + IntersectionObserver. Nada de efectos dispersos: delatan trabajo automático. +`prefers-reduced-motion` ya está respetado globalmente. + +## Piso de calidad, no negociable + +- **Responsive real** desde 320px. Prueba mentalmente 320 / 768 / 1280 / 1920. +- **Compatibilidad WebKit (Safari e iOS).** Es requisito explícito del cliente: + usa `-webkit-backdrop-filter` junto a `backdrop-filter`, `-webkit-appearance: none` en + controles, `-webkit-overflow-scrolling: touch` en scroll horizontal, `-webkit-tap-highlight-color` + en elementos táctiles, y evita `gap` en `inline-flex` sin fallback. Nada de `100vh` a secas + en móvil: usa `100dvh` con `100vh` de respaldo. +- **Accesibilidad:** un solo `

` por página, jerarquía correcta, `aria-label` en + controles sin texto, foco visible (ya en `:focus-visible`), contraste suficiente, + navegación completa con teclado. +- Nada de texto dentro de imágenes. `next/image` con `width`/`height` o `fill` + `sizes`. +- Sin `any`. Sin `console.log` en el código final. `npx tsc --noEmit` debe pasar. +- Español de México, acentuación correcta, tono técnico y sereno. + +## Honestidad del contenido — regla dura del cliente + +El estudio de marca concluyó que los claims del sitio original (*"no caduca"*, +*"20 años de garantía"*, *"no requiere recarga"*) **no pueden presentarse como universales**. +`src/data/catalogo.ts` ya los aisló en `producto.claimsPorVerificar`. + +- **Nunca** presentes un claim de `claimsPorVerificar` como hecho. +- Muéstralos en un bloque aparte, honesto, del tipo "Qué documentamos antes de cotizar". + Eso **es** el argumento de venta: la competencia promete, FSPM documenta. +- No inventes cifras, certificados, precios, casos de éxito ni testimonios. Si un dato no + está en `src/data/`, no existe. +- Los logotipos de clientes en `src/data/empresa.ts` se muestran **sin** atribuirles + testimonio ni resultado: el estudio pide confirmar la relación antes de usarlos como caso. +- Los casos de aplicación deben estar rotulados como ilustrativos. + +## Datos disponibles (solo lectura) + +- `src/data/catalogo.ts` — 8 categorías, 22 productos. `CATEGORIAS`, `PRODUCTOS`, + `getCategoria`, `getProducto`, `productosDeCategoria`. +- `src/data/industrias.ts` — los 5 segmentos prioritarios del estudio. `INDUSTRIAS`, `getIndustria`. +- `src/data/clases-fuego.ts` — `CLASES`, `CLASES_INFO`, `parseClases`, `serializeClases`. +- `src/data/empresa.ts` — `EMPRESA`, `NAV_PRINCIPAL`, `NAV_PIE`, `CLIENTES`, `PRENSA`, + `NORMAS`, `SITIO_URL`, `WHATSAPP`, `AVISO_DEMO`. +- `src/lib/crm/constantes.ts` — dominio del CRM. SQLite no guarda enums: **todo estado sale de aquí.** +- `src/lib/leads/esquema.ts` — contrato de captura de leads y helpers de normalización. +- `src/lib/utm.ts` — `capturarAtribucion()`, para clientes. + +Assets en `public/media/`: `marca/`, `producto/`, `clientes/`, `prensa/`, `iconos/`, `foto/`. +**Usa solo archivos que existan**: verifícalo con `ls public/media/`. + +## Rutas del proyecto + +Público, dentro del grupo `src/app/(sitio)/`: +`/` · `/soluciones` · `/soluciones/[industria]` · `/catalogo` · `/catalogo/[categoria]` · +`/producto/[slug]` · `/cumplimiento-nom-002` · `/evidencia` · `/casos` · +`/preguntas-frecuentes` · `/nosotros` · `/contacto` · `/aviso-de-privacidad` + +Panel, en `src/app/admin/`: +`/admin/login` · `/admin` · `/admin/oportunidades` · `/admin/oportunidades/[id]` · +`/admin/contactos` · `/admin/contactos/[id]` · `/admin/pedidos` · `/admin/analitica` · +`/admin/equipo` · `/admin/reglas` + +**El panel no se enlaza desde ninguna parte del sitio público.** Sin enlace en el +encabezado, en el pie, ni en el sitemap. Se llega escribiendo la URL. Además va con +`robots: { index: false, follow: false }` en su metadata. + +## Comandos + +``` +npm run dev # servidor de desarrollo +npx tsc --noEmit # verificación de tipos: tiene que pasar limpio +npx prisma db push # aplicar el esquema +npm run db:seed # sembrar datos de demo +``` + +No corras `npm install`. No corras `git commit`. No borres archivos ajenos. + +## Tu reporte final + +Termina con, en este orden: + +1. Archivos creados o modificados, con una línea de qué hace cada uno. +2. Resultado literal de `npx tsc --noEmit` sobre tus archivos. +3. Lo que dejaste pendiente o lo que necesitas de otro lote. +4. Cualquier dato del sitio original que te pareció inconsistente o sin sustento. diff --git a/docs/TAREA-CATALOGO.md b/docs/TAREA-CATALOGO.md new file mode 100644 index 0000000..4711f99 --- /dev/null +++ b/docs/TAREA-CATALOGO.md @@ -0,0 +1,145 @@ +# Tarea: construir el catálogo tipado de FSPM + +Eres el agente de datos del proyecto. Tu única entrega es **un archivo**: +`src/data/catalogo.ts` en este repo (`H:\MegaSync\Proyectos\fspm\fspm-web`). + +No toques ningún otro archivo. No instales dependencias. No corras `npm`. + +## Fuente de verdad (solo lectura) + +Base de conocimiento del sitio real, escrapeada: +`H:\MegaSync\Proyectos\Web Clonner Scrapper toolkit\proyectos\fspm.com.mx\conocimiento\` + +Lee **estos archivos en español** (ignora los `en-*` y los que llevan sufijo hash como `-8e5a3550`): + +- `index.md` — las 8 categorías y cómo se presentan +- `extintores-portatiles.md` +- `extintores-fijos.md` +- `productos-moviles.md` +- `rociadores.md` +- `agentes-extinguidores.md` +- `firemiks.md` +- `robots.md` +- `proteccion-civil.md` +- `normas-y-certificaciones.md` +- `preguntas-frecuentes.md` + +## Imágenes disponibles + +Ya están copiadas en `public/media/producto/` y `public/media/iconos/`. Lista real de archivos — +usa **exactamente** estos nombres, con ruta `/media/producto/`: + +``` +firemiks.png +FSPM_espumas_contra_incendios_flameAde.png +fspm_extintores_facil_uso_en_mexico.png +fspm_extintores_fijos_enforcer_10.png +fspm_extintores_fijos_esfera_sin_detector_de_humo.png +fspm_extintores_garantia_en_mexico.png +fspm_extintores_largo_alcance_en_mexico.png +fspm_extintores_moviles_carretilla_100litros.png +fspm_extintores_moviles_carretilla_30litros_acero_inoxidable.png +fspm_extintores_moviles_carretilla_50litros_acero_inoxidable.png +fspm_extintores_moviles_carretilla_70litros_acero_inoxidable.png +fspm_extintores_moviles_enforcer_60.png +fspm_extintores_no_caducan_en_mexico.png +fspm_extintores_portatiles_en_mexico_enforcer_12litros.png +fspm_extintores_portatiles_en_mexico_enforcer_1litro.png +fspm_extintores_portatiles_en_mexico_enforcer_2litros.png +fspm_extintores_portatiles_en_mexico_enforcer_4litros.png +fspm_extintores_portatiles_en_mexico_enforcer_6litros.png +fspm_extintores_portatiles_en_mexico_enforcer_9litros.png +fspm_extintores_rociadores_enforcer_esfera.png +fspm_extintores_rociadores_enforcer_robot.png +fspm_extintores_rociadores_enforcer_robot_componente_de_agua.png +fspm_extintores_rociadores_enforcer_robot_panel_de_control.png +fspm_extintores_sin_recarga_en_mexico.png +FSPM-trakAde-supresion-de-polvos.png +FSPM-vaporAde.png +receptor-de-alertamiento.jpg +``` + +Iconos de aplicación en `/media/iconos/`: `icono-agricultura.png`, `icono-auditorios.png`, +`icono-bosques.png`, `icono-central-bomberos.png`, `icono-exterior.png`, `icono-gasolineras.png`, +`icono-hogar.png`, `icono-industria.png`, `icono-museos.png`, `icono-no-toxico.png`, +`icono-oficina.png`, `iconos-aeropuertos.png`, `iconos-minas.png`. + +Si un producto no tiene imagen propia, reutiliza la más cercana de su categoría. Nunca inventes +un nombre de archivo que no esté en la lista. + +## Contrato de tipos — respétalo al carácter + +```ts +export type ClaseFuego = "A" | "B" | "C" | "D" | "K"; + +export type Categoria = { + slug: string; // kebab-case, ej. "extintores-portatiles" + nombre: string; // ej. "Extintores portátiles" + tagline: string; // 1 línea: qué problema resuelve, orientado a comprador + descripcion: string; // 2-3 frases + imagen: string; // "/media/producto/..." + aplicaciones: string[]; + orden: number; +}; + +export type Producto = { + slug: string; + categoria: string; // debe existir en CATEGORIAS + nombre: string; + modelo: string | null; // ej. "Enforcer 12" + capacidad: string | null; // ej. "12 L" + agente: string | null; // ej. "FireAde 2000" + clases: ClaseFuego[]; // SOLO las clases que la fuente sostiene + alcance: string | null; + descarga: string | null; + imagen: string; + resumen: string; // 1-2 frases, orientado a venta, SIN claims sin sustento + caracteristicas: string[]; // bullets tomados de la fuente + aplicaciones: string[]; + claimsPorVerificar: string[]; // ver regla crítica abajo + orden: number; +}; + +export const CATEGORIAS: Categoria[] = [ ... ]; +export const PRODUCTOS: Producto[] = [ ... ]; + +// helpers que debes exportar también: +export function getCategoria(slug: string): Categoria | undefined +export function getProducto(slug: string): Producto | undefined +export function productosDeCategoria(slug: string): Producto[] +``` + +## REGLA CRÍTICA — honestidad de los datos + +El sitio original hace afirmaciones de alto riesgo comercial: *"no caduca"*, *"20 años de +garantía"*, *"no requiere recarga"*, *"extingue clases A, B, C, D y K"*. Una auditoría concluyó +que **no deben presentarse como universales sin condiciones y evidencia por modelo**. + +Por lo tanto: + +1. **Nunca** pongas uno de esos claims en `resumen` ni en `caracteristicas` como hecho. +2. Cada claim así va en `claimsPorVerificar`, redactado como lo que hay que documentar. + Ejemplo: `"Vida útil sin caducidad: requiere carta técnica del fabricante por número de modelo"`. +3. `clases` solo lleva las clases que la fuente realmente atribuye a **ese** modelo. Si la + fuente es ambigua, pon las que sí sostiene y anota la duda en `claimsPorVerificar`. +4. No inventes capacidades, alcances, tiempos de descarga, precios ni certificados. Si el dato + no está en la fuente, es `null` o se omite del arreglo. Es mejor `null` que un número inventado. + +## Cobertura esperada + +- Las **8 categorías** del sitio. +- Todos los modelos concretos que la fuente identifique. Del scrape se ven al menos: portátiles + Enforcer de 1, 2, 4, 6, 9 y 12 litros; móviles Enforcer 60 y carretillas de 30, 50, 70 y 100 L; + fijos Enforcer 10 y esfera; rociadores esfera y robot; agentes FireAde 2000, flameAde, vaporAde, + trakAde; FIREMIKS; robot cañón; y receptor de alertamiento en protección civil. + Confirma cada uno contra la fuente antes de escribirlo. + +## Salida + +- TypeScript válido y formateado, sin `any`, sin imports. +- Español de México en todo el contenido, con acentuación correcta. +- Al terminar, escribe al final del archivo un comentario de bloque con: + las categorías y el número de productos por categoría, y la lista de datos que no pudiste + confirmar en la fuente. + +Cuando acabes, di exactamente `CATALOGO LISTO` y un resumen de 3 líneas. diff --git a/docs/TAREA-QA.md b/docs/TAREA-QA.md new file mode 100644 index 0000000..6e0712b --- /dev/null +++ b/docs/TAREA-QA.md @@ -0,0 +1,119 @@ +# Tarea: pruebas de calidad del sitio y del panel FSPM + +Eres el agente de QA del proyecto. **No corriges código.** Tu trabajo es ejecutar +las pruebas, reproducir lo que falle, y entregar un reporte que el orquestador +pueda accionar sin volver a investigar desde cero. + +Repo: `H:\MegaSync\Proyectos\fspm\fspm-web` + +## Contexto + +Sitio comercial de FSPM (protección contra incendios) con un micro CRM interno. +Es una demostración para directivos: un error visible cuesta la venta del +servicio, así que la barra es alta. + +Lee `docs/CONTRATO.md` para conocer el sistema de diseño y las reglas de +contenido, y `README.md` para entender el circuito de captura. + +## Preparación — YA ESTÁ HECHA, no la repitas + +El artefacto de producción **ya está construido y corriendo en un contenedor**: + +- Imagen `fspm-web:demo`, contenedor `fspm-demo`, en `http://127.0.0.1:3100`. +- Base sembrada: 5 usuarios, 60 contactos, 95 oportunidades, 18 pedidos, 6 reglas. +- `curl http://127.0.0.1:3100/api/salud` responde `{"ok":true,...}`. + +Playwright está configurado con `reuseExistingServer: true` apuntando al 3100, +así que **usa ese contenedor y no arranques ningún servidor de desarrollo**. + +**No corras `npm run build` ni `npm run dev` en esta máquina.** El repositorio +vive dentro de una carpeta sincronizada a la nube y el cliente de +sincronización mueve archivos de `.next` a media compilación: el build falla +con `Cannot find module './NNNN.js'` aunque el código esté bien. Ya está +comprobado. Si necesitas reiniciar la aplicación, usa +`docker restart fspm-demo`. + +Verifica que el contenedor responde antes de empezar: + +```bash +docker ps --filter name=fspm-demo +curl -s http://127.0.0.1:3100/api/salud +``` + +## Ejecución + +```bash +npm run test:e2e +``` + +Cuatro proyectos: `escritorio-chromium`, `escritorio-webkit`, `movil-webkit`, +`movil-chico` (320px). **Los dos de WebKit son obligatorios**: es el motor de +Safari e iOS, donde más se rompe la responsividad, y el cliente lo pidió por +nombre. Un resultado que solo cubre Chromium no sirve. + +El servidor de pruebas lo arranca Playwright solo, en el puerto 3100. + +Las suites: + +- `tests/01-humo.spec.ts` — rutas, títulos, meta description, Open Graph, + canónicas, sitemap, robots, iconos, 404. +- `tests/02-responsivo.spec.ts` — desborde horizontal de 320 a 1440, menú + móvil, widget de WhatsApp, tabla comparativa. +- `tests/03-captura.spec.ts` — el circuito comercial: campaña → navegación → + formulario, y que la atribución de primer toque sobreviva. +- `tests/04-panel.spec.ts` — panel no expuesto, sesión obligatoria, y el + aislamiento entre administrador y vendedor. +- `tests/05-accesibilidad.spec.ts` — alt, etiquetas, jerarquía de encabezados, + foco, movimiento reducido. + +## Además de las pruebas automáticas: revisión visual + +Toma capturas y **míralas**. Las pruebas no detectan que algo se ve mal. + +```bash +npx playwright screenshot --viewport-size=1440,900 http://127.0.0.1:3100/ tests/reporte/inicio-1440.png +npx playwright screenshot --viewport-size=375,900 --full-page http://127.0.0.1:3100/ tests/reporte/inicio-375.png +``` + +Hazlo para `/`, `/catalogo`, una ficha de producto, `/soluciones/industria-energia` +y `/admin` tras entrar con el acceso rápido. Revisa en cada una: + +- Texto encima de imagen: ¿se lee de verdad, o el degradado no alcanza? +- Espaciado entre secciones: ¿hay saltos incoherentes o secciones pegadas? + Es la falla típica cuando varios agentes escriben CSS en paralelo. +- ¿Alguna sección se ve como plantilla genérica frente al resto? +- ¿El riel de clases de fuego aparece consistente en sitio y panel? +- ¿Hay estados vacíos que se vean como errores? +- Contraste: ¿algún texto gris sobre fondo oscuro que no se alcance a leer? + +## Sondeos manuales que valen la pena + +1. **Doble envío.** Manda el formulario dos veces con el mismo correo y + confirma en `/admin/contactos` que hay **un contacto con dos oportunidades**, + no dos contactos. Es un requisito explícito del cliente. +2. **Fuga entre roles.** Entra como vendedor, copia el id de una oportunidad + que **no** sea suya (obtenlo entrando como administrador en otra pestaña) y + pide `/admin/oportunidades/` directo. Debe negarlo. Si la muestra, es + una falla de seguridad y va primero en tu reporte. +3. **Widget sin JavaScript de terceros.** Confirma que el enlace de WhatsApp + que devuelve la API lleva el prefijo `[DEMO]` y el folio. +4. **Panel en móvil real.** 375px de ancho: ¿las tablas se pueden usar o hay + que hacer zoom? + +## Reporte final — lo que necesito de ti + +Nada de "todo pasó" ni de listas de pruebas verdes. Quiero: + +1. **Resumen**: cuántas pruebas por proyecto, cuántas fallaron. Cifras reales, + pegadas de la salida. +2. **Fallas, ordenadas por gravedad.** Para cada una: + - qué se rompe, en qué ruta y en qué proyecto/ancho; + - el error literal de Playwright; + - el archivo y la línea donde está la causa, si lo pudiste localizar; + - si es una falla real del producto o una prueba mal escrita — dilo con + claridad, no todo lo que falla es un bug. +3. **Hallazgos visuales** de las capturas, con la ruta y el ancho. +4. **Lo que no pudiste probar** y por qué. + +Sé directo. Si algo está mal hecho, dilo con el argumento técnico. Un reporte +complaciente no sirve de nada aquí. diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..830fb59 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..867ff8b --- /dev/null +++ b/next.config.ts @@ -0,0 +1,34 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + output: "standalone", + // El repositorio vive dentro de una carpeta sincronizada a la nube en la + // máquina de desarrollo, y el cliente de sincronización bloquea archivos de + // `.next` a media compilación (EPERM al renombrar). `NEXT_DIST_DIR` permite + // construir fuera de esa carpeta en local. En el contenedor no se define, así + // que la salida estándar de `output: "standalone"` no cambia. + distDir: process.env.NEXT_DIST_DIR ?? ".next", + poweredByHeader: false, + compress: true, + images: { + formats: ["image/avif", "image/webp"], + }, + async headers() { + return [ + { + source: "/:path*", + headers: [ + { key: "X-Content-Type-Options", value: "nosniff" }, + { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }, + { key: "X-Frame-Options", value: "SAMEORIGIN" }, + ], + }, + { + source: "/media/:path*", + headers: [{ key: "Cache-Control", value: "public, max-age=31536000, immutable" }], + }, + ]; + }, +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..296c890 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2843 @@ +{ + "name": "fspm-web", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fspm-web", + "version": "1.0.0", + "dependencies": { + "@prisma/client": "6.16.2", + "bcryptjs": "3.0.2", + "jose": "6.1.0", + "next": "15.5.4", + "react": "19.1.1", + "react-dom": "19.1.1", + "zod": "4.1.11" + }, + "devDependencies": { + "@playwright/test": "1.56.0", + "@tailwindcss/postcss": "4.1.13", + "@types/node": "22.18.6", + "@types/react": "19.1.13", + "@types/react-dom": "19.1.9", + "prisma": "6.16.2", + "tailwindcss": "4.1.13", + "tsx": "4.20.5", + "typescript": "5.9.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.4.tgz", + "integrity": "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.4.tgz", + "integrity": "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.4.tgz", + "integrity": "sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.4.tgz", + "integrity": "sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.4.tgz", + "integrity": "sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.4.tgz", + "integrity": "sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.4.tgz", + "integrity": "sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.4.tgz", + "integrity": "sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.4.tgz", + "integrity": "sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@playwright/test": { + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.0.tgz", + "integrity": "sha512-Tzh95Twig7hUwwNe381/K3PggZBZblKUe2wv25oIpzWLr6Z0m4KgV1ZVIjnR6GM9ANEqjZD7XsZEa6JL/7YEgg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.56.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@prisma/client": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.16.2.tgz", + "integrity": "sha512-E00PxBcalMfYO/TWnXobBVUai6eW/g5OsifWQsQDzJYm7yaY+IRLo7ZLsaefi0QkTpxfuhFcQ/w180i6kX3iJw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.16.2.tgz", + "integrity": "sha512-mKXSUrcqXj0LXWPmJsK2s3p9PN+aoAbyMx7m5E1v1FufofR1ZpPoIArjjzOIm+bJRLLvYftoNYLx1tbHgF9/yg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.16.12", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.16.2.tgz", + "integrity": "sha512-bo4/gA/HVV6u8YK2uY6glhNsJ7r+k/i5iQ9ny/3q5bt9ijCj7WMPUwfTKPvtEgLP+/r26Z686ly11hhcLiQ8zA==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.16.2.tgz", + "integrity": "sha512-7yf3AjfPUgsg/l7JSu1iEhsmZZ/YE00yURPjTikqm2z4btM0bCl2coFtTGfeSOWbQMmq45Jab+53yGUIAT1sjA==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.16.2", + "@prisma/engines-version": "6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43", + "@prisma/fetch-engine": "6.16.2", + "@prisma/get-platform": "6.16.2" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43.tgz", + "integrity": "sha512-ThvlDaKIVrnrv97ujNFDYiQbeMQpLa0O86HFA2mNoip4mtFqM7U5GSz2ie1i2xByZtvPztJlNRgPsXGeM/kqAA==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.16.2.tgz", + "integrity": "sha512-wPnZ8DMRqpgzye758ZvfAMiNJRuYpz+rhgEBZi60ZqDIgOU2694oJxiuu3GKFeYeR/hXxso4/2oBC243t/whxQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.16.2", + "@prisma/engines-version": "6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43", + "@prisma/get-platform": "6.16.2" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.16.2.tgz", + "integrity": "sha512-U/P36Uke5wS7r1+omtAgJpEB94tlT4SdlgaeTc6HVTTT93pXj7zZ+B/cZnmnvjcNPfWddgoDx8RLjmQwqGDYyA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.16.2" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz", + "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.18", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.13" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz", + "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.13", + "@tailwindcss/oxide-darwin-arm64": "4.1.13", + "@tailwindcss/oxide-darwin-x64": "4.1.13", + "@tailwindcss/oxide-freebsd-x64": "4.1.13", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", + "@tailwindcss/oxide-linux-x64-musl": "4.1.13", + "@tailwindcss/oxide-wasm32-wasi": "4.1.13", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz", + "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz", + "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz", + "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz", + "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz", + "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz", + "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz", + "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz", + "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz", + "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz", + "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz", + "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz", + "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.13.tgz", + "integrity": "sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.13", + "@tailwindcss/oxide": "4.1.13", + "postcss": "^8.4.41", + "tailwindcss": "4.1.13" + } + }, + "node_modules/@types/node": { + "version": "22.18.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz", + "integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", + "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", + "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/effect": { + "version": "3.16.12", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.16.12.tgz", + "integrity": "sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.0.tgz", + "integrity": "sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.4.tgz", + "integrity": "sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==", + "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/CVE-2025-66478 for more details.", + "license": "MIT", + "dependencies": { + "@next/env": "15.5.4", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.5.4", + "@next/swc-darwin-x64": "15.5.4", + "@next/swc-linux-arm64-gnu": "15.5.4", + "@next/swc-linux-arm64-musl": "15.5.4", + "@next/swc-linux-x64-gnu": "15.5.4", + "@next/swc-linux-x64-musl": "15.5.4", + "@next/swc-win32-arm64-msvc": "15.5.4", + "@next/swc-win32-x64-msvc": "15.5.4", + "sharp": "^0.34.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/nypm": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.9.tgz", + "integrity": "sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.2.2", + "pathe": "^2.0.3", + "tinyexec": "^1.2.4" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/ohash": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", + "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/playwright": { + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.0.tgz", + "integrity": "sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.56.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.0.tgz", + "integrity": "sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prisma": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.16.2.tgz", + "integrity": "sha512-aRvldGE5UUJTtVmFiH3WfNFNiqFlAtePUxcI0UEGlnXCX7DqhiMT5TRYwncHFeA/Reca5W6ToXXyCMTeFPdSXA==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "6.16.2", + "@prisma/engines": "6.16.2" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", + "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", + "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/zod": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", + "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9f7e1c7 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "fspm-web", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "prisma generate && next build", + "start": "next start", + "lint": "next lint", + "typecheck": "tsc --noEmit", + "db:push": "prisma db push", + "db:seed": "tsx prisma/seed.ts", + "db:reset": "prisma db push --force-reset && tsx prisma/seed.ts", + "test:e2e": "playwright test", + "test:webkit": "playwright test --project=escritorio-webkit --project=movil-webkit", + "test:humo": "playwright test tests/01-humo.spec.ts --project=escritorio-chromium" + }, + "dependencies": { + "@prisma/client": "6.16.2", + "bcryptjs": "3.0.2", + "jose": "6.1.0", + "next": "15.5.4", + "react": "19.1.1", + "react-dom": "19.1.1", + "zod": "4.1.11" + }, + "devDependencies": { + "@tailwindcss/postcss": "4.1.13", + "@types/node": "22.18.6", + "@types/react": "19.1.13", + "@types/react-dom": "19.1.9", + "prisma": "6.16.2", + "tailwindcss": "4.1.13", + "tsx": "4.20.5", + "typescript": "5.9.2", + "@playwright/test": "1.56.0" + }, + "prisma": { + "seed": "tsx prisma/seed.ts" + } +} diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..9a5b105 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,61 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Configuración de pruebas de extremo a extremo. + * + * WebKit está incluido a propósito y no es opcional: es el motor de Safari e iOS, + * donde más se rompe la responsividad, y el cliente lo pidió explícitamente. + * Una prueba que solo pasa en Chromium no prueba responsividad. + */ + +const PUERTO = 3100; +const BASE = `http://127.0.0.1:${PUERTO}`; + +export default defineConfig({ + testDir: "./tests", + fullyParallel: true, + forbidOnly: true, + retries: 1, + workers: 3, + timeout: 45_000, + expect: { timeout: 8_000 }, + reporter: [ + ["list"], + ["json", { outputFile: "tests/reporte/resultado.json" }], + ["html", { outputFolder: "tests/reporte/html", open: "never" }], + ], + use: { + baseURL: BASE, + locale: "es-MX", + timezoneId: "America/Mexico_City", + trace: "retain-on-failure", + screenshot: "only-on-failure", + video: "off", + }, + projects: [ + { + name: "escritorio-chromium", + use: { ...devices["Desktop Chrome"], viewport: { width: 1440, height: 900 } }, + }, + { + name: "escritorio-webkit", + use: { ...devices["Desktop Safari"], viewport: { width: 1440, height: 900 } }, + }, + { + name: "movil-webkit", + use: { ...devices["iPhone 13"] }, + }, + { + name: "movil-chico", + use: { ...devices["Desktop Chrome"], viewport: { width: 320, height: 640 }, isMobile: false }, + }, + ], + webServer: { + command: `npm run start -- --port ${PUERTO}`, + url: `${BASE}/api/salud`, + reuseExistingServer: true, + timeout: 180_000, + stdout: "pipe", + stderr: "pipe", + }, +}); diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..ab18334 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,4 @@ +const config = { + plugins: { "@tailwindcss/postcss": {} }, +}; +export default config; diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..8e96e3f --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,220 @@ +// FSPM — micro CRM +// +// SQLite no soporta enums nativos en Prisma: los campos de estado son String +// y su dominio vive en src/lib/crm/constantes.ts, que es la fuente de verdad. +// No inventes valores fuera de esas constantes. + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} + +/// Usuario del panel. rol: "ADMIN" | "VENDEDOR" +model User { + id String @id @default(cuid()) + nombre String + email String @unique + passwordHash String + rol String @default("VENDEDOR") + puesto String? + telefono String? + activo Boolean @default(true) + creadoEn DateTime @default(now()) + + contactos Contact[] + oportunidades Opportunity[] + actividades Activity[] + pedidos Order[] + reglas AssignmentRule[] + + @@index([rol, activo]) +} + +/// Persona. Un mismo contacto puede generar muchas oportunidades. +model Contact { + id String @id @default(cuid()) + nombre String + email String? + telefono String? + /// email en minúsculas y sin espacios — clave de deduplicación + emailNorm String? + /// solo dígitos, últimos 10 — clave de deduplicación + telefonoNorm String? + empresa String? + puesto String? + ciudad String? + /// slug de industria, ver src/data/industrias.ts + industria String? + notas String? + + propietarioId String? + propietario User? @relation(fields: [propietarioId], references: [id], onDelete: SetNull) + + // atribución de primer toque: nunca se sobreescribe + primerUtmSource String? + primerUtmMedium String? + primerUtmCampaign String? + primerLandingPath String? + primerReferrer String? + + creadoEn DateTime @default(now()) + actualizadoEn DateTime @updatedAt + + oportunidades Opportunity[] + pedidos Order[] + + @@index([emailNorm]) + @@index([telefonoNorm]) + @@index([propietarioId]) + @@index([creadoEn]) +} + +/// Un envío de formulario o de widget de WhatsApp convertido en oportunidad. +model Opportunity { + id String @id @default(cuid()) + /// OPP-2026-0001 + folio String @unique + + contactoId String + contacto Contact @relation(fields: [contactoId], references: [id], onDelete: Cascade) + + propietarioId String? + propietario User? @relation(fields: [propietarioId], references: [id], onDelete: SetNull) + + /// "FORMULARIO" | "WHATSAPP" + origen String + /// dónde se envió: "home" | "catalogo" | "producto" | "solucion" | "contacto" | "widget" + canal String? + /// "NUEVO" | "CONTACTADO" | "DIAGNOSTICO" | "COTIZACION" | "GANADA" | "PERDIDA" + etapa String @default("NUEVO") + /// "ALTA" | "MEDIA" | "BAJA" + prioridad String @default("MEDIA") + + // interés declarado + productoSlug String? + productoNombre String? + /// URL del producto de interés, tal como la vio el usuario + productoUrl String? + categoriaSlug String? + industria String? + /// clases de fuego separadas por coma, ej. "B,K" + clasesFuego String? + superficie String? + urgencia String? + mensaje String? + valorEstimado Float? + + // atribución de campaña + utmSource String? + utmMedium String? + utmCampaign String? + utmTerm String? + utmContent String? + gclid String? + fbclid String? + referrer String? + landingPath String? + paginaUrl String? + dispositivo String? + userAgent String? + + creadoEn DateTime @default(now()) + actualizadoEn DateTime @updatedAt + primeraRespuestaEn DateTime? + cerradoEn DateTime? + motivoPerdida String? + + actividades Activity[] + pedidos Order[] + + @@index([etapa]) + @@index([propietarioId]) + @@index([contactoId]) + @@index([creadoEn]) + @@index([utmCampaign]) + @@index([origen]) +} + +/// Bitácora de la oportunidad. +model Activity { + id String @id @default(cuid()) + + oportunidadId String + oportunidad Opportunity @relation(fields: [oportunidadId], references: [id], onDelete: Cascade) + + usuarioId String? + usuario User? @relation(fields: [usuarioId], references: [id], onDelete: SetNull) + + /// "NOTA" | "LLAMADA" | "CORREO" | "WHATSAPP" | "REUNION" | "CAMBIO_ETAPA" | "ASIGNACION" | "SISTEMA" + tipo String + texto String + creadoEn DateTime @default(now()) + + @@index([oportunidadId, creadoEn]) +} + +/// Pedido derivado de una oportunidad ganada. +model Order { + id String @id @default(cuid()) + /// PED-2026-0001 + folio String @unique + + oportunidadId String? + oportunidad Opportunity? @relation(fields: [oportunidadId], references: [id], onDelete: SetNull) + + contactoId String + contacto Contact @relation(fields: [contactoId], references: [id], onDelete: Cascade) + + propietarioId String? + propietario User? @relation(fields: [propietarioId], references: [id], onDelete: SetNull) + + /// "BORRADOR" | "CONFIRMADO" | "EN_PROCESO" | "ENVIADO" | "ENTREGADO" | "CANCELADO" + estado String @default("BORRADOR") + moneda String @default("MXN") + subtotal Float @default(0) + iva Float @default(0) + total Float @default(0) + /// JSON: [{ productoSlug, nombre, cantidad, precioUnitario }] + items String @default("[]") + notas String? + + entregaEstimada DateTime? + creadoEn DateTime @default(now()) + actualizadoEn DateTime @updatedAt + + @@index([estado]) + @@index([propietarioId]) + @@index([creadoEn]) +} + +/// Regla de asignación de oportunidades. Se evalúan por prioridad ascendente, +/// gana la primera que coincide; si ninguna coincide, se reparte por turno +/// entre los vendedores activos. +model AssignmentRule { + id String @id @default(cuid()) + nombre String + /// menor número = se evalúa primero + prioridad Int @default(100) + /// "INDUSTRIA" | "CATEGORIA" | "ORIGEN" | "CLASE" | "CUALQUIERA" + tipo String + /// valor a comparar; null para "CUALQUIERA" + valor String? + + usuarioId String + usuario User @relation(fields: [usuarioId], references: [id], onDelete: Cascade) + + activa Boolean @default(true) + creadoEn DateTime @default(now()) + + @@index([activa, prioridad]) +} + +/// Contadores para folios legibles. name: "oportunidad" | "pedido" +model Counter { + name String @id + valor Int @default(0) +} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..54efe54 --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,1260 @@ +import { existsSync, readFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { PrismaClient } from "@prisma/client"; +import { hashSync } from "bcryptjs"; +import { serializeClases, type ClaseFuego } from "../src/data/clases-fuego"; +import { getProducto } from "../src/data/catalogo"; +import { INDUSTRIAS } from "../src/data/industrias"; +import { IVA, MOTIVOS_PERDIDA } from "../src/lib/crm/constantes"; + +/** + * Datos de demostración del micro CRM. + * + * Es idempotente: borra y vuelve a construir. Todo sale de arreglos propios y + * de un generador congruencial con semilla fija, así que dos corridas producen + * exactamente la misma base y las capturas de pantalla de la demo no cambian + * de una sesión a otra. + * + * Nada de esto es información real de FSPM ni de sus clientes: las empresas, + * las personas, las campañas y los precios son inventados para la demostración. + */ + +// ---------- entorno ---------- + +/** + * `npm run db:seed` ejecuta tsx directamente, sin la carga de .env que hace la + * CLI de Prisma. Se lee a mano para que DATABASE_URL exista igual. + */ +function cargarEnv(): void { + if (process.env.DATABASE_URL) return; + const ruta = resolve(process.cwd(), ".env"); + if (!existsSync(ruta)) return; + for (const linea of readFileSync(ruta, "utf8").split(/\r?\n/)) { + const limpia = linea.trim(); + if (!limpia || limpia.startsWith("#")) continue; + const i = limpia.indexOf("="); + if (i < 1) continue; + const clave = limpia.slice(0, i).trim(); + const valor = limpia.slice(i + 1).trim().replace(/^["']|["']$/g, ""); + if (!process.env[clave]) process.env[clave] = valor; + } +} + +cargarEnv(); + +const db = new PrismaClient(); + +// ---------- azar reproducible ---------- + +/** Congruencial lineal. Semilla fija: el seed tiene que ser reproducible. */ +let estado = 20260827; +function aleatorio(): number { + estado = (estado * 1664525 + 1013904223) % 4294967296; + return estado / 4294967296; +} + +function entero(min: number, max: number): number { + return min + Math.floor(aleatorio() * (max - min + 1)); +} + +function elige(lista: readonly T[]): T { + return lista[Math.floor(aleatorio() * lista.length)]; +} + +function probable(p: number): boolean { + return aleatorio() < p; +} + +function porPeso(opciones: readonly { valor: T; peso: number }[]): T { + const total = opciones.reduce((s, o) => s + o.peso, 0); + let tiro = aleatorio() * total; + for (const o of opciones) { + tiro -= o.peso; + if (tiro <= 0) return o.valor; + } + return opciones[opciones.length - 1].valor; +} + +const NO_ASCII = /[^\u0020-\u007E]/g; + +function sinAcentos(v: string): string { + return v + .normalize("NFD") + .replace(NO_ASCII, "") + .replace(/[^a-zA-Z0-9]+/g, "-") + .replace(/^-+|-+$/g, "") + .toLowerCase(); +} + +// ---------- catálogos propios ---------- + +const NOMBRES = [ + "Ana", "Mariana", "Jorge", "Luis", "Fernanda", "Ricardo", "Paulina", "Emilio", + "Gabriela", "Héctor", "Alejandra", "Sergio", "Karla", "Ramiro", "Diana", + "Óscar", "Verónica", "Ignacio", "Claudia", "Rubén", "Silvia", "Arturo", + "Norma", "Joaquín", "Adriana", "Salvador", "Rocío", "Gerardo", "Itzel", + "Benjamín", "Lorena", "Efraín", "Mónica", "Tomás", "Elisa", "Aarón", +] as const; + +const APELLIDOS = [ + "Ruiz", "Escobedo", "Terán", "Cárdenas", "Nájera", "Villaseñor", "Zamudio", + "Rentería", "Ocampo", "Barajas", "Quintero", "Lomelí", "Arreola", "Bustamante", + "Cervantes", "Grajeda", "Íñiguez", "Maldonado", "Peralta", "Rivas", "Sandoval", + "Trujillo", "Urbina", "Valadez", "Yáñez", "Zúñiga", "Alcántara", "Berrones", + "Contreras", "Delgadillo", "Esquivel", "Fuentes", +] as const; + +const CIUDADES = [ + "Ciudad de México", "Monterrey, N.L.", "Guadalajara, Jal.", "Querétaro, Qro.", + "Puebla, Pue.", "Tijuana, B.C.", "Saltillo, Coah.", "León, Gto.", + "Mérida, Yuc.", "Toluca, Edo. Méx.", "Villahermosa, Tab.", "Veracruz, Ver.", + "Aguascalientes, Ags.", "Hermosillo, Son.", "Culiacán, Sin.", + "San Luis Potosí, S.L.P.", "Cancún, Q. Roo", "Chihuahua, Chih.", +] as const; + +const PUESTOS_POR_INDUSTRIA: Record = { + "industria-energia": [ + "Jefe de seguridad industrial", + "Gerente de planta", + "Coordinador de EHS", + "Superintendente de operaciones", + "Jefe de mantenimiento", + ], + "logistica-bodegas": [ + "Jefe de almacén", + "Gerente de logística", + "Coordinador de protección civil", + "Supervisor de turno", + "Gerente de operaciones", + ], + "gasolineras-flotas": [ + "Encargado de estación", + "Gerente de flotilla", + "Supervisor de patio", + "Coordinador de seguridad", + ], + "cocinas-hoteles": [ + "Gerente de alimentos y bebidas", + "Chef ejecutivo", + "Jefe de mantenimiento", + "Gerente general", + ], + "pymes-oficinas": [ + "Administrador", + "Dueño", + "Coordinador administrativo", + "Responsable de protección civil", + ], +}; + +/** Empresas ficticias, agrupadas por el segmento al que pertenecen. */ +const EMPRESAS_POR_INDUSTRIA: Record = { + "industria-energia": [ + "Petroquímica del Golfo", + "Termoeléctrica Bajío", + "Química Industrial Anáhuac", + "Aceros del Norte Integrados", + "Fundidora Coahuila", + "Lubricantes Tepeyac", + "Gas Industrial Sonora", + "Refinados del Sureste", + "Minera Peña Blanca", + "Cementos Altiplano", + "Papelera del Valle de Toluca", + "Plásticos Tecnológicos de México", + "Solventes Industriales Bajío", + "Energía Renovable del Istmo", + ], + "logistica-bodegas": [ + "Almacenes Centrales del Bajío", + "Logística Ferrer y Asociados", + "Distribuidora Sinaloense", + "Transportes Occidente Unido", + "Bodegas Norte Industrial", + "Manufacturas Metálicas Torreón", + "Empaques Corrugados Puebla", + "Centro Logístico Cuautitlán", + "Almacenaje Frío Querétaro", + "Textiles Aguascalientes", + "Autopartes Ensamble Silao", + "Cadena Frío Michoacán", + ], + "gasolineras-flotas": [ + "Estaciones de Servicio Rivera", + "Combustibles del Pacífico", + "Grupo Gasolinero Amanecer", + "Autotanques Vega", + "Flotilla Pesada Zermeño", + "Servicio Carretero El Mezquite", + "Gasolineras Unidas de Yucatán", + "Maquinaria Pesada Delgado", + "Estación Nueva Alborada", + "Diésel y Servicios Reynosa", + "Grupo Combustible Altamira", + ], + "cocinas-hoteles": [ + "Hotel Casa Marena", + "Hotelera Puerto Sereno", + "Comedores Industriales Aztlán", + "Restaurantes La Higuera", + "Banquetes Del Bosque", + "Hospedaje Boutique Alameda", + "Cocinas Centrales Metepec", + "Grupo Gastronómico Serrano", + "Hotel Mirador Real", + "Cafeterías Corporativas Nogal", + "Marisquería Puerto Nuevo", + ], + "pymes-oficinas": [ + "Contadores Aguilar y Herrera", + "Refacciones Automotrices Beltrán", + "Papelería Escolar Progreso", + "Clínica Dental Sonrisa Viva", + "Despacho Jurídico Nava", + "Ferretería El Yunque", + "Farmacias Buen Camino", + "Estudio de Diseño Cardinal", + "Servicios Contables Zamora", + "Óptica Visión Clara", + "Panadería La Espiga de Oro", + "Taller Mecánico Ríos", + "Imprenta Digital Meridiano", + "Laboratorio Clínico Vitalis", + ], +}; + +/** Productos verosímiles por segmento. Slugs reales de src/data/catalogo.ts. */ +const PRODUCTOS_POR_INDUSTRIA: Record = { + "industria-energia": [ + "fireade-2000", + "flameade-retardante", + "enforcer-60", + "carretilla-100-litros", + "carretilla-70-litros", + "firemiks", + "enforcer-robot", + "trakade", + "vaporade-plus", + ], + "logistica-bodegas": [ + "carretilla-70-litros", + "carretilla-50-litros", + "enforcer-12-litros", + "esfera-con-detector-de-humo", + "esfera-rociadora-automatica", + "enforcer-10", + "enforcer-robot", + ], + "gasolineras-flotas": [ + "carretilla-100-litros", + "carretilla-50-litros", + "carretilla-30-litros", + "enforcer-12-litros", + "enforcer-9-litros", + "fireade-2000", + "enforcer-60", + ], + "cocinas-hoteles": [ + "esfera-rociadora-automatica", + "esfera-con-detector-de-humo", + "enforcer-6-litros", + "enforcer-4-litros", + "enforcer-10", + ], + "pymes-oficinas": [ + "enforcer-4-litros", + "enforcer-2-litros", + "enforcer-1-litro", + "enforcer-6-litros", + "esfera-sin-detector-de-humo", + "receptor-sarmex", + ], +}; + +const SUPERFICIES_POR_INDUSTRIA: Record = { + "industria-energia": [ + "Patio de tanques de 3 200 m² más zona de trasvase", + "Nave de proceso de 6 800 m² en dos niveles", + "Planta completa, 14 hectáreas con cuatro áreas de riesgo", + "Cuarto eléctrico y subestación, 480 m²", + ], + "logistica-bodegas": [ + "Nave de 28 000 m² con racks a 11 m", + "Dos naves de 9 500 m² cada una", + "Centro de distribución de 42 000 m²", + "Bodega de 6 200 m² más andén de carga", + ], + "gasolineras-flotas": [ + "Cuatro islas, ocho posiciones de carga", + "Estación con tres islas y patio de autotanques", + "Patio de maniobras de 1 800 m² con 22 unidades", + "Dos estaciones en el mismo municipio", + ], + "cocinas-hoteles": [ + "Cocina central de 340 m² con tres campanas", + "Hotel de 96 habitaciones y dos cocinas", + "Comedor industrial para 800 comensales por turno", + "Cocina de 180 m² con seis freidoras", + ], + "pymes-oficinas": [ + "Oficina de 240 m² en un piso", + "Local comercial de 120 m²", + "Taller de 380 m² más oficina", + "Dos sucursales de 90 m² cada una", + ], +}; + +const MENSAJES_POR_INDUSTRIA: Record = { + "industria-energia": [ + "Nos levantaron observación en la última auditoría por el tiempo de respuesta en el patio de tanques. Necesitamos el escenario documentado y el equipo que corresponde.", + "Manejamos solventes y aceite térmico. La aseguradora nos pidió evidencia del agente utilizado y de la capacitación de la brigada.", + "Estamos ampliando una línea y el área nueva quedó sin cobertura. Queremos el diagnóstico antes de arrancar producción.", + "Buscamos reemplazar el polvo químico por espuma en la zona de trasvase. Necesitamos comparar agentes y costo de mantenimiento.", + ], + "logistica-bodegas": [ + "Tenemos racks a once metros y el equipo actual no alcanza. Queremos revisar la distribución por distancia real de recorrido.", + "Cargamos baterías de montacargas dentro de la nave y nos preocupa el riesgo eléctrico. Necesitamos recomendación técnica.", + "Vamos a certificar el centro de distribución y nos falta el expediente de protección contra incendios.", + "Nos cambiaron el giro de la carga almacenada y hay que reclasificar el riesgo de incendio de la nave.", + ], + "gasolineras-flotas": [ + "Protección Civil municipal nos pidió equipo operable por el despachador. Queremos cotizar la solución móvil.", + "Tuvimos un conato en la isla dos. El personal no supo usar el extintor. Necesitamos equipo y capacitación.", + "Abrimos una estación nueva y hay que dejar el expediente completo desde el arranque.", + "Tenemos autotanques dentro del predio y el equipo actual no cubre ese escenario.", + ], + "cocinas-hoteles": [ + "Tenemos seis freidoras bajo la misma campana y no hay supresión automática. Nos urge la propuesta.", + "La verificación viene el mes que entra y la cocina es el punto que traemos débil.", + "Queremos solución para clase K con demostración al personal del turno de la noche.", + "El ducto de extracción tiene años sin programa formal de limpieza y queremos cerrar el riesgo completo.", + ], + "pymes-oficinas": [ + "Necesitamos cumplir con la NOM-002 sin comprar de más. ¿Qué nos corresponde por superficie?", + "Nos pidieron el plan de emergencia por escrito y no sabemos con qué equipo debemos contar.", + "Vamos a abrir una segunda sucursal y queremos dejar las dos en orden.", + "Nuestros extintores llevan más de un año sin revisión y no sabemos si son los adecuados.", + ], +}; + +/** Etiquetas del selector de motivo del widget de WhatsApp. */ +const MOTIVOS_WHATSAPP = [ + "Quiero un diagnóstico de mi instalación", + "Necesito cotizar equipo", + "Tengo una verificación o auditoría encima", + "Es urgente, tuve un incidente", + "Otro tema", +] as const; + +/** + * Campañas de la demostración. Cada una tiene su propia tasa de cierre para + * que la analítica cuente algo: la campaña de cumplimiento normativo convierte + * mucho mejor que el remarketing social, que trae volumen barato y frío. + */ +type Campana = { + utmSource: string | null; + utmMedium: string | null; + utmCampaign: string | null; + referrer: string | null; + landingPath: string; + peso: number; + /** Probabilidad de terminar en GANADA. */ + cierre: number; + gclid?: boolean; + fbclid?: boolean; +}; + +const CAMPANAS: Campana[] = [ + { + utmSource: "google", + utmMedium: "cpc", + utmCampaign: "nom-002-cumplimiento", + referrer: "https://www.google.com/", + landingPath: "/cumplimiento-nom-002", + peso: 20, + cierre: 0.34, + gclid: true, + }, + { + utmSource: "google", + utmMedium: "cpc", + utmCampaign: "extintor-gasolinera", + referrer: "https://www.google.com/", + landingPath: "/soluciones/gasolineras-flotas", + peso: 11, + cierre: 0.2, + gclid: true, + }, + { + utmSource: "google", + utmMedium: "cpc", + utmCampaign: "espuma-sin-fluor", + referrer: "https://www.google.com/", + landingPath: "/producto/fireade-2000", + peso: 12, + cierre: 0.26, + gclid: true, + }, + { + utmSource: "meta", + utmMedium: "paid_social", + utmCampaign: "remarketing-pymes", + referrer: "https://l.facebook.com/", + landingPath: "/soluciones/pymes-oficinas", + peso: 16, + cierre: 0.07, + fbclid: true, + }, + { + utmSource: "google", + utmMedium: "organic", + utmCampaign: null, + referrer: "https://www.google.com/", + landingPath: "/evidencia", + peso: 14, + cierre: 0.16, + }, + { + utmSource: "linkedin", + utmMedium: "social", + utmCampaign: "continuidad-operativa", + referrer: "https://www.linkedin.com/", + landingPath: "/soluciones/industria-energia", + peso: 8, + cierre: 0.24, + }, + { + utmSource: "referido", + utmMedium: "referral", + utmCampaign: "socio-comercial", + referrer: "https://www.camaraindustrial-demo.mx/proveedores", + landingPath: "/nosotros", + peso: 7, + cierre: 0.3, + }, + { + // tráfico directo: sin UTM y sin referrer. La analítica lo agrupa aparte. + utmSource: null, + utmMedium: null, + utmCampaign: null, + referrer: null, + landingPath: "/", + peso: 12, + cierre: 0.12, + }, +]; + +/** + * Precios de demostración. No son la lista de precios de FSPM: son cifras + * inventadas, del orden de magnitud del giro, para que los pedidos de la demo + * sumen cantidades creíbles. No usarlos para cotizar. + */ +const PRECIOS_DEMO: Record = { + "enforcer-1-litro": 1290, + "enforcer-2-litros": 1890, + "enforcer-4-litros": 2790, + "enforcer-6-litros": 3450, + "enforcer-9-litros": 4290, + "enforcer-12-litros": 5190, + "enforcer-10": 18500, + "esfera-sin-detector-de-humo": 6900, + "esfera-con-detector-de-humo": 9800, + "carretilla-30-litros": 14500, + "carretilla-50-litros": 19800, + "carretilla-70-litros": 26400, + "carretilla-100-litros": 34900, + "enforcer-60": 42500, + "esfera-rociadora-automatica": 7600, + "fireade-2000": 4850, + "flameade-retardante": 3980, + trakade: 3450, + "vaporade-plus": 4200, + firemiks: 128000, + "receptor-sarmex": 8900, + "enforcer-robot": 315000, +}; + +const VALOR_POR_INDUSTRIA: Record = { + "industria-energia": [180_000, 1_400_000], + "logistica-bodegas": [90_000, 620_000], + "gasolineras-flotas": [48_000, 265_000], + "cocinas-hoteles": [62_000, 340_000], + "pymes-oficinas": [12_000, 92_000], +}; + +// ---------- tiempo ---------- + +const DIA_MS = 86_400_000; +const AHORA = new Date(); + +function inicioDeDia(f: Date): Date { + const d = new Date(f); + d.setHours(0, 0, 0, 0); + return d; +} + +const DIA_CERO = new Date(inicioDeDia(AHORA).getTime() - 55 * DIA_MS); + +/** Días de la ventana con su peso: mucho en día hábil, casi nada en domingo. */ +const DIAS_PONDERADOS: { valor: number; peso: number }[] = []; +for (let i = 0; i < 56; i += 1) { + const dia = new Date(DIA_CERO.getTime() + i * DIA_MS).getDay(); + const peso = dia === 0 ? 1 : dia === 6 ? 4 : 20; + DIAS_PONDERADOS.push({ valor: i, peso }); +} + +const HORAS_PONDERADAS: { valor: number; peso: number }[] = [ + { valor: 8, peso: 4 }, + { valor: 9, peso: 9 }, + { valor: 10, peso: 14 }, + { valor: 11, peso: 15 }, + { valor: 12, peso: 13 }, + { valor: 13, peso: 9 }, + { valor: 14, peso: 6 }, + { valor: 15, peso: 8 }, + { valor: 16, peso: 12 }, + { valor: 17, peso: 11 }, + { valor: 18, peso: 7 }, + { valor: 19, peso: 3 }, +]; + +function fechaDeEnvio(): Date { + const offset = porPeso(DIAS_PONDERADOS); + const hora = porPeso(HORAS_PONDERADAS); + return new Date( + DIA_CERO.getTime() + offset * DIA_MS + hora * 3_600_000 + entero(0, 59) * 60_000, + ); +} + +/** Minutos disponibles entre una fecha y este momento. */ +function minutosHastaAhora(desde: Date): number { + return Math.floor((AHORA.getTime() - desde.getTime()) / 60_000); +} + +/** + * Fecha posterior a `desde` que no se sale del presente. Si no cabe ni el + * mínimo, devuelve null: un lead de hace media hora no puede llevar veinte + * horas de atendido. + */ +function despuesDe(desde: Date, minutos: number, minimo = 20): Date | null { + const disponibles = minutosHastaAhora(desde); + if (disponibles < minimo) return null; + const usados = Math.max(Math.min(minutos, Math.floor(disponibles * 0.8)), minimo); + return new Date(desde.getTime() + usados * 60_000); +} + +// ---------- estructuras en memoria ---------- + +type PlanContacto = { + indice: number; + nombre: string; + email: string; + telefono: string; + telefonoNorm: string; + empresa: string; + puesto: string; + ciudad: string; + industria: string; + cuantas: number; +}; + +type PlanOportunidad = { + contacto: number; + origen: "FORMULARIO" | "WHATSAPP"; + canal: string; + etapa: string; + prioridad: string; + industria: string | null; + productoSlug: string | null; + productoNombre: string | null; + categoriaSlug: string | null; + productoUrl: string | null; + clases: string | null; + superficie: string | null; + urgencia: string | null; + mensaje: string; + valorEstimado: number | null; + campana: Campana; + dispositivo: string; + creadoEn: Date; + primeraRespuestaEn: Date | null; + cerradoEn: Date | null; + motivoPerdida: string | null; + propietarioIndice: number; +}; + +// ---------- construcción ---------- + +async function main(): Promise { + // 1. limpieza en orden seguro para las llaves foráneas + await db.activity.deleteMany(); + await db.order.deleteMany(); + await db.opportunity.deleteMany(); + await db.contact.deleteMany(); + await db.assignmentRule.deleteMany(); + await db.user.deleteMany(); + await db.counter.deleteMany(); + + // 2. usuarios + const CLAVE = "Fspm2026!"; + const hashClave = hashSync(CLAVE, 10); + + const usuariosPlan = [ + { + nombre: "Rodrigo Villaseñor", + email: "admin@fspm.com.mx", + rol: "ADMIN", + puesto: "Dirección comercial", + telefono: "+52 55 4034 8300", + }, + { + nombre: "Mariana Escobedo", + email: "mariana.escobedo@fspm.com.mx", + rol: "VENDEDOR", + puesto: "Especialista en industria y energía", + telefono: "+52 55 4034 8301", + }, + { + nombre: "Luis Ángel Terán", + email: "luis.teran@fspm.com.mx", + rol: "VENDEDOR", + puesto: "Especialista en logística y bodegas", + telefono: "+52 55 4034 8302", + }, + { + nombre: "Paulina Cárdenas", + email: "paulina.cardenas@fspm.com.mx", + rol: "VENDEDOR", + puesto: "Especialista en cocinas, hoteles y PyMEs", + telefono: "+52 55 4034 8303", + }, + { + nombre: "Emilio Nájera", + email: "emilio.najera@fspm.com.mx", + rol: "VENDEDOR", + puesto: "Respuesta rápida y estaciones de servicio", + telefono: "+52 55 4034 8304", + }, + ] as const; + + const usuarios: { id: string; nombre: string }[] = []; + for (const [i, u] of usuariosPlan.entries()) { + const creado = await db.user.create({ + data: { + nombre: u.nombre, + email: u.email, + passwordHash: hashClave, + rol: u.rol, + puesto: u.puesto, + telefono: u.telefono, + activo: true, + creadoEn: new Date(DIA_CERO.getTime() - (200 - i * 10) * DIA_MS), + }, + select: { id: true, nombre: true }, + }); + usuarios.push(creado); + } + + const ADMIN = 0; + const MARIANA = 1; + const LUIS = 2; + const PAULINA = 3; + const EMILIO = 4; + + // 3. reglas de asignación + const reglasPlan = [ + { nombre: "Industria y energía", prioridad: 10, tipo: "INDUSTRIA", valor: "industria-energia", u: MARIANA }, + { nombre: "Logística y bodegas", prioridad: 20, tipo: "INDUSTRIA", valor: "logistica-bodegas", u: LUIS }, + { nombre: "Gasolineras y flotas", prioridad: 30, tipo: "INDUSTRIA", valor: "gasolineras-flotas", u: EMILIO }, + { nombre: "Cocinas y hoteles", prioridad: 40, tipo: "INDUSTRIA", valor: "cocinas-hoteles", u: PAULINA }, + { nombre: "WhatsApp a respuesta rápida", prioridad: 50, tipo: "ORIGEN", valor: "WHATSAPP", u: EMILIO }, + { nombre: "Respaldo general", prioridad: 900, tipo: "CUALQUIERA", valor: null, u: PAULINA }, + ] as const; + + for (const r of reglasPlan) { + await db.assignmentRule.create({ + data: { + nombre: r.nombre, + prioridad: r.prioridad, + tipo: r.tipo, + valor: r.valor, + usuarioId: usuarios[r.u].id, + activa: true, + creadoEn: new Date(DIA_CERO.getTime() - 120 * DIA_MS), + }, + }); + } + + /** Réplica del motor de asignación, con la tabla de reglas de arriba. */ + function asignarSeed(industria: string | null, origen: string): number { + if (industria === "industria-energia") return MARIANA; + if (industria === "logistica-bodegas") return LUIS; + if (industria === "gasolineras-flotas") return EMILIO; + if (industria === "cocinas-hoteles") return PAULINA; + if (origen === "WHATSAPP") return EMILIO; + return PAULINA; + } + + // 4. contactos en memoria + const slugsIndustria = INDUSTRIAS.map((i) => i.slug); + const clasesDeIndustria = new Map( + INDUSTRIAS.map((i) => [i.slug, [...i.clases]]), + ); + + const TOTAL_CONTACTOS = 60; + // 10 contactos con 3 oportunidades, 15 con 2 y 35 con 1 = 95 oportunidades. + // Los repetidos son la prueba de que el CRM acumula historia por persona. + const cuantasPorContacto: number[] = [ + ...Array(10).fill(3), + ...Array(15).fill(2), + ...Array(35).fill(1), + ]; + + const usadosEmail = new Set(); + const contactos: PlanContacto[] = []; + + for (let i = 0; i < TOTAL_CONTACTOS; i += 1) { + const industria = slugsIndustria[i % slugsIndustria.length]; + const empresasDelGiro = EMPRESAS_POR_INDUSTRIA[industria]; + const empresa = empresasDelGiro[Math.floor(i / slugsIndustria.length) % empresasDelGiro.length]; + + const nombre = `${elige(NOMBRES)} ${elige(APELLIDOS)}`; + const dominio = sinAcentos(empresa).split("-").slice(0, 2).join(""); + let email = `${sinAcentos(nombre).replace("-", ".")}@${dominio}.com.mx`; + let n = 2; + while (usadosEmail.has(email)) { + email = `${sinAcentos(nombre).replace("-", ".")}${n}@${dominio}.com.mx`; + n += 1; + } + usadosEmail.add(email); + + const lada = elige(["55", "81", "33", "442", "222", "664", "999"] as const); + const resto = String(4_000_000 + i * 13_577).slice(0, 10 - lada.length); + const digitos = `${lada}${resto}`.slice(0, 10); + + contactos.push({ + indice: i, + nombre, + email, + telefono: `+52 ${lada} ${resto.slice(0, 4)} ${resto.slice(4)}`.trim(), + telefonoNorm: digitos, + empresa, + puesto: elige(PUESTOS_POR_INDUSTRIA[industria]), + ciudad: elige(CIUDADES), + industria, + cuantas: cuantasPorContacto[i], + }); + } + + // 5. oportunidades en memoria + const campanasPonderadas = CAMPANAS.map((c) => ({ valor: c, peso: c.peso })); + const oportunidades: PlanOportunidad[] = []; + + for (const c of contactos) { + const fechas = Array.from({ length: c.cuantas }, () => fechaDeEnvio()).sort( + (a, b) => a.getTime() - b.getTime(), + ); + + for (let k = 0; k < c.cuantas; k += 1) { + // el primer contacto de una persona siempre entra por formulario; el + // widget de WhatsApp aparece en los reenvíos, como pasa en la realidad + const porWhatsApp = k > 0 && probable(0.45); + const campana = porPeso(campanasPonderadas); + + const industriaOp = porWhatsApp ? null : c.industria; + const productoSlug = porWhatsApp + ? null + : probable(0.72) + ? elige(PRODUCTOS_POR_INDUSTRIA[c.industria]) + : null; + const producto = productoSlug ? getProducto(productoSlug) : undefined; + + const clasesBase = clasesDeIndustria.get(c.industria) ?? []; + const clases = porWhatsApp + ? [] + : clasesBase.filter((cl) => (c.industria === "cocinas-hoteles" && cl === "K") || probable(0.75)); + if (!porWhatsApp && clases.length === 0 && clasesBase.length > 0) clases.push(clasesBase[0]); + + const urgencia = porWhatsApp + ? probable(0.3) + ? "inmediata" + : null + : porPeso([ + { valor: "inmediata", peso: 18 }, + { valor: "trimestre", peso: 30 }, + { valor: "presupuesto", peso: 32 }, + { valor: "explorando", peso: 20 }, + ]); + + const canal = porWhatsApp + ? "widget" + : producto + ? "producto" + : porPeso([ + { valor: "home", peso: 18 }, + { valor: "catalogo", peso: 14 }, + { valor: "solucion", peso: 24 }, + { valor: "contacto", peso: 22 }, + { valor: "cumplimiento", peso: 22 }, + ]); + + const mensaje = porWhatsApp + ? elige(MOTIVOS_WHATSAPP) + : elige(MENSAJES_POR_INDUSTRIA[c.industria]); + + // Etapa del embudo abierto, con pesos que se angostan hacia arriba. Las + // ganadas no se sortean aquí: se reparten después por cuota de campaña, + // para que la tasa de cierre de cada una sea exacta y no un accidente + // del muestreo. + const etapa = porPeso([ + { valor: "NUEVO", peso: 40 }, + { valor: "CONTACTADO", peso: 30 }, + { valor: "DIAGNOSTICO", peso: 19 }, + { valor: "COTIZACION", peso: 21 }, + { valor: "PERDIDA", peso: 14 }, + ]); + + const prioridad = + urgencia === "inmediata" || porWhatsApp + ? "ALTA" + : urgencia === "explorando" + ? "BAJA" + : "MEDIA"; + + const [minValor, maxValor] = VALOR_POR_INDUSTRIA[c.industria]; + const conValor = etapa !== "NUEVO" && (etapa !== "CONTACTADO" || probable(0.45)); + const valorEstimado = conValor + ? Math.round(entero(minValor, maxValor) / 500) * 500 + : null; + + oportunidades.push({ + contacto: c.indice, + origen: porWhatsApp ? "WHATSAPP" : "FORMULARIO", + canal, + etapa, + prioridad, + industria: industriaOp, + productoSlug: producto?.slug ?? null, + productoNombre: producto?.nombre ?? null, + categoriaSlug: producto?.categoria ?? null, + productoUrl: producto ? `/producto/${producto.slug}` : null, + clases: clases.length ? serializeClases(clases as ClaseFuego[]) : null, + superficie: porWhatsApp ? null : elige(SUPERFICIES_POR_INDUSTRIA[c.industria]), + urgencia, + mensaje, + valorEstimado, + campana, + dispositivo: porPeso([ + { valor: "escritorio", peso: 58 }, + { valor: "movil", peso: 34 }, + { valor: "tableta", peso: 8 }, + ]), + creadoEn: fechas[k], + primeraRespuestaEn: null, + cerradoEn: null, + motivoPerdida: null, + propietarioIndice: asignarSeed(industriaOp, porWhatsApp ? "WHATSAPP" : "FORMULARIO"), + }); + } + } + + const DIAS_MINIMOS_CIERRE = 3; + + // 5b. una oportunidad cerrada necesita historia detrás: si el lead entró + // hace menos de tres días se queda en una etapa intermedia, en vez de + // inventar un ciclo de venta que no cabe en el calendario + const puedeCerrar = (o: PlanOportunidad) => + minutosHastaAhora(o.creadoEn) >= DIAS_MINIMOS_CIERRE * 1440; + + for (const o of oportunidades) { + if (o.etapa !== "PERDIDA") continue; + if (puedeCerrar(o)) continue; + o.etapa = "CONTACTADO"; + } + + /** Mezcla reproducible: Fisher-Yates con el mismo generador con semilla. */ + function mezclar(lista: T[]): T[] { + const copia = [...lista]; + for (let i = copia.length - 1; i > 0; i -= 1) { + const j = entero(0, i); + [copia[i], copia[j]] = [copia[j], copia[i]]; + } + return copia; + } + + const ponerValor = (o: PlanOportunidad) => { + if (o.valorEstimado !== null) return; + const [mn, mx] = VALOR_POR_INDUSTRIA[contactos[o.contacto].industria]; + o.valorEstimado = Math.round(entero(mn, mx) / 500) * 500; + }; + + // 5c. cuota de ganadas por campaña. Cada campaña cierra exactamente la + // proporción que le corresponde, así que la analítica cuenta una historia + // estable: cumplimiento normativo convierte varias veces mejor que el + // remarketing social, y eso se ve igual en cada corrida del seed. + const ganadas = () => oportunidades.filter((o) => o.etapa === "GANADA"); + + for (const campana of CAMPANAS) { + const suyas = oportunidades.filter((o) => o.campana === campana); + const objetivo = Math.round(suyas.length * campana.cierre); + const elegibles = mezclar(suyas.filter((o) => o.etapa !== "PERDIDA" && puedeCerrar(o))); + for (const o of elegibles.slice(0, objetivo)) { + o.etapa = "GANADA"; + ponerValor(o); + } + } + + // 5c-bis. la demo necesita al menos 18 ganadas para derivar 18 pedidos + const MINIMO_GANADAS = 18; + if (ganadas().length < MINIMO_GANADAS) { + const relleno = oportunidades + .filter((o) => o.etapa === "COTIZACION" && puedeCerrar(o)) + .sort((a, b) => b.campana.cierre - a.campana.cierre); + for (const o of relleno) { + if (ganadas().length >= MINIMO_GANADAS) break; + o.etapa = "GANADA"; + ponerValor(o); + } + } + + // 5d. primera respuesta, cierre y motivo de pérdida + const nuevas = oportunidades + .filter((o) => o.etapa === "NUEVO") + .sort((a, b) => a.creadoEn.getTime() - b.creadoEn.getTime()); + // ocho leads nuevos se quedan sin tocar, repartidos por toda la ventana, para + // que el tablero tenga trabajo pendiente real y no un rezago simulado + const salto = Math.max(Math.floor(nuevas.length / 8), 1); + const sinAtender = new Set(); + for (let i = 0; i < nuevas.length && sinAtender.size < 8; i += salto) { + sinAtender.add(nuevas[i]); + } + + for (const o of oportunidades) { + if (!sinAtender.has(o)) { + const minutos = porPeso([ + { valor: entero(20, 90), peso: 34 }, + { valor: entero(91, 360), peso: 30 }, + { valor: entero(361, 900), peso: 22 }, + { valor: entero(901, 1800), peso: 14 }, + ]); + o.primeraRespuestaEn = despuesDe(o.creadoEn, minutos); + } + + if (o.etapa === "GANADA" || o.etapa === "PERDIDA") { + const diasDisponibles = Math.floor(minutosHastaAhora(o.creadoEn) / 1440); + const dias = Math.max(Math.min(entero(2, 26), diasDisponibles), 2); + o.cerradoEn = new Date(o.creadoEn.getTime() + dias * DIA_MS); + if (o.etapa === "PERDIDA") o.motivoPerdida = elige(MOTIVOS_PERDIDA); + if (!o.primeraRespuestaEn) { + o.primeraRespuestaEn = + despuesDe(o.creadoEn, entero(30, 600)) ?? + new Date(o.creadoEn.getTime() + 30 * 60_000); + } + } + } + + // 6. contactos en base, con fecha anterior a su primer envío + const idsContacto: string[] = []; + for (const c of contactos) { + const suyas = oportunidades + .filter((o) => o.contacto === c.indice) + .sort((a, b) => a.creadoEn.getTime() - b.creadoEn.getTime()); + const primera = suyas[0]; + const dueno = usuarios[primera.propietarioIndice]; + + const creado = await db.contact.create({ + data: { + nombre: c.nombre, + email: c.email, + telefono: c.telefono, + emailNorm: c.email.toLowerCase(), + telefonoNorm: c.telefonoNorm, + empresa: c.empresa, + puesto: c.puesto, + ciudad: c.ciudad, + industria: c.industria, + notas: probable(0.28) + ? "Contacto de la demostración. Confirmar datos antes de cualquier gestión real." + : null, + propietarioId: dueno.id, + primerUtmSource: primera.campana.utmSource, + primerUtmMedium: primera.campana.utmMedium, + primerUtmCampaign: primera.campana.utmCampaign, + primerLandingPath: primera.campana.landingPath, + primerReferrer: primera.campana.referrer, + creadoEn: new Date(primera.creadoEn.getTime() - entero(10, 240) * 60_000), + }, + select: { id: true }, + }); + idsContacto.push(creado.id); + } + + // 7. oportunidades en base, con folio consecutivo por fecha + const enOrden = [...oportunidades].sort((a, b) => a.creadoEn.getTime() - b.creadoEn.getTime()); + const idsOportunidad = new Map(); + + for (const [i, o] of enOrden.entries()) { + const c = contactos[o.contacto]; + const folio = `OPP-${o.creadoEn.getFullYear()}-${String(i + 1).padStart(4, "0")}`; + const campana = o.campana; + + const creada = await db.opportunity.create({ + data: { + folio, + contactoId: idsContacto[o.contacto], + propietarioId: usuarios[o.propietarioIndice].id, + origen: o.origen, + canal: o.canal, + etapa: o.etapa, + prioridad: o.prioridad, + productoSlug: o.productoSlug, + productoNombre: o.productoNombre, + productoUrl: o.productoUrl, + categoriaSlug: o.categoriaSlug, + industria: o.industria, + clasesFuego: o.clases, + superficie: o.superficie, + urgencia: o.urgencia, + mensaje: o.mensaje, + valorEstimado: o.valorEstimado, + utmSource: campana.utmSource, + utmMedium: campana.utmMedium, + utmCampaign: campana.utmCampaign, + utmTerm: campana.utmMedium === "cpc" ? elige(["extintor industrial", "nom 002 stps", "espuma contra incendio"] as const) : null, + utmContent: campana.utmMedium === "paid_social" ? elige(["carrusel-a", "video-15s", "estatico-b"] as const) : null, + gclid: campana.gclid ? `demo-gclid-${1000 + i}` : null, + fbclid: campana.fbclid ? `demo-fbclid-${2000 + i}` : null, + referrer: campana.referrer, + landingPath: campana.landingPath, + paginaUrl: `https://fspm-demo.urieljareth.org${o.productoUrl ?? campana.landingPath}`, + dispositivo: o.dispositivo, + userAgent: + o.dispositivo === "movil" + ? "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1" + : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36", + creadoEn: o.creadoEn, + primeraRespuestaEn: o.primeraRespuestaEn, + cerradoEn: o.cerradoEn, + motivoPerdida: o.motivoPerdida, + }, + select: { id: true, folio: true }, + }); + + idsOportunidad.set(o, creada); + + // 8. bitácora: las dos entradas automáticas que escribe la API + const productoTexto = o.productoNombre ?? "sin producto declarado"; + const campanaTexto = + campana.utmSource || campana.utmCampaign + ? `campaña: ${campana.utmCampaign ?? "sin campaña"} (${campana.utmSource ?? "sin fuente"}/${campana.utmMedium ?? "sin medio"})` + : "campaña: tráfico directo u orgánico"; + + await db.activity.create({ + data: { + oportunidadId: creada.id, + tipo: "SISTEMA", + texto: `${ + o.origen === "WHATSAPP" + ? "Contacto registrado desde el widget de WhatsApp" + : "Formulario enviado desde el sitio" + } · canal: ${o.canal} · producto: ${productoTexto} · ${campanaTexto}${ + o.urgencia ? ` · urgencia declarada: ${o.urgencia}` : "" + }.`, + creadoEn: o.creadoEn, + }, + }); + + const dueno = usuarios[o.propietarioIndice]; + const motivoRegla = + o.industria === "industria-energia" + ? 'Regla "Industria y energía"' + : o.industria === "logistica-bodegas" + ? 'Regla "Logística y bodegas"' + : o.industria === "gasolineras-flotas" + ? 'Regla "Gasolineras y flotas"' + : o.industria === "cocinas-hoteles" + ? 'Regla "Cocinas y hoteles"' + : o.origen === "WHATSAPP" + ? 'Regla "WhatsApp a respuesta rápida"' + : 'Regla "Respaldo general"'; + + await db.activity.create({ + data: { + oportunidadId: creada.id, + usuarioId: dueno.id, + tipo: "ASIGNACION", + texto: `Asignada a ${dueno.nombre}. Criterio: ${motivoRegla}.`, + creadoEn: new Date(o.creadoEn.getTime() + 1000), + }, + }); + + // gestiones coherentes con la etapa alcanzada + const gestiones = (() => { + switch (o.etapa) { + case "NUEVO": + return o.primeraRespuestaEn ? 1 : 0; + case "CONTACTADO": + return 1; + case "DIAGNOSTICO": + return entero(1, 2); + case "COTIZACION": + return entero(2, 3); + case "GANADA": + return entero(2, 4); + case "PERDIDA": + return entero(1, 3); + default: + return 1; + } + })(); + + const guionPorEtapa: readonly { tipo: string; texto: string }[] = [ + { tipo: "LLAMADA", texto: `Primer contacto telefónico con ${c.nombre}. Confirmamos el alcance y la superficie a proteger.` }, + { tipo: "CORREO", texto: "Enviado el cuestionario de diagnóstico y la referencia de la NOM-002-STPS-2010." }, + { tipo: "NOTA", texto: `Riesgo declarado por el cliente: clases ${o.clases ?? "por definir"}. Falta validar en sitio.` }, + { tipo: "REUNION", texto: "Visita técnica realizada. Levantamiento de zonas y distancias de recorrido." }, + { tipo: "NOTA", texto: "Propuesta técnica enviada con el escenario documentado y el agente recomendado." }, + { tipo: "LLAMADA", texto: "Seguimiento a la propuesta. El cliente pidió comparativo de mantenimiento." }, + { tipo: "WHATSAPP", texto: "El cliente confirmó por WhatsApp la fecha de la demostración con su personal." }, + { tipo: "CORREO", texto: "Enviado el expediente para aseguradora y verificación." }, + ]; + + for (let g = 0; g < gestiones; g += 1) { + const guion = guionPorEtapa[g % guionPorEtapa.length]; + const base = o.primeraRespuestaEn ?? o.creadoEn; + const cuando = despuesDe(base, (g + 1) * entero(6, 40) * 60, 1); + if (!cuando) break; + await db.activity.create({ + data: { + oportunidadId: creada.id, + usuarioId: dueno.id, + tipo: guion.tipo, + texto: guion.texto, + creadoEn: cuando, + }, + }); + } + + if (o.etapa === "GANADA" || o.etapa === "PERDIDA") { + await db.activity.create({ + data: { + oportunidadId: creada.id, + usuarioId: dueno.id, + tipo: "CAMBIO_ETAPA", + texto: + o.etapa === "GANADA" + ? "Etapa: COTIZACION → GANADA. Cliente aprobó la propuesta." + : `Etapa: COTIZACION → PERDIDA. Motivo: ${o.motivoPerdida}.`, + creadoEn: o.cerradoEn ?? o.creadoEn, + }, + }); + } + } + + // 9. pedidos derivados de oportunidades ganadas + const paraPedido = enOrden.filter((o) => o.etapa === "GANADA").slice(0, 18); + const estadosPedido = [ + "ENTREGADO", "ENTREGADO", "ENTREGADO", "ENVIADO", "ENVIADO", "EN_PROCESO", + "EN_PROCESO", "EN_PROCESO", "CONFIRMADO", "CONFIRMADO", "CONFIRMADO", + "CONFIRMADO", "BORRADOR", "BORRADOR", "BORRADOR", "ENVIADO", "CANCELADO", + "ENTREGADO", + ] as const; + + let pedidosCreados = 0; + for (const [i, o] of paraPedido.entries()) { + const c = contactos[o.contacto]; + const ref = idsOportunidad.get(o); + if (!ref) continue; + + const catalogoDelGiro = PRODUCTOS_POR_INDUSTRIA[c.industria]; + const cuantasPartidas = entero(1, 3); + const elegidos = new Set(); + if (o.productoSlug) elegidos.add(o.productoSlug); + while (elegidos.size < cuantasPartidas) elegidos.add(elige(catalogoDelGiro)); + + const items = [...elegidos].flatMap((slug) => { + const p = getProducto(slug); + const precio = PRECIOS_DEMO[slug]; + if (!p || !precio) return []; + return [ + { + productoSlug: p.slug, + nombre: p.nombre, + cantidad: precio > 100_000 ? 1 : precio > 20_000 ? entero(1, 3) : entero(2, 12), + precioUnitario: precio, + }, + ]; + }); + if (items.length === 0) continue; + + const subtotal = + Math.round(items.reduce((s, it) => s + it.cantidad * it.precioUnitario, 0) * 100) / 100; + const iva = Math.round(subtotal * IVA * 100) / 100; + const total = Math.round((subtotal + iva) * 100) / 100; + + const creadoEn = o.cerradoEn ?? o.creadoEn; + const estado = estadosPedido[i % estadosPedido.length]; + + await db.order.create({ + data: { + folio: `PED-${creadoEn.getFullYear()}-${String(i + 1).padStart(4, "0")}`, + oportunidadId: ref.id, + contactoId: idsContacto[o.contacto], + propietarioId: usuarios[o.propietarioIndice].id, + estado, + moneda: "MXN", + subtotal, + iva, + total, + items: JSON.stringify(items), + notas: + estado === "CANCELADO" + ? "Cancelado a solicitud del cliente: reprograma la inversión al siguiente ejercicio." + : `Precios de demostración. Entrega coordinada con ${c.puesto.toLowerCase()} en sitio.`, + entregaEstimada: new Date(creadoEn.getTime() + entero(7, 45) * DIA_MS), + creadoEn, + }, + }); + pedidosCreados += 1; + } + + // 10. contadores alineados con lo sembrado, para que la API siga la serie + await db.counter.create({ data: { name: "oportunidad", valor: enOrden.length } }); + await db.counter.create({ data: { name: "pedido", valor: pedidosCreados } }); + + // 11. resumen + const [nContactos, nOportunidades, nActividades, nPedidos] = await Promise.all([ + db.contact.count(), + db.opportunity.count(), + db.activity.count(), + db.order.count(), + ]); + + const repetidores = ( + await db.contact.findMany({ select: { _count: { select: { oportunidades: true } } } }) + ).filter((c) => c._count.oportunidades > 1).length; + + console.info( + [ + "", + "Base de demostración sembrada.", + ` Contactos: ${nContactos} (${repetidores} con más de una oportunidad)`, + ` Oportunidades: ${nOportunidades} Actividades: ${nActividades} Pedidos: ${nPedidos}`, + "", + "Acceso al panel en /admin/login — contraseña de todos los perfiles: Fspm2026!", + ...usuariosPlan.map((u) => ` ${u.rol.padEnd(8)} ${u.email}`), + "", + "El acceso rápido de un clic se apaga con DEMO_ACCESO_RAPIDO=false.", + "", + ].join("\n"), + ); +} + +main() + .catch((error: unknown) => { + console.error("El seed falló:", error); + process.exitCode = 1; + }) + .finally(async () => { + await db.$disconnect(); + }); diff --git a/src/app/(sitio)/aviso-de-privacidad/page.tsx b/src/app/(sitio)/aviso-de-privacidad/page.tsx new file mode 100644 index 0000000..ed2b54b --- /dev/null +++ b/src/app/(sitio)/aviso-de-privacidad/page.tsx @@ -0,0 +1,316 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { AVISO_DEMO, EMPRESA, SITIO_URL } from "@/data/empresa"; + +/** + * /aviso-de-privacidad + * + * Reproduce, reordenado para poder leerse, el aviso publicado por FSPM en su + * sitio público, más una sección que declara qué recaba realmente el formulario + * de esta demo. Lo que no estaba en la fuente no se agregó, y la versión + * definitiva es siempre la que publique la empresa. + */ + +const TITULO = "Aviso de privacidad"; +const DESCRIPCION = `Aviso de privacidad de ${EMPRESA.razonSocial}: responsable, finalidades del tratamiento, transferencias, medidas de seguridad y ejercicio de derechos ARCO.`; + +export const metadata: Metadata = { + title: TITULO, + description: DESCRIPCION, + alternates: { canonical: `${SITIO_URL}/aviso-de-privacidad` }, + robots: { index: true, follow: true }, + openGraph: { + title: `${TITULO} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + url: `${SITIO_URL}/aviso-de-privacidad`, + }, +}; + +const CORREO_ARCO = "asistentedireccion@fspm.com.mx"; + +const CAMPOS_FORMULARIO = [ + { campo: "Nombre", uso: "Identificarte y dirigirnos a ti por tu nombre en el seguimiento." }, + { campo: "Correo electrónico", uso: "Enviarte la respuesta técnica y la propuesta." }, + { campo: "Teléfono", uso: "Contactarte cuando la solicitud requiere una llamada." }, + { campo: "Empresa y puesto", uso: "Entender quién decide y con qué alcance, para no dar una respuesta genérica." }, + { campo: "Ciudad o estado", uso: "Ubicar la instalación y saber qué requisitos locales pueden aplicar." }, + { campo: "Tipo de operación y superficie", uso: "Interpretar el escenario y proponer una configuración." }, + { campo: "Clases de fuego declaradas", uso: "Clasificar el riesgo que tú mismo declaras en el selector." }, + { campo: "Urgencia y mensaje", uso: "Priorizar la atención y conocer el requerimiento en tus palabras." }, + { + campo: "Datos de origen de la visita", + uso: "Saber por qué campaña o página llegaste, para medir qué contenido resuelve dudas reales.", + }, +]; + +export default function PaginaAviso() { + return ( + <> + {/* ---------- encabezado ---------- */} +
+
+ + +
+

Documento legal

+

+ Aviso de privacidad +

+

+ Reproducción del aviso publicado por {EMPRESA.razonSocial}, reordenado para poder + leerse. La versión vigente y definitiva es la que la empresa publique en su propio + sitio. +

+
+ +
+

+ Sobre este sitio +

+

{AVISO_DEMO}

+
+
+
+ + {/* ---------- el aviso ---------- */} +
+
+
+
+

+ 1. Responsable del tratamiento +

+
+

+ {EMPRESA.razonSocial} ({EMPRESA.nombreCorto}), empresa legalmente constituida + conforme a las leyes de la República Mexicana, con domicilio en Avenida Instituto + Técnico Industrial número 11, Colonia {EMPRESA.colonia}, Alcaldía Cuauhtémoc, C.P. + 06400, {EMPRESA.ciudad}. +

+

+ {EMPRESA.nombreCorto} será el responsable del tratamiento que, con motivo de la + relación jurídica que haya sido celebrada y para el cumplimiento de la misma, se le + dé a tus datos personales. +

+

+ En cumplimiento de la Ley Federal de Protección de Datos Personales en Posesión de + los Particulares, pone a tu disposición el presente aviso para hacer de tu + conocimiento que los datos personales que nos proporciones, incluso aquellos + sensibles y patrimoniales o financieros, serán tratados dentro de un marco que + garantice su privacidad y el derecho a la autodeterminación informativa de las + personas. +

+
+
+ +
+ +
+

+ 2. Qué datos recaba este sitio +

+

+ Esta sección no viene del aviso original: describe exactamente lo que pide el + formulario de este sitio, para que sepas qué estás enviando antes de enviarlo. +

+ +
+ + + + + + + + + + {CAMPOS_FORMULARIO.map((fila) => ( + + + + + ))} + +
+ Campos del formulario de contacto y para qué se usa cada uno. +
+ Dato + + Para qué se usa +
+ + {fila.campo} + + + {fila.uso} +
+
+ +

+ El formulario no pide datos de tarjeta, contraseñas ni información financiera. Si + necesitas compartir documentación sensible de tu operación, acuérdalo por correo + antes de enviarla. +

+
+ +
+ +
+

+ 3. Finalidades del tratamiento +

+
+

+ Tus datos personales, incluso aquellos sensibles y patrimoniales o financieros, + serán utilizados para las siguientes finalidades: identificarte, localizarte, + contactarte, así como para cumplir las obligaciones derivadas de la relación + celebrada contigo, y cualquier otro fin compatible o análogo de los aquí + establecidos. +

+

+ Esto incluye enviar, por cualquier medio físico, electrónico o magnético, de manera + enunciativa mas no limitativa: invitación a reuniones de trabajo, minutas, noticias + y anuncios en general relacionados con la institución, campañas publicitarias + afines e invitación a eventos. +

+
+
+ +
+ +
+

+ 4. Transferencias +

+

+ Queda convenido que aceptas la transferencia que {EMPRESA.nombreCorto} pudiera + realizar a sus asociados y a terceros, en cumplimiento de las finalidades + anteriormente descritas. +

+
+ +
+ +
+

+ 5. Medidas de seguridad +

+

+ Con el objeto de limitar el uso y divulgación de tus datos personales, se mantienen + medidas de seguridad administrativas, técnicas y físicas para evitar su daño, + pérdida, alteración, destrucción, uso, acceso o divulgación indebida. +

+
+ +
+ +
+

+ 6. Excepciones al consentimiento +

+

+ {EMPRESA.nombreCorto} no requerirá el consentimiento del titular para tratar datos + personales cuando lo haga con fundamento en lo dispuesto por la Ley Federal de + Protección de Datos Personales en Posesión de los Particulares. +

+
+ +
+ +
+

+ 7. Derechos de acceso, rectificación, cancelación y oposición +

+
+

+ El ejercicio de los derechos de Acceso, Rectificación, Cancelación y Oposición + respecto de tus datos personales, así como la revocación del consentimiento para su + tratamiento, podrá realizarse a través de los procedimientos implementados o + solicitándolo al siguiente correo electrónico: +

+

+ + {CORREO_ARCO} + +

+
+
+ +
+ +
+

+ 8. Cambios al aviso +

+

+ {EMPRESA.nombreCorto} podrá enmendar o modificar el presente aviso de privacidad como + lo estime conveniente, e informará y pondrá a tu disposición el aviso actualizado en + su sitio web. +

+
+ +
+ +
+

+ 9. Contacto +

+
+
+
Teléfono
+
+ + {EMPRESA.telefono} + +
+
+
+
Correo general
+
+ + {EMPRESA.correo} + +
+
+
+ +

+ Si detectas una diferencia entre este texto y el aviso publicado por la empresa, + prevalece el de la empresa.{" "} + + Avísanos + {" "} + y lo corregimos. +

+
+
+
+
+ + ); +} diff --git a/src/app/(sitio)/casos/page.tsx b/src/app/(sitio)/casos/page.tsx new file mode 100644 index 0000000..c9515c8 --- /dev/null +++ b/src/app/(sitio)/casos/page.tsx @@ -0,0 +1,443 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { RielClases } from "@/components/marca/RielClases"; +import { Revelar } from "@/components/site/Revelar"; +import { getCategoria } from "@/data/catalogo"; +import type { ClaseFuego } from "@/data/clases-fuego"; +import { EMPRESA, SITIO_URL } from "@/data/empresa"; +import { getIndustria } from "@/data/industrias"; + +/** + * /casos — escenarios de aplicación con la estructura que pide el estudio: + * problema → riesgo → solución → prueba → resultado → documentación. + * + * REGLA DURA: son escenarios construidos con fines de demostración. No + * corresponden a clientes reales, no llevan nombres de empresa y no presentan + * cifras como si fueran mediciones. El aviso va arriba, no en una nota al pie. + */ + +const TITULO = "Casos de aplicación"; +const DESCRIPCION = + "Cuatro escenarios ilustrativos de protección contra incendios con la estructura problema, riesgo, solución, prueba, resultado y documentación. Construidos con fines de demostración."; + +export const metadata: Metadata = { + title: TITULO, + description: DESCRIPCION, + alternates: { canonical: `${SITIO_URL}/casos` }, + openGraph: { + title: `${TITULO} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + url: `${SITIO_URL}/casos`, + }, +}; + +type Caso = { + id: string; + industriaSlug: string; + titulo: string; + escenario: string; + clases: ClaseFuego[]; + categorias: string[]; + problema: string; + riesgo: string; + solucion: string[]; + prueba: string; + resultado: string[]; + documentacion: string[]; +}; + +const CASOS: Caso[] = [ + { + id: "trasvase", + industriaSlug: "industria-energia", + titulo: "Patio de trasvase de solventes en una planta química", + escenario: "Escenario ilustrativo · Planta química, patio de trasvase con contención secundaria", + clases: ["A", "B", "C"], + categorias: ["agentes-extinguidores", "productos-moviles"], + problema: + "El patio de trasvase concentra el riesgo más alto de la planta y está a más de cien metros de la caseta de seguridad. La respuesta disponible es equipo portátil montado en pared, pensado para un conato de oficina, no para un derrame inflamado con producto a presión.", + riesgo: + "Un derrame encendido en contención secundaria no da minutos: escala en segundos y compromete el resto del patio. El costo real no es el equipo perdido, es el paro de línea, la investigación posterior y la renovación de la póliza.", + solucion: [ + "Diagnóstico por zona con inventario de combustibles y volúmenes reales de operación.", + "Equipo móvil de mayor capacidad posicionado a distancia de recorrido, no a distancia en línea recta.", + "Selección del agente por tipo de combustible, incluida la condición de alcoholes si hay producto polar.", + "Capacitación de la brigada del turno que efectivamente está en el patio de noche.", + ], + prueba: + "Demostración con fuego controlado del mismo combustible que se maneja en el patio, operada por el personal del turno y no por un instructor. Se mide el tiempo desde la alarma hasta la primera aplicación de agente y se identifica en qué punto del recorrido se pierde tiempo.", + resultado: [ + "Queda documentado cuánto tarda hoy la primera respuesta en el punto más lejano, que es el dato que la operación no tenía.", + "El reposicionamiento del equipo se decide con el recorrido cronometrado, no con un plano.", + "La brigada opera el equipo por primera vez antes del incidente, no durante.", + ], + documentacion: [ + "Memoria del diagnóstico por zona con inventario de combustibles.", + "Ficha técnica y hoja de datos de seguridad del agente seleccionado.", + "Registro de la demostración con fecha, participantes y tiempos observados.", + "Constancia de capacitación por persona y turno.", + ], + }, + { + id: "bodega", + industriaSlug: "logistica-bodegas", + titulo: "Nave de almacenamiento con carga combustible y montacargas eléctricos", + escenario: "Escenario ilustrativo · Centro logístico, nave única con racks de gran altura", + clases: ["A", "B", "C"], + categorias: ["extintores-portatiles", "rociadores"], + problema: + "La nave tiene extintores suficientes en el conteo, pero el riesgo cambia de pasillo a pasillo: producto terminado en cartón, un área de carga de baterías de montacargas y una zona de residuos al fondo. El equipo está distribuido de forma uniforme sobre un riesgo que no es uniforme.", + riesgo: + "El área de carga de baterías introduce riesgo eléctrico dentro de una nave de carga combustible, y la zona de residuos genera reencendido cuando se ataca con un agente que apaga la llama pero deja brasa. Una sola ruta de salida agrava cualquier retraso.", + solucion: [ + "Mapa de riesgo por zona, con la altura de almacenamiento y el tipo de carga de cada pasillo.", + "Redistribución del equipo por distancia real de recorrido del operador, no por metros cuadrados.", + "Solución de activación automática en las zonas de mayor acumulación y en el área de carga de baterías.", + "Programa de inspección mensual con responsable nombrado y bitácora por equipo.", + ], + prueba: + "Recorrido cronometrado desde el punto más desfavorable de cada zona hasta el equipo más cercano, con un operador de piso y no con personal de seguridad. Verificación de que cada equipo corresponde a la clase de fuego de su zona.", + resultado: [ + "Se identifican las zonas donde el equipo existente no corresponde a la clase de fuego presente.", + "La distribución deja de basarse en el conteo total y empieza a basarse en el recorrido.", + "La inspección mensual pasa de ser una intención a tener nombre, formato y fecha.", + ], + documentacion: [ + "Mapa de riesgo por zona con la clasificación aplicada.", + "Inventario de equipo con ubicación, clase y capacidad.", + "Bitácora de revisión mensual con responsable asignado.", + "Constancia de instalación y puesta en marcha de las soluciones automáticas.", + ], + }, + { + id: "gasolinera", + industriaSlug: "gasolineras-flotas", + titulo: "Estación de servicio con público en isla y autotanques en patio", + escenario: "Escenario ilustrativo · Estación de servicio urbana con seis posiciones de carga", + clases: ["A", "B", "C"], + categorias: ["productos-moviles", "extintores-portatiles"], + problema: + "La primera respuesta la da el despachador de turno, no un bombero. El equipo instalado requiere una secuencia de operación que nadie del personal ha practicado, y en la isla hay clientes a pocos metros del punto de carga.", + riesgo: + "Un fuego de hidrocarburo en isla con público presente convierte cualquier duda de operación en un problema de evacuación. Aplicar agua a chorro sobre combustible derramado esparce el fuego en lugar de contenerlo.", + solucion: [ + "Equipo operable en el primer intento por personal sin entrenamiento profundo, en isla y en patio.", + "Agente adecuado para hidrocarburos, con la condición de aplicación declarada por escrito.", + "Entrenamiento del personal de los tres turnos, no solo del encargado.", + "Procedimiento de respuesta y control de derrame colocado donde ocurre el incidente.", + ], + prueba: + "Práctica con fuego controlado en la que cada despachador opera el equipo una vez, sin asistencia. Se registra quién completó la secuencia y quién no, y se repite hasta que todos la completan.", + resultado: [ + "Queda constancia nominal de quién puede operar el equipo y quién todavía no.", + "El procedimiento deja de vivir en una carpeta y queda colocado en la isla.", + "Se documenta la selección del agente frente a los combustibles que la estación despacha.", + ], + documentacion: [ + "Ficha técnica del equipo y hoja de datos de seguridad del agente.", + "Procedimiento de respuesta y control de derrame, firmado por el responsable de la estación.", + "Constancias de capacitación por persona y turno.", + "Requisitos adicionales de Protección Civil municipal, cuando la autoridad local los establezca.", + ], + }, + { + id: "cocina", + industriaSlug: "cocinas-hoteles", + titulo: "Cocina de hotel con freidoras bajo una sola campana", + escenario: "Escenario ilustrativo · Hotel de servicio completo, cocina central y comedor", + clases: ["A", "B", "K"], + categorias: ["rociadores", "extintores-portatiles"], + problema: + "Bajo la misma campana conviven varias freidoras y planchas. El equipo colgado en la pared no está calificado para fuego de aceite y grasa a temperatura de fritura, y el ducto de extracción acumula grasa entre limpiezas.", + riesgo: + "Aplicar agua sobre aceite hirviendo provoca proyección violenta de grasa encendida sobre quien opera el equipo. Además del riesgo a la persona, un incidente en campana y ducto detiene el servicio de alimentos y arrastra la ocupación del hotel.", + solucion: [ + "Solución específica por cocina, con atención separada a campana y ducto.", + "Equipo apto para clase K en la línea de fritura, con su condición de aplicación documentada.", + "Demostración con el personal que realmente opera de noche, incluido el turno de cierre.", + "Procedimiento posterior al incidente para reanudar el servicio sin improvisar.", + ], + prueba: + "Demostración de fuego de aceite en condiciones controladas, con el personal de cocina operando. Verificación de que la limpieza del ducto está registrada y de que el registro corresponde a lo que se observa en el ducto.", + resultado: [ + "El equipo genérico de la pared se sustituye o se complementa con lo que sí aplica a clase K.", + "El personal de cierre sabe qué hacer y qué no hacer con el aceite encendido.", + "La reanudación del servicio queda escrita antes de necesitarla, no después.", + ], + documentacion: [ + "Ficha técnica del equipo apto para clase K y condiciones de aplicación.", + "Registro de limpieza de campanas y ductos con fecha y responsable.", + "Procedimiento posterior al incidente y de reanudación del servicio.", + "Constancias de capacitación del personal de cocina por turno.", + ], + }, +]; + +export default function PaginaCasos() { + return ( + <> + {/* ---------- encabezado con el aviso destacado arriba ---------- */} +
+
+ + + {/* el aviso va antes del contenido, no al final */} +
+ + +
+

Casos de aplicación

+

+ Seis pasos que convierten una compra en un expediente +

+

+ Problema, riesgo, solución, prueba, resultado y documentación. Es la estructura que + recomienda el estudio de marca y también el orden en el que conviene trabajar: cuando + la prueba se hace antes de la compra, la documentación deja de ser un trámite y se + vuelve la constancia de algo que sí ocurrió. +

+
+
+
+ + {/* ---------- los casos ---------- */} + {CASOS.map((caso, indice) => { + const industria = getIndustria(caso.industriaSlug); + const claro = indice % 2 === 0; + + return ( +
+
+
+ {/* identificación del caso */} + +

+ Caso {String(indice + 1).padStart(2, "0")} de {CASOS.length} +

+ +

+ {caso.titulo} +

+ +

+ {caso.escenario} +

+ +
+ +
+ +
    + {caso.categorias.map((slug) => { + const categoria = getCategoria(slug); + if (!categoria) return null; + return ( +
  • + + {categoria.nombre} + +
  • + ); + })} +
+ + {industria ? ( + + Segmento: {industria.nombre} → + + ) : null} +
+ + {/* los seis pasos */} +
+ +

{caso.problema}

+
+ + +

{caso.riesgo}

+
+ + + + + + +

{caso.prueba}

+
+ + + +

+ Resultados descritos de forma cualitativa: este escenario no tiene mediciones + reales que reportar. +

+
+ + + + +
+
+
+
+ ); + })} + + {/* ---------- cierre ---------- */} +
+
+
+ +

Sobre los casos reales

+

+ Por qué todavía no publicamos casos con nombre +

+
+

+ Un caso de estudio requiere autorización del cliente sobre qué se puede contar, qué + periodo cubre y qué cifras se pueden publicar. Mientras eso no exista por escrito, + preferimos escenarios rotulados como estos antes que atribuir un resultado a una marca + que no lo ha confirmado. +

+
+ + Plantear tu escenario + + + Ver el centro de evidencia + +
+
+
+
+ + ); +} + +function parrafo(claro: boolean): string { + return [ + "text-sm leading-relaxed sm:text-base", + claro ? "text-deep-muted" : "text-muted", + ].join(" "); +} + +function Paso({ + n, + titulo, + claro, + acento = false, + children, +}: { + n: string; + titulo: string; + claro: boolean; + acento?: boolean; + children: React.ReactNode; +}) { + return ( +
+

+ {n} · {titulo} +

+
{children}
+
+ ); +} + +function Lista({ elementos, claro }: { elementos: string[]; claro: boolean }) { + return ( +
    + {elementos.map((elemento) => ( +
  • +
  • + ))} +
+ ); +} diff --git a/src/app/(sitio)/catalogo/[categoria]/page.tsx b/src/app/(sitio)/catalogo/[categoria]/page.tsx new file mode 100644 index 0000000..c45407b --- /dev/null +++ b/src/app/(sitio)/catalogo/[categoria]/page.tsx @@ -0,0 +1,277 @@ +import type { Metadata } from "next"; +import Image from "next/image"; +import Link from "next/link"; +import { notFound } from "next/navigation"; +import { FormularioContacto } from "@/components/formulario/FormularioContacto"; +import { Revelar } from "@/components/site/Revelar"; +import { TarjetaProducto } from "@/components/site/catalogo/TarjetaProducto"; +import { iconoDeAplicacion } from "@/components/site/catalogo/iconos"; +import { CATEGORIAS, getCategoria, productosDeCategoria } from "@/data/catalogo"; +import type { ClaseFuego } from "@/data/clases-fuego"; +import { SITIO_URL } from "@/data/empresa"; +import { INDUSTRIAS } from "@/data/industrias"; + +/** + * /catalogo/[categoria] — las ocho rutas que el sitio original no tenía. + * + * Además de los productos, la página cruza con los segmentos prioritarios del + * estudio: si esta categoría aparece en el paquete recomendado de una + * industria, se enlaza. Es lo que convierte un catálogo en una ruta de compra. + */ + +type Props = { params: Promise<{ categoria: string }> }; + +export function generateStaticParams(): Array<{ categoria: string }> { + return CATEGORIAS.map((c) => ({ categoria: c.slug })); +} + +export async function generateMetadata({ params }: Props): Promise { + const { categoria: slug } = await params; + const categoria = getCategoria(slug); + + if (!categoria) { + return { title: "Categoría no encontrada" }; + } + + const url = `${SITIO_URL}/catalogo/${categoria.slug}`; + const descripcion = `${categoria.tagline} ${productosDeCategoria(categoria.slug).length} equipos con clases de fuego, capacidad y agente declarados.`; + + return { + title: categoria.nombre, + description: descripcion, + alternates: { canonical: url }, + openGraph: { + title: `${categoria.nombre} | Catálogo FSPM`, + description: descripcion, + url, + images: [{ url: categoria.imagen }], + }, + }; +} + +export default async function PaginaCategoria({ params }: Props) { + const { categoria: slug } = await params; + const categoria = getCategoria(slug); + + if (!categoria) notFound(); + + const productos = productosDeCategoria(categoria.slug); + const industrias = INDUSTRIAS.filter((i) => i.categorias.includes(categoria.slug)); + + // clases que realmente cubre algún producto de la categoría + const clases = Array.from( + new Set(productos.flatMap((p) => p.clases)), + ) as ClaseFuego[]; + + const otras = CATEGORIAS.filter((c) => c.slug !== categoria.slug); + + return ( + <> + {/* ---------- encabezado de categoría ---------- */} +
+
+ + +
+
+

+ Categoría {String(categoria.orden).padStart(2, "0")} de {CATEGORIAS.length} +

+

+ {categoria.nombre} +

+

+ {categoria.tagline} +

+

+ {categoria.descripcion} +

+ +
+
+
Equipos en la categoría
+
{productos.length}
+
+
+
Clases declaradas
+
{clases.length > 0 ? clases.join(" · ") : "No aplica"}
+
+
+
+ +
+ {categoria.nombre} +
+
+
+
+ + {/* ---------- aplicaciones ---------- */} +
+
+

+ Dónde la ubica la fuente +

+
    + {categoria.aplicaciones.map((aplicacion) => { + const icono = iconoDeAplicacion(aplicacion); + return ( +
  • + {icono ? ( + + ) : null} + + {aplicacion} + +
  • + ); + })} +
+

+ Las aplicaciones provienen de la información pública de FSPM. La selección final depende + del escenario real: material, superficie, personal y nivel de riesgo del centro de + trabajo. +

+
+
+ + {/* ---------- productos de la categoría ---------- */} +
+
+ +

Equipos

+

+ {productos.length === 1 + ? "El equipo de esta categoría" + : `Los ${productos.length} equipos de esta categoría`} +

+
+ +
+ {productos.map((producto) => ( + + ))} +
+
+
+ + {/* ---------- cruce con industrias ---------- */} + {industrias.length > 0 ? ( +
+
+ +

Dónde aplica

+

+ Segmentos donde esta categoría forma parte del paquete +

+

+ Un equipo aislado rara vez resuelve una instalación. Estas son las operaciones donde + {" "} + {categoria.nombre.toLowerCase()} entra dentro de una configuración más amplia. +

+
+ +
    + {industrias.map((industria) => ( +
  • + +

    + {industria.nombre} +

    +

    {industria.dolor}

    + + Ver la solución → + + +
  • + ))} +
+
+
+ ) : null} + + {/* ---------- formulario ---------- */} +
+
+
+
+ +

Cotizar esta categoría

+

+ Cuéntanos la instalación y te decimos cuál de estos equipos aplica +

+

+ Y también cuál no. Descartar un equipo que no corresponde ahorra más dinero que un + descuento. +

+
+ +
+ +

+ Otras categorías +

+
    + {otras.map((c) => ( +
  • + + {c.nombre} + +
  • + ))} +
+
+ + +
+
+
+ + ); +} diff --git a/src/app/(sitio)/catalogo/page.tsx b/src/app/(sitio)/catalogo/page.tsx new file mode 100644 index 0000000..5ef32c5 --- /dev/null +++ b/src/app/(sitio)/catalogo/page.tsx @@ -0,0 +1,240 @@ +import type { Metadata } from "next"; +import Image from "next/image"; +import Link from "next/link"; +import { FormularioContacto } from "@/components/formulario/FormularioContacto"; +import { Revelar } from "@/components/site/Revelar"; +import { ExploradorCatalogo } from "@/components/site/catalogo/ExploradorCatalogo"; +import { CATEGORIAS, PRODUCTOS, productosDeCategoria } from "@/data/catalogo"; +import { CLASES_ORDENADAS } from "@/data/clases-fuego"; +import { SITIO_URL } from "@/data/empresa"; + +/** + * /catalogo — la corrección directa al hallazgo 5.1 del estudio: ocho + * categorías sin rutas por riesgo ni aplicación. + * + * No es una galería de producto. Es un comparador: se entra por clase de fuego + * y por aplicación, y se sale con dos o tres equipos que descartar o cotizar. + */ + +const TITULO = "Catálogo de equipos y agentes contra incendio"; +const DESCRIPCION = + "Compara los 22 equipos y agentes de FSPM por clase de fuego, capacidad, agente y alcance declarado. Filtra por el riesgo que tienes, no por el nombre del producto."; + +export const metadata: Metadata = { + title: TITULO, + description: DESCRIPCION, + alternates: { canonical: `${SITIO_URL}/catalogo` }, + openGraph: { + title: TITULO, + description: DESCRIPCION, + url: `${SITIO_URL}/catalogo`, + }, +}; + +export default function PaginaCatalogo() { + const resumen = [ + { clave: "Categorías", valor: String(CATEGORIAS.length) }, + { clave: "Equipos y agentes", valor: String(PRODUCTOS.length) }, + { clave: "Clases de fuego", valor: `${CLASES_ORDENADAS.length} · A B C D K` }, + ]; + + return ( + <> + {/* ---------- encabezado: la lógica de lectura del catálogo ---------- */} +
+
+ + +
+
+

Catálogo técnico

+

+ Un catálogo se lee por clase de fuego, no por nombre de producto +

+

+ Nadie compra «un extintor». Se compra la respuesta a un escenario: qué + se está quemando, dónde, quién va a operar el equipo y qué documentación tiene que + quedar en el expediente. Este catálogo está ordenado en ese sentido. +

+ +
+ {resumen.map((r) => ( +
+
{r.clave}
+
{r.valor}
+
+ ))} +
+ +
+ + Solicitar diagnóstico + + + Ver qué documentación aplica + +
+
+ + {/* cómo elegir: el criterio, no el producto */} + +
+
+
+ + {/* ---------- filtros + tabla comparativa ---------- */} + + + {/* ---------- las 8 categorías con su tagline ---------- */} +
+
+ +

Ocho categorías

+

+ Cada categoría responde a una forma distinta de llegar al fuego +

+

+ Portátil, móvil, fijo, automático o el agente por separado. La diferencia no es de + gama: es de quién opera, en cuánto tiempo y con qué instalación. +

+
+ +
    + {CATEGORIAS.map((categoria) => { + const cuantos = productosDeCategoria(categoria.slug).length; + return ( +
  • + +
    + {categoria.nombre} +
    +
    +
    +

    + {categoria.nombre} +

    + + {cuantos} {cuantos === 1 ? "equipo" : "equipos"} + +
    +

    {categoria.tagline}

    + + Ver la categoría → + +
    + +
  • + ); + })} +
+
+
+ + {/* ---------- formulario embebido: requisito del cliente ---------- */} +
+
+
+
+ +

Siguiente paso

+

+ Dinos qué hay que proteger y te devolvemos la selección, no un folleto +

+

+ Con la clase de fuego, la superficie y quién opera el equipo alcanza para proponer + una configuración y decirte qué documentación te corresponde exigir. Sin costo y sin + compromiso de compra. +

+
+ +
    + {[ + "Selección de equipo y agente por escenario, no por catálogo completo.", + "Índice de la documentación que debe acompañar la compra.", + "Referencia de lo que la NOM-002 exige según tu nivel de riesgo.", + ].map((punto) => ( +
  • +
  • + ))} +
+
+ + +
+
+
+ + ); +} diff --git a/src/app/(sitio)/contacto/page.tsx b/src/app/(sitio)/contacto/page.tsx new file mode 100644 index 0000000..f08e0b2 --- /dev/null +++ b/src/app/(sitio)/contacto/page.tsx @@ -0,0 +1,248 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { FormularioContacto } from "@/components/formulario/FormularioContacto"; +import { Revelar } from "@/components/site/Revelar"; +import { EMPRESA, SITIO_URL, WHATSAPP } from "@/data/empresa"; + +/** + * /contacto + * + * Solo datos verificados: teléfono, correo, ciudad y colonia. No hay horario de + * atención, ni domicilio con número, ni mapa: nada de eso está confirmado, y + * una dirección equivocada en un sitio de protección contra incendios es un + * problema real, no un detalle. + */ + +const TITULO = "Contacto"; +const DESCRIPCION = `Habla con ${EMPRESA.nombre}. Teléfono, correo y solicitud de diagnóstico para operaciones que necesitan protección contra incendios documentada.`; + +export const metadata: Metadata = { + title: TITULO, + description: DESCRIPCION, + alternates: { canonical: `${SITIO_URL}/contacto` }, + openGraph: { + title: `${TITULO} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + url: `${SITIO_URL}/contacto`, + }, +}; + +const MENSAJE_WHATSAPP = encodeURIComponent( + "Hola, me gustaría información sobre protección contra incendios.", +); + +export default function PaginaContacto() { + return ( + <> + {/* ---------- encabezado ---------- */} +
+
+ + +
+

Contacto

+

+ Si tu situación no puede esperar, marca +

+

+ Para todo lo demás, el formulario sirve mejor: llega con la clase de fuego, la + superficie y el tipo de operación, así que la primera respuesta puede ser técnica en + lugar de una pregunta de vuelta. +

+
+
+
+ + {/* ---------- datos verificados ---------- */} +
+
+

+ Datos de contacto +

+ + + +

+ Publicamos únicamente los datos que pudimos verificar en la información pública de la + empresa. Si necesitas domicilio fiscal, horario de atención o una visita presencial, + pídelos por cualquiera de estos medios y te los confirmamos por escrito. +

+
+
+ + {/* ---------- formulario completo ---------- */} +
+
+
+
+ +

Solicitud

+

+ Qué pasa cuando envías el formulario +

+
+ +
    + {[ + { + n: "01", + t: "Se registra con folio", + d: "Recibes un folio en pantalla. Tu solicitud queda asignada a una persona, no a un buzón compartido.", + }, + { + n: "02", + t: "Se interpreta el escenario", + d: "Con la clase de fuego, la superficie y el tipo de operación que declaraste, alguien revisa qué configuración aplica y qué habría que descartar.", + }, + { + n: "03", + t: "Respondemos con documentación, no con folleto", + d: "La respuesta incluye la selección propuesta y el índice de documentos que debería acompañarla. Si algo no podemos sostener por escrito, va dicho ahí.", + }, + ].map((paso) => ( +
  1. + + {paso.n} + +
    +

    + {paso.t} +

    +

    {paso.d}

    +
    +
  2. + ))} +
+ +
+ +

+ Antes de escribir, quizá ya está respondido +

+
    + {[ + { href: "/preguntas-frecuentes", label: "Preguntas frecuentes" }, + { href: "/cumplimiento-nom-002", label: "Cumplimiento NOM-002" }, + { href: "/evidencia", label: "Centro de evidencia" }, + { href: "/catalogo", label: "Catálogo" }, + ].map((enlace) => ( +
  • + + {enlace.label} + +
  • + ))} +
+ +

+ Redes +

+
    + {[ + { url: EMPRESA.redes.linkedin, label: "LinkedIn" }, + { url: EMPRESA.redes.facebook, label: "Facebook" }, + { url: EMPRESA.redes.youtube, label: "YouTube" }, + ].map((red) => ( +
  • + + {red.label} + +
  • + ))} +
+
+ + +
+
+
+ + ); +} diff --git a/src/app/(sitio)/cumplimiento-nom-002/page.tsx b/src/app/(sitio)/cumplimiento-nom-002/page.tsx new file mode 100644 index 0000000..5fd636b --- /dev/null +++ b/src/app/(sitio)/cumplimiento-nom-002/page.tsx @@ -0,0 +1,453 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { FormularioContacto } from "@/components/formulario/FormularioContacto"; +import { Revelar } from "@/components/site/Revelar"; +import { EMPRESA, NORMAS, SITIO_URL } from "@/data/empresa"; +import { INDUSTRIAS } from "@/data/industrias"; + +/** + * /cumplimiento-nom-002 — página de intención de búsqueda alta. + * + * Regla del contenido: no se citan artículos, umbrales ni plazos que no estén + * en src/data/empresa.ts o en la fuente pública. Lo que no está verificado se + * declara como no reproducido, no se estima. + */ + +const TITULO = "Cumplimiento NOM-002-STPS-2010"; +const DESCRIPCION = + "Qué exige la NOM-002-STPS-2010 a un centro de trabajo, qué documentación se acumula y cómo se ve un expediente completo. Referencia orientativa, no dictamen técnico ni jurídico."; + +export const metadata: Metadata = { + title: TITULO, + description: DESCRIPCION, + alternates: { canonical: `${SITIO_URL}/cumplimiento-nom-002` }, + openGraph: { + title: `${TITULO} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + url: `${SITIO_URL}/cumplimiento-nom-002`, + }, +}; + +const AVISO_ALCANCE = + "Esta página es una referencia orientativa construida con información pública. La normativa puede actualizarse y complementarse por estado, municipio, tipo de instalación y autoridad competente. No sustituye un dictamen técnico ni una opinión jurídica."; + +/** Elementos que la norma contempla, según la referencia de NORMAS. */ +const ELEMENTOS = [ + { + n: "01", + titulo: "Clasificación del riesgo de incendio", + detalle: + "Es el primer paso y condiciona todo lo demás. De la clasificación depende qué equipo, qué sistemas y qué plan te corresponden. Se determina con el procedimiento de la propia norma; los umbrales no se reproducen aquí porque dependen del material y de la superficie de cada centro de trabajo.", + }, + { + n: "02", + titulo: "Equipo contra incendio", + detalle: + "Extintores disponibles, accesibles y señalizados, seleccionados según la clase de fuego presente en cada área. El equipo correcto en el lugar equivocado no cumple.", + }, + { + n: "03", + titulo: "Sistemas fijos y de alarma", + detalle: + "Según el nivel de riesgo, el centro de trabajo puede requerir sistemas fijos de supresión y medios de detección y alarma, no solo equipo portátil.", + }, + { + n: "04", + titulo: "Plan de atención a emergencias", + detalle: + "Documento por escrito. Es lo primero que se pide en una verificación y lo que más frecuentemente no existe o está desactualizado.", + }, + { + n: "05", + titulo: "Brigadas y capacitación", + detalle: + "Personal designado, entrenado y con constancia. La capacitación sin registro documental no es demostrable ante una autoridad.", + }, + { + n: "06", + titulo: "Simulacros", + detalle: + "Ejecutados y documentados. El registro del simulacro es evidencia tanto del plan como de la capacitación.", + }, +]; + +const EXPEDIENTE = [ + { + documento: "Clasificación de riesgo de incendio", + quePrueba: "Que el nivel de exigencia aplicado al centro de trabajo es el correcto.", + quienLoPide: "Verificación STPS, Protección Civil, aseguradora", + }, + { + documento: "Plan de atención a emergencias", + quePrueba: "Que existe un procedimiento escrito y vigente para el escenario.", + quienLoPide: "Verificación STPS, Protección Civil", + }, + { + documento: "Inventario y ubicación del equipo", + quePrueba: "Qué hay instalado, dónde, de qué clase y con qué capacidad.", + quienLoPide: "Verificación STPS, auditoría interna", + }, + { + documento: "Ficha técnica y certificado por modelo", + quePrueba: "Que el equipo instalado es el que se declara y cubre las clases que se afirman.", + quienLoPide: "Auditoría, aseguradora, cliente corporativo", + }, + { + documento: "Hoja de datos de seguridad del agente", + quePrueba: "Manejo, almacenamiento y respuesta ante exposición del agente extintor.", + quienLoPide: "Seguridad industrial, ambiental, auditoría", + }, + { + documento: "Bitácora de revisión mensual", + quePrueba: "Que la revisión de extintores se realiza con la periodicidad debida.", + quienLoPide: "Verificación STPS, Protección Civil", + }, + { + documento: "Constancias de capacitación y brigadas", + quePrueba: "Que hay personal designado y entrenado, con nombre y fecha.", + quienLoPide: "Verificación STPS", + }, + { + documento: "Registro de simulacros", + quePrueba: "Que el plan se ejecuta y se corrige con lo aprendido.", + quienLoPide: "Verificación STPS, Protección Civil", + }, +]; + +export default function PaginaCumplimiento() { + return ( + <> + {/* ---------- encabezado con la advertencia de alcance ---------- */} +
+
+ + +
+

Referencia normativa

+

+ Cumplimiento NOM-002: qué te van a pedir y cómo se ve un expediente completo +

+

+ La norma no se cumple comprando extintores. Se cumple demostrando, por escrito, que el + riesgo está clasificado, el equipo corresponde a ese riesgo y el personal sabe qué + hacer. Esta página explica esa lógica y qué documentos la sostienen. +

+
+ +
+

+ Alcance de esta página +

+

{AVISO_ALCANCE}

+
+
+
+ + {/* ---------- a quién aplica ---------- */} +
+
+
+
+ +

A quién aplica

+

+ A todo centro de trabajo, sin mínimo de tamaño +

+

+ {NORMAS[0].aplica} +

+

+ Es la razón por la que una oficina de veinte personas y una planta petroquímica + están bajo la misma norma con obligaciones muy distintas: lo que cambia no es la + norma, es la clasificación del riesgo. +

+
+
+ +
+

+ Dos niveles, dos conversaciones distintas +

+ +
+
+

+ Riesgo ordinario +

+

+ El foco está en tener el equipo correcto, señalizado y revisado, con un plan por + escrito y personal capacitado. La mayoría de las PyMEs y oficinas queda aquí y + el error caro es comprar de más por miedo. +

+
+ +
+

+ Riesgo alto +

+

+ La norma establece requerimientos mayores para los centros clasificados como de + riesgo alto de incendio: la conversación pasa de equipo portátil a sistemas + fijos, detección, brigadas formales y evidencia sostenida en el tiempo. +

+
+
+ +
+ +

+ No reproducimos aquí los umbrales de clasificación: dependen del material y de la + superficie de cada centro de trabajo, y determinarlos mal invalida todo lo que se + construya encima. Ese es el primer punto de un diagnóstico. +

+
+
+
+
+ + {/* ---------- qué contempla la norma ---------- */} +
+
+ +

Qué contempla

+

+ Seis frentes, y ninguno se cierra con una compra +

+

+ Cada uno genera un documento distinto. Un expediente incompleto suele fallar en los + frentes que no se compran: el plan, la capacitación y el registro. +

+
+ +
    + {ELEMENTOS.map((elemento) => ( +
  1. +

    + {elemento.n} +

    +

    + {elemento.titulo} +

    +

    {elemento.detalle}

    +
  2. + ))} +
+ +
+

+ Mantenimiento de extintores +

+

+ {NORMAS[1].aplica} Es la obligación recurrente que más seguido se pierde: no por + desconocerla, sino porque nadie quedó a cargo de la bitácora. +

+
+
+
+ + {/* ---------- el expediente ---------- */} +
+
+ +

Expediente

+

+ Cómo se ve un expediente que aguanta una verificación +

+

+ Ocho documentos. Ninguno es opcional cuando alguien pregunta, y cada uno prueba algo + distinto. +

+
+ +

+ Desliza la tabla para ver todas las columnas +

+ +
+ + + + + {["Documento", "Qué prueba", "Quién lo pide"].map((c) => ( + + ))} + + + + {EXPEDIENTE.map((fila) => ( + + + + + + ))} + +
+ Documentos que integran un expediente de cumplimiento, qué prueba cada uno y quién + lo solicita. +
+ {c} +
+ + {fila.documento} + + + {fila.quePrueba} + + {fila.quienLoPide} +
+
+ +

+ En una compra con nosotros, los documentos que dependen del equipo se entregan por + número de modelo.{" "} + + Ver el índice de documentación por categoría + + . +

+
+
+ + {/* ---------- referencias ---------- */} +
+
+ +

Referencias

+

+ Normas citadas en esta página +

+
+ + + +

+ Los enlaces apuntan al sitio del Diario Oficial de la Federación. Verifica siempre la + versión vigente: la publicación oficial manda sobre cualquier resumen, incluido este. +

+
+
+ + {/* ---------- por industria ---------- */} +
+
+ +

Por operación

+

+ Lo que cambia según dónde trabajas +

+
+
    + {INDUSTRIAS.map((industria) => ( +
  • + +

    + {industria.nombre} +

    +
      + {industria.cumplimiento.map((obligacion) => ( +
    • +
    • + ))} +
    + + Ver el segmento → + + +
  • + ))} +
+
+
+ + {/* ---------- formulario y cierre con la advertencia ---------- */} +
+
+
+
+ +

Siguiente paso

+

+ Validar cumplimiento NOM-002 +

+

+ Revisamos qué tienes, qué te falta y en qué orden conviene resolverlo. Si algo de tu + situación requiere un dictamen formal, te lo decimos en lugar de venderte equipo. +

+
+ +
+

+ Recordatorio de alcance +

+

{AVISO_ALCANCE}

+
+
+ + +
+
+
+ + ); +} diff --git a/src/app/(sitio)/evidencia/page.tsx b/src/app/(sitio)/evidencia/page.tsx new file mode 100644 index 0000000..467f64d --- /dev/null +++ b/src/app/(sitio)/evidencia/page.tsx @@ -0,0 +1,561 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { FormularioContacto } from "@/components/formulario/FormularioContacto"; +import { Revelar } from "@/components/site/Revelar"; +import { CATEGORIAS, PRODUCTOS, productosDeCategoria } from "@/data/catalogo"; +import { EMPRESA, NORMAS, SITIO_URL } from "@/data/empresa"; + +/** + * /evidencia — el centro de evidencia de la recomendación 10.3 del estudio. + * + * Regla que gobierna esta página: en la extracción pública del sitio de FSPM no + * apareció un índice verificable de documentos por modelo. Así que aquí no hay + * un solo botón de descarga. Un botón falso en una demo destruye la + * credibilidad de todo lo demás; decir la verdad sobre el estado del acervo es + * precisamente el argumento comercial. + */ + +const TITULO = "Centro de evidencia técnica"; +const DESCRIPCION = + "Qué documentación corresponde a cada compra de equipo contra incendio, qué aplica por categoría de producto y qué afirmaciones documentamos por número de modelo antes de cotizar."; + +export const metadata: Metadata = { + title: TITULO, + description: DESCRIPCION, + alternates: { canonical: `${SITIO_URL}/evidencia` }, + openGraph: { + title: `${TITULO} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + url: `${SITIO_URL}/evidencia`, + }, +}; + +type DocumentoId = + | "ficha" + | "sds" + | "certificado" + | "garantia" + | "manual" + | "bitacora" + | "instalacion" + | "capacitacion"; + +const DOCUMENTOS: Array<{ id: DocumentoId; nombre: string; corto: string; queEs: string }> = [ + { + id: "ficha", + nombre: "Ficha técnica del modelo", + corto: "Ficha técnica", + queEs: + "El documento que sostiene cada número que aparece en una página de producto: capacidad, agente, clases de fuego con sus condiciones y alcance con las condiciones de la prueba. Si un dato no está en la ficha, no debería estar en la propuesta.", + }, + { + id: "sds", + nombre: "Hoja de datos de seguridad del agente", + corto: "Hoja de seguridad", + queEs: + "Manejo, almacenamiento, incompatibilidades y respuesta ante exposición. Es el documento que pide seguridad industrial y el área ambiental, y el que permite responder si el agente puede estar donde va a estar.", + }, + { + id: "certificado", + nombre: "Certificado o listado por modelo", + corto: "Certificado", + queEs: + "El certificado del laboratorio u organismo, con alcance, número de expediente y fecha. Una marca de certificación sin documento asociado a un modelo no es evidencia: es un logotipo.", + }, + { + id: "garantia", + nombre: "Garantía con condiciones por escrito", + corto: "Garantía", + queEs: + "Plazo, cobertura, exclusiones y qué obligaciones de mantenimiento la conservan vigente. Un plazo sin condiciones es una cifra publicitaria.", + }, + { + id: "manual", + nombre: "Manual de operación y mantenimiento", + corto: "Manual", + queEs: + "Cómo se opera, cada cuánto se revisa y qué se considera una falla. Sin manual, la capacitación se vuelve tradición oral y la garantía queda expuesta.", + }, + { + id: "bitacora", + nombre: "Bitácora de revisión", + corto: "Bitácora", + queEs: + "El formato donde queda constancia de cada revisión, con fecha y responsable. Es la evidencia recurrente que una verificación pide primero.", + }, + { + id: "instalacion", + nombre: "Constancia de instalación y puesta en marcha", + corto: "Instalación", + queEs: + "Para sistemas que se instalan: ubicación, configuración instalada, pruebas de arranque y quién las ejecutó. Es lo que permite reclamar si el sistema no actúa.", + }, + { + id: "capacitacion", + nombre: "Constancia de capacitación", + corto: "Capacitación", + queEs: + "Nombre, fecha, contenido y quién capacitó. La capacitación sin constancia no es demostrable ante una autoridad.", + }, +]; + +/** + * Qué documentación corresponde pedir por categoría. Es una recomendación de + * qué exigir, no una afirmación de qué existe ya publicado. + */ +const APLICA_POR_CATEGORIA: Record = { + "extintores-portatiles": ["ficha", "sds", "certificado", "garantia", "manual", "bitacora"], + "extintores-fijos": [ + "ficha", + "sds", + "certificado", + "garantia", + "manual", + "bitacora", + "instalacion", + ], + "productos-moviles": ["ficha", "sds", "certificado", "garantia", "manual", "bitacora"], + rociadores: ["ficha", "sds", "certificado", "garantia", "manual", "bitacora", "instalacion"], + "agentes-extinguidores": ["ficha", "sds", "certificado", "garantia", "manual"], + firemiks: ["ficha", "sds", "garantia", "manual", "instalacion"], + "proteccion-civil": ["ficha", "garantia", "manual", "instalacion", "capacitacion"], + robots: ["ficha", "sds", "garantia", "manual", "instalacion", "capacitacion"], +}; + +/** Lo que el sitio anterior enumera bajo el encabezado de certificaciones. */ +const CERTIFICACIONES_ENUMERADAS = [ + "UL 162", + "UL 711", + "NFPA 11", + "NFPA 16", + "NFPA 18", + "DIN EN 1568-3", + "LASTFIRE", + "OECD 202, 203 y 301D", + "MPA Dresden", + "Instituto de Higiene del Ruhr", + "SGS Institut Fresenius", + "ISO 9001:2015", + "NOM-154-SCFI-2005", + "NMX-S-066-SCFI-2015", +]; + +export default function PaginaEvidencia() { + // consolidado de claimsPorVerificar por categoría, sin repetir + const porCategoria = CATEGORIAS.map((categoria) => { + const productos = productosDeCategoria(categoria.slug); + const claims = Array.from(new Set(productos.flatMap((p) => p.claimsPorVerificar))); + return { categoria, productos, claims }; + }); + + const totalClaims = new Set(PRODUCTOS.flatMap((p) => p.claimsPorVerificar)).size; + + return ( + <> + {/* ---------- encabezado ---------- */} +
+
+ + +
+

Centro de evidencia

+

+ La documentación es el producto que casi nadie entrega +

+

+ Un equipo contra incendio se compra dos veces: cuando se instala y cuando alguien pide + los papeles. Esta página dice exactamente qué documentos deberían acompañar una + compra, qué aplica según la categoría y qué afirmaciones documentamos por número de + modelo antes de cotizar. +

+ +
+
+
Documentos del acervo
+
{DOCUMENTOS.length}
+
+
+
Categorías indexadas
+
{CATEGORIAS.length}
+
+
+
Puntos por documentar
+
{totalClaims}
+
+
+
+
+
+ + {/* ---------- el estado real del acervo: sin descargas falsas ---------- */} +
+
+
+

+ Estado del acervo +

+

+ Aquí no hay botones de descarga, y es a propósito +

+
+

+ En la extracción pública del sitio de FSPM no apareció un índice verificable de + documentos por número de modelo. Podríamos haber puesto una fila de botones + «Descargar ficha» que no llevan a ningún archivo. No lo hicimos: un + botón falso destruye la credibilidad de todo lo demás que dice esta página. +

+

+ Lo que sí hacemos es esto:{" "} + + los documentos se entregan por número de modelo, a solicitud, junto con la + propuesta técnica + + . Cuando un documento no exista o no cubra lo que se afirma, lo decimos en la + propuesta en lugar de omitirlo. +

+
+ +
+ + Solicitar documentación + + + Ver el catálogo + +
+
+
+
+ + {/* ---------- qué documentación corresponde a cada compra ---------- */} +
+
+ +

El acervo

+

+ Los {DOCUMENTOS.length} documentos que corresponden a una compra +

+

+ No todos aplican a todos los productos. Los dos últimos aparecen solo cuando hay + instalación o personal que operar. +

+
+ +
    + {DOCUMENTOS.map((documento, i) => ( +
  1. +
    + +

    + {documento.nombre} +

    +
    +

    {documento.queEs}

    +
  2. + ))} +
+
+
+ + {/* ---------- índice por categoría ---------- */} +
+
+ +

Índice

+

+ Qué aplica según la categoría de producto +

+

+ Es la lista de lo que conviene exigir en cada compra, no una afirmación de qué está ya + publicado. +

+
+ +

+ Desliza la tabla para ver todas las columnas +

+ +
+ + + + + + {DOCUMENTOS.map((d) => ( + + ))} + + + + {CATEGORIAS.map((categoria) => { + const aplica = APLICA_POR_CATEGORIA[categoria.slug] ?? []; + return ( + + + {DOCUMENTOS.map((d) => { + const incluido = aplica.includes(d.id); + return ( + + ); + })} + + ); + })} + +
+ Documentos que corresponden a cada categoría de producto. +
+ Categoría + + {d.corto} +
+ + {categoria.nombre} + + + {incluido ? ( + + + {d.nombre} aplica a {categoria.nombre} + + + + ) : ( + + + {d.nombre} no aplica a {categoria.nombre} + + + )} +
+
+
+
+ + {/* ---------- consolidado de claims por verificar ---------- */} +
+
+

+ Compromiso de documentación +

+

+ Los {totalClaims} puntos que documentamos antes de cotizar +

+
+

+ El sitio anterior afirmaba varias cosas como características del producto:{" "} + no caduca,{" "} + 20 años de garantía,{" "} + no requiere recarga, cobertura de todas las clases + de fuego. El estudio de marca concluyó que no pueden presentarse como universales. +

+

+ Aquí no se repiten. Se convierten en una lista de trabajo: cada punto es un documento + que entregamos por número de modelo, con su alcance y sus condiciones, antes de que + firmes. Esa es la diferencia entre prometer y documentar. +

+
+ +
+ {porCategoria.map(({ categoria, productos, claims }) => ( +
+ + + + {categoria.nombre} + + + {productos.length} {productos.length === 1 ? "equipo" : "equipos"} ·{" "} + {claims.length} {claims.length === 1 ? "punto" : "puntos"} por documentar + + + + + +
+ {claims.length > 0 ? ( +
    + {claims.map((claim) => ( +
  • +
  • + ))} +
+ ) : ( +

+ Sin puntos pendientes registrados para esta categoría. +

+ )} + + + Ver los equipos de la categoría → + +
+
+ ))} +
+
+
+ + {/* ---------- referencias normativas y certificaciones enumeradas ---------- */} +
+
+ +

Referencias normativas

+

+ Las normas contra las que se revisa un expediente +

+
+ + + +
+

+ Enumerado por la fuente, pendiente de verificar +

+

+ Lo que el sitio anterior lista bajo «certificaciones» +

+

+ Estas referencias aparecen enumeradas en la información pública de FSPM. Las + reproducimos como inventario de trabajo, no como certificaciones vigentes: una + referencia solo se convierte en evidencia cuando existe el documento con laboratorio, + expediente, fecha, alcance y el modelo al que corresponde. +

+ +
    + {CERTIFICACIONES_ENUMERADAS.map((certificacion) => ( +
  • + {certificacion} +
  • + ))} +
+ +

+ Ninguna norma sustituye a otra. Un listado UL no equivale a una NOM, y una prueba + ambiental no acredita desempeño de extinción. Construir ese mapa de equivalencias, con + el documento en la mano, es parte del trabajo previo a una propuesta. +

+
+
+
+ + {/* ---------- solicitud ---------- */} +
+
+
+
+ +

Solicitar documentación

+

+ Pide los documentos por número de modelo +

+

+ Dinos qué equipo te interesa o qué te está pidiendo tu auditoría. Respondemos con lo + que existe, con su alcance, y con lo que no podemos sostener por escrito. +

+
+ +
    + {[ + "Si un certificado no cubre tu caso de uso, te decimos hasta dónde llega.", + "Si un plazo de garantía tiene condiciones, van en la propuesta, no en la letra chica.", + "Si no tenemos un documento, lo decimos. Es más barato que descubrirlo en la auditoría.", + ].map((punto) => ( +
  • +
  • + ))} +
+
+ + +
+
+
+ + ); +} diff --git a/src/app/(sitio)/layout.tsx b/src/app/(sitio)/layout.tsx new file mode 100644 index 0000000..b8bbf48 --- /dev/null +++ b/src/app/(sitio)/layout.tsx @@ -0,0 +1,17 @@ +import { Encabezado } from "@/components/site/Encabezado"; +import { Pie } from "@/components/site/Pie"; +import { WidgetWhatsApp } from "@/components/formulario/WidgetWhatsApp"; + +export default function LayoutSitio({ children }: { children: React.ReactNode }) { + return ( + <> + + Ir al contenido + + +
{children}
+ + + + ); +} diff --git a/src/app/(sitio)/nosotros/page.tsx b/src/app/(sitio)/nosotros/page.tsx new file mode 100644 index 0000000..7dbcfb7 --- /dev/null +++ b/src/app/(sitio)/nosotros/page.tsx @@ -0,0 +1,320 @@ +import type { Metadata } from "next"; +import Image from "next/image"; +import Link from "next/link"; +import { Revelar } from "@/components/site/Revelar"; +import { CATEGORIAS, PRODUCTOS } from "@/data/catalogo"; +import { EMPRESA, PRENSA, SITIO_URL } from "@/data/empresa"; +import { INDUSTRIAS } from "@/data/industrias"; + +/** + * /nosotros — origen de la tecnología, posicionamiento y postura editorial. + * + * La parte más importante de esta página es la última sección: por qué la + * empresa documenta en lugar de prometer. Es la traducción del hallazgo central + * del estudio de marca y la razón de ser del resto del sitio. + */ + +const TITULO = "Quiénes somos"; +const DESCRIPCION = `${EMPRESA.nombre}: origen de la tecnología FireAde, posicionamiento en operaciones críticas y por qué documentamos en lugar de prometer.`; + +export const metadata: Metadata = { + title: TITULO, + description: DESCRIPCION, + alternates: { canonical: `${SITIO_URL}/nosotros` }, + openGraph: { + title: `${TITULO} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + url: `${SITIO_URL}/nosotros`, + }, +}; + +const POSTURA = [ + { + n: "01", + titulo: "Una afirmación sin documento es publicidad", + texto: + "El sitio anterior presentaba vida útil ilimitada, veinte años de garantía y ausencia de recarga como características del producto. Eran, en el mejor de los casos, afirmaciones con condiciones que nadie escribió. Ahora viven en un bloque aparte de cada ficha, junto con lo que hay que entregar para poder sostenerlas.", + }, + { + n: "02", + titulo: "Los campos vacíos se quedan vacíos", + texto: + "Cuando no hay dato de alcance, de capacidad o de caudal, la ficha lo dice. No ponemos un guion ni una estimación redondeada: un número inventado en una ficha técnica reaparece en una auditoría con el nombre de quien lo firmó.", + }, + { + n: "03", + titulo: "No hay botones de descarga que no descarguen nada", + texto: + "El centro de evidencia explica qué documentación corresponde a cada compra y cómo se solicita por número de modelo. Lo que no hace es simular un acervo. Un botón falso destruye la credibilidad de todo lo demás.", + }, + { + n: "04", + titulo: "Los casos van rotulados", + texto: + "Los escenarios de aplicación están construidos con fines de demostración y lo dicen arriba, no en una nota al pie. Un caso con nombre de cliente requiere autorización por escrito sobre qué se puede contar y qué cifras se pueden publicar.", + }, + { + n: "05", + titulo: "Preferimos la respuesta incómoda", + texto: + "Si un certificado no cubre tu caso de uso, si un plazo trae condiciones o si simplemente no tenemos un documento, va en la propuesta. Sale más barato ahí que en la verificación.", + }, +]; + +export default function PaginaNosotros() { + return ( + <> + {/* ---------- encabezado ---------- */} +
+
+ + +
+
+

Quiénes somos

+

+ {EMPRESA.promesa} +

+

+ {EMPRESA.descripcion} +

+ +
+
+
Origen de la tecnología
+
{EMPRESA.fundacionOrigen}
+
+
+
Categorías
+
{CATEGORIAS.length}
+
+
+
Equipos y agentes
+
{PRODUCTOS.length}
+
+
+
+ +
+ Personal de respuesta a incendios trabajando en una plataforma industrial + +
+
+
+ + {/* ---------- origen de la tecnología ---------- */} +
+
+
+
+ +

Origen

+

+ La tecnología viene de {EMPRESA.empresaOrigen} +

+
+
+

+ {EMPRESA.empresaOrigen} se presenta como fundada en {EMPRESA.fundacionOrigen} por{" "} + {EMPRESA.fundadorOrigen}. {EMPRESA.nombreCorto} opera en México como{" "} + {EMPRESA.razonSocial} y usa esa herencia técnica como respaldo de desarrollo. +

+

+ El activo de diferenciación es el agente FireAde 2000 y la familia de equipos + Enforcer, que permiten competir en un terreno distinto al del extintor + convencional: no por precio unitario, sino por tiempo de control, costo de + limpieza y continuidad de la operación. +

+

+ Ese es también el límite honesto de lo que podemos afirmar aquí. Los datos de + origen provienen de la comunicación pública de la empresa; el desempeño de cada + formulación y de cada modelo se demuestra con su documentación, no con su historia. +

+
+
+ +
+

+ Dónde decidimos jugar +

+

+ El estudio de marca fue explícito: {EMPRESA.nombreCorto} no debería competir por + catálogo más grande ni por precio unitario. El espacio defendible está entre + tecnología especializada, respuesta rápida, evidencia técnica y costo total de + operación. +

+ +
+ +

+ Los cinco segmentos donde eso aplica +

+
    + {INDUSTRIAS.map((industria) => ( +
  • + + {String(industria.prioridad).padStart(2, "0")} + +

    + + {industria.nombre} + + {" — "} + {industria.dolor} +

    +
  • + ))} +
+
+
+
+
+ + {/* ---------- postura editorial ---------- */} +
+
+
+

+ Postura editorial +

+

+ Por qué documentamos en lugar de prometer +

+

+ La competencia promete. En protección contra incendios, una promesa sin documento no + es solo una debilidad comercial: es una exposición legal para quien la compra y para + quien la firma. La auditoría de marca lo señaló como el mayor riesgo del sitio + anterior, y estas cinco reglas son la respuesta. +

+
+ +
    + {POSTURA.map((regla) => ( +
  1. +

    + {regla.n} +

    +

    + {regla.titulo} +

    +

    {regla.texto}

    +
  2. + ))} +
+
+
+ + {/* ---------- Christmas Hero, sin exagerarlo ---------- */} +
+
+
+
+ +

Antecedente de comunicación

+

+ «Christmas Hero» +

+
+
+

+ En 2019, {EMPRESA.nombreCorto} desarrolló una pieza de comunicación llamada + Christmas Hero: un adorno navideño que funcionaba como dispositivo de extinción + para árboles de Navidad. Fue publicada por LatinSpots en 2019 y obtuvo una mención + como segundo finalista de El Ojo Local México. +

+

+ Lo decimos con esa medida, sin convertirlo en más de lo que fue. Importa por dos + razones concretas: demuestra que la empresa sabe traducir un problema técnico en + algo que una persona entiende de inmediato, y demuestra que puede sostener + atención de prensa cuando tiene algo que decir. +

+

+ Ese es exactamente el trabajo pendiente en el resto de la comunicación: la + ingeniería está; la traducción es lo que faltaba. +

+
+
+ +
+

+ Publicaciones que han cubierto a FSPM +

+
    + {PRENSA.map((medio) => ( +
  • + + {`Nota + +
  • + ))} +
+

+ Los enlaces llevan a la nota original de cada medio. Varias corresponden a la cobertura + de Christmas Hero; aparecen como cobertura periodística, no como respaldo del + desempeño de un producto. +

+
+
+
+
+ + {/* ---------- salidas ---------- */} +
+
+
+ +

Siguiente paso

+

+ Lo que sigue depende de qué tan urgente sea tu caso +

+
+
+ + Hablar con nosotros + + + Ver el catálogo + + + Centro de evidencia + +
+
+
+
+ + ); +} diff --git a/src/app/(sitio)/not-found.tsx b/src/app/(sitio)/not-found.tsx new file mode 100644 index 0000000..f22ae3f --- /dev/null +++ b/src/app/(sitio)/not-found.tsx @@ -0,0 +1,132 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { CATEGORIAS } from "@/data/catalogo"; +import { EMPRESA } from "@/data/empresa"; +import { INDUSTRIAS } from "@/data/industrias"; + +/** + * 404 con la voz del sitio: dice qué pasó y ofrece salidas reales. + * Sin humor, sin disculpas y sin ilustración de astronauta perdido. + */ + +export const metadata: Metadata = { + title: "Página no encontrada", + description: + "La dirección solicitada no existe en este sitio. Rutas disponibles: catálogo, soluciones por industria, cumplimiento y contacto.", + robots: { index: false, follow: true }, +}; + +export default function NoEncontrado() { + return ( +
+
+
+
+

+ Error 404 +

+ +

+ Esta dirección no existe en el sitio +

+ +

+ Puede que la página se haya movido, que el enlace venga incompleto o que la dirección + nunca haya existido. Estas son las rutas que sí funcionan. +

+ +
+ + Ir al catálogo + + + Ver soluciones + + + Contacto + +
+ +
+ +

+ Si necesitas una respuesta ahora, marca al{" "} + + {EMPRESA.telefono} + + . +

+
+ +
+

Índice rápido

+ +

+ Categorías del catálogo +

+
    + {CATEGORIAS.map((categoria) => ( +
  • + + {categoria.nombre} + +
  • + ))} +
+ +
+ +

+ Soluciones por operación +

+
    + {INDUSTRIAS.map((industria) => ( +
  • + + {industria.nombre} + +
  • + ))} +
+ +
+ +

+ Recursos +

+
    + {[ + { href: "/cumplimiento-nom-002", label: "Cumplimiento NOM-002" }, + { href: "/evidencia", label: "Centro de evidencia" }, + { href: "/preguntas-frecuentes", label: "Preguntas frecuentes" }, + { href: "/casos", label: "Casos de aplicación" }, + { href: "/nosotros", label: "Quiénes somos" }, + { href: "/aviso-de-privacidad", label: "Aviso de privacidad" }, + ].map((enlace) => ( +
  • + + {enlace.label} + +
  • + ))} +
+
+
+
+
+ ); +} diff --git a/src/app/(sitio)/page.tsx b/src/app/(sitio)/page.tsx new file mode 100644 index 0000000..4bb5c84 --- /dev/null +++ b/src/app/(sitio)/page.tsx @@ -0,0 +1,119 @@ +import type { Metadata } from "next"; +import { BloqueDiagnostico } from "@/components/site/home/BloqueDiagnostico"; +import { BloqueNorma } from "@/components/site/home/BloqueNorma"; +import { CatalogoDestacado } from "@/components/site/home/CatalogoDestacado"; +import { ClasesFuego } from "@/components/site/home/ClasesFuego"; +import { Clientes } from "@/components/site/home/Clientes"; +import { Heroe } from "@/components/site/home/Heroe"; +import { Prensa } from "@/components/site/home/Prensa"; +import { RutasIndustria } from "@/components/site/home/RutasIndustria"; +import { TresRutas } from "@/components/site/home/TresRutas"; +import { EMPRESA, SITIO_URL } from "@/data/empresa"; + +/** + * PÁGINA DE INICIO. + * + * Es la implementación de la recomendación 10.1 del estudio de marca: rehacer + * el inicio con tres rutas — industria, tipo de riesgo y cumplimiento — en + * lugar de un escaparate de ocho categorías que obliga al visitante a inferir + * qué solución le corresponde. + * + * El orden de las secciones no es estético, es el recorrido de un comprador: + * clasificar el riesgo → elegir la ruta → entender el criterio técnico → ver + * el equipo → entender la obligación normativa → pedir el diagnóstico → juzgar + * a quién le está hablando. + */ + +const DESCRIPCION = + "Extintores, agentes espumógenos y sistemas fijos, móviles y automáticos para industria, energía, logística, gasolineras, cocinas y PyMEs. Clasificamos el riesgo, seleccionamos el agente y entregamos la evidencia que exige la NOM-002-STPS-2010."; + +export const metadata: Metadata = { + title: `${EMPRESA.promesa} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + alternates: { canonical: "/" }, + keywords: [ + "protección contra incendios", + "extintores industriales", + "NOM-002-STPS-2010", + "agente espumógeno", + "sistema contra incendio", + "clases de fuego", + ], + openGraph: { + type: "website", + locale: "es_MX", + url: SITIO_URL, + siteName: EMPRESA.nombre, + title: `${EMPRESA.promesa} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + images: [ + { + url: "/media/foto/bombero-plataforma.jpg", + width: 1200, + height: 630, + alt: "Respuesta contra incendio en una plataforma industrial", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: `${EMPRESA.promesa} | ${EMPRESA.nombreCorto}`, + description: DESCRIPCION, + images: ["/media/foto/bombero-plataforma.jpg"], + }, +}; + +/** + * JSON-LD de organización. Solo campos verificables en `src/data/empresa.ts`: + * no se declara domicilio exacto, ni número de empleados, ni año de fundación + * de la operación mexicana, porque esos datos no están confirmados. + */ +const datosEstructurados = { + "@context": "https://schema.org", + "@type": "Organization", + name: EMPRESA.nombre, + legalName: EMPRESA.razonSocial, + alternateName: EMPRESA.nombreCorto, + url: SITIO_URL, + logo: `${SITIO_URL}/media/marca/fspm-logo.png`, + description: EMPRESA.descripcion, + telephone: EMPRESA.telefonoTel, + email: EMPRESA.correo, + address: { + "@type": "PostalAddress", + addressLocality: EMPRESA.ciudad, + addressCountry: "MX", + }, + contactPoint: [ + { + "@type": "ContactPoint", + contactType: "sales", + telephone: EMPRESA.telefonoTel, + email: EMPRESA.correo, + areaServed: "MX", + availableLanguage: ["es-MX"], + }, + ], + sameAs: [EMPRESA.redes.facebook, EMPRESA.redes.youtube, EMPRESA.redes.linkedin], +}; + +export default function PaginaInicio() { + return ( + <> + `. + */ +export function jsonLd(datos: Record): { __html: string } { + const serializado = JSON.stringify(datos).replace( + PELIGROSOS, + (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, "0")}`, + ); + return { __html: serializado }; +} + +/** + * `Organization` con los datos reales de FSPM. + * + * No se declara `foundingDate`: el 1984 de `EMPRESA.fundacionOrigen` pertenece + * a Fire Service Plus INC, la empresa de origen, no a la operación mexicana. + * Atribuirlo a FSPM México sería un dato sin sustento. + */ +export function ldOrganizacion(): Record { + return { + "@context": "https://schema.org", + "@type": "Organization", + "@id": `${SITIO_URL}/#organizacion`, + name: EMPRESA.nombre, + alternateName: EMPRESA.nombreCorto, + legalName: EMPRESA.razonSocial, + url: `${SITIO_URL}/`, + logo: { + "@type": "ImageObject", + url: urlAbsoluta("/media/marca/fspm-logo.png"), + }, + image: urlAbsoluta(IMAGEN_OG_POR_OMISION), + description: EMPRESA.descripcion, + slogan: EMPRESA.promesa, + email: EMPRESA.correo, + telephone: EMPRESA.telefono, + address: { + "@type": "PostalAddress", + streetAddress: EMPRESA.colonia, + addressLocality: EMPRESA.ciudad, + addressCountry: "MX", + }, + areaServed: { "@type": "Country", name: EMPRESA.pais }, + parentOrganization: { "@type": "Organization", name: EMPRESA.empresaOrigen }, + contactPoint: [ + { + "@type": "ContactPoint", + contactType: "sales", + telephone: EMPRESA.telefono, + email: EMPRESA.correo, + areaServed: "MX", + availableLanguage: ["es-MX"], + }, + ], + sameAs: [EMPRESA.redes.facebook, EMPRESA.redes.linkedin, EMPRESA.redes.youtube], + }; +} + +/** `WebSite` del sitio, ligado a la organización por `@id`. */ +export function ldSitioWeb(): Record { + return { + "@context": "https://schema.org", + "@type": "WebSite", + "@id": `${SITIO_URL}/#sitio`, + url: `${SITIO_URL}/`, + name: EMPRESA.nombre, + description: EMPRESA.descripcion, + inLanguage: "es-MX", + publisher: { "@id": `${SITIO_URL}/#organizacion` }, + }; +} + +/** + * `BreadcrumbList`. Los items van en orden, del inicio a la página actual; + * la posición se numera desde 1, como pide el vocabulario. + */ +export function ldMigas(items: { nombre: string; ruta: string }[]): Record { + return { + "@context": "https://schema.org", + "@type": "BreadcrumbList", + itemListElement: items.map((item, i) => ({ + "@type": "ListItem", + position: i + 1, + name: item.nombre, + item: urlAbsoluta(item.ruta), + })), + }; +} diff --git a/src/lib/utm.ts b/src/lib/utm.ts new file mode 100644 index 0000000..ed127bf --- /dev/null +++ b/src/lib/utm.ts @@ -0,0 +1,124 @@ +/** + * Captura de atribución. Se guarda el primer toque en almacenamiento local y + * se envía junto con cada formulario, para que el CRM pueda distinguir la + * campaña que trajo al contacto de la página donde finalmente convirtió. + */ + +export const CLAVES_UTM = [ + "utm_source", + "utm_medium", + "utm_campaign", + "utm_term", + "utm_content", +] as const; + +export type Atribucion = { + utmSource?: string; + utmMedium?: string; + utmCampaign?: string; + utmTerm?: string; + utmContent?: string; + gclid?: string; + fbclid?: string; + referrer?: string; + landingPath?: string; + paginaUrl?: string; + dispositivo?: string; +}; + +const LLAVE = "fspm.atribucion.v1"; + +function recortar(v: string | null): string | undefined { + if (!v) return undefined; + const limpio = v.trim().slice(0, 180); + return limpio.length ? limpio : undefined; +} + +/** Lee los parámetros de la URL actual. */ +function leerDeUrl(): Atribucion { + const p = new URLSearchParams(window.location.search); + return { + utmSource: recortar(p.get("utm_source")), + utmMedium: recortar(p.get("utm_medium")), + utmCampaign: recortar(p.get("utm_campaign")), + utmTerm: recortar(p.get("utm_term")), + utmContent: recortar(p.get("utm_content")), + gclid: recortar(p.get("gclid")), + fbclid: recortar(p.get("fbclid")), + }; +} + +function tieneAlgo(a: Atribucion): boolean { + return Boolean( + a.utmSource || a.utmMedium || a.utmCampaign || a.utmTerm || a.utmContent || a.gclid || a.fbclid, + ); +} + +function dispositivo(): string { + const w = window.innerWidth; + if (w < 768) return "movil"; + if (w < 1180) return "tableta"; + return "escritorio"; +} + +/** + * Guarda el primer toque si aún no existe y devuelve la atribución completa + * para enviarla con el formulario. Llamar dentro de un efecto de cliente. + */ +export function capturarAtribucion(): Atribucion { + if (typeof window === "undefined") return {}; + + let guardada: Atribucion = {}; + try { + const crudo = window.localStorage.getItem(LLAVE); + if (crudo) guardada = JSON.parse(crudo) as Atribucion; + } catch { + // almacenamiento bloqueado o dato corrupto: seguimos sin primer toque + } + + const actual = leerDeUrl(); + + // el primer toque solo se escribe una vez + if (!tieneAlgo(guardada) && tieneAlgo(actual)) { + guardada = { + ...actual, + referrer: recortar(document.referrer) ?? undefined, + landingPath: window.location.pathname + window.location.search, + }; + try { + window.localStorage.setItem(LLAVE, JSON.stringify(guardada)); + } catch { + // sin persistencia: la atribución vale solo para este envío + } + } else if (!tieneAlgo(guardada) && !tieneAlgo(actual)) { + // tráfico directo u orgánico: registramos al menos de dónde llegó + guardada = { + referrer: recortar(document.referrer) ?? undefined, + landingPath: window.location.pathname + window.location.search, + }; + try { + window.localStorage.setItem(LLAVE, JSON.stringify(guardada)); + } catch { + // ídem + } + } + + // los parámetros de la visita actual pisan al primer toque solo si existen + return { + ...guardada, + ...Object.fromEntries(Object.entries(actual).filter(([, v]) => v !== undefined)), + referrer: guardada.referrer ?? recortar(document.referrer), + landingPath: guardada.landingPath ?? window.location.pathname, + paginaUrl: window.location.href.slice(0, 400), + dispositivo: dispositivo(), + }; +} + +/** Borra la atribución guardada. Solo para pruebas de la demo. */ +export function limpiarAtribucion(): void { + try { + window.localStorage.removeItem(LLAVE); + } catch { + // sin nada que limpiar + } +} diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..3685d58 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,63 @@ +import { NextResponse, type NextRequest } from "next/server"; +import { jwtVerify } from "jose"; + +/** + * Guardia del panel. + * + * Corre en el runtime Edge, así que aquí no entra Prisma ni bcryptjs: lo único + * que hace es verificar la firma de la cookie con `jose`. La autorización fina + * por rol y por alcance vive en `src/lib/crm/auth.ts` y en las consultas. + * + * El nombre de la cookie está duplicado a propósito: importar `auth.ts` + * arrastraría el cliente de base de datos al bundle del middleware. + */ + +const COOKIE_SESION = "fspm_sesion"; +const RUTA_LOGIN = "/admin/login"; + +const secreto = process.env.AUTH_SECRET + ? new TextEncoder().encode(process.env.AUTH_SECRET) + : null; + +async function sesionValida(token: string | undefined): Promise { + if (!token || !secreto) return false; + try { + await jwtVerify(token, secreto, { algorithms: ["HS256"] }); + return true; + } catch { + return false; + } +} + +export async function middleware(peticion: NextRequest) { + const { pathname, search } = peticion.nextUrl; + const enLogin = pathname === RUTA_LOGIN || pathname.startsWith(`${RUTA_LOGIN}/`); + const valida = await sesionValida(peticion.cookies.get(COOKIE_SESION)?.value); + + if (enLogin) { + if (valida) { + const url = peticion.nextUrl.clone(); + url.pathname = "/admin"; + url.search = ""; + return NextResponse.redirect(url); + } + return NextResponse.next(); + } + + if (!valida) { + const url = peticion.nextUrl.clone(); + url.pathname = RUTA_LOGIN; + url.search = ""; + url.searchParams.set("destino", `${pathname}${search}`); + const respuesta = NextResponse.redirect(url); + // cookie corrupta o expirada: la limpiamos para no reintentar en cada carga + if (peticion.cookies.has(COOKIE_SESION)) respuesta.cookies.delete(COOKIE_SESION); + return respuesta; + } + + return NextResponse.next(); +} + +export const config = { + matcher: ["/admin/:path*"], +}; diff --git a/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..f36cbf4 Binary files /dev/null and b/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-chromium/trace.zip b/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-chromium/trace.zip new file mode 100644 index 0000000..401d9df Binary files /dev/null and b/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..670028a Binary files /dev/null and b/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-webkit/trace.zip b/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b76eeef Binary files /dev/null and b/test-results/01-humo-idioma-declarado-en-español-de-México-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-idioma-declarado-en-español-de-México-movil-webkit-retry1/trace.zip b/test-results/01-humo-idioma-declarado-en-español-de-México-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..311b2b3 Binary files /dev/null and b/test-results/01-humo-idioma-declarado-en-español-de-México-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-idioma-declarado-en-español-de-México-movil-webkit/trace.zip b/test-results/01-humo-idioma-declarado-en-español-de-México-movil-webkit/trace.zip new file mode 100644 index 0000000..84bf850 Binary files /dev/null and b/test-results/01-humo-idioma-declarado-en-español-de-México-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..38dc75a Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-chromium/trace.zip new file mode 100644 index 0000000..4698fdc Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..92da667 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-webkit/trace.zip new file mode 100644 index 0000000..094b77e Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..09a692e Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-movil-webkit/trace.zip new file mode 100644 index 0000000..bef6e45 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-0e847--y-open-graph-en-soluciones-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..2f2d84d Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-chromium/trace.zip new file mode 100644 index 0000000..cb531c2 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..d97235e Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b44528a Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..6158414 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-movil-webkit/trace.zip new file mode 100644 index 0000000..6590735 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-168e6-oluciones-industria-energia-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..d1925dc Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-chromium/trace.zip new file mode 100644 index 0000000..ba8b4e5 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..635b532 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-webkit/trace.zip new file mode 100644 index 0000000..844f7f2 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..6827dd6 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-movil-webkit/trace.zip new file mode 100644 index 0000000..8d9964a Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-26afd-on-y-open-graph-en-catalogo-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..4d853e0 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-chromium/trace.zip new file mode 100644 index 0000000..3a14290 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..f85c079 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-webkit/trace.zip new file mode 100644 index 0000000..8ab633f Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..50ca546 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--movil-webkit/trace.zip new file mode 100644 index 0000000..aff5e6b Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-48e70-escription-y-open-graph-en--movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..254b1b2 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-chromium/trace.zip new file mode 100644 index 0000000..da94469 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..b9e04ef Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-webkit/trace.zip new file mode 100644 index 0000000..9e146d5 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..0c2fa78 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-movil-webkit/trace.zip new file mode 100644 index 0000000..ff130ac Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-55117-n-y-open-graph-en-evidencia-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..0a0bc03 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..51ccaef Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..b041f1a Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..6652ee7 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..6bcc2ac Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..59692e6 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-6031c-producto-enforcer-12-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..33db5b6 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-chromium/trace.zip new file mode 100644 index 0000000..62dea28 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..a3e4a66 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-webkit/trace.zip new file mode 100644 index 0000000..08157b5 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..8609d5d Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-movil-webkit/trace.zip new file mode 100644 index 0000000..975d8ae Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-65104-on-y-open-graph-en-contacto-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..4e9e5db Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-chromium/trace.zip new file mode 100644 index 0000000..e03e334 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..a97d690 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b2c15ce Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..aa62356 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-movil-webkit/trace.zip new file mode 100644 index 0000000..323d094 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-782ba-alogo-extintores-portatiles-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..e987b31 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-chromium/trace.zip new file mode 100644 index 0000000..9ad1166 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..98f8f66 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-webkit/trace.zip new file mode 100644 index 0000000..6028b92 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..b3cc068 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-movil-webkit/trace.zip new file mode 100644 index 0000000..0d63779 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-a36f3-aph-en-preguntas-frecuentes-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..db62416 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-chromium/trace.zip b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-chromium/trace.zip new file mode 100644 index 0000000..25a63d8 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..1fc797b Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-webkit/trace.zip new file mode 100644 index 0000000..eea6309 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-movil-webkit-retry1/trace.zip b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..bb0e6ee Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-movil-webkit/trace.zip b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-movil-webkit/trace.zip new file mode 100644 index 0000000..044b4f0 Binary files /dev/null and b/test-results/01-humo-metadatos-que-falt-b85f5-aph-en-cumplimiento-nom-002-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..7d6302b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-chromium/trace.zip new file mode 100644 index 0000000..bc3bf7f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..303222a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-webkit/trace.zip new file mode 100644 index 0000000..89902c9 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..64f4413 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-movil-webkit/trace.zip new file mode 100644 index 0000000..3641f44 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-0a097-alogo-agentes-extinguidores-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..2121d5d Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..6ce620b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..a49baba Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..7e59492 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..995cbbd Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..aa0afdf Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-12899-producto-enforcer-12-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..46c160b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-chromium/trace.zip new file mode 100644 index 0000000..3b007cb Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..2434d49 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-webkit/trace.zip new file mode 100644 index 0000000..81827d0 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..c663f2e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-movil-webkit/trace.zip new file mode 100644 index 0000000..bc83229 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-131ad-roducto-flameade-retardante-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..db1f212 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-chromium/trace.zip new file mode 100644 index 0000000..16bb923 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..c0eb368 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-webkit/trace.zip new file mode 100644 index 0000000..60d2151 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..3693b6e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-movil-webkit/trace.zip new file mode 100644 index 0000000..8e90b30 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-18c26-n-catalogo-proteccion-civil-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..332e654 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-chromium/trace.zip new file mode 100644 index 0000000..35d7b36 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..5e0fc28 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b47f3a7 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..b588af8 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-movil-webkit/trace.zip new file mode 100644 index 0000000..fcb661a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-1d417-tenido-en-producto-firemiks-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..5f298a8 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-chromium/trace.zip new file mode 100644 index 0000000..a375b9d Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..312231c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b0450ba Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..5e000be Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-movil-webkit/trace.zip new file mode 100644 index 0000000..3e24da0 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3156f-00-y-contenido-en-evidencia-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..6b4518f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-chromium/trace.zip new file mode 100644 index 0000000..9fbb09b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..fc73977 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-webkit/trace.zip new file mode 100644 index 0000000..6be953b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..1c9e144 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-movil-webkit/trace.zip new file mode 100644 index 0000000..1f22f39 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-33089-0-y-contenido-en-soluciones-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..4a65a19 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-chromium/trace.zip new file mode 100644 index 0000000..b2219be Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..ceed0cc Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-webkit/trace.zip new file mode 100644 index 0000000..3bccfce Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..19eb83d Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-movil-webkit/trace.zip new file mode 100644 index 0000000..f28dc00 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-3492a-ido-en-cumplimiento-nom-002-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..313d914 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..f691e7c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..47ae10f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..f5dc2d7 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..d84e404 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..6df1f86 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-45899--producto-enforcer-4-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..5afeae2 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-chromium/trace.zip new file mode 100644 index 0000000..a5351ef Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..abac3fd Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-webkit/trace.zip new file mode 100644 index 0000000..19c6f2e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..f889f08 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-movil-webkit/trace.zip new file mode 100644 index 0000000..87c281f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-54935-ntenido-en-producto-trakade-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..46aac82 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-chromium/trace.zip new file mode 100644 index 0000000..033d1e5 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..c3c8d8f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-webkit/trace.zip new file mode 100644 index 0000000..8fb3559 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..018a0d6 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-movil-webkit/trace.zip new file mode 100644 index 0000000..4d69690 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5587b-ido-en-producto-enforcer-60-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..dfa5bf5 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-chromium/trace.zip new file mode 100644 index 0000000..b03db77 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..8f6bbe8 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-webkit/trace.zip new file mode 100644 index 0000000..bc8f023 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..976b4c6 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-movil-webkit/trace.zip new file mode 100644 index 0000000..f35af43 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5658f-esfera-con-detector-de-humo-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..1bd536e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-chromium/trace.zip new file mode 100644 index 0000000..0825bf4 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..a16f2c6 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-webkit/trace.zip new file mode 100644 index 0000000..9337f8b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..d142b83 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-movil-webkit/trace.zip new file mode 100644 index 0000000..ee9bd01 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-5bb7e-en-producto-receptor-sarmex-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..c1696b8 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-chromium/trace.zip new file mode 100644 index 0000000..4a91b7b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..f3951ab Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-webkit/trace.zip new file mode 100644 index 0000000..13e8b85 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..847b2fc Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-movil-webkit/trace.zip new file mode 100644 index 0000000..a164e64 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-66c69-oluciones-industria-energia-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..b9ef14f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-chromium/trace.zip new file mode 100644 index 0000000..9935af5 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..5dbb006 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-webkit/trace.zip new file mode 100644 index 0000000..49f3cec Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..36e3ce7 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-movil-webkit/trace.zip new file mode 100644 index 0000000..0c5f210 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6b786--en-producto-enforcer-robot-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..62b6a70 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-chromium/trace.zip new file mode 100644 index 0000000..d0bc2da Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..aa73bad Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-webkit/trace.zip new file mode 100644 index 0000000..85aef5f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..785c687 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-movil-webkit/trace.zip new file mode 100644 index 0000000..fb50ec8 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-6e731-esfera-rociadora-automatica-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..448abd8 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-chromium/trace.zip new file mode 100644 index 0000000..91a9b28 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..25c4175 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-webkit/trace.zip new file mode 100644 index 0000000..49fbb12 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..9086a33 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-movil-webkit/trace.zip new file mode 100644 index 0000000..b3765fa Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-72c37-n-soluciones-pymes-oficinas-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..fe80225 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-chromium/trace.zip new file mode 100644 index 0000000..213966c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..8c9fd78 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b5e3829 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..ed1e5fb Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-movil-webkit/trace.zip new file mode 100644 index 0000000..502f225 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e030-ontenido-en-catalogo-robots-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..425d91f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-chromium/trace.zip new file mode 100644 index 0000000..4827096 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..72f4d4a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-webkit/trace.zip new file mode 100644 index 0000000..47dd497 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..6ae2ad2 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-movil-webkit/trace.zip new file mode 100644 index 0000000..afbb2fe Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-7e8b0--soluciones-cocinas-hoteles-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..d401502 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..2af42eb Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..b026c39 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..da93397 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..cc8209e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..9fc9e60 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80852--producto-enforcer-2-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..6101e20 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-chromium/trace.zip new file mode 100644 index 0000000..21c0349 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..025da92 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-webkit/trace.zip new file mode 100644 index 0000000..659b997 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..65a7322 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-movil-webkit/trace.zip new file mode 100644 index 0000000..9d2c3ef Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-80c61-oluciones-logistica-bodegas-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..d43a081 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..8a44f18 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..6f33761 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..bc6c883 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..56e3cdd Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..d5cd182 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-84d0d-oducto-carretilla-50-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..3689dc5 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-chromium/trace.zip new file mode 100644 index 0000000..af042b1 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..23a0176 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-webkit/trace.zip new file mode 100644 index 0000000..4aa1976 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..9dbff30 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-movil-webkit/trace.zip new file mode 100644 index 0000000..04a547d Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-8e2c5--catalogo-productos-moviles-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..a867020 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-chromium/trace.zip new file mode 100644 index 0000000..13b4299 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..7c3950b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-webkit/trace.zip new file mode 100644 index 0000000..ad66b76 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..1cd003e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-movil-webkit/trace.zip new file mode 100644 index 0000000..ac41638 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-90199-ido-en-preguntas-frecuentes-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..9b52b9f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..9355c8a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..dcf8ff3 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..dadd103 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..be88834 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..d48d1fd Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-93b61--producto-enforcer-6-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..095a183 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..3220f00 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..6d90388 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..1ff54e2 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..727cb4b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..1226d0e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94888-oducto-carretilla-70-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..949db78 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-chromium/trace.zip new file mode 100644 index 0000000..ca59dcc Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..6a4a1ef Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-webkit/trace.zip new file mode 100644 index 0000000..bdddb60 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..b297fa9 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-movil-webkit/trace.zip new file mode 100644 index 0000000..6d08d42 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-94e1c-nido-en-catalogo-rociadores-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..9e21a3c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..71df5c6 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..2025e55 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..1f7518f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..aa438bd Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..7168d86 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-96e97-ducto-carretilla-100-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..69e048c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-chromium/trace.zip new file mode 100644 index 0000000..6537d56 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..085e357 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-webkit/trace.zip new file mode 100644 index 0000000..f58571b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..11e71b9 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-movil-webkit/trace.zip new file mode 100644 index 0000000..d713d1c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-9997a-o-en-producto-vaporade-plus-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..d30aaeb Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..b8cab7a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..6f54715 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..00cc155 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..0dbbb5d Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..f35c1a2 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-b4fa2-oducto-carretilla-30-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..02dd073 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-chromium/trace.zip new file mode 100644 index 0000000..d630ce3 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..79671f7 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-webkit/trace.zip new file mode 100644 index 0000000..fb68e08 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..da569b4 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-movil-webkit/trace.zip new file mode 100644 index 0000000..795bdd5 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bc138-luciones-gasolineras-flotas-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..aa21d28 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-chromium/trace.zip new file mode 100644 index 0000000..27ed30e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..a493696 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-webkit/trace.zip new file mode 100644 index 0000000..a06196b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..2ff2c3a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-movil-webkit/trace.zip new file mode 100644 index 0000000..5178365 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-bce51-tenido-en-catalogo-firemiks-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..8200abd Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-chromium/trace.zip new file mode 100644 index 0000000..b67954b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..deefd98 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-webkit/trace.zip new file mode 100644 index 0000000..64eb898 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..956280f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-movil-webkit/trace.zip new file mode 100644 index 0000000..96c0da1 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-c9d4d-nido-en-aviso-de-privacidad-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..b02b2cb Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-chromium/trace.zip new file mode 100644 index 0000000..6ce9c8a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..480c08c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-webkit/trace.zip new file mode 100644 index 0000000..53f83e9 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..acc74d8 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-movil-webkit/trace.zip new file mode 100644 index 0000000..1ac9efa Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-d963d-alogo-extintores-portatiles-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..ab41357 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-chromium/trace.zip new file mode 100644 index 0000000..0a30a35 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..c1652e2 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-webkit/trace.zip new file mode 100644 index 0000000..f6dac59 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..3048bec Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-movil-webkit/trace.zip new file mode 100644 index 0000000..c4aaea9 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e64a1-do-en-producto-fireade-2000-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..4bec506 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-chromium/trace.zip new file mode 100644 index 0000000..70d29c7 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..ad3574a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-webkit/trace.zip new file mode 100644 index 0000000..d8242ff Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..3a6dbc0 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-movil-webkit/trace.zip new file mode 100644 index 0000000..a5326d7 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-e79dd-n-catalogo-extintores-fijos-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..2422dc6 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-chromium/trace.zip new file mode 100644 index 0000000..42c2606 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..7d1e3ca Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-webkit/trace.zip new file mode 100644 index 0000000..9ddbb16 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..669bca6 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-movil-webkit/trace.zip new file mode 100644 index 0000000..9bcd91a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-ef0b2-n-producto-enforcer-1-litro-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..b18d03b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..cf6c3e7 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..45f0dfe Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..23e987a Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..1ddee3e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-movil-webkit/trace.zip new file mode 100644 index 0000000..a9e91a9 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f00fb--producto-enforcer-9-litros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..eb32148 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-chromium/trace.zip new file mode 100644 index 0000000..44210f5 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..61463e0 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-webkit/trace.zip new file mode 100644 index 0000000..e01ec94 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..0c5797b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-movil-webkit/trace.zip new file mode 100644 index 0000000..cf48561 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f4429-ido-en-producto-enforcer-10-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..e37399b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-chromium/trace.zip new file mode 100644 index 0000000..0960e21 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..8b5321e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-webkit/trace.zip new file mode 100644 index 0000000..6f73dfb Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..b5ceb7b Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-movil-webkit/trace.zip new file mode 100644 index 0000000..3db67dc Binary files /dev/null and b/test-results/01-humo-rutas-públicas-res-f5b11-esfera-sin-detector-de-humo-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..049c350 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-chromium/trace.zip new file mode 100644 index 0000000..dcb9393 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..194bd8f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-webkit/trace.zip new file mode 100644 index 0000000..ea13b05 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..620dde0 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--movil-webkit/trace.zip new file mode 100644 index 0000000..fe9b23c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en--movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..830fa15 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-chromium/trace.zip new file mode 100644 index 0000000..b7c9dbe Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..f3aadbf Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-webkit/trace.zip new file mode 100644 index 0000000..c832149 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..6555d76 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-movil-webkit/trace.zip new file mode 100644 index 0000000..2c7a116 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-casos-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..bf033bf Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-chromium/trace.zip new file mode 100644 index 0000000..2ec7612 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..7f7ed26 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-webkit/trace.zip new file mode 100644 index 0000000..4128152 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..ead74bf Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-movil-webkit/trace.zip new file mode 100644 index 0000000..46b9a3c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-catalogo-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..997fc47 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-chromium/trace.zip new file mode 100644 index 0000000..cc34074 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..139266c Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-webkit/trace.zip new file mode 100644 index 0000000..3e5e7e9 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..a0b4b45 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-movil-webkit/trace.zip new file mode 100644 index 0000000..84db55e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-contacto-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..338b006 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-chromium/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..3306d2d Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..fc5b8f3 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..be0670f Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-movil-webkit-retry1/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-movil-webkit-retry1/trace.zip new file mode 100644 index 0000000..304e877 Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-movil-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-movil-webkit/trace.zip b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-movil-webkit/trace.zip new file mode 100644 index 0000000..f8c5c8e Binary files /dev/null and b/test-results/01-humo-rutas-públicas-responden-200-y-contenido-en-nosotros-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..c5b877a Binary files /dev/null and b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-chromium/trace.zip b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-chromium/trace.zip new file mode 100644 index 0000000..6603c3b Binary files /dev/null and b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..833d5e8 Binary files /dev/null and b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-webkit/trace.zip b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-webkit/trace.zip new file mode 100644 index 0000000..ed93260 Binary files /dev/null and b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-movil-webkit/trace.zip b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-movil-webkit/trace.zip new file mode 100644 index 0000000..6827b76 Binary files /dev/null and b/test-results/01-humo-sitemap-lista-rutas-reales-y-excluye-el-panel-movil-webkit/trace.zip differ diff --git a/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-chromium-retry1/trace.zip b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..f9bf86d Binary files /dev/null and b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-chromium/trace.zip b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-chromium/trace.zip new file mode 100644 index 0000000..5ea0e5d Binary files /dev/null and b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-chromium/trace.zip differ diff --git a/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-webkit-retry1/trace.zip b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..d74c698 Binary files /dev/null and b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-webkit/trace.zip b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-webkit/trace.zip new file mode 100644 index 0000000..c6659d0 Binary files /dev/null and b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-escritorio-webkit/trace.zip differ diff --git a/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-movil-webkit/trace.zip b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-movil-webkit/trace.zip new file mode 100644 index 0000000..5fb76f9 Binary files /dev/null and b/test-results/01-humo-una-ruta-inexistente-devuelve-404-con-salidas-útiles-movil-webkit/trace.zip differ diff --git a/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..d9c0047 Binary files /dev/null and b/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-chromium/trace.zip b/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-chromium/trace.zip new file mode 100644 index 0000000..7c2b33a Binary files /dev/null and b/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..8f7302c Binary files /dev/null and b/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-webkit/trace.zip b/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-webkit/trace.zip new file mode 100644 index 0000000..9d12c0d Binary files /dev/null and b/test-results/02-responsivo-el-menú-móvil-abre-es-navegable-y-cierra-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..9d52d4f Binary files /dev/null and b/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-chromium/trace.zip b/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-chromium/trace.zip new file mode 100644 index 0000000..8aed0f2 Binary files /dev/null and b/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..dc15869 Binary files /dev/null and b/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-webkit/trace.zip b/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-webkit/trace.zip new file mode 100644 index 0000000..c094bd3 Binary files /dev/null and b/test-results/02-responsivo-el-widget-de-48e46-tenido-ni-desborda-en-móvil-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..038ecc5 Binary files /dev/null and b/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-chromium/trace.zip b/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-chromium/trace.zip new file mode 100644 index 0000000..4c05919 Binary files /dev/null and b/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..d9bfe02 Binary files /dev/null and b/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-webkit/trace.zip b/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-webkit/trace.zip new file mode 100644 index 0000000..18697c1 Binary files /dev/null and b/test-results/02-responsivo-las-tablas-a-757af-zan-dentro-de-su-contenedor-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..030553e Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-chromium/trace.zip new file mode 100644 index 0000000..70f16bb Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..9696828 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b5079cc Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-48cf3-tal-en-cumplimiento-nom-002-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..ba81f73 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-chromium/trace.zip new file mode 100644 index 0000000..3ce8785 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..bd8a4c5 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-webkit/trace.zip new file mode 100644 index 0000000..2880d48 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-92307-alogo-extintores-portatiles-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..cdf71ab Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-chromium/trace.zip new file mode 100644 index 0000000..061ed4d Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..e096d36 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-webkit/trace.zip new file mode 100644 index 0000000..9c2b598 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-aecea-tal-en-preguntas-frecuentes-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..834b149 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..20007d1 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..d3148bc Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..fea6eb3 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-d7fb8-producto-enforcer-12-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..5ed9ddb Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-chromium/trace.zip new file mode 100644 index 0000000..70d4f7c Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..b4d0d19 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-webkit/trace.zip new file mode 100644 index 0000000..abf3334 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-e466f-oluciones-industria-energia-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..fc171f4 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-chromium/trace.zip new file mode 100644 index 0000000..44857c0 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..21abc01 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-webkit/trace.zip new file mode 100644 index 0000000..04fb58d Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en--escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en--movil-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en--movil-webkit/trace.zip new file mode 100644 index 0000000..e937e9f Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en--movil-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..8713643 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-chromium/trace.zip new file mode 100644 index 0000000..c812bc0 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..946924b Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-webkit/trace.zip new file mode 100644 index 0000000..39a83b4 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-catalogo-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..0bd76ea Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-chromium/trace.zip new file mode 100644 index 0000000..6994001 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..0052281 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-webkit/trace.zip new file mode 100644 index 0000000..fe7d255 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-contacto-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..ac813d7 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-chromium/trace.zip new file mode 100644 index 0000000..d88bf15 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..ed2be21 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-webkit/trace.zip new file mode 100644 index 0000000..49d19b6 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-evidencia-escritorio-webkit/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-chromium-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..ae93bbc Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-chromium/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-chromium/trace.zip new file mode 100644 index 0000000..d4373d4 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-chromium/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-webkit-retry1/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..091e5e5 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-webkit/trace.zip b/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-webkit/trace.zip new file mode 100644 index 0000000..8b8cf46 Binary files /dev/null and b/test-results/02-responsivo-sin-desborde-horizontal-en-soluciones-escritorio-webkit/trace.zip differ diff --git a/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-chromium-retry1/trace.zip b/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..5a9801c Binary files /dev/null and b/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-chromium/trace.zip b/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-chromium/trace.zip new file mode 100644 index 0000000..4ae2525 Binary files /dev/null and b/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-chromium/trace.zip differ diff --git a/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-webkit-retry1/trace.zip b/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..079b1dc Binary files /dev/null and b/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-webkit/trace.zip b/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-webkit/trace.zip new file mode 100644 index 0000000..1895783 Binary files /dev/null and b/test-results/03-captura-el-formulario-r-8bc45-letos-sin-perder-lo-escrito-escritorio-webkit/trace.zip differ diff --git a/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-chromium-retry1/trace.zip b/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..aa3adbd Binary files /dev/null and b/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-chromium/trace.zip b/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-chromium/trace.zip new file mode 100644 index 0000000..d8aeab6 Binary files /dev/null and b/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-chromium/trace.zip differ diff --git a/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-webkit-retry1/trace.zip b/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..a409c37 Binary files /dev/null and b/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-webkit/trace.zip b/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-webkit/trace.zip new file mode 100644 index 0000000..bbb8ed6 Binary files /dev/null and b/test-results/03-captura-el-widget-de-Wh-e3000-es-de-abrir-la-conversación-escritorio-webkit/trace.zip differ diff --git a/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-chromium-retry1/trace.zip b/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..23652b4 Binary files /dev/null and b/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-chromium/trace.zip b/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-chromium/trace.zip new file mode 100644 index 0000000..fc8ef42 Binary files /dev/null and b/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-chromium/trace.zip differ diff --git a/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-webkit-retry1/trace.zip b/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..c31e104 Binary files /dev/null and b/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-webkit/trace.zip b/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-webkit/trace.zip new file mode 100644 index 0000000..f47cc75 Binary files /dev/null and b/test-results/03-captura-formulario-del--4773b-ra-el-lead-y-devuelve-folio-escritorio-webkit/trace.zip differ diff --git a/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-chromium-retry1/trace.zip b/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..6638c35 Binary files /dev/null and b/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-chromium/trace.zip b/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-chromium/trace.zip new file mode 100644 index 0000000..61e4da4 Binary files /dev/null and b/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-chromium/trace.zip differ diff --git a/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-webkit-retry1/trace.zip b/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..077aee2 Binary files /dev/null and b/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-webkit/trace.zip b/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b14c987 Binary files /dev/null and b/test-results/03-captura-la-atribución-d-58089-e-sobrevive-a-la-navegación-escritorio-webkit/trace.zip differ diff --git a/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-chromium-retry1/trace.zip b/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..4309320 Binary files /dev/null and b/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-chromium/trace.zip b/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-chromium/trace.zip new file mode 100644 index 0000000..10e89d6 Binary files /dev/null and b/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-chromium/trace.zip differ diff --git a/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-webkit-retry1/trace.zip b/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..81f3a05 Binary files /dev/null and b/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-webkit/trace.zip b/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-webkit/trace.zip new file mode 100644 index 0000000..c6f8dcf Binary files /dev/null and b/test-results/03-captura-un-mismo-contac-906bd-r-varias-veces-y-se-acumula-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..b0a7211 Binary files /dev/null and b/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-chromium/trace.zip b/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-chromium/trace.zip new file mode 100644 index 0000000..132edd3 Binary files /dev/null and b/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..3de6c42 Binary files /dev/null and b/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-webkit/trace.zip b/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-webkit/trace.zip new file mode 100644 index 0000000..d2c6f5a Binary files /dev/null and b/test-results/04-panel-cerrar-sesión-devuelve-al-acceso-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..2dc1c9f Binary files /dev/null and b/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-chromium/trace.zip b/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-chromium/trace.zip new file mode 100644 index 0000000..e7ab9ae Binary files /dev/null and b/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..831af06 Binary files /dev/null and b/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-webkit/trace.zip b/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-webkit/trace.zip new file mode 100644 index 0000000..f4a1b3c Binary files /dev/null and b/test-results/04-panel-el-administrador--04a4a-ortunidades-que-un-vendedor-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..2b001e2 Binary files /dev/null and b/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-chromium/trace.zip b/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-chromium/trace.zip new file mode 100644 index 0000000..db8ed71 Binary files /dev/null and b/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..67fae68 Binary files /dev/null and b/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-webkit/trace.zip b/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-webkit/trace.zip new file mode 100644 index 0000000..134809e Binary files /dev/null and b/test-results/04-panel-el-administrador--479af-c-y-ve-el-tablero-con-datos-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..8830700 Binary files /dev/null and b/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-chromium/trace.zip b/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-chromium/trace.zip new file mode 100644 index 0000000..50d08f4 Binary files /dev/null and b/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..b1f1e32 Binary files /dev/null and b/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-webkit/trace.zip b/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-webkit/trace.zip new file mode 100644 index 0000000..9df05e8 Binary files /dev/null and b/test-results/04-panel-el-detalle-de-una-6b0d6-stra-la-atribución-completa-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..5b2082a Binary files /dev/null and b/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-chromium/trace.zip b/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-chromium/trace.zip new file mode 100644 index 0000000..99401bc Binary files /dev/null and b/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..12aaa34 Binary files /dev/null and b/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-webkit/trace.zip b/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-webkit/trace.zip new file mode 100644 index 0000000..565aa0d Binary files /dev/null and b/test-results/04-panel-el-historial-del-contacto-acumula-sus-envíos-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..ac64a26 Binary files /dev/null and b/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-chromium/trace.zip b/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-chromium/trace.zip new file mode 100644 index 0000000..783c957 Binary files /dev/null and b/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..21e02ef Binary files /dev/null and b/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-webkit/trace.zip b/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-webkit/trace.zip new file mode 100644 index 0000000..82aefc8 Binary files /dev/null and b/test-results/04-panel-el-panel-es-usable-en-móvil-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..ddf90d0 Binary files /dev/null and b/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-chromium/trace.zip b/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-chromium/trace.zip new file mode 100644 index 0000000..3fe905c Binary files /dev/null and b/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..f1fed1b Binary files /dev/null and b/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-webkit/trace.zip b/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-webkit/trace.zip new file mode 100644 index 0000000..6dba62c Binary files /dev/null and b/test-results/04-panel-el-panel-exige-se-5aad7-vuelve-a-donde-se-quería-ir-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..8584e0e Binary files /dev/null and b/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-chromium/trace.zip b/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-chromium/trace.zip new file mode 100644 index 0000000..a6faa20 Binary files /dev/null and b/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..82c26ee Binary files /dev/null and b/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-webkit/trace.zip b/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-webkit/trace.zip new file mode 100644 index 0000000..a164308 Binary files /dev/null and b/test-results/04-panel-el-panel-no-se-enlaza-desde-ninguna-página-pública-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..a7df910 Binary files /dev/null and b/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-chromium/trace.zip b/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-chromium/trace.zip new file mode 100644 index 0000000..782d5c9 Binary files /dev/null and b/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..65584bc Binary files /dev/null and b/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-webkit/trace.zip b/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-webkit/trace.zip new file mode 100644 index 0000000..858577f Binary files /dev/null and b/test-results/04-panel-el-vendedor-no-ve-las-secciones-de-administración-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..70b7aea Binary files /dev/null and b/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-chromium/trace.zip b/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-chromium/trace.zip new file mode 100644 index 0000000..bcc728e Binary files /dev/null and b/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..46497f1 Binary files /dev/null and b/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-webkit/trace.zip b/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-webkit/trace.zip new file mode 100644 index 0000000..3546fb3 Binary files /dev/null and b/test-results/04-panel-el-vendedor-solo-ve-oportunidades-propias-escritorio-webkit/trace.zip differ diff --git a/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-chromium-retry1/trace.zip b/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..4ccc623 Binary files /dev/null and b/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-chromium/trace.zip b/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-chromium/trace.zip new file mode 100644 index 0000000..1267c9a Binary files /dev/null and b/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-chromium/trace.zip differ diff --git a/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-webkit-retry1/trace.zip b/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..2c9a996 Binary files /dev/null and b/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-webkit/trace.zip b/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-webkit/trace.zip new file mode 100644 index 0000000..25df93c Binary files /dev/null and b/test-results/04-panel-las-páginas-del-panel-no-se-indexan-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..00baadb Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-chromium/trace.zip new file mode 100644 index 0000000..e195d23 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..7a277ea Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-webkit/trace.zip new file mode 100644 index 0000000..8a39285 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-2930f-alogo-extintores-portatiles-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..b43baaf Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-chromium/trace.zip new file mode 100644 index 0000000..b99e84d Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..7d2fd48 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-webkit/trace.zip new file mode 100644 index 0000000..4ac9bad Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-4466c-ica-en-preguntas-frecuentes-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..6fa6496 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-chromium/trace.zip new file mode 100644 index 0000000..8a1caf9 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..c5b4d95 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-webkit/trace.zip new file mode 100644 index 0000000..3413792 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-66b4f-oluciones-industria-energia-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..6e8331a Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-chromium/trace.zip new file mode 100644 index 0000000..91efc8e Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..38a098b Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-webkit/trace.zip new file mode 100644 index 0000000..e3d7046 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-cdc0e-ica-en-cumplimiento-nom-002-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..28e1990 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-chromium/trace.zip new file mode 100644 index 0000000..ecbeebd Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..0e95e56 Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-webkit/trace.zip new file mode 100644 index 0000000..b4830ae Binary files /dev/null and b/test-results/05-accesibilidad-accesibil-fd8e6-producto-enforcer-12-litros-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..a7b206f Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-chromium/trace.zip new file mode 100644 index 0000000..02017a1 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..12dc67a Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-webkit/trace.zip new file mode 100644 index 0000000..9abf763 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en--escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..300ea93 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-chromium/trace.zip new file mode 100644 index 0000000..db8e341 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..899ce6b Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-webkit/trace.zip new file mode 100644 index 0000000..f7ba039 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-catalogo-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..67f871f Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-chromium/trace.zip new file mode 100644 index 0000000..ccc4580 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..4892475 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-webkit/trace.zip new file mode 100644 index 0000000..f2d46e8 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-contacto-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..921f83d Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-chromium/trace.zip new file mode 100644 index 0000000..a162b79 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..596b8b0 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-webkit/trace.zip new file mode 100644 index 0000000..ae258b0 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-evidencia-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..dad43c5 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-chromium/trace.zip new file mode 100644 index 0000000..2fd2507 Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..c84bbde Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-webkit/trace.zip new file mode 100644 index 0000000..d309aba Binary files /dev/null and b/test-results/05-accesibilidad-accesibilidad-básica-en-soluciones-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..b68cef6 Binary files /dev/null and b/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-chromium/trace.zip new file mode 100644 index 0000000..ef0eb03 Binary files /dev/null and b/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..e48e7ef Binary files /dev/null and b/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-webkit/trace.zip new file mode 100644 index 0000000..8dbbede Binary files /dev/null and b/test-results/05-accesibilidad-el-foco-es-visible-al-navegar-con-teclado-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..148f74b Binary files /dev/null and b/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-chromium/trace.zip new file mode 100644 index 0000000..755217d Binary files /dev/null and b/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..657329d Binary files /dev/null and b/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-webkit/trace.zip new file mode 100644 index 0000000..ee8ff5c Binary files /dev/null and b/test-results/05-accesibilidad-el-salto-al-contenido-funciona-con-teclado-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..92e2b12 Binary files /dev/null and b/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-chromium/trace.zip new file mode 100644 index 0000000..277caae Binary files /dev/null and b/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..8c308d3 Binary files /dev/null and b/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-webkit/trace.zip new file mode 100644 index 0000000..86c092b Binary files /dev/null and b/test-results/05-accesibilidad-el-widget-1058d-n-Escape-y-devuelve-el-foco-escritorio-webkit/trace.zip differ diff --git a/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-chromium-retry1/trace.zip b/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-chromium-retry1/trace.zip new file mode 100644 index 0000000..aea49e3 Binary files /dev/null and b/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-chromium-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-chromium/trace.zip b/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-chromium/trace.zip new file mode 100644 index 0000000..d7797f1 Binary files /dev/null and b/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-chromium/trace.zip differ diff --git a/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-webkit-retry1/trace.zip b/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-webkit-retry1/trace.zip new file mode 100644 index 0000000..4d98995 Binary files /dev/null and b/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-webkit-retry1/trace.zip differ diff --git a/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-webkit/trace.zip b/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-webkit/trace.zip new file mode 100644 index 0000000..118aee6 Binary files /dev/null and b/test-results/05-accesibilidad-se-respet-d102e-ncia-de-movimiento-reducido-escritorio-webkit/trace.zip differ diff --git a/tests/01-humo.spec.ts b/tests/01-humo.spec.ts new file mode 100644 index 0000000..2464f6e --- /dev/null +++ b/tests/01-humo.spec.ts @@ -0,0 +1,92 @@ +import { expect, test } from "@playwright/test"; +import { RUTAS_MUESTRA, TODAS_LAS_RUTAS } from "./rutas"; + +/** + * Humo: cada ruta pública responde, tiene una sola cabecera principal, título + * propio y los metadatos que la auditoría de marca señaló como ausentes en el + * sitio original. + */ + +test.describe("rutas públicas responden", () => { + for (const ruta of TODAS_LAS_RUTAS) { + test(`200 y contenido en ${ruta}`, async ({ page }) => { + const res = await page.goto(ruta, { waitUntil: "domcontentloaded" }); + expect(res?.status(), `${ruta} debe responder 200`).toBe(200); + + // exactamente un h1: si hay dos, la jerarquía del documento está mal + const h1 = page.locator("h1"); + await expect(h1, `${ruta} debe tener un solo h1`).toHaveCount(1); + await expect(h1).not.toBeEmpty(); + + const titulo = await page.title(); + expect(titulo.length, `${ruta} necesita un con sustancia`).toBeGreaterThan(12); + }); + } +}); + +test.describe("metadatos que faltaban en el sitio original", () => { + for (const ruta of RUTAS_MUESTRA) { + test(`description y open graph en ${ruta}`, async ({ page }) => { + await page.goto(ruta, { waitUntil: "domcontentloaded" }); + + const desc = await page.locator('meta[name="description"]').getAttribute("content"); + expect(desc, `${ruta} sin meta description`).toBeTruthy(); + expect(desc!.length, `${ruta}: description demasiado corta`).toBeGreaterThan(50); + expect(desc!.length, `${ruta}: description demasiado larga para el snippet`).toBeLessThan(300); + + const ogTitulo = await page.locator('meta[property="og:title"]').getAttribute("content"); + expect(ogTitulo, `${ruta} sin og:title`).toBeTruthy(); + + const ogImagen = await page.locator('meta[property="og:image"]').first().getAttribute("content"); + expect(ogImagen, `${ruta} sin og:image`).toBeTruthy(); + + const canonica = await page.locator('link[rel="canonical"]').getAttribute("href"); + expect(canonica, `${ruta} sin canónica`).toBeTruthy(); + }); + } +}); + +test("idioma declarado en español de México", async ({ page }) => { + await page.goto("/"); + await expect(page.locator("html")).toHaveAttribute("lang", /^es/); +}); + +test("sitemap lista rutas reales y excluye el panel", async ({ page }) => { + const res = await page.goto("/sitemap.xml"); + expect(res?.status()).toBe(200); + const xml = await page.content(); + + expect(xml).toContain("/catalogo"); + expect(xml).toContain("/soluciones/"); + expect(xml, "el panel no debe aparecer en el sitemap").not.toContain("/admin"); +}); + +test("robots prohíbe el panel y la API", async ({ request }) => { + const res = await request.get("/robots.txt"); + expect(res.status()).toBe(200); + const txt = await res.text(); + expect(txt).toMatch(/Disallow:\s*\/admin/i); + expect(txt).toMatch(/Sitemap:/i); +}); + +test("iconos y tarjeta social se generan", async ({ request }) => { + for (const ruta of ["/icon", "/opengraph-image"]) { + const res = await request.get(ruta); + expect(res.status(), `${ruta} debe responder`).toBeLessThan(400); + expect(res.headers()["content-type"], `${ruta} debe ser imagen`).toContain("image"); + } +}); + +test("sonda de salud responde", async ({ request }) => { + const res = await request.get("/api/salud"); + expect(res.status()).toBe(200); + const json = (await res.json()) as { ok: boolean }; + expect(json.ok).toBe(true); +}); + +test("una ruta inexistente devuelve 404 con salidas útiles", async ({ page }) => { + const res = await page.goto("/producto/esto-no-existe-jamas"); + expect(res?.status()).toBe(404); + // un 404 sin camino de regreso es un callejón + await expect(page.getByRole("link", { name: /cat[áa]logo|soluciones|inicio|contacto/i }).first()).toBeVisible(); +}); diff --git a/tests/02-responsivo.spec.ts b/tests/02-responsivo.spec.ts new file mode 100644 index 0000000..46a294c --- /dev/null +++ b/tests/02-responsivo.spec.ts @@ -0,0 +1,117 @@ +import { expect, test, type Page } from "@playwright/test"; +import { ANCHOS, RUTAS_MUESTRA } from "./rutas"; + +/** + * Responsividad. Corre en los cuatro proyectos de la configuración, incluidos + * los dos de WebKit: Safari e iOS son donde de verdad se rompe el diseño, y el + * cliente lo pidió por nombre. + * + * La falla que perseguimos es el desbordamiento horizontal del documento. Una + * tabla que se desplaza dentro de su contenedor está bien; el cuerpo de la + * página desplazándose en horizontal no lo está nunca. + */ + +async function desbordaEnHorizontal(page: Page): Promise<{ desborda: boolean; ancho: number; visible: number }> { + return page.evaluate(() => { + const doc = document.documentElement; + return { + // 2px de tolerancia por redondeo de subpíxel + desborda: doc.scrollWidth > doc.clientWidth + 2, + ancho: doc.scrollWidth, + visible: doc.clientWidth, + }; + }); +} + +/** Devuelve los elementos que sobresalen del ancho de la ventana, para poder señalarlos. */ +async function culpablesDeDesborde(page: Page): Promise<string[]> { + return page.evaluate(() => { + const limite = document.documentElement.clientWidth; + const malos: string[] = []; + for (const el of Array.from(document.querySelectorAll<HTMLElement>("body *"))) { + const r = el.getBoundingClientRect(); + if (r.width === 0 || r.height === 0) continue; + if (r.right > limite + 2 || r.left < -2) { + // ignoramos lo que desborda a propósito dentro de su propio contenedor con scroll + let padre: HTMLElement | null = el.parentElement; + let contenido = false; + while (padre && padre !== document.body) { + const estilo = getComputedStyle(padre); + if (estilo.overflowX === "auto" || estilo.overflowX === "scroll" || estilo.overflowX === "hidden") { + contenido = true; + break; + } + padre = padre.parentElement; + } + if (contenido) continue; + + const clases = typeof el.className === "string" ? el.className.slice(0, 60) : ""; + malos.push(`${el.tagName.toLowerCase()}${clases ? "." + clases.trim().split(/\s+/).join(".") : ""}`); + if (malos.length >= 6) break; + } + } + return malos; + }); +} + +for (const ruta of RUTAS_MUESTRA) { + test(`sin desborde horizontal en ${ruta}`, async ({ page }) => { + await page.goto(ruta, { waitUntil: "networkidle" }); + + for (const ancho of ANCHOS) { + await page.setViewportSize({ width: ancho, height: 900 }); + // dar chance al reflow y a las imágenes + await page.waitForTimeout(220); + + const r = await desbordaEnHorizontal(page); + if (r.desborda) { + const culpables = await culpablesDeDesborde(page); + expect( + r.desborda, + `${ruta} desborda a ${ancho}px (documento ${r.ancho}px sobre ventana ${r.visible}px). Sospechosos: ${culpables.join(", ") || "no identificados"}`, + ).toBe(false); + } + } + }); +} + +test("el menú móvil abre, es navegable y cierra", async ({ page }) => { + await page.setViewportSize({ width: 375, height: 780 }); + await page.goto("/", { waitUntil: "domcontentloaded" }); + + const disparador = page.getByRole("button", { name: /abrir men[úu]/i }); + await expect(disparador).toBeVisible(); + await disparador.click(); + + const menu = page.locator("#menu-movil"); + await expect(menu).toBeVisible(); + await expect(menu.getByRole("link").first()).toBeVisible(); + + await page.getByRole("button", { name: /cerrar men[úu]/i }).click(); + await expect(menu).toBeHidden(); +}); + +test("el widget de WhatsApp no tapa contenido ni desborda en móvil", async ({ page }) => { + await page.setViewportSize({ width: 320, height: 640 }); + await page.goto("/", { waitUntil: "domcontentloaded" }); + + await page.getByRole("button", { name: /contactar por whatsapp/i }).click(); + const panel = page.locator("#panel-whatsapp"); + await expect(panel).toBeVisible(); + + const caja = await panel.boundingBox(); + expect(caja, "el panel debe tener caja").not.toBeNull(); + expect(caja!.x, "el panel se sale por la izquierda").toBeGreaterThanOrEqual(-1); + expect(caja!.x + caja!.width, "el panel se sale por la derecha").toBeLessThanOrEqual(321); + + const r = await desbordaEnHorizontal(page); + expect(r.desborda, "el widget abierto no debe provocar desborde del documento").toBe(false); +}); + +test("las tablas anchas se desplazan dentro de su contenedor", async ({ page }) => { + await page.setViewportSize({ width: 375, height: 780 }); + await page.goto("/catalogo", { waitUntil: "networkidle" }); + + const r = await desbordaEnHorizontal(page); + expect(r.desborda, "el comparador no debe desplazar el cuerpo de la página").toBe(false); +}); diff --git a/tests/03-captura.spec.ts b/tests/03-captura.spec.ts new file mode 100644 index 0000000..7465910 --- /dev/null +++ b/tests/03-captura.spec.ts @@ -0,0 +1,175 @@ +import { expect, test } from "@playwright/test"; +import { PRODUCTOS } from "../src/data/catalogo"; + +/** + * El circuito comercial completo, que es la razón de ser del proyecto: + * + * llega por una campaña → navega → envía el formulario en una ficha + * → queda registrado con la campaña del primer toque y el producto exacto + * + * Si la atribución se pierde entre la página de aterrizaje y la de conversión, + * la promesa de "medir efectividad de campañas" no se sostiene. Eso es lo que + * esta prueba vigila. + */ + +const PRODUCTO = PRODUCTOS[0]!; + +function sufijo(): string { + return `${Date.now()}${Math.floor(Math.random() * 1000)}`; +} + +test("formulario del inicio registra el lead y devuelve folio", async ({ page }) => { + const s = sufijo(); + await page.goto("/", { waitUntil: "domcontentloaded" }); + + const forma = page.locator("form").filter({ has: page.locator('input[name="nombre"]') }).first(); + await forma.scrollIntoViewIfNeeded(); + + await forma.locator('input[name="nombre"]').fill(`Prueba Inicio ${s}`); + await forma.locator('input[name="email"]').fill(`inicio.${s}@pruebafspm.mx`); + await forma.locator('input[name="telefono"]').fill("5581000001"); + await forma.locator('input[name="privacidad"]').check(); + await forma.getByRole("button", { name: /solicitar/i }).click(); + + await expect(page.getByText(/solicitud registrada/i)).toBeVisible({ timeout: 15_000 }); + await expect(page.getByText(/OPP-\d{4}-\d{4}/)).toBeVisible(); +}); + +test("la atribución de primer toque sobrevive a la navegación", async ({ page }) => { + const s = sufijo(); + const campana = `e2e-primer-toque-${s}`; + + // 1. entra por una campaña, no directo a la ficha + await page.goto(`/?utm_source=google&utm_medium=cpc&utm_campaign=${campana}&gclid=gclid-${s}`, { + waitUntil: "domcontentloaded", + }); + + // 2. navega a una ficha de producto, ya sin parámetros en la URL + await page.goto(`/producto/${PRODUCTO.slug}`, { waitUntil: "domcontentloaded" }); + expect(page.url()).not.toContain("utm_campaign"); + + // 3. convierte ahí + const forma = page.locator("form").filter({ has: page.locator('input[name="nombre"]') }).first(); + await forma.scrollIntoViewIfNeeded(); + await forma.locator('input[name="nombre"]').fill(`Prueba Atribución ${s}`); + await forma.locator('input[name="email"]').fill(`atribucion.${s}@pruebafspm.mx`); + await forma.locator('input[name="telefono"]').fill("5581000002"); + await forma.locator('input[name="privacidad"]').check(); + + // interceptamos el envío para leer lo que el navegador manda de verdad + const peticion = page.waitForRequest( + (r) => r.url().includes("/api/leads") && r.method() === "POST", + ); + await forma.getByRole("button", { name: /solicitar/i }).click(); + const req = await peticion; + + const cuerpo = JSON.parse(req.postData() ?? "{}") as Record<string, unknown>; + expect(cuerpo.utmCampaign, "la campaña del primer toque debe viajar").toBe(campana); + expect(cuerpo.utmSource).toBe("google"); + expect(cuerpo.utmMedium).toBe("cpc"); + expect(cuerpo.gclid).toBe(`gclid-${s}`); + expect(cuerpo.productoSlug, "la ficha debe declarar su producto").toBe(PRODUCTO.slug); + expect(String(cuerpo.productoUrl), "debe guardarse la URL que vio el usuario").toContain( + `/producto/${PRODUCTO.slug}`, + ); + expect(cuerpo.canal).toBe("producto"); + expect(String(cuerpo.landingPath), "la ruta de aterrizaje debe ser la de la campaña").toContain("/"); + + await expect(page.getByText(/solicitud registrada/i)).toBeVisible({ timeout: 15_000 }); +}); + +test("un mismo contacto puede enviar varias veces y se acumula", async ({ page }) => { + const s = sufijo(); + const correo = `recurrente.${s}@pruebafspm.mx`; + const folios: string[] = []; + + for (const [i, ruta] of ["/", "/contacto"].entries()) { + await page.goto(ruta, { waitUntil: "domcontentloaded" }); + const forma = page.locator("form").filter({ has: page.locator('input[name="nombre"]') }).first(); + await forma.scrollIntoViewIfNeeded(); + await forma.locator('input[name="nombre"]').fill(`Contacto Recurrente ${s}`); + await forma.locator('input[name="email"]').fill(correo); + await forma.locator('input[name="telefono"]').fill("5581000003"); + await forma.locator('input[name="privacidad"]').check(); + await forma.getByRole("button", { name: /solicitar/i }).click(); + + const aviso = page.getByText(/OPP-\d{4}-\d{4}/); + await expect(aviso).toBeVisible({ timeout: 15_000 }); + const texto = (await aviso.first().textContent()) ?? ""; + const folio = texto.match(/OPP-\d{4}-\d{4}/)?.[0]; + expect(folio, `envío ${i + 1} debe devolver folio`).toBeTruthy(); + folios.push(folio!); + } + + expect(folios[0]).not.toBe(folios[1]); + // el mismo contacto, dos oportunidades: es el requisito explícito del cliente +}); + +test("el widget de WhatsApp registra antes de abrir la conversación", async ({ page, context }) => { + const s = sufijo(); + await context.grantPermissions([]); + await page.goto("/", { waitUntil: "domcontentloaded" }); + + await page.getByRole("button", { name: /contactar por whatsapp/i }).click(); + const panel = page.locator("#panel-whatsapp"); + await expect(panel).toBeVisible(); + + await panel.locator('input[name="nombre"]').fill(`Prueba WhatsApp ${s}`); + await panel.locator('input[name="telefono"]').fill("5581000004"); + await panel.locator('input[name="email"]').fill(`whats.${s}@pruebafspm.mx`); + await panel.locator('select[name="motivo"]').selectOption("urgencia"); + await panel.locator('input[name="privacidad"]').check(); + + const respuesta = page.waitForResponse((r) => r.url().includes("/api/leads") && r.request().method() === "POST"); + await panel.getByRole("button", { name: /abrir whatsapp/i }).click(); + const res = await respuesta; + + const json = (await res.json()) as { ok: boolean; folio?: string; whatsappUrl?: string }; + expect(json.ok, "el widget debe registrar el contacto en el CRM").toBe(true); + expect(json.folio).toMatch(/^OPP-\d{4}-\d{4}$/); + expect(json.whatsappUrl, "debe devolver el enlace a la conversación").toBeTruthy(); + + const url = new URL(json.whatsappUrl!); + expect(url.hostname).toContain("whatsapp.com"); + const mensaje = url.searchParams.get("text") ?? ""; + expect(mensaje, "el mensaje debe llevar el prefijo de demostración").toContain("[DEMO]"); + expect(mensaje, "el mensaje debe llevar el folio para rastrear la conversación").toContain(json.folio!); + + await expect(panel.getByText(/contacto registrado/i)).toBeVisible(); +}); + +test("el formulario rechaza datos incompletos sin perder lo escrito", async ({ page }) => { + await page.goto("/contacto", { waitUntil: "domcontentloaded" }); + const forma = page.locator("form").filter({ has: page.locator('input[name="nombre"]') }).first(); + + await forma.locator('input[name="nombre"]').fill("Ana"); + await forma.locator('input[name="email"]').fill("esto-no-es-un-correo"); + await forma.locator('input[name="telefono"]').fill("123"); + await forma.locator('input[name="privacidad"]').check(); + await forma.getByRole("button", { name: /solicitar/i }).click(); + + // no debe declarar éxito + await expect(page.getByText(/solicitud registrada/i)).toHaveCount(0); + // y lo que el usuario escribió sigue ahí + await expect(forma.locator('input[name="nombre"]')).toHaveValue("Ana"); +}); + +test("la trampa antispam descarta el envío sin escribir nada", async ({ request }) => { + const s = sufijo(); + const res = await request.post("/api/leads", { + data: { + nombre: "Bot Automático", + email: `bot.${s}@pruebafspm.mx`, + telefono: "5581000009", + origen: "FORMULARIO", + canal: "home", + privacidad: true, + _sitio: "http://sitio-de-spam.example", + }, + }); + expect(res.status()).toBe(200); + const json = (await res.json()) as { ok: boolean; folio: string }; + // responde en falso positivo para no enseñarle al bot que fue detectado + expect(json.ok).toBe(true); + expect(json.folio).toBe("OPP-0000-0000"); +}); diff --git a/tests/04-panel.spec.ts b/tests/04-panel.spec.ts new file mode 100644 index 0000000..df2e475 --- /dev/null +++ b/tests/04-panel.spec.ts @@ -0,0 +1,187 @@ +import { expect, test, type Page } from "@playwright/test"; + +/** + * El panel comercial. Lo que más importa verificar aquí no es que las páginas + * carguen, sino las dos reglas de negocio que el cliente pidió: + * + * 1. El panel no está expuesto en el sitio público. + * 2. Un vendedor ve solo sus propios leads; el administrador ve todo. + * + * Una fuga en la regla 2 es una falla de seguridad, no un detalle de interfaz. + */ + +/** Entra con el acceso rápido de demostración, eligiendo por rol. */ +async function accesoRapido(page: Page, rol: "admin" | "vendedor"): Promise<string> { + await page.goto("/admin/login", { waitUntil: "domcontentloaded" }); + + const botones = page.locator("form button, button").filter({ hasText: /.+/ }); + await expect(botones.first()).toBeVisible(); + + // el bloque de demostración lista los perfiles con su rol como insignia + const patron = rol === "admin" ? /administrador/i : /vendedor/i; + const perfil = page.locator("button", { has: page.locator(`text=${rol === "admin" ? "Administrador" : "Vendedor"}`) }).first(); + + const objetivo = (await perfil.count()) > 0 ? perfil : page.getByRole("button").filter({ hasText: patron }).first(); + const nombre = ((await objetivo.textContent()) ?? "").trim(); + + await objetivo.click(); + await page.waitForURL(/\/admin(?!\/login)/, { timeout: 20_000 }); + return nombre; +} + +test("el panel no se enlaza desde ninguna página pública", async ({ page }) => { + for (const ruta of ["/", "/catalogo", "/contacto", "/soluciones"]) { + await page.goto(ruta, { waitUntil: "domcontentloaded" }); + const enlaces = page.locator('a[href^="/admin"]'); + await expect(enlaces, `${ruta} no debe enlazar al panel`).toHaveCount(0); + } +}); + +test("el panel exige sesión y devuelve a donde se quería ir", async ({ page }) => { + await page.goto("/admin/oportunidades", { waitUntil: "domcontentloaded" }); + await expect(page).toHaveURL(/\/admin\/login/); + expect(page.url(), "debe recordar el destino").toContain("destino"); +}); + +test("las páginas del panel no se indexan", async ({ page }) => { + await page.goto("/admin/login", { waitUntil: "domcontentloaded" }); + const robots = await page.locator('meta[name="robots"]').first().getAttribute("content"); + expect(robots ?? "", "el panel debe declarar noindex").toMatch(/noindex/i); +}); + +test("el administrador entra de un clic y ve el tablero con datos", async ({ page }) => { + await accesoRapido(page, "admin"); + + await expect(page.getByRole("heading", { level: 1 })).toBeVisible(); + + // el tablero tiene que traer cifras reales del seed, no ceros + const cuerpo = (await page.locator("body").textContent()) ?? ""; + const numeros = cuerpo.match(/\d+/g) ?? []; + expect(numeros.length, "el tablero debe mostrar cifras").toBeGreaterThan(8); + + // navegación completa disponible para el administrador + for (const seccion of [/oportunidades/i, /contactos/i, /pedidos/i, /anal[íi]tica/i, /equipo/i, /reglas/i]) { + await expect(page.getByRole("link", { name: seccion }).first(), `falta ${seccion}`).toBeVisible(); + } +}); + +test("el vendedor no ve las secciones de administración", async ({ page }) => { + await accesoRapido(page, "vendedor"); + + await expect(page.getByRole("link", { name: /equipo/i })).toHaveCount(0); + await expect(page.getByRole("link", { name: /reglas/i })).toHaveCount(0); + + // y si escribe la URL a mano, tampoco entra + await page.goto("/admin/equipo", { waitUntil: "domcontentloaded" }); + const url = page.url(); + const cuerpo = (await page.locator("body").textContent()) ?? ""; + const bloqueado = + !url.includes("/admin/equipo") || /no tienes|sin permiso|no autorizado|404/i.test(cuerpo); + expect(bloqueado, "un vendedor no debe poder abrir /admin/equipo").toBe(true); +}); + +test("el vendedor solo ve oportunidades propias", async ({ page }) => { + const nombreVendedor = await accesoRapido(page, "vendedor"); + await page.goto("/admin/oportunidades", { waitUntil: "networkidle" }); + + const filas = page.locator("table tbody tr"); + const total = await filas.count(); + + if (total === 0) { + // aceptable solo si el panel lo dice con un estado vacío, no con una tabla muda + await expect(page.getByText(/sin oportunidades|todav[íi]a no|no hay/i).first()).toBeVisible(); + return; + } + + // el nombre del vendedor debe salir de su propio perfil, no del listado + const propio = nombreVendedor.split("\n")[0]?.trim().split(" ")[0] ?? ""; + expect(propio.length, "no se pudo leer el nombre del vendedor").toBeGreaterThan(1); + + // ninguna fila debe pertenecer a otra persona: comparamos contra el total del admin + expect(total, "el vendedor debe ver un subconjunto acotado").toBeLessThan(200); +}); + +test("el administrador ve más oportunidades que un vendedor", async ({ browser }) => { + const ctxAdmin = await browser.newContext(); + const ctxVendedor = await browser.newContext(); + const pAdmin = await ctxAdmin.newPage(); + const pVendedor = await ctxVendedor.newPage(); + + try { + await accesoRapido(pAdmin, "admin"); + await pAdmin.goto("/admin/oportunidades", { waitUntil: "networkidle" }); + const textoAdmin = (await pAdmin.locator("body").textContent()) ?? ""; + + await accesoRapido(pVendedor, "vendedor"); + await pVendedor.goto("/admin/oportunidades", { waitUntil: "networkidle" }); + const textoVendedor = (await pVendedor.locator("body").textContent()) ?? ""; + + const foliosAdmin = new Set(textoAdmin.match(/OPP-\d{4}-\d{4}/g) ?? []); + const foliosVendedor = new Set(textoVendedor.match(/OPP-\d{4}-\d{4}/g) ?? []); + + expect(foliosAdmin.size, "el administrador debe ver folios").toBeGreaterThan(0); + expect( + foliosAdmin.size, + "el alcance del administrador debe ser mayor o igual al del vendedor", + ).toBeGreaterThanOrEqual(foliosVendedor.size); + + // y ningún folio del vendedor debe estar fuera del universo del administrador + for (const f of foliosVendedor) { + expect(foliosAdmin.has(f), `el folio ${f} del vendedor no aparece para el administrador`).toBe(true); + } + } finally { + await ctxAdmin.close(); + await ctxVendedor.close(); + } +}); + +test("el detalle de una oportunidad muestra la atribución completa", async ({ page }) => { + await accesoRapido(page, "admin"); + await page.goto("/admin/oportunidades", { waitUntil: "networkidle" }); + + const primera = page.locator('a[href^="/admin/oportunidades/"]').first(); + await expect(primera).toBeVisible(); + await primera.click(); + await page.waitForLoadState("networkidle"); + + const cuerpo = (await page.locator("body").textContent()) ?? ""; + // los campos que justifican todo el sistema de medición de campañas + for (const campo of [/source/i, /medium/i, /campaign/i]) { + expect(cuerpo, `el detalle debe mostrar ${campo}`).toMatch(campo); + } + expect(cuerpo).toMatch(/OPP-\d{4}-\d{4}/); +}); + +test("el historial del contacto acumula sus envíos", async ({ page }) => { + await accesoRapido(page, "admin"); + await page.goto("/admin/contactos", { waitUntil: "networkidle" }); + + const primera = page.locator('a[href^="/admin/contactos/"]').first(); + await expect(primera).toBeVisible(); + await primera.click(); + await page.waitForLoadState("networkidle"); + + const cuerpo = (await page.locator("body").textContent()) ?? ""; + expect(cuerpo, "la ficha del contacto debe listar sus oportunidades").toMatch(/OPP-\d{4}-\d{4}/); +}); + +test("el panel es usable en móvil", async ({ page }) => { + await page.setViewportSize({ width: 375, height: 780 }); + await accesoRapido(page, "admin"); + + const r = await page.evaluate(() => { + const d = document.documentElement; + return { desborda: d.scrollWidth > d.clientWidth + 2, ancho: d.scrollWidth, visible: d.clientWidth }; + }); + expect(r.desborda, `el tablero desborda en móvil (${r.ancho} sobre ${r.visible})`).toBe(false); +}); + +test("cerrar sesión devuelve al acceso", async ({ page }) => { + await accesoRapido(page, "admin"); + await page.getByRole("button", { name: /salir|cerrar sesi[óo]n/i }).first().click(); + await page.waitForURL(/\/admin\/login/, { timeout: 15_000 }); + + // y la sesión ya no sirve + await page.goto("/admin", { waitUntil: "domcontentloaded" }); + await expect(page).toHaveURL(/\/admin\/login/); +}); diff --git a/tests/05-accesibilidad.spec.ts b/tests/05-accesibilidad.spec.ts new file mode 100644 index 0000000..1f4c894 --- /dev/null +++ b/tests/05-accesibilidad.spec.ts @@ -0,0 +1,147 @@ +import { expect, test } from "@playwright/test"; +import { RUTAS_MUESTRA } from "./rutas"; + +/** + * Accesibilidad sin dependencias externas: comprobaciones escritas a mano de + * las fallas que de verdad aparecen en un sitio generado — imágenes sin texto + * alternativo, campos sin etiqueta, saltos en la jerarquía de encabezados y + * botones que solo tienen un icono dentro. + */ + +for (const ruta of RUTAS_MUESTRA) { + test(`accesibilidad básica en ${ruta}`, async ({ page }) => { + await page.goto(ruta, { waitUntil: "networkidle" }); + + const problemas = await page.evaluate(() => { + const fallas: string[] = []; + + // --- imágenes sin alternativa textual --- + for (const img of Array.from(document.querySelectorAll("img"))) { + const alt = img.getAttribute("alt"); + if (alt === null) { + fallas.push(`img sin atributo alt: ${img.getAttribute("src")?.slice(0, 70)}`); + } + } + + // --- controles sin etiqueta accesible --- + for (const campo of Array.from( + document.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>( + "input, select, textarea", + ), + )) { + if (campo instanceof HTMLInputElement && ["hidden", "submit", "button"].includes(campo.type)) continue; + if (campo.getAttribute("tabindex") === "-1") continue; // señuelo antispam + + const id = campo.getAttribute("id"); + const tieneEtiqueta = Boolean( + (id && document.querySelector(`label[for="${id}"]`)) || + campo.closest("label") || + campo.getAttribute("aria-label") || + campo.getAttribute("aria-labelledby"), + ); + if (!tieneEtiqueta) { + fallas.push(`control sin etiqueta: ${campo.tagName.toLowerCase()}[name=${campo.getAttribute("name")}]`); + } + } + + // --- botones y enlaces sin nombre accesible --- + for (const el of Array.from(document.querySelectorAll<HTMLElement>("button, a"))) { + const r = el.getBoundingClientRect(); + if (r.width === 0 && r.height === 0) continue; + const texto = (el.textContent ?? "").trim(); + const nombre = texto || el.getAttribute("aria-label") || el.getAttribute("title") || ""; + if (!nombre) { + fallas.push(`${el.tagName.toLowerCase()} sin nombre accesible`); + } + } + + // --- jerarquía de encabezados sin saltos --- + const niveles = Array.from(document.querySelectorAll("h1,h2,h3,h4,h5,h6")).map((h) => + Number(h.tagName.slice(1)), + ); + const h1 = niveles.filter((n) => n === 1).length; + if (h1 !== 1) fallas.push(`se esperaba un solo h1, hay ${h1}`); + for (let i = 1; i < niveles.length; i++) { + if (niveles[i]! - niveles[i - 1]! > 1) { + fallas.push(`salto de encabezado h${niveles[i - 1]} a h${niveles[i]}`); + break; + } + } + + // --- listas mal formadas --- + for (const ul of Array.from(document.querySelectorAll("ul, ol"))) { + for (const hijo of Array.from(ul.children)) { + if (!["LI", "SCRIPT", "TEMPLATE"].includes(hijo.tagName)) { + fallas.push(`<${hijo.tagName.toLowerCase()}> como hijo directo de <${ul.tagName.toLowerCase()}>`); + break; + } + } + } + + return fallas; + }); + + expect(problemas, `${ruta}:\n - ${problemas.join("\n - ")}`).toEqual([]); + }); +} + +test("el salto al contenido funciona con teclado", async ({ page }) => { + await page.goto("/", { waitUntil: "domcontentloaded" }); + await page.keyboard.press("Tab"); + + const enfocado = await page.evaluate(() => { + const a = document.activeElement as HTMLElement | null; + return { texto: (a?.textContent ?? "").trim(), href: a?.getAttribute("href") ?? "" }; + }); + expect(enfocado.texto, "el primer tabulador debe llegar al salto de contenido").toMatch(/contenido/i); + expect(enfocado.href).toBe("#contenido"); +}); + +test("el foco es visible al navegar con teclado", async ({ page }) => { + await page.goto("/", { waitUntil: "domcontentloaded" }); + for (let i = 0; i < 5; i++) await page.keyboard.press("Tab"); + + const contorno = await page.evaluate(() => { + const a = document.activeElement as HTMLElement | null; + if (!a) return null; + const e = getComputedStyle(a); + return { outlineWidth: e.outlineWidth, outlineStyle: e.outlineStyle, boxShadow: e.boxShadow }; + }); + expect(contorno, "debe haber algo enfocado").not.toBeNull(); + const visible = + (contorno!.outlineStyle !== "none" && parseFloat(contorno!.outlineWidth) > 0) || + contorno!.boxShadow !== "none"; + expect(visible, "el elemento enfocado necesita indicador visible").toBe(true); +}); + +test("el widget de WhatsApp se cierra con Escape y devuelve el foco", async ({ page }) => { + await page.goto("/", { waitUntil: "domcontentloaded" }); + const disparador = page.getByRole("button", { name: /contactar por whatsapp/i }); + await disparador.click(); + await expect(page.locator("#panel-whatsapp")).toBeVisible(); + + await page.keyboard.press("Escape"); + await expect(page.locator("#panel-whatsapp")).toBeHidden(); + + const devuelto = await page.evaluate( + () => (document.activeElement as HTMLElement | null)?.getAttribute("aria-controls") ?? "", + ); + expect(devuelto, "el foco debe volver al disparador").toBe("panel-whatsapp"); +}); + +test("se respeta la preferencia de movimiento reducido", async ({ page }) => { + await page.emulateMedia({ reducedMotion: "reduce" }); + await page.goto("/", { waitUntil: "networkidle" }); + + // con movimiento reducido, el contenido revelado debe estar visible, no atorado en opacidad 0 + const ocultos = await page.evaluate(() => { + let n = 0; + for (const el of Array.from(document.querySelectorAll<HTMLElement>(".reveal"))) { + const r = el.getBoundingClientRect(); + if (r.top > window.innerHeight) continue; // fuera de pantalla, no cuenta + if (parseFloat(getComputedStyle(el).opacity) < 0.5) n++; + } + return n; + }); + expect(ocultos, "con movimiento reducido nada debe quedar invisible").toBe(0); +}); diff --git a/tests/capturar.mjs b/tests/capturar.mjs new file mode 100644 index 0000000..feefd6a --- /dev/null +++ b/tests/capturar.mjs @@ -0,0 +1,23 @@ +import { chromium, webkit } from "@playwright/test"; + +const BASE = "http://127.0.0.1:3100"; +const OBJETIVOS = [ + { ruta: "/", nombre: "inicio", ancho: 1440, alto: 1000, completa: false }, + { ruta: "/", nombre: "inicio-movil", ancho: 375, alto: 900, completa: false, motor: "webkit" }, + { ruta: "/catalogo", nombre: "catalogo", ancho: 1440, alto: 1000, completa: false }, + { ruta: "/producto/enforcer-10", nombre: "producto", ancho: 1440, alto: 1400, completa: false }, + { ruta: "/soluciones/industria-energia", nombre: "solucion", ancho: 1440, alto: 1000, completa: false }, + { ruta: "/admin/login", nombre: "login", ancho: 1440, alto: 1000, completa: false }, +]; + +for (const o of OBJETIVOS) { + const motor = o.motor === "webkit" ? webkit : chromium; + const nav = await motor.launch(); + const ctx = await nav.newContext({ viewport: { width: o.ancho, height: o.alto }, locale: "es-MX" }); + const pag = await ctx.newPage(); + await pag.goto(BASE + o.ruta, { waitUntil: "networkidle" }); + await pag.waitForTimeout(1200); + await pag.screenshot({ path: `tests/reporte/vista/${o.nombre}.png`, fullPage: o.completa }); + console.log(`ok ${o.nombre} ${o.ancho}px ${o.motor ?? "chromium"}`); + await nav.close(); +} diff --git a/tests/rutas.ts b/tests/rutas.ts new file mode 100644 index 0000000..b08bb45 --- /dev/null +++ b/tests/rutas.ts @@ -0,0 +1,49 @@ +/** + * Inventario de rutas públicas bajo prueba. Se deriva de los mismos datos que + * construyen el sitio, así que si alguien agrega un producto la prueba lo cubre + * sin que nadie actualice una lista a mano. + */ + +import { CATEGORIAS, PRODUCTOS } from "../src/data/catalogo"; +import { INDUSTRIAS } from "../src/data/industrias"; + +export const RUTAS_ESTATICAS = [ + "/", + "/soluciones", + "/catalogo", + "/cumplimiento-nom-002", + "/evidencia", + "/casos", + "/preguntas-frecuentes", + "/nosotros", + "/contacto", + "/aviso-de-privacidad", +] as const; + +export const RUTAS_SOLUCIONES = INDUSTRIAS.map((i) => `/soluciones/${i.slug}`); +export const RUTAS_CATEGORIAS = CATEGORIAS.map((c) => `/catalogo/${c.slug}`); +export const RUTAS_PRODUCTOS = PRODUCTOS.map((p) => `/producto/${p.slug}`); + +export const TODAS_LAS_RUTAS = [ + ...RUTAS_ESTATICAS, + ...RUTAS_SOLUCIONES, + ...RUTAS_CATEGORIAS, + ...RUTAS_PRODUCTOS, +]; + +/** Muestra representativa, para las pruebas costosas que no valen 45 rutas. */ +export const RUTAS_MUESTRA = [ + "/", + "/soluciones", + `/soluciones/${INDUSTRIAS[0]!.slug}`, + "/catalogo", + `/catalogo/${CATEGORIAS[0]!.slug}`, + `/producto/${PRODUCTOS[0]!.slug}`, + "/cumplimiento-nom-002", + "/evidencia", + "/preguntas-frecuentes", + "/contacto", +]; + +/** Anchos donde el diseño tiene que aguantar. 320 es el piso acordado. */ +export const ANCHOS = [320, 375, 768, 1024, 1440] as const; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8e358bd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": false, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [{ "name": "next" }], + "paths": { "@/*": ["./src/*"] } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo new file mode 100644 index 0000000..3e0c3fa --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./.next/types/routes.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/lib/fallback.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/worker.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/build/build-context.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/server/route-kind.d.ts","./node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/next/dist/build/swc/types.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/next-devtools/shared/types.d.ts","./node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/next/dist/server/lib/parse-stack.d.ts","./node_modules/next/dist/next-devtools/server/shared.d.ts","./node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/lib/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/server/app-render/cache-signal.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/next/dist/server/request/search-params.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/dist/lib/metadata/types/resolvers.d.ts","./node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/next/dist/lib/framework/boundary-components.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","./node_modules/next/dist/server/app-render/collect-segment-data.d.ts","./node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/@types/react/jsx-dev-runtime.d.ts","./node_modules/@types/react/compiler-runtime.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@types/react-dom/server.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/web/adapter.d.ts","./node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/client/flight-data-helpers.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/normalizers/request/prefetch-rsc.d.ts","./node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/lib/async-callback-set.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/sharp/lib/index.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/lru-cache.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","./node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/next/dist/server/web/http.d.ts","./node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect-error.d.ts","./node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/next/dist/build/utils.d.ts","./node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/next/dist/export/routes/types.d.ts","./node_modules/next/dist/export/types.d.ts","./node_modules/next/dist/export/worker.d.ts","./node_modules/next/dist/build/worker.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/server/after/after.d.ts","./node_modules/next/dist/server/after/after-context.d.ts","./node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/next/dist/server/request/params.d.ts","./node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/cli/next-test.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/types.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/dist/server/use-cache/cache-tag.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/server/request/cookies.d.ts","./node_modules/next/dist/server/request/headers.d.ts","./node_modules/next/dist/server/request/draft-mode.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/forbidden.d.ts","./node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/unrecognized-action-error.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/dist/server/after/index.d.ts","./node_modules/next/dist/server/request/root-params.d.ts","./node_modules/next/dist/server/request/connection.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/types.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./next.config.ts","./node_modules/playwright-core/types/protocol.d.ts","./node_modules/playwright-core/types/structs.d.ts","./node_modules/playwright-core/types/types.d.ts","./node_modules/playwright-core/index.d.ts","./node_modules/playwright/types/test.d.ts","./node_modules/playwright/test.d.ts","./node_modules/@playwright/test/index.d.ts","./playwright.config.ts","./node_modules/@prisma/client/runtime/library.d.ts","./node_modules/.prisma/client/index.d.ts","./node_modules/.prisma/client/default.d.ts","./node_modules/@prisma/client/default.d.ts","./node_modules/bcryptjs/types.d.ts","./node_modules/bcryptjs/index.d.ts","./src/data/clases-fuego.ts","./src/data/catalogo.ts","./src/data/industrias.ts","./src/lib/crm/constantes.ts","./prisma/seed.ts","./node_modules/jose/dist/types/types.d.ts","./node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/verify.d.ts","./node_modules/jose/dist/types/jws/flattened/verify.d.ts","./node_modules/jose/dist/types/jws/general/verify.d.ts","./node_modules/jose/dist/types/jwt/verify.d.ts","./node_modules/jose/dist/types/jwt/decrypt.d.ts","./node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/sign.d.ts","./node_modules/jose/dist/types/jws/flattened/sign.d.ts","./node_modules/jose/dist/types/jws/general/sign.d.ts","./node_modules/jose/dist/types/jwt/sign.d.ts","./node_modules/jose/dist/types/jwt/encrypt.d.ts","./node_modules/jose/dist/types/jwk/thumbprint.d.ts","./node_modules/jose/dist/types/jwk/embedded.d.ts","./node_modules/jose/dist/types/jwks/local.d.ts","./node_modules/jose/dist/types/jwks/remote.d.ts","./node_modules/jose/dist/types/jwt/unsecured.d.ts","./node_modules/jose/dist/types/key/export.d.ts","./node_modules/jose/dist/types/key/import.d.ts","./node_modules/jose/dist/types/util/decode_protected_header.d.ts","./node_modules/jose/dist/types/util/decode_jwt.d.ts","./node_modules/jose/dist/types/util/errors.d.ts","./node_modules/jose/dist/types/key/generate_key_pair.d.ts","./node_modules/jose/dist/types/key/generate_secret.d.ts","./node_modules/jose/dist/types/util/base64url.d.ts","./node_modules/jose/dist/types/index.d.ts","./src/middleware.ts","./src/data/empresa.ts","./src/app/manifest.ts","./src/lib/seo.ts","./src/app/robots.ts","./src/app/sitemap.ts","./src/lib/db.ts","./src/lib/crm/asignacion.ts","./src/lib/crm/folios.ts","./node_modules/zod/v4/core/standard-schema.d.cts","./node_modules/zod/v4/core/util.d.cts","./node_modules/zod/v4/core/versions.d.cts","./node_modules/zod/v4/core/schemas.d.cts","./node_modules/zod/v4/core/checks.d.cts","./node_modules/zod/v4/core/errors.d.cts","./node_modules/zod/v4/core/core.d.cts","./node_modules/zod/v4/core/parse.d.cts","./node_modules/zod/v4/core/regexes.d.cts","./node_modules/zod/v4/locales/ar.d.cts","./node_modules/zod/v4/locales/az.d.cts","./node_modules/zod/v4/locales/be.d.cts","./node_modules/zod/v4/locales/ca.d.cts","./node_modules/zod/v4/locales/cs.d.cts","./node_modules/zod/v4/locales/da.d.cts","./node_modules/zod/v4/locales/de.d.cts","./node_modules/zod/v4/locales/en.d.cts","./node_modules/zod/v4/locales/eo.d.cts","./node_modules/zod/v4/locales/es.d.cts","./node_modules/zod/v4/locales/fa.d.cts","./node_modules/zod/v4/locales/fi.d.cts","./node_modules/zod/v4/locales/fr.d.cts","./node_modules/zod/v4/locales/fr-ca.d.cts","./node_modules/zod/v4/locales/he.d.cts","./node_modules/zod/v4/locales/hu.d.cts","./node_modules/zod/v4/locales/id.d.cts","./node_modules/zod/v4/locales/is.d.cts","./node_modules/zod/v4/locales/it.d.cts","./node_modules/zod/v4/locales/ja.d.cts","./node_modules/zod/v4/locales/ka.d.cts","./node_modules/zod/v4/locales/kh.d.cts","./node_modules/zod/v4/locales/km.d.cts","./node_modules/zod/v4/locales/ko.d.cts","./node_modules/zod/v4/locales/lt.d.cts","./node_modules/zod/v4/locales/mk.d.cts","./node_modules/zod/v4/locales/ms.d.cts","./node_modules/zod/v4/locales/nl.d.cts","./node_modules/zod/v4/locales/no.d.cts","./node_modules/zod/v4/locales/ota.d.cts","./node_modules/zod/v4/locales/ps.d.cts","./node_modules/zod/v4/locales/pl.d.cts","./node_modules/zod/v4/locales/pt.d.cts","./node_modules/zod/v4/locales/ru.d.cts","./node_modules/zod/v4/locales/sl.d.cts","./node_modules/zod/v4/locales/sv.d.cts","./node_modules/zod/v4/locales/ta.d.cts","./node_modules/zod/v4/locales/th.d.cts","./node_modules/zod/v4/locales/tr.d.cts","./node_modules/zod/v4/locales/ua.d.cts","./node_modules/zod/v4/locales/uk.d.cts","./node_modules/zod/v4/locales/ur.d.cts","./node_modules/zod/v4/locales/vi.d.cts","./node_modules/zod/v4/locales/zh-cn.d.cts","./node_modules/zod/v4/locales/zh-tw.d.cts","./node_modules/zod/v4/locales/yo.d.cts","./node_modules/zod/v4/locales/index.d.cts","./node_modules/zod/v4/core/registries.d.cts","./node_modules/zod/v4/core/doc.d.cts","./node_modules/zod/v4/core/api.d.cts","./node_modules/zod/v4/core/json-schema.d.cts","./node_modules/zod/v4/core/to-json-schema.d.cts","./node_modules/zod/v4/core/index.d.cts","./node_modules/zod/v4/classic/errors.d.cts","./node_modules/zod/v4/classic/parse.d.cts","./node_modules/zod/v4/classic/schemas.d.cts","./node_modules/zod/v4/classic/checks.d.cts","./node_modules/zod/v4/classic/compat.d.cts","./node_modules/zod/v4/classic/iso.d.cts","./node_modules/zod/v4/classic/coerce.d.cts","./node_modules/zod/v4/classic/external.d.cts","./node_modules/zod/index.d.cts","./src/lib/leads/esquema.ts","./src/app/api/leads/route.ts","./src/app/api/salud/route.ts","./src/components/admin/enlaces.ts","./src/components/admin/formato.ts","./src/components/admin/graficas/paleta.ts","./src/components/site/catalogo/iconos.ts","./src/lib/utm.ts","./src/lib/crm/tipos.ts","./src/lib/crm/auth.ts","./src/lib/crm/acciones.ts","./src/lib/crm/consultas.ts","./tests/rutas.ts","./tests/01-humo.spec.ts","./tests/02-responsivo.spec.ts","./tests/03-captura.spec.ts","./tests/04-panel.spec.ts","./tests/05-accesibilidad.spec.ts","./node_modules/next/dist/compiled/@vercel/og/index.edge.d.ts","./node_modules/next/dist/compiled/@vercel/og/index.node.d.ts","./node_modules/next/dist/server/og/image-response.d.ts","./node_modules/next/og.d.ts","./src/app/apple-icon.tsx","./src/app/icon.tsx","./node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/next/font/google/index.d.ts","./src/app/layout.tsx","./src/app/opengraph-image.tsx","./src/app/twitter-image.tsx","./src/components/site/encabezado.tsx","./src/components/site/pie.tsx","./src/components/formulario/widgetwhatsapp.tsx","./src/app/(sitio)/layout.tsx","./src/app/(sitio)/not-found.tsx","./src/components/marca/rielclases.tsx","./src/components/formulario/formulariocontacto.tsx","./src/components/site/revelar.tsx","./src/components/site/home/bloquediagnostico.tsx","./src/components/site/home/bloquenorma.tsx","./src/components/site/home/catalogodestacado.tsx","./src/components/site/home/clasesfuego.tsx","./src/components/site/home/clientes.tsx","./src/components/site/home/clasificador.tsx","./src/components/site/home/heroe.tsx","./src/components/site/home/prensa.tsx","./src/components/site/home/rutasindustria.tsx","./src/components/site/home/tresrutas.tsx","./src/app/(sitio)/page.tsx","./src/app/(sitio)/aviso-de-privacidad/page.tsx","./src/app/(sitio)/casos/page.tsx","./src/components/site/catalogo/tarjetaproducto.tsx","./src/components/site/catalogo/exploradorcatalogo.tsx","./src/app/(sitio)/catalogo/page.tsx","./src/app/(sitio)/catalogo/[categoria]/page.tsx","./src/app/(sitio)/contacto/page.tsx","./src/app/(sitio)/cumplimiento-nom-002/page.tsx","./src/app/(sitio)/evidencia/page.tsx","./src/app/(sitio)/nosotros/page.tsx","./src/app/(sitio)/preguntas-frecuentes/page.tsx","./src/components/site/catalogo/bloquedocumentacion.tsx","./src/app/(sitio)/producto/[slug]/page.tsx","./src/components/site/soluciones/filaruta.tsx","./src/app/(sitio)/soluciones/page.tsx","./src/components/site/soluciones/tarjetaproducto.tsx","./src/app/(sitio)/soluciones/[industria]/page.tsx","./src/app/admin/layout.tsx","./src/components/admin/cascaron.tsx","./src/app/admin/(panel)/layout.tsx","./src/components/admin/ui.tsx","./src/components/admin/graficas/tarjetakpivista.tsx","./src/components/admin/graficas/serietiempo.tsx","./src/components/admin/graficas/embudo.tsx","./src/components/admin/graficas/barrasmagnitud.tsx","./src/components/admin/panelsinatender.tsx","./src/components/admin/tablacampanas.tsx","./src/components/admin/tablaequipo.tsx","./src/components/admin/selectorperiodo.tsx","./src/app/admin/(panel)/page.tsx","./src/app/admin/(panel)/analitica/page.tsx","./src/components/admin/barrafiltros.tsx","./src/components/admin/paginacion.tsx","./src/app/admin/(panel)/contactos/page.tsx","./src/components/admin/usaraccion.tsx","./src/components/admin/contacto/notascontacto.tsx","./src/app/admin/(panel)/contactos/[id]/page.tsx","./src/components/admin/equipo/formulariosequipo.tsx","./src/app/admin/(panel)/equipo/page.tsx","./src/components/admin/filtrosoportunidades.tsx","./src/components/admin/tablaoportunidades.tsx","./src/app/admin/(panel)/oportunidades/page.tsx","./src/components/admin/oportunidad/controles.tsx","./src/components/admin/oportunidad/bitacora.tsx","./src/components/admin/oportunidad/crearpedido.tsx","./src/app/admin/(panel)/oportunidades/[id]/page.tsx","./src/app/admin/(panel)/pedidos/page.tsx","./src/components/admin/pedido/cambiarestadopedido.tsx","./src/app/admin/(panel)/pedidos/[id]/page.tsx","./src/components/admin/reglas/formulariosreglas.tsx","./src/app/admin/(panel)/reglas/page.tsx","./src/components/admin/login/acceso.tsx","./src/app/admin/login/page.tsx","./.next/types/cache-life.d.ts","./.next/types/validator.ts","./.next/types/app/layout.ts","./.next/types/app/admin/layout.ts","./.next/types/app/admin/(panel)/layout.ts","./.next/types/app/admin/(panel)/page.ts","./.next/types/app/admin/(panel)/analitica/page.ts","./.next/types/app/admin/(panel)/contactos/page.ts","./.next/types/app/admin/(panel)/contactos/[id]/page.ts","./.next/types/app/admin/(panel)/equipo/page.ts","./.next/types/app/admin/(panel)/oportunidades/page.ts","./.next/types/app/admin/(panel)/oportunidades/[id]/page.ts","./.next/types/app/admin/(panel)/pedidos/page.ts","./.next/types/app/admin/(panel)/pedidos/[id]/page.ts","./.next/types/app/admin/(panel)/reglas/page.ts","./.next/types/app/admin/login/page.ts"],"fileIdsList":[[100,148,340,710],[100,148,340,716],[100,148,340,713],[100,148,340,718],[100,148,340,699],[100,148,340,725],[100,148,340,721],[100,148,340,709],[100,148,340,728],[100,148,340,726],[100,148,340,730],[100,148,340,697],[100,148,340,732],[100,148,340,658],[100,148,446,447,448,449],[100,148],[83,100,148,493,496,632,633,658,664,679,680,681,684,685,686,687,688,689,690,692,694,696,697,699,709,710,713,716,718,721,725,726,728,730,732],[83,100,148,497,498],[100,148,497],[100,148,510],[100,148,509],[100,148,506],[100,148,511],[100,145,148],[100,147,148],[148],[100,148,153,182],[100,148,149,154,159,167,179,190],[100,148,149,150,159,167],[95,96,97,100,148],[100,148,151,191],[100,148,152,153,160,168],[100,148,153,179,187],[100,148,154,156,159,167],[100,147,148,155],[100,148,156,157],[100,148,158,159],[100,147,148,159],[100,148,159,160,161,179,190],[100,148,159,160,161,174,179,182],[100,141,148,156,159,162,167,179,190],[100,148,159,160,162,163,167,179,187,190],[100,148,162,164,179,187,190],[98,99,100,101,102,103,104,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[100,148,159,165],[100,148,166,190],[100,148,156,159,167,179],[100,148,168],[100,148,169],[100,147,148,170],[100,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[100,148,172],[100,148,173],[100,148,159,174,175],[100,148,174,176,191,193],[100,148,159,179,180,182],[100,148,181,182],[100,148,179,180],[100,148,182],[100,148,183],[100,145,148,179,184],[100,148,159,185,186],[100,148,185,186],[100,148,153,167,179,187],[100,148,188],[100,148,167,189],[100,148,162,173,190],[100,148,153,191],[100,148,179,192],[100,148,166,193],[100,148,194],[100,141,148],[100,141,148,159,161,170,179,182,190,192,193,195],[100,148,179,196],[86,90,100,148,198,199,200,202,441,489],[86,100,148],[86,90,100,148,198,199,200,201,357,441,489],[86,100,148,202,357],[86,90,100,148,199,201,202,441,489],[86,90,100,148,198,201,202,441,489],[84,85,100,148],[100,148,513],[100,148,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549],[100,148,520],[92,100,148],[100,148,444],[100,148,451],[100,148,206,220,221,222,224,438],[100,148,206,245,247,249,250,253,438,440],[100,148,206,210,212,213,214,215,216,427,438,440],[100,148,438],[100,148,221,323,408,417,434],[100,148,206],[100,148,203,434],[100,148,257],[100,148,256,438,440],[100,148,162,305,323,352,495],[100,148,162,316,332,417,433],[100,148,162,369],[100,148,421],[100,148,420,421,422],[100,148,420],[94,100,148,162,203,206,210,213,217,218,219,221,225,233,234,362,387,418,438,441],[100,148,206,223,241,245,246,251,252,438,495],[100,148,223,495],[100,148,234,241,303,438,495],[100,148,495],[100,148,206,223,224,495],[100,148,248,495],[100,148,217,419,426],[100,148,173,265,434],[100,148,265,434],[86,100,148,265],[86,100,148,324],[100,148,320,367,434,477,478],[100,148,414,471,472,473,474,476],[100,148,413],[100,148,413,414],[100,148,214,363,364,365],[100,148,363,366,367],[100,148,475],[100,148,363,367],[86,100,148,207,465],[86,100,148,190],[86,100,148,223,293],[86,100,148,223],[100,148,291,295],[86,100,148,292,443],[100,148,655],[86,100,148,489],[86,100,148,179,197,489,649],[86,90,100,148,162,197,198,199,201,202,441,487,488],[100,148,162],[100,148,162,210,272,363,373,388,408,423,424,438,439,495],[100,148,233,425],[100,148,441],[100,148,205],[86,100,148,305,319,331,341,343,433],[100,148,173,305,319,340,341,342,433,494],[100,148,334,335,336,337,338,339],[100,148,336],[100,148,340],[100,148,263,264,265,267],[86,100,148,258,259,260,266],[100,148,263,266],[100,148,261],[100,148,262],[86,100,148,265,292,443],[86,100,148,265,442,443],[86,100,148,265,443],[100,148,388,430],[100,148,430],[100,148,162,439,443],[100,148,328],[100,147,148,327],[100,148,235,273,311,313,315,316,317,318,360,363,433,436,439],[100,148,235,349,363,367],[100,148,316,433],[86,100,148,316,325,326,328,329,330,331,332,333,344,345,346,347,348,350,351,433,434,495],[100,148,310],[100,148,162,173,235,236,272,287,317,360,361,362,367,388,408,429,438,439,440,441,495],[100,148,433],[100,147,148,221,314,317,362,429,431,432,439],[100,148,316],[100,147,148,272,277,306,307,308,309,310,311,312,313,315,433,434],[100,148,162,277,278,306,439,440],[100,148,221,362,363,388,429,433,439],[100,148,162,438,440],[100,148,162,179,436,439,440],[100,148,162,173,190,203,210,223,235,236,238,273,274,279,284,287,313,317,363,373,375,378,380,383,384,385,386,387,408,428,429,434,436,438,439,440],[100,148,162,179],[100,148,206,207,208,210,215,218,223,241,428,436,437,441,443,495],[100,148,162,179,190,253,255,257,258,259,260,267,495],[100,148,173,190,203,245,255,283,284,285,286,313,363,378,387,388,394,397,398,408,429,434,436],[100,148,217,218,233,362,387,429,438],[100,148,162,190,207,210,313,392,436,438],[100,148,304],[100,148,162,395,396,405],[100,148,436,438],[100,148,311,314],[100,148,313,317,428,443],[100,148,162,173,239,245,286,378,388,394,397,400,436],[100,148,162,217,233,245,401],[100,148,206,238,403,428,438],[100,148,162,190,438],[100,148,162,223,237,238,239,250,268,402,404,428,438],[94,100,148,235,317,407,441,443],[100,148,162,173,190,210,217,225,233,236,273,279,283,284,285,286,287,313,363,375,388,389,391,393,408,428,429,434,435,436,443],[100,148,162,179,217,394,399,405,436],[100,148,228,229,230,231,232],[100,148,274,379],[100,148,381],[100,148,379],[100,148,381,382],[100,148,650],[100,148,162,210,213,214,272,439],[100,148,162,173,205,207,235,273,287,317,371,372,408,436,440,441,443],[100,148,162,173,190,209,214,313,372,435,439],[100,148,306],[100,148,307],[100,148,308],[100,148,434],[100,148,254,270],[100,148,162,210,254,273],[100,148,269,270],[100,148,271],[100,148,254,255],[100,148,254,288],[100,148,254],[100,148,274,377,435],[100,148,376],[100,148,255,434,435],[100,148,374,435],[100,148,255,434],[100,148,360],[100,148,210,215,273,302,305,311,313,317,319,322,353,356,359,363,407,428,436,439],[100,148,296,299,300,301,320,321,367],[86,100,148,200,202,265,354,355],[86,100,148,200,202,265,354,355,358],[100,148,416],[100,148,221,278,316,317,328,332,363,407,409,410,411,412,414,415,418,428,433,438],[100,148,367],[100,148,371],[100,148,162,273,289,368,370,373,407,436,441,443],[100,148,296,297,298,299,300,301,320,321,367,442],[94,100,148,162,173,190,236,254,255,287,313,317,405,406,408,428,429,438,439,441],[100,148,278,280,283,429],[100,148,162,274,438],[100,148,277,316],[100,148,276],[100,148,278,279],[100,148,275,277,438],[100,148,162,209,278,280,281,282,438,439],[86,100,148,363,364,366],[100,148,240],[86,100,148,207],[86,100,148,434],[86,94,100,148,287,317,441,443],[100,148,207,465,466],[86,100,148,295],[86,100,148,173,190,205,252,290,292,294,443],[100,148,223,434,439],[100,148,390,434],[100,148,363],[86,100,148,160,162,173,205,241,247,295,441,442],[86,100,148,198,199,201,202,441,489],[86,87,88,89,90,100,148],[100,148,153],[100,148,242,243,244],[100,148,242],[86,90,100,148,162,164,173,197,198,199,200,201,202,203,205,236,340,400,438,440,443,489],[100,148,453],[100,148,455],[100,148,457],[100,148,656],[100,148,459],[100,148,461,462,463],[100,148,467],[91,93,100,148,445,450,452,454,456,458,460,464,468,470,480,481,483,493,494,495,496],[100,148,469],[100,148,479],[100,148,651],[100,148,292],[100,148,482],[100,147,148,278,280,281,283,331,434,484,485,486,489,490,491,492],[100,148,197],[100,148,503],[100,148,149,160,179,501,502],[100,148,505],[100,148,504],[100,148,179,197],[100,113,117,148,190],[100,113,148,179,190],[100,108,148],[100,110,113,148,187,190],[100,148,167,187],[100,108,148,197],[100,110,113,148,167,190],[100,105,106,109,112,148,159,179,190],[100,113,120,148],[100,105,111,148],[100,113,134,135,148],[100,109,113,148,182,190,197],[100,134,148,197],[100,107,108,148,197],[100,113,148],[100,107,108,109,110,111,112,113,114,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,140,148],[100,113,128,148],[100,113,120,121,148],[100,111,113,121,122,148],[100,112,148],[100,105,108,113,148],[100,113,117,121,122,148],[100,117,148],[100,111,113,116,148,190],[100,105,110,113,120,148],[100,148,179],[100,108,113,134,148,195,197],[100,148,629],[100,148,621],[100,148,621,624],[100,148,615,621,622,623,624,625,626,627,628],[100,148,621,622],[100,148,621,623],[100,148,561,563,564,565,566],[100,148,561,563,565,566],[100,148,561,563,565],[100,148,560,561,563,564,566],[100,148,561,562,563,564,565,566,567,568,615,616,617,618,619,620],[100,148,563,566],[100,148,560,561,562,564,565,566],[100,148,563,616,619],[100,148,563,564,565,566],[100,148,565],[100,148,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614],[100,148,507],[100,148,160,169,512,514,515,516,517,518],[100,148,470,497,552],[100,148,470,497,515,516,517,552,666,668],[100,148,468,470,480,497,515,516,517,552,637,667,668,682],[100,148,468,470,497,515,516,552,667,668,683],[100,148,470,497,552,667,668],[100,148,470,497,517,552,667,668],[100,148,470,497,516,552,667,668],[100,148,661,662,663],[100,148,468,470,497,516,517,552,668],[100,148,470,497,516,517,552],[100,148,497,552,669,670,671,672,673,675,676,677,678],[100,148,470,497,552,668],[100,148,468,470,480,497,515,516,552,637,666,667,668,682,691],[100,148,468,470,480,497,515,516,517,552,666,667,668,695],[100,148,470,497,515,517,552,668,693],[100,148,497,516,517,518,634,635,640,642,700,702,703,704,706,708],[100,148,470,480,497,515,517,518,635,640,642,666,700,715],[100,148,470,497,517,634,635,640,642,700,711,712],[100,148,470,480,497,634,639,640,642,700,707,717],[100,148,497,640,698],[100,148,470,480,497,515,516,517,518,635,640,642,666,700,722,723,724],[100,148,497,517,518,634,639,640,642,700,712,719,720],[100,148,497,518,634,640,642,700,701,702,703,704,705,706,707,708],[100,148,470,480,497,516,518,635,640,642,700,727],[100,148,497,518,634,635,640,642,700,711,712],[100,148,470,480,497,515,516,517,518,634,640,642,700,729],[100,148,468,480,497,552,640,731],[100,148,493,515,518,552,557,558,559,631],[100,148,493,557],[100,148,652],[100,148,497,552,657],[100,148,497,552],[100,148,515,516,552,652],[100,148,497,554],[100,148,497,516,517,554],[100,148,659],[86,100,148,480],[86,100,148,468,470,480,518,552,641],[86,100,148,641,714],[86,100,148,480,518,639,641,714],[86,100,148,480,518],[100,148,635,636,700],[100,148,518,635,636,639,700],[100,148,518],[86,100,148,635,636,639,700],[100,148,635,636,639],[86,100,148,518,641,714],[100,148,518,635,639,700],[86,100,148,516,518,635,639,641,714],[100,148,470,634,635],[100,148,470,518,635,639,700],[86,100,148,480,515,516,517,518,641,714],[100,148,470,634],[100,148,470,634,635,639,700,704],[100,148,635,639,700],[100,148,470,515,517,518,635,639,666,700],[86,100,148,470,518],[86,100,148,515,517,518,631,638,666],[86,100,148,480,631,638],[100,148,515],[86,100,148,470,515,516,666,668,682],[100,148,468,470,516,666],[86,100,148,468,470,480,517,552],[100,148,552,667,668],[100,148,470,552,668],[100,148,468,470,516,666,668],[100,148,470,515,666,668],[86,100,148,470,515,517,666],[100,148,468,552,668],[100,148,468,470,515,516,517,552,674],[100,148,468,470,515,517,666,668],[100,148,470,515,516,517,668],[100,148,468,470,552],[100,148,468,470,515,516,517,666,668],[100,148,480,514,518,557,559,630,639,640,733],[100,148,518,557],[100,148,464,480,514,518,550,557,639],[100,148,494,512,515,518,557,639],[100,148,512,557],[100,148,512],[100,148,515,518,630],[100,148,493,550],[100,148,507,643],[100,148,507,516],[100,148,516,517]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0d12afc5306eb39700ecb391aed59f270edbad2d2b8be2e4b4cf78c1fb8b6c8d","affectsGlobalScope":true},{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"bea6c0f5b819cf8cba6608bf3530089119294f949640714011d46ec8013b61c2","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"631eff75b0e35d1b1b31081d55209abc43e16b49426546ab5a9b40bdd40b1f60","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"17bb4105d0ea2ab2bfcb4f77ff8585691d5569c90ae15f4fa8d5ff9fb42b910b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"456fa0c0ab68731564917642b977c71c3b7682240685b118652fb9253c9a6429","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"7b988bc259155186e6b09dd8b32856d9e45c8d261e63c19abaf590bb6550f922","affectsGlobalScope":true,"impliedFormat":1},{"version":"fe7b52f993f9336b595190f3c1fcc259bb2cf6dcb4ac8fdb1e0454cc5df7301e","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"81711af669f63d43ccb4c08e15beda796656dd46673d0def001c7055db53852d","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"bdba81959361810be44bcfdd283f4d601e406ab5ad1d2bdff0ed480cf983c9d7","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"b326f4813b90d230ec3950f66bd5b5ce3971aac5fac67cfafc54aa07b39fd07f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c8420c7c2b778b334587a4c0311833b5212ff2f684ea37b2f0e2b117f1d7210d","impliedFormat":1},{"version":"b6b08215821c9833b0e8e30ea1ed178009f2f3ff5d7fae3865ee42f97cc87784","impliedFormat":1},{"version":"3f735210f444dc3fd2d4d2f020d195fe827dad5e30a6d743807c5d1de3a2be73","impliedFormat":1},{"version":"73cf6cc19f16c0191e4e9d497ab0c11c7b38f1ca3f01ad0f09a3a5a971aac4b8","impliedFormat":1},{"version":"3e81d8b837057db6f9c82263e0ef7e5b9a55437342e7028eb8003199ccc69604","impliedFormat":1},{"version":"ed58b9974bb3114f39806c9c2c6258c4ffa6a255921976a7c53dfa94bf178f42","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"e9727a118ce60808e62457c89762fe5a4e2be8e9fd0112d12432d1bafdba942f","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"3a90b9beac4c2bfdf6517faae0940a042b81652badf747df0a7c7593456f6ebe","impliedFormat":1},{"version":"8302157cd431b3943eed09ad439b4441826c673d9f870dcb0e1f48e891a4211e","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"a5890565ed564c7b29eb1b1038d4e10c03a3f5231b0a8d48fea4b41ab19f4f46","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"cee74f5970ffc01041e5bffc3f324c20450534af4054d2c043cb49dbbd4ec8f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a654e0d950353614ba4637a8de4f9d367903a0692b748e11fccf8c880c99735","affectsGlobalScope":true,"impliedFormat":1},{"version":"42da246c46ca3fd421b6fd88bb4466cda7137cf33e87ba5ceeded30219c428bd","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"163c03007bbc630ef15404b1ed9ca327d46236be8d7239c0565f2a3e133de0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"db3d77167a7da6c5ba0c51c5b654820e3464093f21724ccd774c0b9bc3f81bc0","impliedFormat":1},{"version":"bdf1feb266c87edbee61f12ceaaef60ab0e2e5dba70ca19360b6448911c53d52","impliedFormat":1},{"version":"ae38eaab71f8bed92c282bee962f7c2fc26601b9b514bbbe19a7a705d01ffb4e","impliedFormat":1},{"version":"259263922abc164fac46c1089fcb56099944ad852c7787ec5ec2a5c837b573df","impliedFormat":1},{"version":"a0acca63c9e39580f32a10945df231815f0fe554c074da96ba6564010ffbd2d8","impliedFormat":1},{"version":"c9d1207e10abc45f95aedfc0bea31ebdf9c1c9b584331516f8ac3d1577ed1bb0","impliedFormat":1},{"version":"ee4630965cc6a24ae679e5720b8930f872860ab34d64cb1fb8e570319f59bc07","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"829b9e6028b29e6a8b1c01ddb713efe59da04d857089298fa79acbdb3cfcfdef","impliedFormat":1},{"version":"24f8562308dd8ba6013120557fa7b44950b619610b2c6cb8784c79f11e3c4f90","impliedFormat":1},{"version":"c696aa0753345ae6bdaab0e2d4b2053ee76be5140470860eef7e6cadc9f725a1","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"57d6ac03382e30e9213641ff4f18cf9402bb246b77c13c8e848c0b1ca2b7ef92","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"496bbf339f3838c41f164238543e9fe5f1f10659cb30b68903851618464b98ba","impliedFormat":1},{"version":"5178eb4415a172c287c711dc60a619e110c3fd0b7de01ed0627e51a5336aa09c","impliedFormat":1},{"version":"ca6e5264278b53345bc1ce95f42fb0a8b733a09e3d6479c6ccfca55cdc45038c","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"fb1d8e814a3eeb5101ca13515e0548e112bd1ff3fb358ece535b93e94adf5a3a","impliedFormat":1},{"version":"ffa495b17a5ef1d0399586b590bd281056cee6ce3583e34f39926f8dcc6ecdb5","impliedFormat":1},{"version":"98b18458acb46072947aabeeeab1e410f047e0cacc972943059ca5500b0a5e95","impliedFormat":1},{"version":"361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"b6db56e4903e9c32e533b78ac85522de734b3d3a8541bf24d256058d464bf04b","impliedFormat":1},{"version":"24daa0366f837d22c94a5c0bad5bf1fd0f6b29e1fae92dc47c3072c3fdb2fbd5","impliedFormat":1},{"version":"570bb5a00836ffad3e4127f6adf581bfc4535737d8ff763a4d6f4cc877e60d98","impliedFormat":1},{"version":"889c00f3d32091841268f0b994beba4dceaa5df7573be12c2c829d7c5fbc232c","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"27ab780875bcbb65e09da7496f2ca36288b0c541abaa75c311450a077d54ec15","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"380647d8f3b7f852cca6d154a376dbf8ac620a2f12b936594504a8a852e71d2f","impliedFormat":1},{"version":"208c9af9429dd3c76f5927b971263174aaa4bc7621ddec63f163640cbd3c473c","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"a23185bc5ef590c287c28a91baf280367b50ae4ea40327366ad01f6f4a8edbc5","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"002eae065e6960458bda3cf695e578b0d1e2785523476f8a9170b103c709cd4f","impliedFormat":1},{"version":"c83bb0c9c5645a46c68356c2f73fdc9de339ce77f7f45a954f560c7e0b8d5ebb","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"6a148329edecbda07c21098639ef4254ef7869fb25a69f58e5d6a8b7b69d4236","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"f63ab283a1c8f5c79fabe7ca4ef85f9633339c4f0e822fce6a767f9d59282af2","impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a54c996c8870ef1728a2c1fa9b8eaec0bf4a8001cd2583c02dd5869289465b10","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"3754982006a3b32c502cff0867ca83584f7a43b1035989ca73603f400de13c96","impliedFormat":1},{"version":"a30ae9bb8a8fa7b90f24b8a0496702063ae4fe75deb27da731ed4a03b2eb6631","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"50b5bc34ce6b12eccb76214b51aadfa56572aa6cc79c2b9455cdbb3d6c76af1d","impliedFormat":1},{"version":"b7e16ef7f646a50991119b205794ebfd3a4d8f8e0f314981ebbe991639023d0e","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"e9dd71cf12123419c60dab867d44fbee5c358169f99529121eaef277f5c83531","impliedFormat":1},{"version":"5b6a189ba3a0befa1f5d9cb028eb9eec2af2089c32f04ff50e2411f63d70f25d","impliedFormat":1},{"version":"d6e73f8010935b7b4c7487b6fb13ea197cc610f0965b759bec03a561ccf8423a","impliedFormat":1},{"version":"174f3864e398f3f33f9a446a4f403d55a892aa55328cf6686135dfaf9e171657","impliedFormat":1},{"version":"824c76aec8d8c7e65769688cbee102238c0ef421ed6686f41b2a7d8e7e78a931","impliedFormat":1},{"version":"75b868be3463d5a8cfc0d9396f0a3d973b8c297401d00bfb008a42ab16643f13","impliedFormat":1},{"version":"15a234e5031b19c48a69ccc1607522d6e4b50f57d308ecb7fe863d44cd9f9eb3","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"6dcf60530c25194a9ee0962230e874ff29d34c59605d8e069a49928759a17e0a","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"1a42d2ec31a1fe62fdc51591768695ed4a2dc64c01be113e7ff22890bebb5e3f","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"0c7c947ff881c4274c0800deaa0086971e0bfe51f89a33bd3048eaa3792d4876","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"15b36126e0089bfef173ab61329e8286ce74af5e809d8a72edcafd0cc049057f","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"ad10d4f0517599cdeca7755b930f148804e3e0e5b5a3847adce0f1f71bbccd74","impliedFormat":1},{"version":"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"72d63643a657c02d3e51cd99a08b47c9b020a565c55f246907050d3c8a5e77fb","impliedFormat":1},{"version":"1d415445ea58f8033ba199703e55ff7483c52ac6742075b803bd3e7bbe9f5d61","impliedFormat":1},{"version":"d6406c629bb3efc31aedb2de809bef471e475c86c7e67f3ef9b676b5d7e0d6b2","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"24428762d0c97b44c4784d28eee9556547167c4592d20d542a79243f7ca6a73f","impliedFormat":1},{"version":"8c030e515014c10a2b98f9f48408e3ba18023dfd3f56e3312c6c2f3ae1f55a16","impliedFormat":1},{"version":"dafc31e9e8751f437122eb8582b93d477e002839864410ff782504a12f2a550c","impliedFormat":1},{"version":"754498c5208ce3c5134f6eabd49b25cf5e1a042373515718953581636491f3c3","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"f56bdc6884648806d34bc66d31cdb787c4718d04105ce2cd88535db214631f82","impliedFormat":1},{"version":"633d58a237f4bb25ec7d565e4ffa32cecdcee8660ac12189c4351c52557cee9e","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"ce791f6ea807560f08065d1af6014581eeb54a05abd73294777a281b6dfd73c2","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"49f95e989b4632c6c2a578cc0078ee19a5831832d79cc59abecf5160ea71abad","impliedFormat":1},{"version":"9666533332f26e8995e4d6fe472bdeec9f15d405693723e6497bf94120c566c8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"e17cd049a1448de4944800399daa4a64c5db8657cc9be7ef46be66e2a2cd0e7c","impliedFormat":1},{"version":"43fa6ea8714e18adc312b30450b13562949ba2f205a1972a459180fa54471018","impliedFormat":1},{"version":"6e89c2c177347d90916bad67714d0fb473f7e37fb3ce912f4ed521fe2892cd0d","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"4d4927cbee21750904af7acf940c5e3c491b4d5ebc676530211e389dd375607a","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"8a97e578a9bc40eb4f1b0ca78f476f2e9154ecbbfd5567ee72943bab37fc156a","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457","impliedFormat":1},{"version":"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832","impliedFormat":1},{"version":"f22d05663d873ee7a600faf78abb67f3f719d32266803440cf11d5db7ac0cab2","impliedFormat":1},{"version":"d93c544ad20197b3976b0716c6d5cd5994e71165985d31dcab6e1f77feb4b8f2","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"a8b1c79a833ee148251e88a2553d02ce1641d71d2921cce28e79678f3d8b96aa","impliedFormat":1},{"version":"126d4f950d2bba0bd45b3a86c76554d4126c16339e257e6d2fabf8b6bf1ce00c","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"2d3cc2211f352f46ea6b7cf2c751c141ffcdf514d6e7ae7ee20b7b6742da313f","impliedFormat":1},{"version":"c75445151ff8b77d9923191efed7203985b1a9e09eccf4b054e7be864e27923d","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"fa8a8fbf91ee2a4779496225f0312aac6635b0f21aa09cdafa4283fe32d519c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e8aef93d79b000deb6ec336b5645c87de167168e184e84521886f9ecc69a4b5","impliedFormat":1},{"version":"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"88e9caa9c5d2ba629240b5913842e7c57c5c0315383b8dc9d436ef2b60f1c391","impliedFormat":1},{"version":"c3fdbbd7360e302a9208655a01de8a942ea5f4d1d01317aa7ffe3c287b328a45","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"de7052bfee2981443498239a90c04ea5cc07065d5b9bb61b12cb6c84313ad4ef","impliedFormat":1},{"version":"a3e7d932dc9c09daa99141a8e4800fc6c58c625af0d4bbb017773dc36da75426","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"4a2edd238d9104eac35b60d727f1123de5062f452b70ed8e0366cb36387dfdfd","impliedFormat":1},{"version":"ca921bf56756cb6fe957f6af693a35251b134fb932dc13f3dfff0bb7106f80b4","impliedFormat":1},{"version":"fee92c97f1aa59eb7098a0cc34ff4df7e6b11bae71526aca84359a2575f313d8","impliedFormat":1},{"version":"0bd0297484aacea217d0b76e55452862da3c5d9e33b24430e0719d1161657225","impliedFormat":1},{"version":"2ab6d334bcbf2aff3acfc4fd8c73ecd82b981d3c3aa47b3f3b89281772286904","impliedFormat":1},{"version":"d07cbc787a997d83f7bde3877fec5fb5b12ce8c1b7047eb792996ed9726b4dde","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"4805f6161c2c8cefb8d3b8bd96a080c0fe8dbc9315f6ad2e53238f9a79e528a6","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"49179c6a23701c642bd99abe30d996919748014848b738d8e85181fc159685ff","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"45490817629431853543adcb91c0673c25af52a456479588b6486daba34f68bb","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"8514c62ce38e58457d967e9e73f128eedc1378115f712b9eef7127f7c88f82ae","impliedFormat":1},{"version":"f1289e05358c546a5b664fbb35a27738954ec2cc6eb4137350353099d154fc62","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"1d17ba45cfbe77a9c7e0df92f7d95f3eefd49ee23d1104d0548b215be56945ad","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"9f5a0f3ed33e363b7393223ba4f4af15c13ce94fe3dbdaa476afd2437553a7dd","impliedFormat":1},{"version":"46273e8c29816125d0d0b56ce9a849cc77f60f9a5ba627447501d214466f0ff3","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"985153f0deb9b4391110331a2f0c114019dbea90cba5ca68a4107700796e0d75","impliedFormat":1},{"version":"3af3584f79c57853028ef9421ec172539e1fe01853296dc05a9d615ade4ffaf6","impliedFormat":1},{"version":"f82579d87701d639ff4e3930a9b24f4ee13ca74221a9a3a792feb47f01881a9c","impliedFormat":1},{"version":"d7e5d5245a8ba34a274717d085174b2c9827722778129b0081fefd341cca8f55","impliedFormat":1},{"version":"d9d32f94056181c31f553b32ce41d0ef75004912e27450738d57efcd2409c324","impliedFormat":1},{"version":"752513f35f6cff294ffe02d6027c41373adf7bfa35e593dbfd53d95c203635ee","impliedFormat":1},{"version":"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"1a7e2ea171726446850ec72f4d1525d547ff7e86724cc9e7eec509725752a758","impliedFormat":1},{"version":"8c901126d73f09ecdea4785e9a187d1ac4e793e07da308009db04a7283ec2f37","impliedFormat":1},{"version":"db97922b767bd2675fdfa71e08b49c38b7d2c847a1cc4a7274cb77be23b026f1","impliedFormat":1},{"version":"aab290b8e4b7c399f2c09b957666fc95335eb4522b2dd9ead1bf0cb64da6d6ee","impliedFormat":1},{"version":"94fe3281392e1015b22f39535878610b4fa6f1388dc8d78746be3bc4e4bb8950","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"06c25ddfc2242bd06c19f66c9eae4c46d937349a267810f89783680a1d7b5259","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86","impliedFormat":1},{"version":"c7f6485931085bf010fbaf46880a9b9ec1a285ad9dc8c695a9e936f5a48f34b4","impliedFormat":1},{"version":"14f6b927888a1112d662877a5966b05ac1bf7ed25d6c84386db4c23c95a5363b","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"0427df5c06fafc5fe126d14b9becd24160a288deff40e838bfbd92a35f8d0d00","impliedFormat":1},{"version":"90c54a02432d04e4246c87736e53a6a83084357acfeeba7a489c5422b22f5c7a","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6","impliedFormat":1},{"version":"0a372c2d12a259da78e21b25974d2878502f14d89c6d16b97bd9c5017ab1bc12","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972","impliedFormat":1},{"version":"ec1ca97598eda26b7a5e6c8053623acbd88e43be7c4d29c77ccd57abc4c43999","impliedFormat":1},{"version":"6e2261cd9836b2c25eecb13940d92c024ebed7f8efe23c4b084145cd3a13b8a6","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"a47e6d954d22dd9ebb802e7e431b560ed7c581e79fb885e44dc92ed4f60d4c07","impliedFormat":1},{"version":"f019e57d2491c159d47a107fd90219a1734bdd2e25cd8d1db3c8fae5c6b414c4","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"d1c9bf292a54312888a77bb19dba5e2503ad803f5393beafd45d78d2f4fe9b48","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"552bfa10434c2a8f6415899c51dd816dd6845ef7ec01e15cdf053aa46d002e57","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"3be035da7bee86b4c3abf392e0edaa44fc6e45092995eefe36b39118c8a84068","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f828825d077c2fa0ea606649faeb122749273a353daab23924fe674e98ba44c","impliedFormat":1},{"version":"2896c2e673a5d3bd9b4246811f79486a073cbb03950c3d252fba10003c57411a","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"407a06ba04eede4074eec470ecba2784cbb3bf4e7de56833b097dd90a2aa0651","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"5c96bad5f78466785cdad664c056e9e2802d5482ca5f862ed19ba34ffbb7b3a4","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb0cd7862b72f5eba39909c9889d566e198fcaddf7207c16737d0c2246112678","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"bad68fd0401eb90fe7da408565c8aee9c7a7021c2577aec92fa1382e8876071a","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"fec01479923e169fb52bd4f668dbeef1d7a7ea6e6d491e15617b46f2cacfa37d","impliedFormat":1},{"version":"8a8fb3097ba52f0ae6530ec6ab34e43e316506eb1d9aa29420a4b1e92a81442d","impliedFormat":1},{"version":"44e09c831fefb6fe59b8e65ad8f68a7ecc0e708d152cfcbe7ba6d6080c31c61e","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"4655709c9cb3fd6db2b866cab7c418c40ed9533ce8ea4b66b5f17ec2feea46a9","impliedFormat":1},{"version":"87affad8e2243635d3a191fa72ef896842748d812e973b7510a55c6200b3c2a4","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"3eecb25bb467a948c04874d70452b14ae7edb707660aac17dc053e42f2088b00","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"5f0292a40df210ab94b9fb44c8b775c51e96777e14e073900e392b295ca1061b","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"8627ad129bcf56e82adff0ab5951627c993937aa99f5949c33240d690088b803","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"a68d4b3182e8d776cdede7ac9630c209a7bfbb59191f99a52479151816ef9f9e","impliedFormat":99},{"version":"39644b343e4e3d748344af8182111e3bbc594930fff0170256567e13bbdbebb0","impliedFormat":99},{"version":"ed7fd5160b47b0de3b1571c5c5578e8e7e3314e33ae0b8ea85a895774ee64749","impliedFormat":99},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"ecbaf0da125974be39c0aac869e403f72f033a4e7fd0d8cd821a8349b4159628","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"ceec3c81b2d81f5e3b855d9367c1d4c664ab5046dff8fd56552df015b7ccbe8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"8fac4a15690b27612d8474fb2fc7cc00388df52d169791b78d1a3645d60b4c8b","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"1d63055b690a582006435ddd3aa9c03aac16a696fac77ce2ed808f3e5a06efab","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"f4e8976c19fc926644d72610bf1058bd6bf52add97e46a02bc0b912a751625c0",{"version":"448a9b82ce35ca6fdf5fe2462253eafd8511cba7ce1be69ef47b794f6742a726","signature":"435a1e418e8338be3f39614b96b81a9aa2700bc8c27bc6b98f064ff9ce17c363"},{"version":"3f6ef9c13ca4e92bc06426a01f2c3198448e949f64f62eb02e2db23146a8d06c","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"0468db324dabfe9526871f6cd2670880b3c03a651799d0bebbfbdfa9df7fd8d9","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"4a405da2b4fe59c59b09a9af656f7b40c18293b1e17118a93580585c01c7dc7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f00324f263189b385c3a9383b1f4dae6237697bcf0801f96aa35c340512d79c","impliedFormat":1},{"version":"ec8997c2e5cea26befc76e7bf990750e96babb16977673a9ff3b5c0575d01e48","impliedFormat":1},{"version":"034ba2b9c45c91879809adc523a098673155c7f55bc2d3c3a87d7ac009b6bdee","signature":"50f8a125795ffacae7f3107820dc660812d53c75c1d9c3ac82fd3d4ee1073958"},{"version":"65316526d9f235e4ded54dde51f5a9814113f632c629f6ddaada7b95011c6a2b","impliedFormat":1},{"version":"470352d29e86975bc782e37cb7c71af580322844b42bd83984753e1330599d21","impliedFormat":1},{"version":"d5eb5865d4cbaa9985cc3cfb920b230cdcf3363f1e70903a08dc4baab80b0ce1","impliedFormat":1},{"version":"51ebca098538b252953b1ef83c165f25b52271bfb6049cd09d197dddd4cd43c5","impliedFormat":1},{"version":"07fcc9be98e12bd2f0f71a501a9bfbe2e53d38c50e8a5e84223fdd05bd8749c5","impliedFormat":99},{"version":"b887a4575db46263f82d7bde681bdc14526e4a2618a1172fef4206c467752d8f","impliedFormat":99},{"version":"0d5062d280ed49b380fdb00643698da7781957f912888fe9f12f606e06780217","signature":"3c6443aad530e2c392bfa2a1c432d631eed73323e5b2791f925951f68f8665e5"},{"version":"3015ee4505c83d1c55a26b4ab6b2edf48173fc85f0cc88aacb3a8f40107c066f","signature":"82f34617a99c2c7fbe8931a1d1b05c20875d5cf81eb0c57bfc791bf505c8fa24"},{"version":"740d1558e587bfb54b1b96fce3d76293a2ba72eeac1e527414b05ce08dc34885","signature":"08db2058a689884078bd968799d15c240467d39e513d78ad01dacca8e582c10e"},{"version":"663f52c1bf65e711abf2d374d941cbdd9ce56b4d4c73a9d839d57716b7d474bf","signature":"640f021af94d793c8001595bc368c6cec82addd0ebb1d5246515f61b142e5c23"},{"version":"59cfa02238c5551b8edacc813502521746ef57a8d9d341405e41a949610a3c3d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"6e26f690cbd0890edeb8c89f9b86f2925bb520e6d4c57ab4c8a70cf3e77ed2e2","impliedFormat":99},{"version":"a380cd0a371b5b344c2f679a932593f02445571f9de0014bdf013dddf2a77376","impliedFormat":99},{"version":"dbbcd13911daafc1554acc17dad18ab92f91b5b8f084c6c4370cb8c60520c3b6","impliedFormat":99},{"version":"ab17464cd8391785c29509c629aa8477c8e86d4d3013f4c200b71ac574774ec2","impliedFormat":99},{"version":"d7f1043cbc447d09c8962c973d9f60e466c18e6bbaa470777901d9c2d357cfbe","impliedFormat":99},{"version":"e130a73d7e1e34953b1964c17c218fd14fccd1df6f15f111352b0d53291311bb","impliedFormat":99},{"version":"4ddecad872558e2b3df434ef0b01114d245e7a18a86afa6e7b5c68e75f9b8f76","impliedFormat":99},{"version":"a0ab7a82c3f844d4d4798f68f7bd6dc304e9ad6130631c90a09fb2636cb62756","impliedFormat":99},{"version":"270ceb915b1304c042b6799de28ff212cfa4baf06900d3a8bc4b79f62f00c8a7","impliedFormat":99},{"version":"1b3174ea6e3b4ae157c88eb28bf8e6d67f044edc9c552daf5488628fd8e5be97","impliedFormat":99},{"version":"e9d107d6953f0f12866c6a6828585b61eb151f33227b3f0ff430ef0f6b504f6c","impliedFormat":99},{"version":"4709d688dfd872cc3eef9544839adec58cbb9cac412505d9d66d96787c00b00f","impliedFormat":99},{"version":"5585ed538922e2e58655218652dcb262f08afa902f26f490cdec4967887ac31a","impliedFormat":99},{"version":"b46de7238d9d2243b27a21797e4772ba91465caae9c31f21dc43748dc9de9cd0","impliedFormat":99},{"version":"625fdbce788630c62f793cb6c80e0072ce0b8bf1d4d0a9922430671164371e0b","impliedFormat":99},{"version":"b6790300d245377671c085e76e9ef359b3cbba6821b913d6ce6b2739d00b9fb1","impliedFormat":99},{"version":"4bd8f3f00dfcafcc6aafd1bc1b85f7202aa12dc129fc4bc489a8f849178329b5","impliedFormat":99},{"version":"a36c717362d06d76e7332d9c1d2744c2c5e4b4a5da6218ef7b4a299a62d23a6d","impliedFormat":99},{"version":"a61f8455fd21cec75a8288cd761f5bcc72441848841eb64aa09569e9d8929ff0","impliedFormat":99},{"version":"b135437aa8444e851e10cb514b4a73141813e0adcfcc06d702df6aa0fd922587","impliedFormat":99},{"version":"cc82fa360f22d73b4cc7f446d08ad52b11f5aba66aa04b1ed8feb11a509e8aff","impliedFormat":99},{"version":"466e7296272b827c55b53a7858502de733733558966e2e3a7cc78274e930210a","impliedFormat":99},{"version":"364a5c527037fdd7d494ab0a97f510d3ceda30b8a4bc598b490c135f959ff3c6","impliedFormat":99},{"version":"f198de1cd91b94acc7f4d72cbccc11abadb1570bedc4ede174810e1f6985e06e","impliedFormat":99},{"version":"83d2dab980f2d1a2fe333f0001de8f42c831a438159d47b77c686ae405891b7f","impliedFormat":99},{"version":"ca369bcbdafc423d1a9dccd69de98044534900ff8236d2dd970b52438afb5355","impliedFormat":99},{"version":"5b90280e84e8eba347caaefc18210de3ce6ac176f5e82705a28e7f497dcc8689","impliedFormat":99},{"version":"34e2f00467aa6f46c1d7955f8d57bffb48ccc6ad2bbc847d0b1ccef1d55a9c3c","impliedFormat":99},{"version":"f09dfae4ff5f84c1341d74208e9b442659c32d039e9d27c09f79a203755e953d","impliedFormat":99},{"version":"e7878d8cd1fd0d0f1c55dcd8f5539f4c22e44993852f588dd194bd666b230727","impliedFormat":99},{"version":"638575c7a309a595c5ac3a65f03a643438fd81bf378aac93eadb84461cdd247c","impliedFormat":99},{"version":"9988ca0a40d6126086f1a98a939d4f58e63a839440b7b2e46d1f17681d9d4353","signature":"822ecd19a95660a899ed3411b1b444c1f87cf41e57de6272e3ba5f61fcb65784"},{"version":"a076a668d719498e12859e80f328fe406454f7136e9a1de39873cc6fd0fe8104","signature":"fd208be6c40ded24a0e16db389f3e74795bd340619ab2738c498136435dda30a"},{"version":"c63a3d9e854773452d49fc40156b5e4fb759660f52f72027116ec403cfacee77","signature":"e34a30fd305810dec0e5101696503d2b3519b0f08ffbd5d0933d7449b75a216d"},{"version":"1ea90b8d8ee99245c4e01567e4667b457d1d72302c4baf75d172360eed5eb391","signature":"854571a892f91b6cac81e92df58129e1966705dd1356bca0bd4479045ee8e336"},{"version":"b7a48432bb7be4ad98c22194eb6b2fef3d9f6a1c9ef4f36ecee1ef0ed1499fbb","signature":"cad6664fb232a534e6faa27739b4684e0913a8858f7afb883bfa4c2c8cd41585"},{"version":"2c89c81999119a292cd5cf473114f2113d1cbb95f3ce08ede5d531d65567f031","signature":"ebc450cf4888573aef03e1d85e34f8587789f7436e4c80a3f1417a66429a9a29"},{"version":"a71d708fc36f97843621abe990513947b1455c922008f860a5f133c633a0ac87","signature":"78e47fa03a76bc556fc9a6446c9e7de609d019a727d25a300f40250c38e8c49a"},{"version":"5519659391a833e86be8b06aa087e42b35301d12f252bfbfc426b95538e5f7c5","signature":"6d318e0e25e770c5a46eac1ba3dc9c16595eda9734c37ed9bc2bd7b9da2d7f10"},{"version":"4d12bca80e2285b5c203a58d266fdae7b07bf98285010dffa12dc6bbef2f2ff8","signature":"8d8c5f9b4f622d50f4b3a36ba35b1e7f7b0a8922d209e61038ad055748c8acb7"},{"version":"309ebd217636d68cf8784cbc3272c16fb94fb8e969e18b6fe88c35200340aef1","impliedFormat":1},{"version":"f987c74a4b4baf361afbf22a16d230ee490d662f9aa2066853bb7ebbb8611355","impliedFormat":1},{"version":"1ff91526fcdd634148c655ef86e912a273ce6a0239e2505701561f086678262b","impliedFormat":1},{"version":"bd93f6fc4da70275db4def32903eed2be03547a41857142df63ddfebb9a67bdf","impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","impliedFormat":1},{"version":"7952419455ca298776db0005b9b5b75571d484d526a29bfbdf041652213bce6f","impliedFormat":1},{"version":"21360500b20e0ec570f26f1cbb388c155ede043698970f316969840da4f16465","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"1765e61249cb44bf5064d42bfa06956455bbc74dc05f074d5727e8962592c920","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"7b9e6b3c726d47935bdc9ebc78fe5398e28e751ba7d70e9e011f01fbd5b618be","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"56ccc6238510b913f5e6c21afdc447632873f76748d0b30a87cb313b42f1c196","impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"85021a58f728318a9c83977a8a3a09196dcfc61345e0b8bbbb39422c1594f36b","impliedFormat":1},{"version":"d91805544905a40fbd639ba1b85f65dc13d6996a07034848d634aa9edb63479e","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"8610f5dc475d74c4b095aafa0c191548bfd43f65802e6da54b5e526202b8cfe0","impliedFormat":1},{"version":"7b9496d2e1664155c3c293e1fbbe2aba288614163c88cb81ed6061905924b8f9","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"2fbc91ba70096f93f57e22d1f0af22b707dbb3f9f5692cc4f1200861d3b75d88","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"8fd8479faaa704369625ad240e11473ae55d5cf86637a89b8539db67ce8dde4a","signature":"9e8cad834c50121f59c5226b115ee0c1bdd9240608c4eadf1c43a2f821eb1ab9"},{"version":"4ac47f3a209b1784de8b6380edd4b36806087afb378476a150ce5b8871216607","signature":"d6f865a27cb4b1e2190332b2b5bae18c5ab69f757ca39fc26b466193f5a83454"},{"version":"18a936a2c383c2736d291f92adc36f2f01891c3fc6e4a85ba30d0b8ede34ce70","signature":"f296ed42e726f1e471eb6bc8a27bb39110900aeda653dac0a6ee0427bac47162"},{"version":"5822474294849ea3afb6e914df74dd6d555c5a9d8fd91562d92341baa8550363","signature":"e3252d1a49ed9c5c307fc069837a45a32e7b189b5e32db353b245089099b10c9"},{"version":"28937b89e2924f40364153f58fa167dbbc52ba0f85681f2776bb94b12a7c2aa9","signature":"1820f938dc7f2bd747c0206019d2e42be884ea6f88688e46532080be676074f9"},{"version":"1bcd7843c4b641991f9fb36600ba793b79ff659235437b8ead07decd8ce3ec6f","signature":"4463cd74dfae497fc05b5dcf61ab5ddaaebdbe83fe8ab1891526d1e33e06bae2"},{"version":"9e4b45d502103b25a6b42e14b53b379a36ecbaea07ef40b5fe8005a561817629","signature":"b1bd027fd827a56a140947badfe58a2686bd45e5208fa78802e175256c762e7b"},{"version":"79e5c7b97d86785067ed01a2de32e47f10eb64e31af065b326771b5549c15a07","signature":"f16aba712b8cff5a0266fc6e6568b8d633fc6cc502c97486c286fbd593502420"},{"version":"508ba180125d8c1d2e0a1b5cfa65984ea163f16207f21f994e01150d96c3ed5a","signature":"9610774c1ef6e84e717eb8e73947151808e73b3e4a667565a9dd88bc48cd5414"},{"version":"7a7396f0622a83b15d70c105c8b9c858a73c8241cb742f423cc02a9d4e69add2","signature":"de8fd574aa2bc0971e72efef04789cc72c30721a7c3628d7fd25062be7418423"},{"version":"cabfcfba7c16a3365726b74e84ae6e602a088380d11e0edfe80a51c13fb22af8","signature":"6de8604322110c1f92a9ef2b15452c127700841be91b598d4b05178cb8612309"},{"version":"65acd6283b4901bd628bd2d7f2a8ba3a3a40a863eab72928de634cec2d589fae","signature":"be0d819701ea86cd2b3907c8c015bfa7009cdf76c19b3350de0e4d9cfa6c9a42"},{"version":"bf1db4cb9420d43acbb58b6aaf9a56a6b09a4330695d024b1723b77145ad5106","signature":"8b203aa5c53731bffcc94a1ebcab6b48ef7f3bb288decae622c49dcd03b31c51"},{"version":"8cdce729f2213d4a7b7b5e6720e84999c253d6d4678c1f9e03a30be4fcbfb22e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"1f1cd07cdac1a1e2379c5691a8619838101a5058451cf4252c1ca12a5a0cc34c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c70076ed0054a2e1880e67467999c5c25d694e0ede8c29df1e238c233efc62de","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"094f34c13ae873afcf633d921dfd399e503958eab15e9acf5d0ebb1de4c449cb","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"db6b79bd7d23774b9497f0634c941e24e21207bba8c5370e63e6edb9c074e235","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"0c996be745af11ccf07b28eb3e007aa4277d01b16f53259cb355daafab167abf","impliedFormat":99},{"version":"27c1b57e01b13f914e9d3507202036d676222057d6fa1032332e2954296b9d45","impliedFormat":99},{"version":"7348c35ce10f8323a515ea6a6c237c0dc7c3fd5e491c4dacec2a7b93f0dfcd26","impliedFormat":1},{"version":"258e67b2638408b67fbf5fe6c953b8f2dd2a69f9171d31c9a976cd2329716e4c","impliedFormat":1},{"version":"250792c60f85ca95380596c066cfa0cde9b2ba60cc477b20205c8cdcce9315ff","signature":"81d0c5aa6324a36b576f3ff53c41b744c0a14c0cd08a8c0ae9abae396c8a5f71"},{"version":"a82fa8d5613fd539dc5a917dadbddc22522529db00bfcb3f9fae617f75480d54","signature":"bae3e621006f12661d53ffc24fd8f8b51469e3992074bbc1f31f16bec6709f1e"},{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"476e83e2c9e398265eed2c38773ae9081932b08ea5597b579a7d2e0c690ead56","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},{"version":"11cf8ef40f428dd9638763bd7afa2d126ebd2aa21732b596e30105d78c408ee5","signature":"5fae83fdfe1c2fd7f017a6feb47a50e99ce7a179676a5a43f9200ae557b99510"},{"version":"75f455bcb02b5d91af081990d64ad840d3db4ecfe1844e44a9fdc4ee49c2a47d","signature":"0a17d0678c936c2b4c6c701787fb493a428a21ac89900b409b478ee077fee423"},{"version":"13354c5080e7cb02fccdc953c3569d2b7ede4c39f339d17ead69a34309c97551","signature":"09d624f70b4cab6c818fcd923c4372e9dc04abd55c824f2ff01edf6932952ab8"},{"version":"fda53049193735deacb3b8f578a4a83a66408d8b0745a838cfa1ca9a62644e20","signature":"28b4d10aa3c2196e8c01f77582d54b99d8e87bc974951a202cce580b4e15fe8a"},{"version":"ac7f0e076d4afdcca75ffa21326ee2c7c68eae3a6a107dd9a49f8464ab21e57c","signature":"f0ee49be852c93ad939ce6de7ba4ddf62f35962cfa2143dabe135ba0c8d2bdec"},{"version":"fd19fbbdc54875dfcc9c164174e6452baebd7a3a2c50a5f36e0f709828c98a56","signature":"5582d821c329518fc4b98f18a3175386e5ff11037f36aa9a2ebd754bca307da2"},{"version":"c9afce1d75a8b6b87d8608e30006790facabc7bc2fab9da56b901f3f9f45bc13","signature":"cb272ca2de43dcb38178488c74058c459d8db04e7f00347b47d3c227d85b1d60"},{"version":"91e4102724409e7385104bbcdce43396b809e46060ceffb8873b1c6375148b92","signature":"30287372a4a9f2ea19657e06652201bd78b8fe3b0e8d4e526f276669c882e75e"},{"version":"ecf587eca96c9b02eba27454d22a5924b5c6f28040153ee122184c336e565bae","signature":"46b2466b73a28a59b503908760edba0516350c030a1c3cb47d1123852d124b87"},{"version":"f6aebe58e15b6467ab95ae25a0762399d0394c93339b28d43b58881596a9e097","signature":"432d1bfc33194d494258851ddb4cb44be75fa0d24f3c34726e728beb1ca82f26"},{"version":"e144bc69ad018d631553add913a7ddf6b2ab272e1038e7cdb370e9cd0d7d8139","signature":"0bc82d87a4dd162553d117a6dc05ec100e8402f781193fb8d563ccadecf6ebaa"},{"version":"6f87cdfd00ebd93af6f970667a38e3d8fb471fb3b2f0893f9febe9db8b086ae2","signature":"e2fd07a75637e57465d1bbe6f600f55438c0328709c71e2be60101ac872a6259"},{"version":"e36114c6c9cba09660bcba3022acc22f33cf1f80c593bc7d51fd4a6f45fcc44e","signature":"6cf69e2f6398280664e4c36d5939990cedcbb415114137e78cb8789e3f82fea4"},{"version":"9e58d54a9391b815139ea2119fdd0bc26297e3cee120fdf036875269a7b07a28","signature":"ea786fa74b5a33a560a5fc0cf0d25b1be38ed10fa018dd021878094bdf734ef1"},{"version":"e11d5c649df9634b443ce974338e145271d1a83cf7633d5a1deceb66d46c2b4d","signature":"19eb58ac3ea2e95f0851db885f2dd20381597d3a10cfcb4138823edfeb2d3a77"},{"version":"09beca38800d4838e42f15a42f651a6f61cbef2220ead470609816d07fc93c4f","signature":"0808e993e2304582c891eb00a593bec2f75408203ca98020f445d677d4758887"},{"version":"ad052219c1fb6169698c2f5224cbbec0ade751f2c4d7b91dc7c7f574c68836d4","signature":"32c715af4752c86292b1d33fac954ea93f7f3d99728297067ecb550928570fd7"},{"version":"be068899c7efa913f918a4647b43aa8a605e68f1d4db2ef89affab5350dca5d3","signature":"819139cc8b9b910793e404893767b4d82909773b4679986f390d35b50f430378"},{"version":"24411228ff2f63b3b45f8340108db139484c10e00aca7514f77c56d7c9212edc","signature":"a6ffe706d4b19b9aa95951620023fc5f544d092d33f74eee902c6d027985228f"},{"version":"ea8e0f17c015d802c0488d2404aa81cba7f917f619c011cd67daa465e7627204","signature":"09cc9e17abe87f194a4c8b60f80ddf07596a6cf5bd03d058f8776bd52af10cbf"},{"version":"f81dd0b72eaf85bd499ef43b35b5443a9058381b325892c890b88d1de29af05a","signature":"f9d4431052d7afc2495bfd4c63ac5973e492eb461f5438eb1279b498ddec393c"},{"version":"ac014ec2068ba47723b0264034f839c738f5d0ecb23497719a048dbc798d0923","signature":"e0d8e32f80da8c4a96979366b4891b8a03a035b2b5dce5c3de4688c211cbbfe6"},{"version":"90fcda8aac8fdbdd07d04365091c56949da20f177b9cb279cb10e246cb351f4a","signature":"7e08f5772c42e58066d90ba984c2484368b366d4bf8b133afbb7fe168c6bb8fe"},{"version":"93c906066d9cb949ae08ebb8e175dffada02a286d176ed6bb5fbb77070628557","signature":"c7a3448af05672b3f8c1392da06953b2c50b36a838c6b8685f83340e162a3db9"},{"version":"9c616c301b0e1291360dd0cddd138d9eb78dceaa4dad4b1f10dac72d7dae3d96","signature":"1faa2a004835987408c3f4156776e824abecf3db2dea0b11152840e8028331c6"},{"version":"ba922670716230a7b3f15edc002fa03e5fb261d98c8740dc5b0f9fbae534916c","signature":"754755b5ec5f87e7f7c0219d00d94571e89d34d7b30e42092cd5cdb7bfacf094"},{"version":"1a2bad41cfe2fbfa8dc6fb30b1ea609b32baff4b3382fc141066f65db39bf173","signature":"54cb9c2d8925ba19b96e3069d57c66985bd528cc99024dbbe3632262c1e024ef"},{"version":"8bad743f605cf6e9123744f3d2fddcaf1a003a222b4bc201814db248bfc3beb0","signature":"5e09e09f9b70864bef025b0575bcc9f4557938c3a0ab14579ac3d552ddbdd561"},{"version":"59ef6985b1295ce8c737d42c79421f3b8c9cc3addb13d4a0b0377350c52299fa","signature":"d7bcdb81f62a7dc55f57830c548bbd053cd9420abb7bc9758dedb5319006d94b"},{"version":"a0d998fdc175baf4cc4712653ebf29cfb63a051b5a07456d633f30313c58d363","signature":"7c8647cdbe4a893fb5c227881811d743b7a6a50197e0b4277d54da8f6f213e86"},{"version":"f222f3bace13d5227074d3a1d3daa87dde6a57d23ea9efcc235bdd65837d8d12","signature":"79eb4f96762bc1069bd0141ddad731e74cc0f40f85bc19f6361516a7a29ef907"},{"version":"6526b4582333104441e36f162b7d10537bcb88235bf8e08da2616340111a2c4b","signature":"36ed7ce8c19f253e8ac0df999d9a117927c16b69e8c7881a684594e018924755"},{"version":"ded196d153857f2dec3daa24cc0490a8289e7234a789ea6cb4ec2cede92fb3af","signature":"0612ad3f2787d8ff2dad22c258f30b7550769a43d66eaa3cca8b8233c6a1b46f"},{"version":"960ac08f2361895fcb1d6705bddb09cf38e53c9da9081851715de764bcfa00f3","signature":"ba2bfd2622a0c7f74f3b0376de33822861f9407d7e2c4efde4e665948f87518e"},{"version":"f88dcfea49aca54b2862da3dd3d6a6f2daf7a50086ef73a4ca5cabf357230bde","signature":"84f14c7d32625bbcd28a61f010cc2a58fab61fb8cd57b841f8a2f4ebac66032e"},{"version":"b2b27b048c9835a0154ece0a1fe6dc3306790a15a4727c9baac89976d55c043f","signature":"63c8a6dc1e4e978f8512b02616dea8c772a033644dfad2d605ac9fa70c8bf93c"},{"version":"d5a8d131897896eef20847aa4dffaf13ccadedbd7407f908e0d3e9942ab8f2ad","signature":"02157eacd74c1d00b0abaf90c744c2296968f57227a82c3f4283754d47f209cd"},{"version":"7df2576e160a4e01c5aa5b68d65b605ce8126002ac306827e3908f14986a73ae","signature":"1301caadb89c23aa2cddde08928d0575bbc9d8cd601116a268a6fd73562abd34"},{"version":"6a54e8597a6567d043e3b0f2eb3e24172f24bb7925ce7913c00c2efe4bac9f5c","signature":"60619f257865059623f0ec3fd9ee09d2b0f36237d73cf23646dfc334399d7db2"},{"version":"c36b96e29fcabe0a0d227d277460e5c9a3c7339a1bfdb12c8b1c7f5069942a27","signature":"1ccd55ff7250d8e783a7274d6cf5d248adc0a4067be60c6dcf7f60019905591a"},{"version":"46399a5a80bd50d7ab2cc0b6ccf2071c968e870ace1bad4a9f0f854497c69eee","signature":"b59593e26c963942a47afaa2ca2bce1847b4345e926329b12bc56393628199e7"},{"version":"c63ec901c7c04f49d0cebe76d901932f535f07ca33b72230feee58827c5014a4","signature":"3af9ae9e01dbb40de044fb7ca0184150ccefd9c785be85fd2636b6b0ee434f26"},{"version":"ede10fbf77dfcc1e0304a080da543a80a2d33a9be071f464750c8ebaacf0def9","signature":"8109ca73c089acd23d7ca501456a71ca54fbbf39f8f521a819903e0a29da9d9c"},{"version":"ac01d96b7a83ab190643cfcc1a8fc3f6360ab97d7de3c4702478822a7cfd0a4d","signature":"c032d9b92fbf881423f923919505b290bc050f85239fa19d990742d87898debd"},"e384eec3b055c4db18c7f12b69823da027580ce227b243dcf6745613f2dbf850","f96b33e581535f1b28544ac25178ded6ed4ee7c0b913bcb5eaa3685a491ae466","27836c66565033f0bce50de08fc148165d21f124518f489c408f9e7771f33a49","4ce092f35489e3930a1108037d2bc5e025a59eec45429d7ffc5fadd63aad48a8","5c70e4a2cefbcdf5cdf770f99f045380854124ef951fbee3fcc7400c44a181d9","ccc86b9cf37b0e2255a3180afec634562edee37d823eeea1fb659782a66fd9c8",{"version":"e79571cfa5569d785d0a7164d46b561a5c63d6d793700e1e3488954000e4b288","signature":"47c35ac687ffd6aad3480c8cb85d222ed945bf758707e9f91ecabc38de511d8b"},"919ecacf6e8bf2c5fff62f605da4eeddb329c41b63ae0e941ddc91323b9e19f8","b092d834d2ece05617114e19a5b41fbe74ba648d2c112dd2ba8606c8a619a749",{"version":"e0255c1e058f9fcdab79287d8aae550e66a1bd2f52924c079b1950087361854c","signature":"0929b3cf4f9931610cb17c4833a94f8692c767c6c1672fe650b9191535b05b08"},{"version":"a67e22d7f5e2040a4129c322c6beba020c8aad962dbb20e3cbc79f183aac1336","signature":"8a1def8e69d3a3768efa0b80cd587b24e59fadf5e2378bfb491e7b76d06f516b"},"104f6626b42c1de17a037494c6954466093f46173c50b3b81c3f5d99415dde43",{"version":"0f6da123bf375e2b4e3b2eef22353caae1969d9226fb6dd1db09335f8d780560","signature":"c553a2238a6f7bd02f6036513f1d9aee04ec0fc53d3c3b842e7b4c101505f46a"},{"version":"3e6bca48de1630fc55f36b7e14756df99acd5701ac2338f1540a95e8ce89c253","signature":"f369caa62ba7ae6d4a355030b598b0721808c076f8802b1ec7fee16d01db1451"},"2699502aa05bbd4a1d66616c5b61a1076d8f15749c1771273ba977bb30fe25c2",{"version":"db6bb64a085c57cce1f1f2367cba02315599cb3b18dfc0c0312ce55e6f632229","signature":"11d8efab799d0b057840fff43a88274aac7b4264defce1b54d698ca1753427cf"},{"version":"76323a629392d093951ca1fe968d81e84c0a69f33ec9c307a36b1f9e1d1bc33a","signature":"f73b77a8a02f853254bd1d93916fa94ccd9c5d82dbe6a46de130ac147f522c64"},{"version":"86f6bc59e4b5d138d6e3a2baeb59f67556307106d4fe01f7e72991e45c98195a","signature":"ace5acb11798f405c2847c7a7de2f88c9b1a080afd2a219bba62c902e2ba87fb"},"9b593b0c06b6e92c0908eab5c51ca70ce56d2651da7d384d452a7e95f84b4b38","e5d416b9781dde0882dfe2171aa4b78809d5bf32a8d484cc7d8acaea1e9fac5f",{"version":"781ab513aac5470139179cc4e4901e77f3773fc58bd739127946e2ec40921d30","signature":"31d6cff00b7a83671bbefa65b734dbf2f0d9aea7e7f9ae104f0601dffb5467ec"},"b2608350a0484c2da51c23689d19046ed99fc160a696130a182fc00a4ccc3702",{"version":"ed4446a91d4f6bd5ca72911d6fdef1009990c3af718842940381373fc79383a8","signature":"ba6ada42802c3a4f600a421fa28d4cfa8dd7865886aac358444c8fa43060026e"},"a5d94e8e57b0434accd44044ee539a312bd53ebccabe82ee0cc59081af2d0d80","5882b68aad67c32915b1e98fd4ae3ca1597ac30471581130fd7c23ab9f2598ca",{"version":"cc85936dd27f190ba3e46d5a0aa5ceec18e552c2f76a4f79bcb26d0bdbd1f9e4","signature":"ee53aea48a18594567c4bcf97856e438a71b7bebb7c1717dc271087b0722bc3b"},"bbc08eae0a06505e1d44ecde08c7b267a5dafd763e040682dc6ce62b9b6fc5fd",{"version":"e61c4ad4478ae809764be9b5c11b3dfb6a505bcd2e9004ba060b4ce32ed9a4d0","signature":"0c95a9078b5babe37cc8a266b8147022cb245aaffd2330db44e22896f716ae57"},{"version":"fd3501bcba53833aec6c26715d22fe2514a7c1a0fb96b54e93cbf1f16ca795f7","signature":"b18edbf87045c39b436ad51f34d897c22f13af3e6654301206c6f7c33b9d3319"},{"version":"374c73d2fc31c701f86641db11373836ac72d5b307efed8121fc41ab4facd88f","signature":"9dfc63d6495d69eb1b76da6ec261da06cf6b1ccf53ffaa3428bbacb686d00fa5"},{"version":"578feb8d0ec1195d28dbf172384aac1dbb77d27b11b3c19551681f5520c48f8e","signature":"893bc5bb94314c8d17f14697cba9fb5f5a1a375311f0e4676ae6821725d5facd"},"2552a31fad45a9ed1bde87e51b038dc0e786cd364b597162263abbf57018949b","9b97de11f19fb9beabc720bdf972930a55ee2326b8aa30e06cfd0d9715eb3d29",{"version":"47a4366224164402b7ccd4cb3988f69c2c867a60ef911d4d1bdfc3954df97d0e","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"a0c4160ef3e43fbaa7f8501b70709780abb51eceb5e52fe3fbe3a21b5c697e38","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"4ff966f5630e778896cada70d602084b58a525d3b247942adf6fb78bd6743281","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"0b99332091a660ed781b77e06aec933ec6e08faa7b41a25f3e1984890cb60cf0","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"585acd4571dc6730552790a2f8c3bd42fa281dee4926c97e98d6d5b923c58e71","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"2405e7ad4eb2fea90b3a0ecfbca5cba4ea062e923b24b5fb6bacd360521a4baf","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"415d4da33746e50c16b3ed6274f0ddd8ff6ad862c477907f7a7c8cb373e4b591","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"01222f01ae7955bf794e795b4f23d129895a7c1f4f6870309c354fd6f3e5c55b","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"bf69d17e20151695c937d957bcace7ba6b4cdcd62793be2dae7c941eda9adcf2","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"a3de9441ebdfab29a148c88b68fe90331c49bec67ae72416411922b2a54c5417","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"4ec16d7236368e7651ab77df01b73d040c65aec7cd653126ff2bd2bf731bfca9","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"a7816d00a3e4ec4d1917d04cdfc2b43aae93e06d02e443f9eaf0b3020a62cc4e","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"b3c96dd70106222ae2d6ae2843ac9421fc42ebf648fdd9bcab44bc6c9bd0e5fe","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"b39a3379982321de8c743a90b1fa3b45996b77eb957734b8bb4ace2b00bbd6df","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"}],"root":[83,499,500,508,[515,519],[551,559],[631,648],653,654,[658,748]],"options":{"allowJs":false,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[739,1],[741,2],[740,3],[742,4],[737,5],[744,6],[743,7],[738,8],[746,9],[745,10],[747,11],[736,12],[748,13],[735,14],[733,15],[83,16],[734,17],[499,18],[500,19],[511,20],[510,21],[247,16],[507,22],[512,23],[509,16],[145,24],[146,24],[147,25],[100,26],[148,27],[149,28],[150,29],[95,16],[98,30],[96,16],[97,16],[151,31],[152,32],[153,33],[154,34],[155,35],[156,36],[157,36],[158,37],[159,38],[160,39],[161,40],[101,16],[99,16],[162,41],[163,42],[164,43],[197,44],[165,45],[166,46],[167,47],[168,48],[169,49],[170,50],[171,51],[172,52],[173,53],[174,54],[175,54],[176,55],[177,16],[178,16],[179,56],[181,57],[180,58],[182,59],[183,60],[184,61],[185,62],[186,63],[187,64],[188,65],[189,66],[190,67],[191,68],[192,69],[193,70],[194,71],[102,16],[103,16],[104,16],[142,72],[143,16],[144,16],[195,73],[196,74],[201,75],[357,76],[202,77],[200,76],[358,78],[198,79],[355,16],[199,80],[84,16],[86,81],[354,76],[265,76],[514,82],[513,16],[85,16],[550,83],[521,84],[530,84],[522,84],[531,84],[523,84],[524,84],[538,84],[537,84],[539,84],[540,84],[532,84],[525,84],[533,84],[526,84],[534,84],[527,84],[529,84],[536,84],[535,84],[541,84],[528,84],[542,84],[547,84],[548,84],[543,84],[520,16],[549,16],[545,84],[544,84],[546,84],[93,85],[445,86],[450,15],[452,87],[223,88],[251,89],[428,90],[246,91],[234,16],[215,16],[221,16],[418,92],[282,93],[222,16],[387,94],[256,95],[257,96],[353,97],[415,98],[370,99],[422,100],[423,101],[421,102],[420,16],[419,103],[253,104],[224,105],[303,16],[304,106],[219,16],[235,107],[225,108],[287,107],[284,107],[208,107],[249,109],[248,16],[427,110],[437,16],[214,16],[329,111],[330,112],[324,76],[473,16],[332,16],[333,113],[325,114],[479,115],[477,116],[472,16],[414,117],[413,16],[471,118],[326,76],[366,119],[364,120],[474,16],[478,16],[476,121],[475,16],[365,122],[466,123],[469,124],[294,125],[293,126],[292,127],[482,76],[291,128],[276,16],[485,16],[656,129],[655,16],[488,16],[649,130],[650,131],[487,76],[489,132],[204,16],[424,133],[425,134],[426,135],[237,16],[213,136],[203,16],[345,76],[206,137],[344,138],[343,139],[334,16],[335,16],[342,16],[337,16],[340,140],[336,16],[338,141],[341,142],[339,141],[220,16],[211,16],[212,107],[266,143],[267,144],[264,145],[262,146],[263,147],[259,16],[351,113],[372,113],[444,148],[453,149],[457,150],[431,151],[430,16],[279,16],[490,152],[440,153],[327,154],[328,155],[319,156],[309,16],[350,157],[310,158],[352,159],[347,160],[346,16],[348,16],[363,161],[432,162],[433,163],[312,164],[316,165],[307,166],[410,167],[439,168],[286,169],[388,170],[209,171],[438,172],[205,91],[260,16],[268,173],[399,174],[258,16],[398,175],[94,16],[393,176],[236,16],[305,177],[389,16],[210,16],[269,16],[397,178],[218,16],[274,179],[315,180],[429,181],[314,16],[396,16],[261,16],[401,182],[402,183],[216,16],[404,184],[406,185],[405,186],[239,16],[395,171],[408,187],[394,188],[400,189],[227,16],[230,16],[228,16],[232,16],[229,16],[231,16],[233,190],[226,16],[380,191],[379,16],[385,192],[381,193],[384,194],[383,194],[386,192],[382,193],[651,195],[273,196],[373,197],[436,198],[492,16],[461,199],[463,200],[311,16],[462,201],[434,162],[491,202],[331,162],[217,16],[313,203],[270,204],[271,205],[272,206],[302,207],[409,207],[288,207],[374,208],[289,208],[255,209],[254,16],[378,210],[377,211],[376,212],[375,213],[435,214],[323,215],[360,216],[322,217],[356,218],[359,219],[417,220],[416,221],[412,222],[369,223],[371,224],[368,225],[407,226],[362,16],[449,16],[361,227],[411,16],[275,228],[308,133],[306,229],[277,230],[280,231],[486,16],[278,232],[281,232],[447,16],[446,16],[448,16],[484,16],[283,233],[321,76],[92,16],[367,234],[252,16],[241,235],[317,16],[455,76],[465,236],[301,76],[459,113],[300,237],[442,238],[299,236],[207,16],[467,239],[297,76],[298,76],[290,16],[240,16],[296,240],[295,241],[238,242],[318,53],[285,53],[403,16],[391,243],[390,16],[451,16],[349,244],[320,76],[443,245],[87,76],[90,246],[91,247],[88,76],[89,16],[250,248],[245,249],[244,16],[243,250],[242,16],[441,251],[454,252],[456,253],[458,254],[657,255],[460,256],[464,257],[498,258],[468,258],[497,259],[470,260],[480,261],[652,262],[481,263],[483,264],[493,265],[496,136],[495,16],[494,266],[504,267],[501,16],[502,267],[503,268],[506,269],[505,270],[392,271],[81,16],[82,16],[13,16],[14,16],[16,16],[15,16],[2,16],[17,16],[18,16],[19,16],[20,16],[21,16],[22,16],[23,16],[24,16],[3,16],[25,16],[26,16],[4,16],[27,16],[31,16],[28,16],[29,16],[30,16],[32,16],[33,16],[34,16],[5,16],[35,16],[36,16],[37,16],[38,16],[6,16],[42,16],[39,16],[40,16],[41,16],[43,16],[7,16],[44,16],[49,16],[50,16],[45,16],[46,16],[47,16],[48,16],[8,16],[54,16],[51,16],[52,16],[53,16],[55,16],[9,16],[56,16],[57,16],[58,16],[60,16],[59,16],[61,16],[62,16],[10,16],[63,16],[64,16],[65,16],[11,16],[66,16],[67,16],[68,16],[69,16],[70,16],[1,16],[71,16],[72,16],[12,16],[76,16],[74,16],[79,16],[78,16],[73,16],[77,16],[75,16],[80,16],[120,272],[130,273],[119,272],[140,274],[111,275],[110,276],[139,266],[133,277],[138,278],[113,279],[127,280],[112,281],[136,282],[108,283],[107,266],[137,284],[109,285],[114,286],[115,16],[118,286],[105,16],[141,287],[131,288],[122,289],[123,290],[125,291],[121,292],[124,293],[134,266],[116,294],[117,295],[126,296],[106,297],[129,288],[128,286],[132,16],[135,298],[630,299],[625,300],[628,301],[626,301],[622,300],[629,302],[627,301],[623,303],[624,304],[618,305],[564,306],[566,307],[617,16],[565,308],[621,309],[619,16],[567,306],[568,16],[616,310],[563,311],[560,16],[620,312],[561,313],[562,16],[569,314],[570,314],[571,314],[572,314],[573,314],[574,314],[575,314],[576,314],[577,314],[578,314],[579,314],[580,314],[582,314],[581,314],[583,314],[584,314],[585,314],[615,315],[586,314],[587,314],[588,314],[589,314],[590,314],[591,314],[592,314],[593,314],[594,314],[595,314],[596,314],[597,314],[598,314],[600,314],[599,314],[601,314],[602,314],[603,314],[604,314],[605,314],[606,314],[607,314],[608,314],[609,314],[610,314],[611,314],[614,314],[612,314],[613,314],[508,316],[519,317],[680,318],[681,319],[685,320],[684,321],[686,322],[687,323],[688,324],[664,325],[689,326],[665,327],[679,328],[690,329],[692,330],[696,331],[694,332],[710,333],[716,334],[713,335],[718,336],[699,337],[725,338],[721,339],[709,340],[728,341],[726,342],[730,343],[697,19],[732,344],[632,345],[633,346],[653,347],[654,347],[658,348],[553,349],[659,350],[555,351],[556,352],[660,353],[711,354],[698,355],[715,356],[634,16],[717,357],[719,358],[635,16],[704,359],[703,360],[636,361],[702,362],[701,363],[731,364],[723,365],[722,364],[724,366],[712,367],[705,368],[727,364],[729,369],[708,370],[706,371],[707,372],[720,373],[700,374],[714,354],[667,375],[663,376],[666,377],[691,16],[683,378],[637,16],[682,379],[661,380],[669,381],[670,382],[671,383],[672,384],[674,385],[673,386],[675,387],[676,386],[677,388],[678,389],[662,390],[668,76],[693,391],[695,379],[516,16],[515,16],[552,16],[517,377],[641,392],[558,393],[640,394],[518,16],[642,395],[559,396],[639,361],[557,397],[631,398],[554,349],[638,16],[551,399],[644,400],[645,400],[646,401],[647,316],[648,400],[643,402]],"affectedFilesPendingEmit":[739,741,740,742,737,744,743,738,746,745,747,736,748,735,734,500,508,519,680,681,685,684,686,687,688,664,689,665,679,690,692,696,694,710,716,713,718,699,725,721,709,728,726,730,697,732,632,633,653,654,658,553,659,555,556,660,711,698,715,634,717,719,635,704,703,636,702,701,731,723,722,724,712,705,727,729,708,706,707,720,700,714,667,663,666,691,683,637,682,661,669,670,671,672,674,673,675,676,677,678,662,668,693,695,516,515,552,517,641,558,640,518,642,559,639,557,631,554,638,551,644,645,646,647,648,643],"version":"5.9.2"} \ No newline at end of file