{"title":"Segundo Chapuzon Ija","description":"\u003csection class=\"rd-time-search\" aria-labelledby=\"rd-time-search-title\"\u003e\n  \u003cp class=\"rd-time-search__eyebrow\"\u003eSegundo Chapuzon Ija\u003c\/p\u003e\n  \u003ch2 id=\"rd-time-search-title\"\u003eTus fotos del evento\u003c\/h2\u003e\n  \u003cp class=\"rd-time-search__intro\"\u003e\n    Localiza tus fotos usando una imagen de referencia o la hora aproximada. Debajo también puedes explorar todas las fotos de la colección.\n  \u003c\/p\u003e\n\n  \u003cdiv class=\"rd-time-search__cards\"\u003e\n    \u003cdiv class=\"rd-time-search__card rd-face-search__card\"\u003e\n      \u003ch3\u003e1. Búsqueda por fotos\u003c\/h3\u003e\n      \u003cp\u003eElige una foto donde tu rostro se vea claramente.\u003c\/p\u003e\n\n      \u003cinput id=\"rd-face-input\" type=\"file\" accept=\"image\/jpeg,image\/png,image\/webp\" hidden\u003e\n      \u003cbutton id=\"rd-face-upload\" class=\"button button--secondary\" type=\"button\"\u003e\n        Sube una foto de referencia\n      \u003c\/button\u003e\n      \u003cp id=\"rd-face-selection\" class=\"rd-time-search__selection\" role=\"status\" aria-live=\"polite\" hidden\u003e\u003c\/p\u003e\n\n      \u003cbutton id=\"rd-face-submit\" class=\"button button--primary\" type=\"button\" disabled\u003e\n        Buscar mis fotos\n      \u003c\/button\u003e\n      \u003cp id=\"rd-face-status\" class=\"rd-time-search__status\" role=\"status\" aria-live=\"polite\"\u003e\n        Preparando la búsqueda por fotos…\n      \u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"rd-time-search__card\"\u003e\n      \u003ch3\u003e2. Buscar por hora aproximada\u003c\/h3\u003e\n\n      \u003clabel for=\"rd-time-interval\"\u003eIntervalo\u003c\/label\u003e\n      \u003cselect id=\"rd-time-interval\" disabled\u003e\n        \u003coption value=\"60\"\u003ePor hora\u003c\/option\u003e\n        \u003coption value=\"30\"\u003eCada 30 minutos\u003c\/option\u003e\n        \u003coption value=\"15\"\u003eCada 15 minutos\u003c\/option\u003e\n      \u003c\/select\u003e\n\n      \u003clabel for=\"rd-time-slot\"\u003eHora aproximada\u003c\/label\u003e\n      \u003cselect id=\"rd-time-slot\" disabled\u003e\n        \u003coption\u003eCargando horarios…\u003c\/option\u003e\n      \u003c\/select\u003e\n\n      \u003cbutton id=\"rd-time-submit\" class=\"button button--primary\" type=\"button\" disabled\u003e\n        Ver estas fotos\n      \u003c\/button\u003e\n\n      \u003cp id=\"rd-time-status\" class=\"rd-time-search__status\" role=\"status\" aria-live=\"polite\"\u003e\n        Cargando horarios disponibles…\n      \u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection id=\"rd-filter-results\" class=\"rd-filter-results\" aria-labelledby=\"rd-filter-title\" hidden\u003e\n  \u003cdiv class=\"rd-filter-results__header\"\u003e\n    \u003cdiv\u003e\n      \u003ch2 id=\"rd-filter-title\"\u003eFotos del horario seleccionado\u003c\/h2\u003e\n      \u003cp id=\"rd-filter-count\"\u003e\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cbutton id=\"rd-show-all\" class=\"button button--secondary\" type=\"button\"\u003e\n      Ver todas las fotos\n    \u003c\/button\u003e\n  \u003c\/div\u003e\n  \u003cul id=\"rd-filter-grid\" class=\"rd-filter-grid\" aria-live=\"polite\"\u003e\u003c\/ul\u003e\n  \u003cnav id=\"rd-filter-pagination\" class=\"rd-filter-pagination\" aria-label=\"Páginas de fotos\"\u003e\u003c\/nav\u003e\n\u003c\/section\u003e\n\n\u003csection class=\"rd-all-photos-heading\" aria-labelledby=\"rd-all-photos-title\"\u003e\n  \u003ch2 id=\"rd-all-photos-title\"\u003e3. Todas las fotos\u003c\/h2\u003e\n  \u003cp\u003eExplora todas las fotos del evento. No necesitas iniciar sesión.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003cdiv id=\"rd-photo-viewer\" class=\"rd-photo-viewer\" hidden\u003e\n  \u003cbutton class=\"rd-photo-viewer__backdrop\" type=\"button\" aria-label=\"Cerrar visor\"\u003e\u003c\/button\u003e\n  \u003csection class=\"rd-photo-viewer__panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"rd-viewer-title\"\u003e\n    \u003cheader class=\"rd-photo-viewer__header\"\u003e\n      \u003cdiv\u003e\n        \u003cp id=\"rd-viewer-position\" class=\"rd-photo-viewer__position\"\u003e\u003c\/p\u003e\n        \u003ch2 id=\"rd-viewer-title\"\u003eFoto del evento\u003c\/h2\u003e\n      \u003c\/div\u003e\n      \u003cbutton id=\"rd-viewer-close\" class=\"rd-photo-viewer__close\" type=\"button\" aria-label=\"Cerrar visor\"\u003e×\u003c\/button\u003e\n    \u003c\/header\u003e\n\n    \u003cdiv id=\"rd-viewer-stage\" class=\"rd-photo-viewer__stage\"\u003e\n      \u003cbutton id=\"rd-viewer-prev\" class=\"rd-photo-viewer__arrow rd-photo-viewer__arrow--prev\" type=\"button\" aria-label=\"Foto anterior\"\u003e‹\u003c\/button\u003e\n      \u003cimg id=\"rd-viewer-image\" alt=\"\" width=\"1200\" height=\"800\"\u003e\n      \u003cbutton id=\"rd-viewer-next\" class=\"rd-photo-viewer__arrow rd-photo-viewer__arrow--next\" type=\"button\" aria-label=\"Foto siguiente\"\u003e›\u003c\/button\u003e\n      \u003cdiv id=\"rd-viewer-loading\" class=\"rd-photo-viewer__loading\" role=\"status\"\u003eCargando foto…\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv id=\"rd-viewer-thumbs\" class=\"rd-photo-viewer__thumbs\" aria-label=\"Fotos cercanas\"\u003e\u003c\/div\u003e\n\n    \u003cfooter class=\"rd-photo-viewer__footer\"\u003e\n      \u003cp id=\"rd-viewer-price\" class=\"rd-photo-viewer__price\"\u003e\u003c\/p\u003e\n      \u003cbutton id=\"rd-viewer-add\" class=\"button button--primary\" type=\"button\" disabled\u003eAgregar al carrito\u003c\/button\u003e\n    \u003c\/footer\u003e\n    \u003cp id=\"rd-viewer-message\" class=\"rd-photo-viewer__message\" role=\"status\" aria-live=\"polite\"\u003e\u003c\/p\u003e\n  \u003c\/section\u003e\n\n  \u003caside class=\"rd-photo-viewer__cart\" aria-label=\"Carrito\"\u003e\n    \u003cdiv id=\"rd-viewer-cart-images\" class=\"rd-photo-viewer__cart-images\"\u003e\u003c\/div\u003e\n    \u003cspan id=\"rd-viewer-cart-count\"\u003e0 fotos agregadas\u003c\/span\u003e\n    \u003ca class=\"button button--primary\" href=\"\/cart\"\u003eVer carrito\u003c\/a\u003e\n  \u003c\/aside\u003e\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n  .rd-time-search,\n  .rd-time-search *,\n  .rd-filter-results,\n  .rd-filter-results * {\n    box-sizing: border-box;\n  }\n\n  .rd-time-search {\n    max-width: 120rem;\n    margin: 2.5rem auto;\n    padding: clamp(1.5rem, 4vw, 3rem);\n    color: rgb(var(--color-foreground));\n    background: rgb(var(--color-background));\n    border: 0.1rem solid rgba(var(--color-foreground), 0.16);\n    border-radius: var(--media-radius);\n    font-family: var(--font-body-family);\n  }\n\n  .rd-time-search__eyebrow {\n    margin: 0 0 0.75rem;\n    font-size: 0.85em;\n    font-weight: 700;\n    letter-spacing: 0.12em;\n    text-align: center;\n    text-transform: uppercase;\n  }\n\n  .rd-time-search h2,\n  .rd-time-search h3,\n  .rd-filter-results h2,\n  .rd-filter-results h3 {\n    color: inherit;\n    font-family: var(--font-heading-family);\n  }\n\n  .rd-time-search h2 {\n    margin: 0;\n    font-size: clamp(2rem, 5vw, 3.5rem);\n    line-height: 1.08;\n    text-align: center;\n  }\n\n  .rd-time-search__intro {\n    max-width: 76rem;\n    margin: 1.25rem auto 0;\n    font-size: 1.05em;\n    text-align: center;\n  }\n\n  .rd-time-search__card {\n    min-width: 0;\n    padding: clamp(1.5rem, 3vw, 2.5rem);\n    border: 0.1rem solid rgba(var(--color-foreground), 0.16);\n    border-radius: var(--media-radius);\n  }\n\n  .rd-time-search__cards {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: clamp(1.5rem, 3vw, 3rem);\n    margin-top: 2.5rem;\n  }\n\n  .rd-face-search__card \u003e p:first-of-type {\n    margin: 0 0 1.5rem;\n  }\n\n  .rd-time-search__selection {\n    margin: 1rem 0 0;\n    overflow-wrap: anywhere;\n    font-weight: 600;\n  }\n\n  .rd-time-search__card h3 {\n    margin: 0 0 1.5rem;\n    font-size: clamp(1.65rem, 2.5vw, 2.2rem);\n  }\n\n  .rd-time-search label {\n    display: block;\n    margin: 1.25rem 0 0.5rem;\n    font-weight: 700;\n  }\n\n  .rd-time-search select,\n  .rd-time-search button {\n    width: 100%;\n    min-height: 4.8rem;\n    font: inherit;\n  }\n\n  .rd-time-search select {\n    padding: 0 1.25rem;\n    color: inherit;\n    background: rgb(var(--color-background));\n    border: 0.1rem solid rgba(var(--color-foreground), 0.3);\n    border-radius: var(--inputs-radius);\n  }\n\n  .rd-time-search button {\n    margin-top: 1.5rem;\n  }\n\n  .rd-time-search__status {\n    min-height: 1.5rem;\n    margin: 1rem 0 0;\n    font-weight: 600;\n    text-align: center;\n  }\n\n  .rd-time-search__status--error {\n    color: #b42318;\n  }\n\n  html.rd-time-filtered #ProductGridContainer {\n    display: none !important;\n  }\n\n  html.rd-time-filtered .rd-all-photos-heading {\n    display: none !important;\n  }\n\n  .rd-all-photos-heading {\n    max-width: var(--page-width);\n    margin: 3rem auto 1.5rem;\n    padding: 0 1.5rem;\n    color: rgb(var(--color-foreground));\n    font-family: var(--font-body-family);\n  }\n\n  .rd-all-photos-heading h2,\n  .rd-all-photos-heading p {\n    margin: 0;\n  }\n\n  .rd-all-photos-heading p {\n    margin-top: 0.5rem;\n  }\n\n  .rd-filter-results {\n    max-width: var(--page-width);\n    margin: 3rem auto;\n    padding: 0 1.5rem;\n    color: rgb(var(--color-foreground));\n  }\n\n  .rd-filter-results[hidden] {\n    display: none !important;\n  }\n\n  .rd-filter-results__header {\n    display: flex;\n    align-items: flex-end;\n    justify-content: space-between;\n    gap: 2rem;\n    margin-bottom: 2rem;\n  }\n\n  .rd-filter-results__header h2,\n  .rd-filter-results__header p {\n    margin: 0;\n  }\n\n  .rd-filter-results__header .button {\n    flex: 0 0 auto;\n  }\n\n  .rd-filter-grid {\n    display: grid;\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n    gap: clamp(1.2rem, 2vw, 2.4rem);\n    margin: 0;\n    padding: 0;\n    list-style: none;\n  }\n\n  .rd-filter-card a {\n    color: inherit;\n    text-decoration: none;\n  }\n\n  .rd-filter-card__image {\n    display: block;\n    width: 100%;\n    height: auto;\n    object-fit: contain;\n    background: rgba(var(--color-foreground), 0.04);\n    border-radius: var(--media-radius);\n  }\n\n  html.rd-photo-proportions #ProductGridContainer .card__media img {\n    object-fit: contain !important;\n  }\n\n  .rd-filter-card h3 {\n    margin: 1rem 0 0.4rem;\n    font-size: 1.5rem;\n    line-height: 1.3;\n    overflow-wrap: anywhere;\n  }\n\n  .rd-filter-card__price {\n    margin: 0;\n  }\n\n  .rd-filter-pagination {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: center;\n    gap: 0.65rem;\n    margin-top: 3rem;\n  }\n\n  .rd-filter-pagination button,\n  .rd-filter-pagination span {\n    min-width: 4.2rem;\n    min-height: 4.2rem;\n    padding: 0.6rem 1rem;\n    color: inherit;\n    background: rgb(var(--color-background));\n    border: 0.1rem solid rgba(var(--color-foreground), 0.25);\n    border-radius: 999px;\n    font: inherit;\n  }\n\n  .rd-filter-pagination button {\n    cursor: pointer;\n  }\n\n  .rd-filter-pagination button[aria-current=\"page\"] {\n    color: rgb(var(--color-background));\n    background: rgb(var(--color-foreground));\n  }\n\n  .rd-filter-pagination span {\n    border-color: transparent;\n    text-align: center;\n  }\n\n  .rd-filter-pagination__summary {\n    flex-basis: 100%;\n    min-height: auto !important;\n    margin-top: 0.75rem;\n    border: 0 !important;\n    text-align: center;\n  }\n\n  .rd-photo-viewer,\n  .rd-photo-viewer * {\n    box-sizing: border-box;\n  }\n\n  .rd-photo-viewer[hidden] {\n    display: none !important;\n  }\n\n  .rd-photo-viewer {\n    position: fixed;\n    z-index: 10000;\n    inset: 0;\n    display: grid;\n    place-items: center;\n    padding: clamp(1rem, 3vw, 3rem) clamp(1rem, 3vw, 3rem) 9rem;\n    color: rgb(var(--color-foreground));\n    font-family: var(--font-body-family);\n  }\n\n  .rd-photo-viewer__backdrop {\n    position: absolute;\n    z-index: -1;\n    inset: 0;\n    width: 100%;\n    height: 100%;\n    padding: 0;\n    background: rgba(0, 0, 0, 0.72);\n    border: 0;\n    cursor: default;\n  }\n\n  .rd-photo-viewer__panel {\n    display: flex;\n    flex-direction: column;\n    width: min(96rem, 100%);\n    max-height: calc(100dvh - 12rem);\n    padding: clamp(1.2rem, 2.5vw, 2rem);\n    overflow: auto;\n    background: rgb(var(--color-background));\n    border: 0.1rem solid rgba(var(--color-foreground), 0.2);\n    border-radius: max(var(--media-radius), 1.2rem);\n    box-shadow: 0 2rem 7rem rgba(0, 0, 0, 0.35);\n  }\n\n  .rd-photo-viewer__header,\n  .rd-photo-viewer__footer,\n  .rd-photo-viewer__cart {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 1.5rem;\n  }\n\n  .rd-photo-viewer__header {\n    margin-bottom: 1.2rem;\n  }\n\n  .rd-photo-viewer__header h2,\n  .rd-photo-viewer__header p,\n  .rd-photo-viewer__price {\n    margin: 0;\n  }\n\n  .rd-photo-viewer__header h2 {\n    max-width: 72rem;\n    font-size: clamp(1.5rem, 2.2vw, 2rem);\n    overflow-wrap: anywhere;\n  }\n\n  .rd-photo-viewer__position {\n    margin-bottom: 0.25rem !important;\n    opacity: 0.72;\n    font-size: 0.9em;\n  }\n\n  .rd-photo-viewer__close,\n  .rd-photo-viewer__arrow {\n    display: grid;\n    flex: 0 0 auto;\n    place-items: center;\n    color: inherit;\n    background: rgba(var(--color-foreground), 0.08);\n    border: 0.1rem solid rgba(var(--color-foreground), 0.22);\n    border-radius: 999px;\n    cursor: pointer;\n  }\n\n  .rd-photo-viewer__close {\n    width: 4rem;\n    height: 4rem;\n    font-size: 2.8rem;\n    line-height: 1;\n  }\n\n  .rd-photo-viewer__stage {\n    position: relative;\n    display: grid;\n    min-height: min(58vh, 58rem);\n    place-items: center;\n    overflow: hidden;\n    background: rgba(var(--color-foreground), 0.045);\n    border-radius: var(--media-radius);\n    touch-action: pan-y;\n  }\n\n  .rd-photo-viewer__stage img {\n    display: block;\n    width: auto;\n    max-width: 100%;\n    height: auto;\n    max-height: min(58vh, 58rem);\n    object-fit: contain;\n  }\n\n  .rd-photo-viewer__arrow {\n    position: absolute;\n    z-index: 2;\n    top: 50%;\n    width: 4.4rem;\n    height: 4.4rem;\n    padding: 0;\n    background: rgb(var(--color-background));\n    box-shadow: 0 0.3rem 1.5rem rgba(0, 0, 0, 0.2);\n    font-size: 3.2rem;\n    transform: translateY(-50%);\n  }\n\n  .rd-photo-viewer__arrow--prev {\n    left: 1rem;\n  }\n\n  .rd-photo-viewer__arrow--next {\n    right: 1rem;\n  }\n\n  .rd-photo-viewer__arrow:disabled {\n    cursor: not-allowed;\n    opacity: 0.3;\n  }\n\n  .rd-photo-viewer__loading {\n    position: absolute;\n    inset: 0;\n    display: grid;\n    place-items: center;\n    background: rgb(var(--color-background));\n    font-weight: 700;\n  }\n\n  .rd-photo-viewer__loading[hidden] {\n    display: none;\n  }\n\n  .rd-photo-viewer__thumbs {\n    display: flex;\n    gap: 0.7rem;\n    padding: 1rem 0;\n    overflow-x: auto;\n    scrollbar-width: thin;\n  }\n\n  .rd-photo-viewer__thumb {\n    display: grid;\n    flex: 0 0 6.4rem;\n    width: 6.4rem;\n    height: 6.4rem;\n    padding: 0.3rem;\n    place-items: center;\n    overflow: hidden;\n    background: rgba(var(--color-foreground), 0.04);\n    border: 0.2rem solid transparent;\n    border-radius: 0.8rem;\n    cursor: pointer;\n  }\n\n  .rd-photo-viewer__thumb[aria-current=\"true\"] {\n    border-color: rgb(var(--color-foreground));\n  }\n\n  .rd-photo-viewer__thumb img {\n    display: block;\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n  }\n\n  .rd-photo-viewer__footer {\n    padding-top: 1rem;\n    border-top: 0.1rem solid rgba(var(--color-foreground), 0.14);\n  }\n\n  .rd-photo-viewer__price {\n    font-size: 1.15em;\n    font-weight: 700;\n  }\n\n  .rd-photo-viewer__footer .button {\n    min-width: min(32rem, 55%);\n  }\n\n  .rd-photo-viewer__footer .rd-photo-viewer__added {\n    color: #fff;\n    background: #168447;\n  }\n\n  .rd-photo-viewer__message {\n    min-height: 1.5rem;\n    margin: 0.7rem 0 0;\n    text-align: right;\n  }\n\n  .rd-photo-viewer__cart {\n    position: fixed;\n    z-index: 3;\n    right: clamp(1rem, 3vw, 3rem);\n    bottom: 1.2rem;\n    left: clamp(1rem, 3vw, 3rem);\n    max-width: 96rem;\n    min-height: 6.4rem;\n    margin: auto;\n    padding: 0.8rem 1rem;\n    color: rgb(var(--color-foreground));\n    background: rgb(var(--color-background));\n    border: 0.1rem solid rgba(var(--color-foreground), 0.18);\n    border-radius: 1.2rem;\n    box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.3);\n  }\n\n  .rd-photo-viewer__cart-images {\n    display: flex;\n    min-width: 0;\n  }\n\n  .rd-photo-viewer__cart-images img {\n    width: 4.6rem;\n    height: 4.6rem;\n    margin-right: -0.9rem;\n    object-fit: contain;\n    background: rgb(var(--color-background));\n    border: 0.2rem solid rgb(var(--color-background));\n    border-radius: 0.6rem;\n  }\n\n  html.rd-viewer-open,\n  html.rd-viewer-open body {\n    overflow: hidden;\n  }\n\n  @media screen and (max-width: 989px) {\n    .rd-filter-grid {\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n    }\n  }\n\n  @media screen and (max-width: 749px) {\n    .rd-time-search__cards {\n      grid-template-columns: 1fr;\n    }\n\n    .rd-filter-results__header {\n      align-items: stretch;\n      flex-direction: column;\n    }\n\n    .rd-filter-grid {\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n\n    .rd-filter-results__header .button {\n      width: 100%;\n    }\n\n    .rd-photo-viewer {\n      align-items: stretch;\n      padding: 0 0 8rem;\n    }\n\n    .rd-photo-viewer__panel {\n      width: 100%;\n      max-height: calc(100dvh - 8rem);\n      min-height: calc(100dvh - 8rem);\n      border: 0;\n      border-radius: 0;\n    }\n\n    .rd-photo-viewer__stage {\n      min-height: 48vh;\n    }\n\n    .rd-photo-viewer__stage img {\n      max-height: 48vh;\n    }\n\n    .rd-photo-viewer__footer {\n      align-items: stretch;\n      flex-direction: column;\n    }\n\n    .rd-photo-viewer__footer .button {\n      width: 100%;\n      min-width: 0;\n    }\n\n    .rd-photo-viewer__message {\n      text-align: center;\n    }\n\n    .rd-photo-viewer__cart-images {\n      display: none;\n    }\n\n    .rd-photo-viewer__cart {\n      gap: 0.8rem;\n    }\n\n    .rd-photo-viewer__cart .button {\n      min-width: 12rem;\n      padding-right: 1.2rem;\n      padding-left: 1.2rem;\n    }\n  }\n\u003c\/style\u003e\n\n\u003cscript\u003e\n  (() =\u003e {\n    const PROXY_ENDPOINT = \"\/apps\/todas-mis-fotos\/search-session\";\n    const PRESIGNED_ENDPOINT = \"https:\/\/0o8ptvnz12.execute-api.us-east-1.amazonaws.com\/prod\/presigned-url\";\n    const EVENT_KEY = \"99SegundoChapuzonIja\";\n    const SLOT_CACHE_KEY = \"rd_time_slots:99SegundoChapuzonIja:v1\";\n    const SLOT_CACHE_MS = 5 * 60 * 1000;\n    const MAX_FILE_BYTES = 15 * 1024 * 1024;\n    const pageCache = new Map();\n    const productCache = new Map();\n    let catalog = null;\n    let viewerContext = null;\n    let viewerIndex = 0;\n    let viewerRequestToken = 0;\n    let viewerTouchStartX = null;\n    let viewerOpener = null;\n    let cartVariantIds = new Set();\n    let selectedFaceFile = null;\n    let faceConfigReady = false;\n    let faceSearchInProgress = false;\n\n    const faceInput = document.getElementById(\"rd-face-input\");\n    const faceUpload = document.getElementById(\"rd-face-upload\");\n    const faceSelection = document.getElementById(\"rd-face-selection\");\n    const faceSubmit = document.getElementById(\"rd-face-submit\");\n    const faceStatus = document.getElementById(\"rd-face-status\");\n    const intervalSelect = document.getElementById(\"rd-time-interval\");\n    const timeSelect = document.getElementById(\"rd-time-slot\");\n    const submitButton = document.getElementById(\"rd-time-submit\");\n    const status = document.getElementById(\"rd-time-status\");\n    const results = document.getElementById(\"rd-filter-results\");\n    const resultTitle = document.getElementById(\"rd-filter-title\");\n    const resultCount = document.getElementById(\"rd-filter-count\");\n    const grid = document.getElementById(\"rd-filter-grid\");\n    const pagination = document.getElementById(\"rd-filter-pagination\");\n    const showAllButton = document.getElementById(\"rd-show-all\");\n    const viewer = document.getElementById(\"rd-photo-viewer\");\n    const viewerBackdrop = viewer.querySelector(\".rd-photo-viewer__backdrop\");\n    const viewerClose = document.getElementById(\"rd-viewer-close\");\n    const viewerPosition = document.getElementById(\"rd-viewer-position\");\n    const viewerTitle = document.getElementById(\"rd-viewer-title\");\n    const viewerStage = document.getElementById(\"rd-viewer-stage\");\n    const viewerImage = document.getElementById(\"rd-viewer-image\");\n    const viewerLoading = document.getElementById(\"rd-viewer-loading\");\n    const viewerPrev = document.getElementById(\"rd-viewer-prev\");\n    const viewerNext = document.getElementById(\"rd-viewer-next\");\n    const viewerThumbs = document.getElementById(\"rd-viewer-thumbs\");\n    const viewerPrice = document.getElementById(\"rd-viewer-price\");\n    const viewerAdd = document.getElementById(\"rd-viewer-add\");\n    const viewerMessage = document.getElementById(\"rd-viewer-message\");\n    const viewerCartImages = document.getElementById(\"rd-viewer-cart-images\");\n    const viewerCartCount = document.getElementById(\"rd-viewer-cart-count\");\n\n    const pad2 = (value) =\u003e String(value).padStart(2, \"0\");\n    const timeLabel = (minute) =\u003e {\n      const normalized = ((minute % 1440) + 1440) % 1440;\n      return pad2(Math.floor(normalized \/ 60)) + \":\" + pad2(normalized % 60);\n    };\n    const slotLabel = (start, end) =\u003e timeLabel(start) + \"–\" + timeLabel(end);\n    const moneyLabel = (price, currency = \"USD\") =\u003e new Intl.NumberFormat(\"es-PA\", {\n      style: \"currency\",\n      currency\n    }).format(Number(price));\n    const secureImageUrl = (url) =\u003e String(url || \"\").startsWith(\"\/\/\")\n      ? \"https:\" + url\n      : String(url || \"\");\n\n    const setStatus = (message, isError = false) =\u003e {\n      status.textContent = message;\n      status.classList.toggle(\"rd-time-search__status--error\", isError);\n    };\n\n    const setFaceStatus = (message, isError = false) =\u003e {\n      faceStatus.textContent = message;\n      faceStatus.classList.toggle(\"rd-time-search__status--error\", isError);\n    };\n\n    const proxyRequest = async (action, payload = {}) =\u003e {\n      const response = await fetch(PROXY_ENDPOINT, {\n        method: \"POST\",\n        credentials: \"same-origin\",\n        headers: {\"Content-Type\": \"application\/json\", \"Accept\": \"application\/json\"},\n        body: JSON.stringify({action, eventKey: EVENT_KEY, ...payload})\n      });\n      const body = await response.json().catch(() =\u003e ({}));\n      if (!response.ok || !body.ok) {\n        throw new Error(body.message || \"No se pudo completar la búsqueda.\");\n      }\n      return body;\n    };\n\n    const timeRequest = (payload) =\u003e proxyRequest(\"time-search\", payload);\n\n    const getSearchPage = async (intervalMinutes, startMinute, page) =\u003e {\n      const cacheKey = [intervalMinutes, startMinute, page].join(\":\");\n      let body = pageCache.get(cacheKey);\n      if (!body) {\n        body = await timeRequest({intervalMinutes, startMinute, page});\n        pageCache.set(cacheKey, body);\n      }\n      return body;\n    };\n\n    const readSlotCache = () =\u003e {\n      try {\n        const cached = JSON.parse(window.sessionStorage.getItem(SLOT_CACHE_KEY) || \"null\");\n        if (cached \u0026\u0026 Date.now() - cached.savedAt \u003c SLOT_CACHE_MS) return cached.value;\n      } catch (error) {\n        console.warn(\"No se pudo leer el catálogo horario local.\", error);\n      }\n      return null;\n    };\n\n    const writeSlotCache = (value) =\u003e {\n      try {\n        window.sessionStorage.setItem(SLOT_CACHE_KEY, JSON.stringify({savedAt: Date.now(), value}));\n      } catch (error) {\n        console.warn(\"No se pudo guardar el catálogo horario local.\", error);\n      }\n    };\n\n    const validateFaceFile = (file) =\u003e {\n      if (!file || ![\"image\/jpeg\", \"image\/png\", \"image\/webp\"].includes(file.type)) {\n        throw new Error(\"Selecciona una imagen JPG, PNG o WEBP.\");\n      }\n      if (file.size \u003e MAX_FILE_BYTES) {\n        throw new Error(\"La imagen no puede superar 15 MB.\");\n      }\n    };\n\n    const safeFilename = (originalName) =\u003e {\n      const normalized = String(originalName || \"referencia.jpg\")\n        .normalize(\"NFD\")\n        .replace(\/[\\u0300-\\u036f]\/g, \"\")\n        .replace(\/[^A-Za-z0-9_.-]+\/g, \"-\")\n        .replace(\/^-+|-+$\/g, \"\");\n      const random = crypto.getRandomValues(new Uint32Array(1))[0].toString(16);\n      return Date.now() + \"-\" + random + \"-\" + (normalized || \"referencia.jpg\");\n    };\n\n    const updateFaceButton = () =\u003e {\n      faceSubmit.disabled = !faceConfigReady || !selectedFaceFile || faceSearchInProgress;\n    };\n\n    const normalizeFaceProducts = (items) =\u003e (items || [])\n      .filter((item) =\u003e item \u0026\u0026 item.shopifyHandle)\n      .map((item) =\u003e ({\n        handle: item.shopifyHandle,\n        title: item.filename || item.match || item.shopifyHandle,\n        imageUrl: secureImageUrl(item.image_url),\n        price: String(item.price || \"4.00\"),\n        currencyCode: \"USD\",\n        variantId: item.variant_id ? String(item.variant_id) : \"\",\n        available: item.available !== false\n      }));\n\n    const uploadReferenceAndSearch = async () =\u003e {\n      validateFaceFile(selectedFaceFile);\n      const filename = safeFilename(selectedFaceFile.name);\n      const objectKey = \"selfies\/rf-evento-\" + EVENT_KEY + \"\/\" + filename;\n      const presignedResponse = await fetch(\n        PRESIGNED_ENDPOINT + \"?filename=\" + encodeURIComponent(objectKey),\n        {cache: \"no-store\"}\n      );\n      const presigned = await presignedResponse.json().catch(() =\u003e ({}));\n      if (!presignedResponse.ok || !presigned.url) {\n        throw new Error(\"No se pudo preparar la foto de referencia.\");\n      }\n      const uploadResponse = await fetch(presigned.url, {\n        method: \"PUT\",\n        headers: {\"Content-Type\": selectedFaceFile.type},\n        body: selectedFaceFile\n      });\n      if (!uploadResponse.ok) throw new Error(\"No se pudo cargar la foto de referencia.\");\n      return proxyRequest(\"session\", {selfieId: filename});\n    };\n\n    const currentInterval = () =\u003e {\n      const minutes = Number(intervalSelect.value);\n      return (catalog.intervals || []).find((item) =\u003e item.minutes === minutes);\n    };\n\n    const fillTimes = () =\u003e {\n      timeSelect.replaceChildren();\n      const interval = currentInterval();\n      for (const slot of (interval \u0026\u0026 interval.slots) || []) {\n        timeSelect.add(new Option(\n          slotLabel(slot.startMinute, slot.endMinute) + \" (\" + slot.total + \" fotos)\",\n          String(slot.startMinute)\n        ));\n      }\n      timeSelect.disabled = !timeSelect.options.length;\n      submitButton.disabled = !timeSelect.options.length;\n      setStatus(\n        timeSelect.options.length\n          ? \"Selecciona el horario y presiona “Ver estas fotos”.\"\n          : \"No hay fotos disponibles en este intervalo.\"\n      );\n    };\n\n    const configureSelectors = () =\u003e {\n      const allowed = new Set((catalog.intervals || []).map((item) =\u003e String(item.minutes)));\n      for (const option of Array.from(intervalSelect.options)) {\n        option.hidden = !allowed.has(option.value);\n        option.disabled = !allowed.has(option.value);\n      }\n      intervalSelect.value = String(catalog.defaultIntervalMinutes || 60);\n      intervalSelect.disabled = false;\n      fillTimes();\n    };\n\n    const applyNaturalRatios = (root = document) =\u003e {\n      document.documentElement.classList.add(\"rd-photo-proportions\");\n      root.querySelectorAll(\"#ProductGridContainer .card__media img\").forEach((image) =\u003e {\n        const apply = () =\u003e {\n          if (!image.naturalWidth || !image.naturalHeight) return;\n          const inner = image.closest(\".card__inner\");\n          if (inner) {\n            inner.style.setProperty(\n              \"--ratio-percent\",\n              (image.naturalHeight \/ image.naturalWidth * 100) + \"%\"\n            );\n          }\n        };\n        if (image.complete) apply();\n        else image.addEventListener(\"load\", apply, {once: true});\n      });\n    };\n\n    const fetchProduct = async (handle) =\u003e {\n      if (productCache.has(handle)) return productCache.get(handle);\n      const request = fetch(\"\/products\/\" + encodeURIComponent(handle) + \".js\", {\n        credentials: \"same-origin\",\n        headers: {\"Accept\": \"application\/json\"}\n      }).then(async (response) =\u003e {\n        const body = await response.json().catch(() =\u003e ({}));\n        if (!response.ok || !body.handle) {\n          throw new Error(\"No se pudo cargar esta foto.\");\n        }\n        const variant = (body.variants || []).find((item) =\u003e item.available) || body.variants?.[0];\n        return {\n          handle: body.handle,\n          title: body.title,\n          imageUrl: secureImageUrl(body.featured_image || body.images?.[0]),\n          price: (Number(body.price || variant?.price || 0) \/ 100).toFixed(2),\n          currencyCode: \"USD\",\n          variantId: variant ? String(variant.id) : \"\",\n          available: Boolean(variant?.available)\n        };\n      });\n      productCache.set(handle, request);\n      try {\n        return await request;\n      } catch (error) {\n        productCache.delete(handle);\n        throw error;\n      }\n    };\n\n    const renderCart = (cart) =\u003e {\n      cartVariantIds = new Set((cart.items || []).map((item) =\u003e String(item.variant_id)));\n      viewerCartImages.replaceChildren();\n      for (const item of (cart.items || []).slice(0, 4)) {\n        const image = document.createElement(\"img\");\n        image.src = secureImageUrl(item.featured_image?.url || item.image);\n        image.alt = item.product_title || \"Foto agregada\";\n        viewerCartImages.append(image);\n      }\n      const count = Number(cart.item_count || 0);\n      viewerCartCount.textContent = count + (count === 1 ? \" foto agregada\" : \" fotos agregadas\");\n    };\n\n    const loadCart = async () =\u003e {\n      try {\n        const response = await fetch(\"\/cart.js\", {\n          credentials: \"same-origin\",\n          headers: {\"Accept\": \"application\/json\"}\n        });\n        if (!response.ok) return;\n        renderCart(await response.json());\n      } catch (error) {\n        console.warn(\"No se pudo consultar el carrito.\", error);\n      }\n    };\n\n    const globalViewerPosition = () =\u003e {\n      if (!viewerContext) return {current: 0, total: 0};\n      const base = viewerContext.mode === \"filtered\"\n        ? (viewerContext.page - 1) * viewerContext.pageSize\n        : 0;\n      return {current: base + viewerIndex + 1, total: viewerContext.total};\n    };\n\n    const canNavigateViewer = (direction) =\u003e {\n      if (!viewerContext) return false;\n      if (direction \u003c 0) {\n        return viewerIndex \u003e 0 || (viewerContext.mode === \"filtered\" \u0026\u0026 viewerContext.page \u003e 1);\n      }\n      return viewerIndex \u003c viewerContext.products.length - 1\n        || (viewerContext.mode === \"filtered\" \u0026\u0026 viewerContext.page \u003c viewerContext.pageCount);\n    };\n\n    const renderViewerThumbs = () =\u003e {\n      viewerThumbs.replaceChildren();\n      if (!viewerContext) return;\n      const start = Math.max(0, Math.min(\n        viewerIndex - 4,\n        viewerContext.products.length - 9\n      ));\n      const end = Math.min(viewerContext.products.length, start + 9);\n      for (let index = start; index \u003c end; index += 1) {\n        const product = viewerContext.products[index];\n        const button = document.createElement(\"button\");\n        button.className = \"rd-photo-viewer__thumb\";\n        button.type = \"button\";\n        button.setAttribute(\"aria-label\", \"Ver \" + (product.title || product.handle));\n        button.setAttribute(\"aria-current\", String(index === viewerIndex));\n        const image = document.createElement(\"img\");\n        image.src = secureImageUrl(product.imageUrl);\n        image.alt = \"\";\n        image.loading = \"lazy\";\n        button.append(image);\n        button.addEventListener(\"click\", () =\u003e showViewerProduct(index));\n        viewerThumbs.append(button);\n      }\n      viewerThumbs.querySelector('[aria-current=\"true\"]')?.scrollIntoView({block: \"nearest\", inline: \"center\"});\n    };\n\n    const updateViewerButton = (product) =\u003e {\n      viewerAdd.classList.remove(\"rd-photo-viewer__added\");\n      if (!product.variantId || !product.available) {\n        viewerAdd.disabled = true;\n        viewerAdd.textContent = \"No disponible\";\n        return;\n      }\n      if (cartVariantIds.has(String(product.variantId))) {\n        viewerAdd.disabled = false;\n        viewerAdd.textContent = \"Agregada ✓\";\n        viewerAdd.classList.add(\"rd-photo-viewer__added\");\n        return;\n      }\n      viewerAdd.disabled = false;\n      viewerAdd.textContent = \"Agregar al carrito · \" + moneyLabel(product.price, product.currencyCode);\n    };\n\n    const showViewerProduct = async (index) =\u003e {\n      if (!viewerContext || !viewerContext.products[index]) return;\n      viewerIndex = index;\n      const token = ++viewerRequestToken;\n      const initial = viewerContext.products[index];\n      const position = globalViewerPosition();\n      viewerTitle.textContent = initial.title || initial.handle;\n      viewerPosition.textContent = \"Foto \" + position.current + \" de \" + position.total;\n      viewerPrice.textContent = initial.price\n        ? moneyLabel(initial.price, initial.currencyCode)\n        : \"Cargando precio…\";\n      viewerMessage.textContent = \"\";\n      viewerAdd.disabled = true;\n      viewerAdd.textContent = \"Cargando…\";\n      viewerAdd.classList.remove(\"rd-photo-viewer__added\");\n      viewerPrev.disabled = !canNavigateViewer(-1);\n      viewerNext.disabled = !canNavigateViewer(1);\n      renderViewerThumbs();\n\n      viewerLoading.hidden = false;\n      viewerImage.onload = () =\u003e {\n        if (token === viewerRequestToken) viewerLoading.hidden = true;\n      };\n      viewerImage.onerror = () =\u003e {\n        if (token === viewerRequestToken) {\n          viewerLoading.hidden = true;\n          viewerMessage.textContent = \"No se pudo mostrar la imagen.\";\n        }\n      };\n      if (initial.imageUrl) viewerImage.src = secureImageUrl(initial.imageUrl);\n      viewerImage.alt = initial.title || \"Foto del evento\";\n\n      try {\n        const details = await fetchProduct(initial.handle);\n        if (token !== viewerRequestToken) return;\n        const product = {...initial, ...details};\n        viewerContext.products[index] = product;\n        viewerTitle.textContent = product.title;\n        viewerImage.alt = product.title;\n        if (secureImageUrl(product.imageUrl) !== viewerImage.src) {\n          viewerLoading.hidden = false;\n          viewerImage.src = secureImageUrl(product.imageUrl);\n        } else if (viewerImage.complete) {\n          viewerLoading.hidden = true;\n        }\n        viewerPrice.textContent = moneyLabel(product.price, product.currencyCode);\n        updateViewerButton(product);\n        renderViewerThumbs();\n      } catch (error) {\n        if (token !== viewerRequestToken) return;\n        viewerLoading.hidden = true;\n        viewerMessage.textContent = error.message || \"No se pudo cargar esta foto.\";\n        viewerAdd.disabled = true;\n        viewerAdd.textContent = \"No disponible\";\n      }\n    };\n\n    const openViewer = (products, index, context) =\u003e {\n      viewerOpener = document.activeElement;\n      viewerContext = {\n        products: products.map((product) =\u003e ({...product})),\n        page: 1,\n        pageCount: 1,\n        pageSize: products.length,\n        total: products.length,\n        mode: \"native\",\n        ...context\n      };\n      viewer.hidden = false;\n      document.documentElement.classList.add(\"rd-viewer-open\");\n      loadCart().finally(() =\u003e showViewerProduct(index));\n      viewerClose.focus();\n    };\n\n    const closeViewer = () =\u003e {\n      viewerRequestToken += 1;\n      viewer.hidden = true;\n      document.documentElement.classList.remove(\"rd-viewer-open\");\n      viewerImage.removeAttribute(\"src\");\n      if (viewerOpener instanceof HTMLElement) viewerOpener.focus();\n      viewerContext = null;\n    };\n\n    const navigateViewer = async (direction) =\u003e {\n      if (!canNavigateViewer(direction) || !viewerContext) return;\n      const nextIndex = viewerIndex + direction;\n      if (nextIndex \u003e= 0 \u0026\u0026 nextIndex \u003c viewerContext.products.length) {\n        showViewerProduct(nextIndex);\n        return;\n      }\n      if (viewerContext.mode !== \"filtered\") return;\n      const nextPage = viewerContext.page + (direction \u003e 0 ? 1 : -1);\n      viewerLoading.hidden = false;\n      try {\n        const body = await getSearchPage(\n          viewerContext.intervalMinutes,\n          viewerContext.startMinute,\n          nextPage\n        );\n        viewerContext.products = body.products.map((product) =\u003e ({...product}));\n        viewerContext.page = body.page;\n        viewerContext.pageCount = body.pageCount;\n        viewerContext.pageSize = body.pageSize;\n        viewerContext.total = body.total;\n        showViewerProduct(direction \u003e 0 ? 0 : body.products.length - 1);\n      } catch (error) {\n        viewerLoading.hidden = true;\n        viewerMessage.textContent = error.message || \"No se pudo cambiar de página.\";\n      }\n    };\n\n    const addViewerProductToCart = async () =\u003e {\n      const product = viewerContext?.products?.[viewerIndex];\n      if (!product?.variantId || !product.available) return;\n      viewerAdd.disabled = true;\n      viewerAdd.textContent = \"Agregando…\";\n      viewerMessage.textContent = \"\";\n      try {\n        const response = await fetch(\"\/cart\/add.js\", {\n          method: \"POST\",\n          credentials: \"same-origin\",\n          headers: {\"Content-Type\": \"application\/json\", \"Accept\": \"application\/json\"},\n          body: JSON.stringify({items: [{id: Number(product.variantId), quantity: 1}]})\n        });\n        const body = await response.json().catch(() =\u003e ({}));\n        if (!response.ok) throw new Error(body.description || \"No se pudo agregar la foto.\");\n        await loadCart();\n        updateViewerButton(product);\n        viewerMessage.textContent = \"La foto fue agregada al carrito.\";\n      } catch (error) {\n        viewerMessage.textContent = error.message || \"No se pudo agregar la foto.\";\n        updateViewerButton(product);\n      }\n    };\n\n    const nativeViewerProducts = () =\u003e {\n      const products = [];\n      const handles = new Set();\n      document.querySelectorAll('#ProductGridContainer a[href*=\"\/products\/\"]').forEach((link) =\u003e {\n        const match = link.getAttribute(\"href\")?.match(\/\\\/products\\\/([a-z0-9-]+)\/i);\n        if (!match || handles.has(match[1])) return;\n        const card = link.closest(\".card-wrapper, .grid__item, li\");\n        const image = card?.querySelector(\".card__media img\");\n        const title = card?.querySelector(\".card__heading, h3\")?.textContent?.trim();\n        handles.add(match[1]);\n        products.push({\n          handle: match[1],\n          title: title || match[1],\n          imageUrl: secureImageUrl(image?.currentSrc || image?.src)\n        });\n      });\n      return products;\n    };\n\n    const makeCard = (product, index, body) =\u003e {\n      const item = document.createElement(\"li\");\n      item.className = \"rd-filter-card\";\n      const link = document.createElement(\"a\");\n      link.href = \"\/products\/\" + encodeURIComponent(product.handle);\n      const image = document.createElement(\"img\");\n      image.className = \"rd-filter-card__image\";\n      image.src = product.imageUrl;\n      if (Number(product.imageWidth) \u003e 0) image.width = Number(product.imageWidth);\n      if (Number(product.imageHeight) \u003e 0) image.height = Number(product.imageHeight);\n      image.loading = \"lazy\";\n      image.alt = product.title;\n      const title = document.createElement(\"h3\");\n      title.textContent = product.title;\n      const price = document.createElement(\"p\");\n      price.className = \"rd-filter-card__price\";\n      price.textContent = moneyLabel(product.price, product.currencyCode);\n      link.append(image, title, price);\n      link.addEventListener(\"click\", (event) =\u003e {\n        if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n        event.preventDefault();\n        openViewer(body.products, index, {\n          mode: body.intervalMinutes ? \"filtered\" : \"native\",\n          page: body.page,\n          pageCount: body.pageCount,\n          pageSize: body.pageSize,\n          total: body.total,\n          intervalMinutes: body.intervalMinutes,\n          startMinute: body.startMinute\n        });\n      });\n      item.append(link);\n      return item;\n    };\n\n    const renderFaceResults = (items) =\u003e {\n      const products = normalizeFaceProducts(items);\n      const body = {\n        products,\n        page: 1,\n        pageCount: 1,\n        pageSize: products.length,\n        total: products.length\n      };\n      resultTitle.textContent = \"Fotos encontradas por referencia\";\n      resultCount.textContent = products.length + (products.length === 1 ? \" foto\" : \" fotos\");\n      grid.replaceChildren(...products.map((product, index) =\u003e makeCard(product, index, body)));\n      pagination.replaceChildren();\n      document.documentElement.classList.add(\"rd-time-filtered\");\n      results.hidden = false;\n      window.history.replaceState(null, \"\", \"#rd-face-results\");\n      results.scrollIntoView({behavior: \"smooth\", block: \"start\"});\n      setFaceStatus(\n        products.length\n          ? \"Encontramos \" + products.length + (products.length === 1 ? \" foto.\" : \" fotos.\")\n          : \"No encontramos coincidencias. Puedes probar otra referencia o explorar todas las fotos.\"\n      );\n    };\n\n    const pageNumbers = (current, total) =\u003e {\n      const values = new Set([1, total]);\n      for (let page = current - 2; page \u003c= current + 2; page += 1) {\n        if (page \u003e= 1 \u0026\u0026 page \u003c= total) values.add(page);\n      }\n      return Array.from(values).sort((a, b) =\u003e a - b);\n    };\n\n    const renderPagination = (body) =\u003e {\n      pagination.replaceChildren();\n      if (!body.pageCount) return;\n      let previous = 0;\n      for (const page of pageNumbers(body.page, body.pageCount)) {\n        if (previous \u0026\u0026 page - previous \u003e 1) {\n          const ellipsis = document.createElement(\"span\");\n          ellipsis.textContent = \"…\";\n          ellipsis.setAttribute(\"aria-hidden\", \"true\");\n          pagination.append(ellipsis);\n        }\n        const button = document.createElement(\"button\");\n        button.type = \"button\";\n        button.textContent = String(page);\n        button.setAttribute(\"aria-label\", \"Página \" + page);\n        if (page === body.page) {\n          button.setAttribute(\"aria-current\", \"page\");\n          button.disabled = true;\n        } else {\n          button.addEventListener(\"click\", () =\u003e loadPage(page, true));\n        }\n        pagination.append(button);\n        previous = page;\n      }\n      const summary = document.createElement(\"span\");\n      summary.className = \"rd-filter-pagination__summary\";\n      summary.textContent = \"Página \" + body.page + \" de \" + body.pageCount;\n      pagination.append(summary);\n    };\n\n    const renderPage = (body) =\u003e {\n      const label = slotLabel(body.startMinute, body.endMinute);\n      resultTitle.textContent = \"Fotos de \" + label;\n      resultCount.textContent = body.total + (body.total === 1 ? \" foto\" : \" fotos\");\n      grid.replaceChildren(...body.products.map((product, index) =\u003e makeCard(product, index, body)));\n      renderPagination(body);\n      document.documentElement.classList.add(\"rd-time-filtered\");\n      results.hidden = false;\n      setStatus(\"Mostrando \" + body.total + (body.total === 1 ? \" foto.\" : \" fotos.\"));\n      window.history.replaceState(null, \"\", \"#rd-time-\" + body.intervalMinutes + \"-\" + body.startMinute + \"-\" + body.page);\n    };\n\n    const loadPage = async (page, shouldScroll = false) =\u003e {\n      const intervalMinutes = Number(intervalSelect.value);\n      const startMinute = Number(timeSelect.value);\n      submitButton.disabled = true;\n      setStatus(\"Cargando fotos…\");\n      try {\n        const body = await getSearchPage(intervalMinutes, startMinute, page);\n        renderPage(body);\n        if (shouldScroll) results.scrollIntoView({behavior: \"smooth\", block: \"start\"});\n      } catch (error) {\n        setStatus(error.message || \"No se pudo completar la búsqueda.\", true);\n      } finally {\n        submitButton.disabled = false;\n      }\n    };\n\n    const restoreHash = () =\u003e {\n      const match = window.location.hash.match(\/^#rd-time-(60|30|15)-(\\d{1,4})-(\\d+)$\/);\n      if (!match) return;\n      intervalSelect.value = match[1];\n      fillTimes();\n      if (Array.from(timeSelect.options).some((option) =\u003e option.value === match[2])) {\n        timeSelect.value = match[2];\n        loadPage(Number(match[3]));\n      }\n    };\n\n    const showAll = () =\u003e {\n      document.documentElement.classList.remove(\"rd-time-filtered\");\n      results.hidden = true;\n      window.history.replaceState(null, \"\", window.location.pathname + window.location.search + \"#ProductGridContainer\");\n      document.getElementById(\"ProductGridContainer\")?.scrollIntoView({behavior: \"smooth\", block: \"start\"});\n      setStatus(\"Mostrando todas las fotos de la colección.\");\n    };\n\n    faceUpload.addEventListener(\"click\", () =\u003e faceInput.click());\n    faceInput.addEventListener(\"change\", () =\u003e {\n      const file = faceInput.files \u0026\u0026 faceInput.files[0];\n      if (!file) return;\n      try {\n        validateFaceFile(file);\n        selectedFaceFile = file;\n        faceSelection.hidden = false;\n        faceSelection.textContent = \"Foto seleccionada: \" + file.name;\n        faceUpload.textContent = \"Cambiar foto de referencia\";\n        setFaceStatus(\"La referencia está lista para buscar.\");\n      } catch (error) {\n        selectedFaceFile = null;\n        faceInput.value = \"\";\n        faceSelection.hidden = true;\n        faceSelection.textContent = \"\";\n        faceUpload.textContent = \"Sube una foto de referencia\";\n        setFaceStatus(error.message, true);\n      }\n      updateFaceButton();\n    });\n    faceSubmit.addEventListener(\"click\", async () =\u003e {\n      if (faceSearchInProgress || !selectedFaceFile) return;\n      faceSearchInProgress = true;\n      updateFaceButton();\n      faceSubmit.textContent = \"Buscando tus fotos…\";\n      setFaceStatus(\"Analizando la foto de referencia…\");\n      try {\n        const body = await uploadReferenceAndSearch();\n        renderFaceResults(body.products || []);\n      } catch (error) {\n        setFaceStatus(error.message || \"No se pudo completar la búsqueda por fotos.\", true);\n      } finally {\n        faceSearchInProgress = false;\n        faceSubmit.textContent = \"Buscar mis fotos\";\n        updateFaceButton();\n      }\n    });\n    intervalSelect.addEventListener(\"change\", fillTimes);\n    submitButton.addEventListener(\"click\", () =\u003e loadPage(1, true));\n    showAllButton.addEventListener(\"click\", showAll);\n    viewerBackdrop.addEventListener(\"click\", closeViewer);\n    viewerClose.addEventListener(\"click\", closeViewer);\n    viewerPrev.addEventListener(\"click\", () =\u003e navigateViewer(-1));\n    viewerNext.addEventListener(\"click\", () =\u003e navigateViewer(1));\n    viewerAdd.addEventListener(\"click\", addViewerProductToCart);\n    viewerStage.addEventListener(\"touchstart\", (event) =\u003e {\n      viewerTouchStartX = event.changedTouches[0]?.clientX ?? null;\n    }, {passive: true});\n    viewerStage.addEventListener(\"touchend\", (event) =\u003e {\n      if (viewerTouchStartX === null) return;\n      const endX = event.changedTouches[0]?.clientX ?? viewerTouchStartX;\n      const distance = endX - viewerTouchStartX;\n      viewerTouchStartX = null;\n      if (Math.abs(distance) \u003c 50) return;\n      navigateViewer(distance \u003e 0 ? -1 : 1);\n    }, {passive: true});\n    document.addEventListener(\"keydown\", (event) =\u003e {\n      if (viewer.hidden) return;\n      if (event.key === \"Escape\") closeViewer();\n      else if (event.key === \"ArrowLeft\") navigateViewer(-1);\n      else if (event.key === \"ArrowRight\") navigateViewer(1);\n    });\n    document.addEventListener(\"click\", (event) =\u003e {\n      const link = event.target.closest('#ProductGridContainer a[href*=\"\/products\/\"]');\n      if (!link || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n      const match = link.getAttribute(\"href\")?.match(\/\\\/products\\\/([a-z0-9-]+)\/i);\n      if (!match) return;\n      const products = nativeViewerProducts();\n      const index = products.findIndex((product) =\u003e product.handle === match[1]);\n      if (index \u003c 0) return;\n      event.preventDefault();\n      openViewer(products, index, {mode: \"native\", total: products.length});\n    });\n    applyNaturalRatios();\n    window.addEventListener(\"load\", () =\u003e applyNaturalRatios(), {once: true});\n\n    (async () =\u003e {\n      proxyRequest(\"config\")\n        .then((body) =\u003e {\n          const config = body.todasMisFotos || {};\n          if (!config.enabled || config.status !== \"valid\" || !config.identity?.selfieRequired) {\n            throw new Error(\"La búsqueda por fotos todavía no está disponible.\");\n          }\n          faceConfigReady = true;\n          setFaceStatus(\"Sube una foto de referencia para comenzar.\");\n          updateFaceButton();\n        })\n        .catch((error) =\u003e {\n          faceConfigReady = false;\n          updateFaceButton();\n          setFaceStatus(error.message || \"No se pudo preparar la búsqueda por fotos.\", true);\n        });\n      try {\n        catalog = readSlotCache() || await timeRequest({});\n        writeSlotCache(catalog);\n        configureSelectors();\n        restoreHash();\n      } catch (error) {\n        intervalSelect.disabled = true;\n        timeSelect.disabled = true;\n        submitButton.disabled = true;\n        setStatus(error.message || \"No se pudieron cargar los horarios.\", true);\n      }\n    })();\n  })();\n\u003c\/script\u003e\n","products":[{"product_id":"segundochapuzonija-oneflashphoto-928","title":"SegundoChapuzonIja-oneflashphoto-928.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236395244,"sku":"99SegundoChapuzonIja-oneflashphoto-928","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-928.jpg?v=1788102295"},{"product_id":"segundochapuzonija-oneflashphoto-927","title":"SegundoChapuzonIja-oneflashphoto-927.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236428012,"sku":"99SegundoChapuzonIja-oneflashphoto-927","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-927.jpg?v=1788102301"},{"product_id":"segundochapuzonija-oneflashphoto-924","title":"SegundoChapuzonIja-oneflashphoto-924.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236460780,"sku":"99SegundoChapuzonIja-oneflashphoto-924","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-924.jpg?v=1788102305"},{"product_id":"segundochapuzonija-oneflashphoto-926","title":"SegundoChapuzonIja-oneflashphoto-926.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236493548,"sku":"99SegundoChapuzonIja-oneflashphoto-926","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-926.jpg?v=1788102310"},{"product_id":"segundochapuzonija-oneflashphoto-921","title":"SegundoChapuzonIja-oneflashphoto-921.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236526316,"sku":"99SegundoChapuzonIja-oneflashphoto-921","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-921.jpg?v=1788102314"},{"product_id":"segundochapuzonija-oneflashphoto-925","title":"SegundoChapuzonIja-oneflashphoto-925.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236559084,"sku":"99SegundoChapuzonIja-oneflashphoto-925","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-925.jpg?v=1788102319"},{"product_id":"segundochapuzonija-oneflashphoto-920","title":"SegundoChapuzonIja-oneflashphoto-920.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236591852,"sku":"99SegundoChapuzonIja-oneflashphoto-920","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-920.jpg?v=1788102323"},{"product_id":"segundochapuzonija-oneflashphoto-919","title":"SegundoChapuzonIja-oneflashphoto-919.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236624620,"sku":"99SegundoChapuzonIja-oneflashphoto-919","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-919.jpg?v=1788102327"},{"product_id":"segundochapuzonija-oneflashphoto-914","title":"SegundoChapuzonIja-oneflashphoto-914.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236657388,"sku":"99SegundoChapuzonIja-oneflashphoto-914","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-914.jpg?v=1788102332"},{"product_id":"segundochapuzonija-oneflashphoto-913","title":"SegundoChapuzonIja-oneflashphoto-913.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236690156,"sku":"99SegundoChapuzonIja-oneflashphoto-913","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-913.jpg?v=1788102336"},{"product_id":"segundochapuzonija-oneflashphoto-918","title":"SegundoChapuzonIja-oneflashphoto-918.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236755692,"sku":"99SegundoChapuzonIja-oneflashphoto-918","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-918.jpg?v=1788102340"},{"product_id":"segundochapuzonija-oneflashphoto-915","title":"SegundoChapuzonIja-oneflashphoto-915.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247236788460,"sku":"99SegundoChapuzonIja-oneflashphoto-915","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-915.jpg?v=1788102344"},{"product_id":"segundochapuzonija-oneflashphoto-909","title":"SegundoChapuzonIja-oneflashphoto-909.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238164716,"sku":"99SegundoChapuzonIja-oneflashphoto-909","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-909.jpg?v=1788102348"},{"product_id":"segundochapuzonija-oneflashphoto-907","title":"SegundoChapuzonIja-oneflashphoto-907.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238197484,"sku":"99SegundoChapuzonIja-oneflashphoto-907","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-907.jpg?v=1788102353"},{"product_id":"segundochapuzonija-oneflashphoto-906","title":"SegundoChapuzonIja-oneflashphoto-906.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238230252,"sku":"99SegundoChapuzonIja-oneflashphoto-906","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-906.jpg?v=1788102357"},{"product_id":"segundochapuzonija-oneflashphoto-905","title":"SegundoChapuzonIja-oneflashphoto-905.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238295788,"sku":"99SegundoChapuzonIja-oneflashphoto-905","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-905.jpg?v=1788102361"},{"product_id":"segundochapuzonija-oneflashphoto-903","title":"SegundoChapuzonIja-oneflashphoto-903.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238328556,"sku":"99SegundoChapuzonIja-oneflashphoto-903","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-903.jpg?v=1788102365"},{"product_id":"segundochapuzonija-oneflashphoto-901","title":"SegundoChapuzonIja-oneflashphoto-901.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238394092,"sku":"99SegundoChapuzonIja-oneflashphoto-901","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-901.jpg?v=1788102369"},{"product_id":"segundochapuzonija-oneflashphoto-900","title":"SegundoChapuzonIja-oneflashphoto-900.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238426860,"sku":"99SegundoChapuzonIja-oneflashphoto-900","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-900.jpg?v=1788102372"},{"product_id":"segundochapuzonija-oneflashphoto-897","title":"SegundoChapuzonIja-oneflashphoto-897.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238459628,"sku":"99SegundoChapuzonIja-oneflashphoto-897","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-897.jpg?v=1788102377"},{"product_id":"segundochapuzonija-oneflashphoto-895","title":"SegundoChapuzonIja-oneflashphoto-895.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238492396,"sku":"99SegundoChapuzonIja-oneflashphoto-895","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-895.jpg?v=1788102381"},{"product_id":"segundochapuzonija-oneflashphoto-896","title":"SegundoChapuzonIja-oneflashphoto-896.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238525164,"sku":"99SegundoChapuzonIja-oneflashphoto-896","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-896.jpg?v=1788102385"},{"product_id":"segundochapuzonija-oneflashphoto-891","title":"SegundoChapuzonIja-oneflashphoto-891.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238590700,"sku":"99SegundoChapuzonIja-oneflashphoto-891","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-891.jpg?v=1788102390"},{"product_id":"segundochapuzonija-oneflashphoto-890","title":"SegundoChapuzonIja-oneflashphoto-890.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238623468,"sku":"99SegundoChapuzonIja-oneflashphoto-890","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-890.jpg?v=1788102394"},{"product_id":"segundochapuzonija-oneflashphoto-893","title":"SegundoChapuzonIja-oneflashphoto-893.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238656236,"sku":"99SegundoChapuzonIja-oneflashphoto-893","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-893.jpg?v=1788102398"},{"product_id":"segundochapuzonija-oneflashphoto-886","title":"SegundoChapuzonIja-oneflashphoto-886.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238721772,"sku":"99SegundoChapuzonIja-oneflashphoto-886","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-886.jpg?v=1788102402"},{"product_id":"segundochapuzonija-oneflashphoto-883","title":"SegundoChapuzonIja-oneflashphoto-883.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238754540,"sku":"99SegundoChapuzonIja-oneflashphoto-883","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-883.jpg?v=1788102406"},{"product_id":"segundochapuzonija-oneflashphoto-908","title":"SegundoChapuzonIja-oneflashphoto-908.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238787308,"sku":"99SegundoChapuzonIja-oneflashphoto-908","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-908.jpg?v=1788102410"},{"product_id":"segundochapuzonija-oneflashphoto-882","title":"SegundoChapuzonIja-oneflashphoto-882.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238820076,"sku":"99SegundoChapuzonIja-oneflashphoto-882","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-882.jpg?v=1788102415"},{"product_id":"segundochapuzonija-oneflashphoto-880","title":"SegundoChapuzonIja-oneflashphoto-880.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238852844,"sku":"99SegundoChapuzonIja-oneflashphoto-880","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-880.jpg?v=1788102419"},{"product_id":"segundochapuzonija-oneflashphoto-878","title":"SegundoChapuzonIja-oneflashphoto-878.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238885612,"sku":"99SegundoChapuzonIja-oneflashphoto-878","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-878.jpg?v=1788102423"},{"product_id":"segundochapuzonija-oneflashphoto-876","title":"SegundoChapuzonIja-oneflashphoto-876.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238918380,"sku":"99SegundoChapuzonIja-oneflashphoto-876","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-876.jpg?v=1788102427"},{"product_id":"segundochapuzonija-oneflashphoto-887","title":"SegundoChapuzonIja-oneflashphoto-887.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238951148,"sku":"99SegundoChapuzonIja-oneflashphoto-887","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-887.jpg?v=1788102431"},{"product_id":"segundochapuzonija-oneflashphoto-871","title":"SegundoChapuzonIja-oneflashphoto-871.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247238983916,"sku":"99SegundoChapuzonIja-oneflashphoto-871","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-871.jpg?v=1788102436"},{"product_id":"segundochapuzonija-oneflashphoto-872","title":"SegundoChapuzonIja-oneflashphoto-872.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239049452,"sku":"99SegundoChapuzonIja-oneflashphoto-872","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-872.jpg?v=1788102441"},{"product_id":"segundochapuzonija-oneflashphoto-867","title":"SegundoChapuzonIja-oneflashphoto-867.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239082220,"sku":"99SegundoChapuzonIja-oneflashphoto-867","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-867.jpg?v=1788102444"},{"product_id":"segundochapuzonija-oneflashphoto-866","title":"SegundoChapuzonIja-oneflashphoto-866.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239114988,"sku":"99SegundoChapuzonIja-oneflashphoto-866","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-866.jpg?v=1788102448"},{"product_id":"segundochapuzonija-oneflashphoto-865","title":"SegundoChapuzonIja-oneflashphoto-865.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239147756,"sku":"99SegundoChapuzonIja-oneflashphoto-865","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-865.jpg?v=1788102452"},{"product_id":"segundochapuzonija-oneflashphoto-863","title":"SegundoChapuzonIja-oneflashphoto-863.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239213292,"sku":"99SegundoChapuzonIja-oneflashphoto-863","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-863.jpg?v=1788102457"},{"product_id":"segundochapuzonija-oneflashphoto-874","title":"SegundoChapuzonIja-oneflashphoto-874.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239246060,"sku":"99SegundoChapuzonIja-oneflashphoto-874","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-874.jpg?v=1788102461"},{"product_id":"segundochapuzonija-oneflashphoto-860","title":"SegundoChapuzonIja-oneflashphoto-860.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239278828,"sku":"99SegundoChapuzonIja-oneflashphoto-860","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-860.jpg?v=1788102464"},{"product_id":"segundochapuzonija-oneflashphoto-864","title":"SegundoChapuzonIja-oneflashphoto-864.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239311596,"sku":"99SegundoChapuzonIja-oneflashphoto-864","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-864.jpg?v=1788102468"},{"product_id":"segundochapuzonija-oneflashphoto-858","title":"SegundoChapuzonIja-oneflashphoto-858.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239344364,"sku":"99SegundoChapuzonIja-oneflashphoto-858","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-858.jpg?v=1788102472"},{"product_id":"segundochapuzonija-oneflashphoto-856","title":"SegundoChapuzonIja-oneflashphoto-856.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239377132,"sku":"99SegundoChapuzonIja-oneflashphoto-856","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-856.jpg?v=1788102476"},{"product_id":"segundochapuzonija-oneflashphoto-859","title":"SegundoChapuzonIja-oneflashphoto-859.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239409900,"sku":"99SegundoChapuzonIja-oneflashphoto-859","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-859.jpg?v=1788102481"},{"product_id":"segundochapuzonija-oneflashphoto-877","title":"SegundoChapuzonIja-oneflashphoto-877.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239442668,"sku":"99SegundoChapuzonIja-oneflashphoto-877","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-877.jpg?v=1788102485"},{"product_id":"segundochapuzonija-oneflashphoto-861","title":"SegundoChapuzonIja-oneflashphoto-861.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239475436,"sku":"99SegundoChapuzonIja-oneflashphoto-861","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-861.jpg?v=1788102490"},{"product_id":"segundochapuzonija-oneflashphoto-851","title":"SegundoChapuzonIja-oneflashphoto-851.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239508204,"sku":"99SegundoChapuzonIja-oneflashphoto-851","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-851.jpg?v=1788102494"},{"product_id":"segundochapuzonija-oneflashphoto-853","title":"SegundoChapuzonIja-oneflashphoto-853.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239540972,"sku":"99SegundoChapuzonIja-oneflashphoto-853","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-853.jpg?v=1788102498"},{"product_id":"segundochapuzonija-oneflashphoto-869","title":"SegundoChapuzonIja-oneflashphoto-869.jpg","description":"Derecho de contenido para uso personal. Contactar para derechos de usos publicitarios al Wht: +507 6028-2182","brand":"oneflashphoto","offers":[{"title":"Default Title","offer_id":48247239573740,"sku":"99SegundoChapuzonIja-oneflashphoto-869","price":4.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/files\/SegundoChapuzonIja-oneflashphoto-869.jpg?v=1788102502"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0715\/5692\/3628\/collections\/rn-image_picker_lib_temp_ef9b9eb4-f175-4276-981d-dff0a621de5c.jpg?v=1788186665","url":"https:\/\/rauldom.com\/collections\/segundochapuzonija.oembed?page=44","provider":"RaulDom Sport Images","version":"1.0","type":"link"}