{
  "version": 3,
  "sources": ["/cdn/shop/t/100/assets/diagnostic.js?cb=20260826v1"],
  "sourcesContent": ["/* ==========================================================================\n   PROPER JACK \u2014 Quiz V2 / diagnostic.js  (v2.2 \u2014 GA4 tracking)\n   12 telas: 1.Dores, 2.Principal Dor (cond.), 3.N\u00EDvel Acne (cond.), 4.Nome,\n   5.Antes/Depois*, 6.Tom de pele, 7.Tipo de pele, 8.Tempo de rotina, 9.Idade,\n   10.Frequ\u00EAncia, 11.Forbes*, 12.Contato.\n   * = interstitials (sem valida\u00E7\u00E3o, CTA \"Continuar\")\n   cond. step 2: aparece s\u00F3 se dores.length >= 2.\n   cond. step 3: aparece s\u00F3 se principalDor === 'acne'.\n   ========================================================================== */\n\n(function () {\n  'use strict';\n\n  var STATE_KEY = 'proper_diagnostic_state';\n  var STATE_TTL_MS = 48 * 60 * 60 * 1000; // 48 HORAS (11/08: 31d -> 7d -> 48h, pedido do Carlos; resultado salvo expira em 2 dias)\n  var STEP_COUNT = 15;          // maior data-step no DOM (13/14 = dores reformuladas B; 15 = dores fotos reais C)\n  var LAST_STEP = 12;           // \u00FAltimo step L\u00D3GICO (Contato) = fim do quiz\n  var INTERSTITIAL_STEPS = [5, 11];\n  // A/B test: intro page (V3) com countdown de oferta vs P1 direto (controle).\n  // 'intro' = v\u00EA a intro antes da P1; 'direct' = abre direto na P1 (atual).\n  // A variante \u00E9 sorteada 50/50 sticky por um script inline no markup\n  // (diagnostic-content) que roda ANTES do render (anti-flash) e exp\u00F5e\n  // window.__pjIntroVariant. Aqui s\u00F3 consumimos (com fallback se o inline n\u00E3o\n  // rodou). Registrada como super-property quiz_intro_variant, antes do $pageview.\n  // A/B intro ENCERRADO (01-03/06): 'direct' venceu (vendia/engajava mais). Intro\n  // page DESATIVADA pra todos. _introVariant fixo = 'direct' por compat dos eventos.\n  var _introVariant = 'direct';\n  /* A/B INTRO V2 (27/07): a variante vem do anti-flash (diagnostic-content.liquid):\n     window.__pjIntroVariant = 'intro' (B, mostra a intro repaginada) | 'direct' (A). */\n  var INTRO_ENABLED = (window.__pjIntroVariant === 'intro');\n\n  // ===== A/B DORES \u2014 LAYOUT (encerra A/B/C anterior \u2014 \"C: fotos reais, 1 tela\" venceu) =====\n  // Agora testando S\u00D3 o layout; AMBAS usam as FOTOS REAIS (dor-*-c.jpg) vencedoras:\n  //   A = fotos em 1 tela  (step 15, 8 numa p\u00E1gina) \u2014 controle (= vencedora C anterior).\n  //   B = fotos em 2 telas (steps 13/14) \u2014 estrutura da B anterior, mas com as fotos.\n  // Sticky 50/50. Sorteado no markup (anti-flash, window.__pjDorVariant) com fallback aqui.\n  // Registrado como super-property quiz_dorfoto_variant ANTES do $pageview.\n  // A/B dorfoto ENCERRADO (09/06): \"A - Fotos 1 tela\" venceu \u2014 fixado pra todos.\n  var _dorVariant = 'A';\n  // L\u00F3gica usa a LETRA (_dorVariant); PostHog recebe o r\u00F3tulo. For\u00E7ar: pj_ab_dorfoto = 'A' | 'B'.\n  var DOR_VARIANT_LABEL = { 'A': 'A - Fotos 1 tela', 'B': 'B - Fotos 2 telas' };\n  var _dorLabel = DOR_VARIANT_LABEL[_dorVariant] || _dorVariant;\n\n  // ===== A/B RESULT PAGE: 3 kits (atual) vs 1 kit (s\u00F3 o Core/4p) ==========\n  // Sticky 50/50. Decidido no markup (anti-flash, window.__pjResultVariant) com\n  // fallback aqui. Em B o markup ganha a classe pj-result-1kit no <html> (CSS\n  // esconde os outros kits + ajusta textos pro singular). Registrado como\n  // super-property quiz_result_variant. Roda em paralelo ao A/B/C de ordem.\n  // A/B result page ENCERRADO (03/06): 1 kit (Core) venceu (view->checkout 28% vs 26%)\n  // \u2014 fixado em 'B' pra TODOS. Pra reabrir, restaurar o sorteio (git hist\u00F3rico).\n  var _resultVariant = 'B';\n  var RESULT_LABEL = { 'A': 'A - 3 kits', 'B': 'B - 1 kit (Core)' };\n  var _resultLabel = RESULT_LABEL[_resultVariant] || _resultVariant;\n\n  // ===== A/B BACKGROUND DO QUIZ: A = cream atual (#F5F0EB) vs B = cinza (#D7D7D7) =====\n  // Sticky 50/50, anti-flash (window.__pjBgVariant) com fallback aqui. Em B o markup\n  // ganha a classe pj-ab-bg-gray no <html> (CSS injetado no anti-flash pinta o fundo).\n  // Super-property quiz_bg_variant. For\u00E7ar: localStorage pj_ab_bg = 'A' | 'B'.\n  // A/B background ENCERRADO (09/06): \"A - Cream #F5F0EB\" venceu \u2014 fixado pra todos (= o cream padr\u00E3o).\n  var _bgVariant = 'A';\n\n  var TIPO_PELE_LABELS = {\n    oleosa: 'Oleosa',\n    seca: 'Seca',\n    sensivel: 'Sens\u00EDvel',\n    mista: 'Mista',\n    normal: 'Normal',\n    naosei: 'Em an\u00E1lise'\n  };\n\n  var DOR_LABELS = {\n    acne: 'Acne',\n    oleosidade: 'Oleosidade',\n    saude: 'Sa\u00FAde da pele',\n    poros: 'Poros dilatados',\n    manchas: 'Manchas',\n    vermelhidao: 'Vermelhid\u00E3o',\n    sinais: 'Sinais de idade',\n    olheiras: 'Olheiras'\n  };\n\n  /* ----- State --------------------------------------------------------- */\n\n  function makeInitialState() {\n    return {\n      step: 1,\n      answers: {\n        dores: [],\n        principalDor: '',\n        acneNivel: '',\n        frequencia: '',\n        tomPele: '',\n        tipoPele: '',\n        tempoRotina: '',\n        idade: '',\n        nome: '',\n        email: '',\n        whatsapp: ''\n      },\n      startedAt: new Date().toISOString(),\n      updatedAt: null,\n      completedAt: null\n    };\n  }\n\n  function loadState() {\n    try {\n      var raw = localStorage.getItem(STATE_KEY);\n      if (!raw) return null;\n      var parsed = JSON.parse(raw);\n      if (!parsed || typeof parsed !== 'object') return null;\n\n      // TTL de 48 horas (11/08) \u2014 descarta state stale baseado em updatedAt (ou startedAt como fallback)\n      var lastTouch = parsed.updatedAt || parsed.startedAt;\n      if (lastTouch) {\n        var t = Date.parse(lastTouch);\n        if (!isNaN(t) && (Date.now() - t) > STATE_TTL_MS) {\n          try { localStorage.removeItem(STATE_KEY); } catch (_) {}\n          return null;\n        }\n      }\n\n      // Migra\u00E7\u00F5es:\n      //  V1 (5 telas, sem 'frequencia')                                 \u2192 V4 (12 telas)\n      //  V2 (10 telas, com 'frequencia' mas sem 'principalDor')        \u2192 V4: shift >=2 por +2\n      //  V3 (11 telas, com 'principalDor' mas sem 'acneNivel')         \u2192 V4: shift >=3 por +1\n      var hasFreq = parsed.answers && Object.prototype.hasOwnProperty.call(parsed.answers, 'frequencia');\n      var hasPrincipal = parsed.answers && Object.prototype.hasOwnProperty.call(parsed.answers, 'principalDor');\n      var hasAcneNivel = parsed.answers && Object.prototype.hasOwnProperty.call(parsed.answers, 'acneNivel');\n      if (!hasFreq && typeof parsed.step === 'number' && parsed.step >= 1 && parsed.step <= 5) {\n        // V1 \u2192 V4\n        var v1Map = { 1: 1, 2: 7, 3: 9, 4: 4, 5: 12 };\n        parsed.step = v1Map[parsed.step] || 1;\n      } else if (hasFreq && !hasPrincipal && typeof parsed.step === 'number' && parsed.step >= 2) {\n        // V2 \u2192 V4: shift +2 (entram principalDor e acneNivel antes)\n        parsed.step = parsed.step + 2;\n        if (Array.isArray(parsed.answers.dores) && parsed.answers.dores.length === 1) {\n          parsed.answers.principalDor = parsed.answers.dores[0];\n        }\n      } else if (hasPrincipal && !hasAcneNivel && typeof parsed.step === 'number' && parsed.step >= 3) {\n        // V3 \u2192 V4: shift +1 (entra acneNivel antes)\n        parsed.step = parsed.step + 1;\n      }\n\n      var init = makeInitialState();\n      parsed.answers = Object.assign({}, init.answers, parsed.answers || {});\n      if (!Array.isArray(parsed.answers.dores)) parsed.answers.dores = [];\n      return parsed;\n    } catch (_) { return null; }\n  }\n\n  function saveState(state) {\n    state.updatedAt = new Date().toISOString();\n    try { localStorage.setItem(STATE_KEY, JSON.stringify(state)); } catch (_) {}\n  }\n\n  function resetState() {\n    try { localStorage.removeItem(STATE_KEY); } catch (_) {}\n  }\n\n  /* ----- Helpers ------------------------------------------------------- */\n\n  function isValidEmail(e) {\n    return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(e || '');\n  }\n  function isValidPhone(p) {\n    return (p || '').replace(/\\D/g, '').length >= 10;\n  }\n  function formatPhone(v) {\n    var d = (v || '').replace(/\\D/g, '').slice(0, 11);\n    if (d.length === 0) return '';\n    if (d.length <= 2) return '(' + d;\n    if (d.length <= 6) return '(' + d.slice(0, 2) + ') ' + d.slice(2);\n    if (d.length <= 10) return '(' + d.slice(0, 2) + ') ' + d.slice(2, 6) + '-' + d.slice(6);\n    return '(' + d.slice(0, 2) + ') ' + d.slice(2, 7) + '-' + d.slice(7);\n  }\n  function cap(s) { s = s || ''; return s.charAt(0).toUpperCase() + s.slice(1); }\n\n  function escapeHtml(s) {\n    s = (s == null ? '' : String(s));\n    return s.replace(/[&<>\"']/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n\n  function isStepValid(step, answers) {\n    switch (step) {\n      case 1: return Array.isArray(answers.dores) && answers.dores.length >= 1;\n      case 13: return true;                                         // dores reformuladas pt1 (pode marcar na pt2)\n      case 14: return Array.isArray(answers.dores) && answers.dores.length >= 1; // exige >= 1 dor no total\n      case 15: return Array.isArray(answers.dores) && answers.dores.length >= 1; // dores 1 tela fotos reais (C)\n      case 2: return !!answers.principalDor && Array.isArray(answers.dores) && answers.dores.indexOf(answers.principalDor) !== -1;\n      case 3: {\n        var a = parseInt(answers.acneNivel, 10);\n        return !isNaN(a) && a >= 0 && a <= 5;\n      }\n      case 4: return (answers.nome || '').trim().length >= 2;\n      case 5: return true; // interstitial Antes/Depois\n      case 6: return !!answers.tomPele;\n      case 7: return !!answers.tipoPele;\n      case 8: return !!answers.tempoRotina;\n      case 9: {\n        var n = parseInt(answers.idade, 10);\n        return !isNaN(n) && n >= 10 && n <= 99;\n      }\n      case 10: return !!answers.frequencia;\n      case 11: return true; // interstitial Forbes\n      case 12: return isValidEmail(answers.email) && isValidPhone(answers.whatsapp);\n      default: return false;\n    }\n  }\n\n  function buildDoresText(dores) {\n    if (!dores || dores.length === 0) return '\u2014';\n    var labels = [];\n    for (var i = 0; i < dores.length; i++) {\n      var l = DOR_LABELS[dores[i]];\n      if (l) labels.push(l.toLowerCase());\n    }\n    if (labels.length === 0) return '\u2014';\n    if (labels.length === 1) return labels[0];\n    if (labels.length === 2) return labels[0] + ' e ' + labels[1];\n    return labels.slice(0, -1).join(', ') + ' e ' + labels[labels.length - 1];\n  }\n\n  /* ----- GA4 / GTM tracking helper ------------------------------------- */\n  /* Loja tem Google Tag GT-TQV89Z6M instalado (Shopify Google & YouTube\n     channel) que roteia pra GA4 + Google Ads. Padr\u00E3o oficial do Google:\n     inicializa window.gtag como stub que empurra arguments pro dataLayer.\n     Quando o tag script real carrega, processa o queue. Funciona com\n     qualquer ordem de carregamento (race condition resolvida).\n     Cada chamada \u00E9 ~1ms \u2014 overhead neglig\u00EDvel. */\n  try {\n    window.dataLayer = window.dataLayer || [];\n    if (typeof window.gtag !== 'function') {\n      window.gtag = function () { window.dataLayer.push(arguments); };\n    }\n    // CR\u00CDTICO \u2014 Shopify Google channel s\u00F3 instala o wrapper Google Tag (GT-),\n    // que n\u00E3o auto-forwarda custom events pra GA4. Aqui registramos a GA4\n    // measurement ID como destino expl\u00EDcito do gtag \u2014 assim nossos eventos\n    // pj_quiz_* chegam direto na propriedade GA4 465836368.\n    // send_page_view:false evita duplicar pageviews j\u00E1 enviados pela Shopify.\n    window.gtag('js', new Date());\n    window.gtag('config', 'G-ZWQE7JHHFY', { send_page_view: false });\n  } catch (_) {}\n\n  /* ----- A/B test: estilo dos cards de dor (P1/P2) ---------------------- */\n  /* images (controle) vs pictograms (teste). Sticky por usu\u00E1rio (localStorage)\n     pra n\u00E3o trocar no reload/resume. Registrado como super-property no PostHog\n     (quiz_card_variant) ANTES do $pageview, ent\u00E3o TODOS os eventos carregam a\n     variante e d\u00E1 pra quebrar qualquer funil por ela. 50/50. */\n  var AB_CARDS_KEY = 'pj_ab_cards';\n  function getCardVariant() {\n    var v = null;\n    try { v = localStorage.getItem(AB_CARDS_KEY); } catch (_) {}\n    if (v !== 'images' && v !== 'pictograms') {\n      v = (Math.random() < 0.5) ? 'images' : 'pictograms';\n      try { localStorage.setItem(AB_CARDS_KEY, v); } catch (_) {}\n    }\n    return v;\n  }\n  // A/B pictogramas vs imagens ENCERRADO em 01/06 (imagens venceu) \u2014 fixado em\n  // 'images'. getCardVariant() preservado caso queira reabrir o teste depois.\n  var _cardVariant = 'images';\n  // Hint pro CSS esconder as imagens cedo na variante pictograms (evita flash\n  // antes do swap em JS). Roda no parse do script.\n  try {\n    if (_cardVariant === 'pictograms' && document.documentElement) {\n      document.documentElement.classList.add('pj-ab-picto');\n    }\n  } catch (_) {}\n\n  /* ----- PostHog (real-time analytics + funnels + session replay) -------- */\n  /* PostHog \u00E9 nossa ferramenta principal de an\u00E1lise visual de funil. GA4 fica\n     como backup pra Google Ads. Vantagens: real-time (~3s), funnels nativos,\n     session recordings.\n     - autocapture: false  \u2192 n\u00E3o captura cliques/inputs autom\u00E1ticos (economiza\n       budget de eventos no free tier \u2014 1M/m\u00EAs)\n     - capture_pageview: false \u2192 Shopify j\u00E1 manda pageviews via Web Pixels\n     - disable_session_recording: false \u2192 mant\u00E9m recordings (limite separado) */\n  try {\n    if (!window.posthog || !window.posthog.__loaded) {\n      !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(\".\");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement(\"script\")).type=\"text/javascript\",p.crossOrigin=\"anonymous\",p.async=!0,p.src=s.api_host.replace(\".i.posthog.com\",\"-assets.i.posthog.com\")+\"/static/array.js\",(r=t.getElementsByTagName(\"script\")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a=\"posthog\",u.people=u.people||[],u.toString=function(t){var e=\"posthog\";return\"posthog\"!==a&&(e+=\".\"+a),t||(e+=\" (stub)\"),e},u.people.toString=function(){return u.toString(1)+\".people (stub)\"},o=\"init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing startSessionRecording stopSessionRecording getSessionId getSessionReplayUrl loadToolbar get_property getPersonProperties createPersonProfile opt_in_session_recording opt_out_session_recording has_opted_in_session_recording has_opted_out_session_recording captureException loadSurveys\".split(\" \"),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);\n      window.posthog.init('phc_suSec7cKUQQw5JyWRWxmXVcJ9Mzt9q3op3jjq9wnDoD9', {\n        api_host: 'https://us.i.posthog.com',\n        capture_pageview: false,\n        autocapture: false,\n        disable_session_recording: false,\n        // corte de custo (25/08/2026): idem init global do pj-posthog.liquid \u2014\n        // desliga dead clicks / exceptions / web vitals tamb\u00E9m nas p\u00E1ginas do quiz.\n        capture_dead_clicks: false,\n        capture_exceptions: false,\n        capture_performance: { web_vitals: false },\n        persistence: 'localStorage+cookie'\n      });\n      // A/B: registra a variante dos cards ANTES do $pageview pra que todos os\n      // eventos (inclusive o $pageview) carreguem quiz_card_variant.\n      try { window.posthog.register({ quiz_card_variant: _cardVariant, quiz_intro_variant: _introVariant, quiz_result_variant: _resultLabel}); window.posthog.unregister('quiz_dor_variant'); window.posthog.unregister('quiz_dorfoto_variant'); window.posthog.unregister('quiz_bg_variant'); } catch (_) {}\n      // $pageview disparado MANUALMENTE aqui \u2014 capture_pageview: false acima desliga\n      // o auto-fire do PostHog (que rodava TARDE, depois do SDK carregar do CDN,\n      // o que \u00E0s vezes era depois do pj_quiz_landing \u2192 funnel quebrado por timestamp).\n      // Fire manual = timestamp congelado AGORA, garantindo que $pageview vem ANTES\n      // de pj_quiz_landing (que dispara em DOMContentLoaded). \u00C9 o \"topo de funil\"\n      // mais cru \u2014 o delta $pageview \u2192 pj_quiz_landing = \"lost patience\" (user\n      // clicou mas n\u00E3o esperou o quiz inicializar).\n      // O funnel macro filtra por $pathname = /pages/diagnostic, ent\u00E3o $pageview\n      // disparado em result pages (onde diagnostic.js tamb\u00E9m carrega) n\u00E3o pollui.\n      window.posthog.capture('$pageview');\n    }\n  } catch (_) {}\n  // Safety: garante o registro da variante mesmo se o bloco acima foi pulado\n  // (posthog j\u00E1 carregado). Idempotente.\n  try {\n    if (window.posthog && typeof window.posthog.register === 'function') {\n      window.posthog.register({ quiz_card_variant: _cardVariant, quiz_intro_variant: _introVariant, quiz_result_variant: _resultLabel});\n      try { window.posthog.unregister('quiz_dor_variant'); window.posthog.unregister('quiz_dorfoto_variant'); window.posthog.unregister('quiz_bg_variant'); } catch (_) {}\n    }\n  } catch (_) {}\n\n  function pjTrack(name, params) {\n    var eventName = 'pj_quiz_' + name;\n    params = params || {};\n    // GA4 via gtag (analytics hist\u00F3rica, atrib. de campanhas, Google Ads)\n    try {\n      window.gtag('event', eventName, params);\n    } catch (_) {}\n    // PostHog real-time (funnels, session replay, an\u00E1lise di\u00E1ria)\n    // corte de custo (25/08/2026): step_view silenciado S\u00D3 no PostHog (~75k ev/m\u00EAs;\n    // drop-off por step continua deriv\u00E1vel do step_answered). GA4 segue recebendo.\n    try {\n      if (name !== 'step_view' && window.posthog && typeof window.posthog.capture === 'function') {\n        window.posthog.capture(eventName, params);\n      }\n    } catch (_) {}\n    // Fallback dataLayer no formato GTM {event:...} \u2014 pra futuro caso a loja\n    // migre pra GTM (n\u00E3o tira nada do gtag, s\u00F3 adiciona compatibilidade).\n    try {\n      var payload = { event: eventName };\n      for (var k in params) {\n        if (params.hasOwnProperty(k)) payload[k] = params[k];\n      }\n      window.dataLayer.push(payload);\n    } catch (_) {}\n  }\n\n  /* Extrai um snapshot de answers (SEM PII) pra incluir em eventos como\n     pj_quiz_complete e pj_quiz_result_view. \u00DAtil pra an\u00E1lise de cohort no\n     GA4/Looker (drop-off por dor, idade, tipo de pele, etc). */\n  function pjAnswerSummary(state) {\n    var a = (state && state.answers) || {};\n    return {\n      dor_principal: a.principalDor || '',\n      acne_nivel:    a.acneNivel || '',\n      idade:         a.idade || '',\n      tipo_pele:     a.tipoPele || '',\n      tempo_rotina:  a.tempoRotina || '',\n      frequencia:    a.frequencia || '',\n      tom_pele:      a.tomPele || '',\n      num_dores:     (a.dores || []).length\n    };\n  }\n\n  /* Mapa principalDor \u2192 kit_code (D01-D08) pra includes em eventos de result */\n  var DOR_TO_KIT_CODE = {\n    acne:        'D01',\n    oleosidade:  'D02',\n    saude:       'D03',\n    manchas:     'D04',\n    vermelhidao: 'D05',\n    sinais:      'D06',\n    poros:       'D07',\n    olheiras:    'D08'\n  };\n\n  /* Cached na entrada de uma result page (init) pra usar em wire functions\n     sem precisar reler state em cada event handler. */\n  var _resultDor = '';\n  function _kitCode() { return DOR_TO_KIT_CODE[_resultDor] || ''; }\n\n  /* ----- DOM refs ------------------------------------------------------ */\n\n  var root, quizEl, resultEl;\n  var progressSegments, progressCount;\n  var ctaBtn, ctaLabel, prevBtn;\n  var stepEls = {};\n\n  /* ----- P1 scroll tracking -------------------------------------------------\n     Hip\u00F3tese: muitos users dropam em P1 sem nem ver os 8 cards (s\u00F3 4 vis\u00EDveis\n     above-the-fold no mobile). Trackamos se scrollaram + profundidade pra\n     validar. Reseta no goToStep(1), captura no exit (goToStep != 1) + pagehide.\n  ------------------------------------------------------------------------- */\n  var _p1ScrollEnabled = false;\n  var _p1MaxScrollY = 0;\n  var _p1ScrollFired = false;\n  var _p1EnteredAt = 0;\n  var _p1CardsTouched = 0;        // contador de cliques em cards (inclui desmarca\u00E7\u00F5es)\n  var _p1FirstCardClickAt = 0;    // timestamp do 1\u00BA clique em card (0 = nunca clicou)\n  var _p1DoresMarked = 0;         // qtde de dores marcadas no momento atual\n\n  function _p1OnScroll() {\n    if (!_p1ScrollEnabled) return;\n    var y = window.scrollY || window.pageYOffset || 0;\n    if (y > _p1MaxScrollY) _p1MaxScrollY = y;\n    if (!_p1ScrollFired && y > 30) {\n      _p1ScrollFired = true;\n      pjTrack('p1_scroll_first', {\n        depth_px: Math.round(y),\n        viewport_h_px: Math.round(window.innerHeight || 0),\n        ms_to_scroll: Date.now() - _p1EnteredAt\n      });\n    }\n  }\n  // Chamado por wireDoresCards a cada click num card. Mant\u00E9m contadores\n  // que ser\u00E3o emitidos no p1_exit + dispara o first_card_click 1x.\n  function _p1NoteCardClick(currentMarkedCount) {\n    if (!_p1ScrollEnabled) return;\n    _p1CardsTouched++;\n    _p1DoresMarked = currentMarkedCount;\n    if (_p1FirstCardClickAt === 0) {\n      _p1FirstCardClickAt = Date.now();\n      pjTrack('p1_first_card_click', {\n        ms_to_click: _p1FirstCardClickAt - _p1EnteredAt\n      });\n    }\n  }\n  function _p1ScrollStart() {\n    _p1ScrollEnabled = true;\n    _p1MaxScrollY = 0;\n    _p1ScrollFired = false;\n    _p1EnteredAt = Date.now();\n    _p1CardsTouched = 0;\n    _p1FirstCardClickAt = 0;\n    _p1DoresMarked = 0;\n    try { window.addEventListener('scroll', _p1OnScroll, { passive: true }); } catch (_) {}\n  }\n  function _p1ScrollExit(exitReason) {\n    if (!_p1ScrollEnabled) return;\n    _p1ScrollEnabled = false;\n    try { window.removeEventListener('scroll', _p1OnScroll); } catch (_) {}\n    // Snapshot final do comportamento em P1 \u2014 base pra cohort analysis no PostHog\n    pjTrack('p1_exit', {\n      reason: exitReason || 'unknown',     // 'advance' | 'pagehide' | 'visibility_hidden' | 'unknown'\n      scrolled: _p1MaxScrollY > 30,\n      max_scroll_px: Math.round(_p1MaxScrollY),\n      viewport_h_px: Math.round(window.innerHeight || 0),\n      ms_on_step: Date.now() - _p1EnteredAt,\n      cards_touched_count: _p1CardsTouched,\n      dores_marked_count: _p1DoresMarked,\n      ms_to_first_click: _p1FirstCardClickAt > 0 ? (_p1FirstCardClickAt - _p1EnteredAt) : -1\n    });\n  }\n  // Triple-redundancy pra capturar a sa\u00EDda do P1:\n  //   1. pagehide \u2014 funciona desktop + ~50% mobile\n  //   2. visibilitychange \u2014 funciona ~95% mobile (lock screen, troca de app)\n  //   3. advance \u2014 quando user clica Pr\u00F3xima (chamado em goToStep)\n  // O _p1ScrollEnabled flag previne firing duplicado.\n  try {\n    window.addEventListener('pagehide', function () {\n      if (_p1ScrollEnabled) _p1ScrollExit('pagehide');\n    });\n    document.addEventListener('visibilitychange', function () {\n      if (document.visibilityState === 'hidden' && _p1ScrollEnabled) {\n        _p1ScrollExit('visibility_hidden');\n      }\n    });\n  } catch (_) {}\n\n  // Module-level wiring registry. Permite wirar steps on-demand (quando user\n  // chega no step via goToStep), em vez de pre-wirar tudo em idle batches\n  // que viravam long tasks na CPU lenta simulada do Lighthouse (TBT explodia).\n  var _stepWirers = null;\n  var _wired = {};\n  function wireStepOnce(n) {\n    if (!_stepWirers || _wired[n] || !_stepWirers[n]) return;\n    _wired[n] = true;\n    _stepWirers[n]();\n  }\n\n  /* ----- Quiz render --------------------------------------------------- */\n\n  /* ===== ROTA A/B/C (ordem das perguntas) ==============================\n     Rota = sequ\u00EAncia ORDENADA de steps que o usu\u00E1rio visita, por variante.\n     Resolve as condicionais (2,3) e injeta interstitials: 5 (Antes/Depois)\n     logo AP\u00D3S a 1\u00AA pergunta, e 11 (Forbes) antes do Contato (12). Toda a\n     navega\u00E7\u00E3o (next/prev/auto-advance), o landing e o contador derivam DAQUI \u2014\n     n\u00E3o existe mais step++ cego.\n       A = Tipo de pele(7) 1\u00BA, depois Dores 1 tela (step 1, imgs atuais)\n       B = Dores REFORMULADAS em 2 telas (13,14); Tipo de pele ap\u00F3s o Nome\n       C = Dores 1 tela FOTOS REAIS (step 15); abre direto nas dores         */\n  function getRoute(state) {\n    var a = (state && state.answers) || {};\n    // Com exatamente 1 dor, ela \u00C9 a principal (a tela \"Principal Dor\" n\u00E3o aparece).\n    // Normaliza aqui pra a decis\u00E3o do step 3 (acne) ficar correta. Idempotente.\n    if (Array.isArray(a.dores) && a.dores.length === 1 && a.principalDor !== a.dores[0]) {\n      a.principalDor = a.dores[0];\n    }\n    // Condicionais do bloco de dor (s\u00F3 entram quando v\u00E3o de fato aparecer).\n    var cond = [];\n    if (Array.isArray(a.dores) && a.dores.length >= 2) cond.push(2); // Principal Dor\n    if (a.principalDor === 'acne') cond.push(3);                     // N\u00EDvel Acne\n    // Antes/Depois (5) entra logo AP\u00D3S o bloco de dor; Forbes (11)+Contato (12) no fim.\n    var route;\n    // Tom de pele (6) REATIVADO (26/08 a pedido) \u2014 entre o Nome (4) e o Tipo de pele (7).\n    if (_dorVariant === 'B') {\n      // B: fotos em 2 telas (13,14) abrem \u2192 [cond] \u2192 5 \u2192 Nome(4) \u2192 Tom(6) \u2192 Tipo de pele(7) \u2192 Tempo(8) \u2192 Idade(9) \u2192 Freq(10)\n      route = [13, 14].concat(cond).concat([5, 4, 6, 7, 8, 9, 10]);\n    } else {\n      // A (controle = fotos 1 tela): step 15 abre \u2192 [cond] \u2192 5 \u2192 Nome(4) \u2192 Tom(6) \u2192 Tipo de pele(7) \u2192 Tempo(8) \u2192 Idade(9) \u2192 Freq(10)\n      route = [15].concat(cond).concat([5, 4, 6, 7, 8, 9, 10]);\n    }\n    route.push(11, 12);\n    /* A/B INTRO V2 (27/07): na variante B a intro j\u00E1 mostra o carrossel de\n       antes/depois \u2014 o interstitial (5) sai da rota pra n\u00E3o repetir. */\n    if (INTRO_ENABLED) {\n      route = route.filter(function (s) { return s !== 5; });\n    }\n    return route;\n  }\n\n  function routeNext(state) {\n    var r = getRoute(state);\n    var i = r.indexOf(state.step);\n    if (i === -1) return state.step + 1;            // fallback defensivo\n    return (i >= r.length - 1) ? (STEP_COUNT + 1) : r[i + 1];\n  }\n  function routePrev(state) {\n    var r = getRoute(state);\n    var i = r.indexOf(state.step);\n    return (i <= 0) ? r[0] : r[i - 1];\n  }\n\n  /* Perguntas (sem interstitials 5/11) na ordem REAL da rota \u2014 mant\u00E9m o contador\n     \"atual/total\" coerente com a navega\u00E7\u00E3o A/B/C. */\n  function getQuestionSteps(state) {\n    return getRoute(state).filter(function (s) {\n      return INTERSTITIAL_STEPS.indexOf(s) === -1;\n    });\n  }\n\n  // Barra segmentada (1 tra\u00E7o por pergunta) + contador \"atual/total\".\n  // total varia (7-9) conforme condicionais \u2014 re-renderiza os tra\u00E7os quando muda.\n  function setProgress(step, state) {\n    if (!progressSegments) return;\n    var list = getQuestionSteps(state);\n    var total = list.length;\n    // N\u00BA da pergunta atual (1-based). Se o step n\u00E3o \u00E9 pergunta (interstitial 11),\n    // usa a contagem de perguntas j\u00E1 passadas (n\u00E3o destaca nenhuma como \"atual\").\n    var current;\n    var idx = list.indexOf(step);\n    if (idx !== -1) {\n      current = idx + 1;\n    } else {\n      current = 0;\n      for (var i = 0; i < list.length; i++) { if (list[i] < step) current++; }\n    }\n    // (Re)cria os tra\u00E7os s\u00F3 se a contagem mudou \u2014 evita thrash de DOM por tick.\n    if (progressSegments.children.length !== total) {\n      var html = '';\n      for (var s = 0; s < total; s++) html += '<span class=\"pj-progress-seg\"></span>';\n      progressSegments.innerHTML = html;\n    }\n    var segs = progressSegments.children;\n    for (var j = 0; j < segs.length; j++) {\n      segs[j].classList.toggle('is-filled', j < current);\n    }\n    if (progressCount) progressCount.textContent = current + '/' + total;\n  }\n\n  function showStep(step) {\n    for (var n = 1; n <= STEP_COUNT; n++) {\n      if (stepEls[n]) stepEls[n].classList.toggle('is-active', n === step);\n    }\n  }\n\n  function setNextLabel(step) {\n    if (step === LAST_STEP) ctaLabel.textContent = 'Ver resultados';\n    else if (INTERSTITIAL_STEPS.indexOf(step) !== -1) ctaLabel.textContent = 'Continuar';\n    else ctaLabel.textContent = 'Pr\u00F3xima';\n  }\n\n  function setPrevVisible(step, state) {\n    // Esconde \"voltar\" s\u00F3 no PRIMEIRO step da rota da variante (n\u00E3o h\u00E1 pra onde voltar).\n    // Em B/C o 1\u00BA step n\u00E3o \u00E9 o step 1, ent\u00E3o N\u00C3O d\u00E1 pra usar \"step <= 1\" aqui.\n    var first = state ? getRoute(state)[0] : 1;\n    if (step === first) prevBtn.setAttribute('hidden', '');\n    else prevBtn.removeAttribute('hidden');\n  }\n\n  function refreshCta(state) {\n    ctaBtn.disabled = !isStepValid(state.step, state.answers);\n    // Pulse no CTA quando step 1 tem ao menos 1 dor selecionada.\n    // P1 tem droprate gigantesco (~69% em maio/26) \u2014 hip\u00F3tese: usu\u00E1rio marca\n    // 1 card e n entende q precisa clicar \"Pr\u00F3xima\". Pulse d\u00E1 affordance.\n    // (A seta SVG nativa do bot\u00E3o j\u00E1 existe e tem nudge animado \u2014 n\u00E3o duplicar\n    //  com seta de texto, fica visualmente bugado.)\n    var doresLen = (state.answers.dores && state.answers.dores.length) || 0;\n    var pulseOn = state.step === 1 && doresLen >= 1;\n    ctaBtn.classList.toggle('pj-cta-pulse', pulseOn);\n  }\n\n  function goToStep(state, step) {\n    if (step < 1) step = 1;\n    if (step > STEP_COUNT) { completeQuiz(state); return; }\n\n    // Skip condicional step 2 (Principal Dor): s\u00F3 aparece se dores.length >= 2.\n    if (step === 2 && (!Array.isArray(state.answers.dores) || state.answers.dores.length < 2)) {\n      if (state.answers.dores && state.answers.dores.length === 1) {\n        state.answers.principalDor = state.answers.dores[0];\n      } else {\n        state.answers.principalDor = '';\n      }\n      saveState(state);\n      if (state.step === 1) { goToStep(state, 3); return; }       // avan\u00E7ando 1\u21922 \u2192 tenta 3\n      if (state.step >= 3)  { goToStep(state, 1); return; }       // voltando 3+\u21922 \u2192 vai pro 1\n      goToStep(state, 1); return;\n    }\n\n    // Skip condicional step 3 (N\u00EDvel Acne): s\u00F3 aparece se principalDor === 'acne'.\n    if (step === 3 && state.answers.principalDor !== 'acne') {\n      state.answers.acneNivel = '';\n      saveState(state);\n      if (state.step <= 2) { goToStep(state, 4); return; }        // avan\u00E7ando 1/2\u21923 \u2192 pula pro 4\n      if (state.step >= 4) { goToStep(state, 2); return; }        // voltando 4+\u21923 \u2192 tenta 2 (que pode pular tb)\n      goToStep(state, 1); return;\n    }\n\n    // Step 5 (Antes/Depois) REATIVADO no V6 \u2014 injetado na rota logo ap\u00F3s a 1\u00AA\n    // pergunta (ver getRoute). A navega\u00E7\u00E3o por rota cuida da ordem; sem skip aqui.\n\n    // Step 6 (Tom de pele) REATIVADO 26/08 \u2014 sem skip; a rota (getRoute) cuida da ordem.\n\n    // P1 scroll tracking \u2014 controla via _p1ScrollEnabled como source of truth.\n    // Se entrando em P1 e tracking off \u2192 start. Se saindo de P1 e tracking on \u2192 exit.\n    // Idempotente: handler interno checa flag pra evitar listener duplicado.\n    if (step === 1 && !_p1ScrollEnabled) {\n      _p1ScrollStart();\n    } else if (step !== 1 && _p1ScrollEnabled) {\n      _p1ScrollExit('advance');\n    }\n\n    state.step = step;\n    saveState(state);\n    // Wira o step on-demand antes de exibir (skip se j\u00E1 wirou).\n    // Reduz TBT do init: nada de pre-wire de 12 steps em idle batches.\n    wireStepOnce(step);\n    showStep(step);\n    setProgress(step, state);\n    // GA4: usu\u00E1rio entrou em um step. Param \"step\" 1-12, \"dor_principal\"\n    // ajuda an\u00E1lise de cohort (quem chegou no step X com dor Y).\n    pjTrack('step_view', { step: step, dor_principal: state.answers.principalDor || '' });\n    setNextLabel(step);\n    setPrevVisible(step, state);\n    refreshCta(state);\n\n    // Sempre volta ao topo ao trocar de step (evita ficar no meio se a step anterior teve scroll)\n    try { window.scrollTo({ top: 0, left: 0, behavior: 'instant' }); } catch (_) { window.scrollTo(0, 0); }\n\n    // Step 2 \u2014 Principal Dor: limpa sele\u00E7\u00E3o, renderiza s\u00F3 os cards das dores selecionadas\n    if (step === 2) {\n      state.answers.principalDor = '';\n      showPrincipalDorCards(state);\n      saveState(state); refreshCta(state);\n    }\n    // Step 3 \u2014 N\u00EDvel Acne: limpa sele\u00E7\u00E3o anterior (consistente com outros singles)\n    if (step === 3) {\n      state.answers.acneNivel = '';\n      var prev3 = stepEls[3].querySelectorAll('.pj-card--acne.is-selected');\n      Array.prototype.forEach.call(prev3, function (c) {\n        c.classList.remove('is-selected');\n        c.setAttribute('aria-checked', 'false');\n      });\n      saveState(state); refreshCta(state);\n    }\n    // Step 4 \u2014 Nome: foca o input\n    if (step === 4) setTimeout(function () { var i = stepEls[4].querySelector('.pj-name-input'); if (i) i.focus(); }, 60);\n    // Step 5 \u2014 Antes/Depois interstitial: auto-advance ap\u00F3s 6s\n    if (step === 5) scheduleAdvance(state, 6000);\n    // Step 11 \u2014 Forbes interstitial: auto-advance ap\u00F3s 4s\n    if (step === 11) scheduleAdvance(state, 4000);\n    // Step 6 \u2014 Tom de pele\n    if (step === 6) {\n      state.answers.tomPele = '';\n      var prev6 = stepEls[6].querySelector('.is-selected');\n      if (prev6) prev6.classList.remove('is-selected');\n      saveState(state); refreshCta(state);\n      var tomTitle = stepEls[6].querySelector('.q-title');\n      if (tomTitle) {\n        var nm6 = (state.answers.nome || '').trim();\n        tomTitle.textContent = nm6\n          ? cap(nm6) + ', qual destes \u00E9 mais pr\u00F3ximo do seu tom de pele?'\n          : 'Qual destes \u00E9 mais pr\u00F3ximo do seu tom de pele?';\n      }\n    }\n    // Step 7 \u2014 Tipo de pele\n    if (step === 7) {\n      state.answers.tipoPele = '';\n      var prev7 = stepEls[7].querySelector('.is-selected');\n      if (prev7) prev7.classList.remove('is-selected');\n      saveState(state); refreshCta(state);\n      var tpTitle = stepEls[7].querySelector('.q-title');\n      if (tpTitle) {\n        var nm7 = (state.answers.nome || '').trim();\n        tpTitle.textContent = nm7\n          ? 'Sabe seu tipo de pele, ' + cap(nm7) + '?'\n          : 'Sabe seu tipo de pele?';\n      }\n    }\n    // Step 8 \u2014 Tempo de rotina\n    if (step === 8) {\n      state.answers.tempoRotina = '';\n      var prev8 = stepEls[8].querySelector('.is-selected');\n      if (prev8) prev8.classList.remove('is-selected');\n      saveState(state); refreshCta(state);\n    }\n    // Step 9 \u2014 Idade\n    if (step === 9) {\n      var ageGreet = stepEls[9].querySelector('.pj-age-greeting');\n      if (ageGreet) {\n        var n9 = (state.answers.nome || '').trim();\n        ageGreet.textContent = n9 ? cap(n9) + ', ' : '';\n      }\n      setTimeout(function () { var i = stepEls[9].querySelector('.pj-age-input'); if (i) i.focus(); }, 60);\n    }\n    // Step 10 \u2014 Frequ\u00EAncia\n    if (step === 10) {\n      state.answers.frequencia = '';\n      var prev10 = stepEls[10].querySelector('.is-selected');\n      if (prev10) prev10.classList.remove('is-selected');\n      saveState(state); refreshCta(state);\n      var freqGreet = stepEls[10].querySelector('.pj-freq-greeting');\n      if (freqGreet) {\n        var nm10 = (state.answers.nome || '').trim();\n        freqGreet.textContent = nm10 ? ' ' + cap(nm10) : '';\n      }\n    }\n    // Step 12 \u2014 Contato: interpola nome no t\u00EDtulo\n    if (step === 12) {\n      var contactGreet = stepEls[12].querySelector('.pj-contact-greeting');\n      if (contactGreet) {\n        var nm12 = (state.answers.nome || '').trim();\n        contactGreet.textContent = nm12 ? cap(nm12) + ', \u00FAltima etapa! ' : '';\n      }\n    }\n  }\n\n  /* ----- Google Sheets webhook (coleta de respostas completas, com PII) ---- */\n  /* Endpoint do Apps Script web app deployado pelo cliente. Vazio = no-op.\n     PostHog (pj_quiz_complete) fica SEM PII pra respeitar LGPD/billing.\n     Sheets \u00E9 a base de leads \u2014 recebe nome/email/whatsapp + todas as respostas. */\n  var SHEETS_WEBHOOK_URL = 'https://script.google.com/macros/s/AKfycby3oz4pQ-YjoZqwLmUif-R01lpGufPluwxnCUTeqHTyluBMOYK859a3cG7TD5Bf4XU/exec';\n\n  function sendToSheets(state) {\n    if (!SHEETS_WEBHOOK_URL) return;\n    var a = state.answers || {};\n    var utm = { utm_source:'', utm_medium:'', utm_campaign:'', utm_content:'', utm_term:'' };\n    try {\n      var params = new URLSearchParams(window.location.search);\n      Object.keys(utm).forEach(function (k) { utm[k] = params.get(k) || ''; });\n    } catch (_) {}\n    var payload = {\n      timestamp:     new Date().toISOString(),\n      started_at:    state.startedAt || '',\n      completed_at:  state.completedAt || '',\n      nome:          a.nome || '',\n      email:         a.email || '',\n      whatsapp:      a.whatsapp || '',\n      idade:         a.idade || '',\n      principal_dor: a.principalDor || '',\n      dores:         (a.dores || []).join(','),\n      num_dores:     (a.dores || []).length,\n      acne_nivel:    a.acneNivel || '',\n      tom_pele:      a.tomPele || '',\n      tipo_pele:     a.tipoPele || '',\n      tempo_rotina:  a.tempoRotina || '',\n      frequencia:    a.frequencia || '',\n      kit_code:      DOR_TO_KIT_CODE[a.principalDor] || '',\n      url:           window.location.href,\n      user_agent:    (navigator && navigator.userAgent) || '',\n      utm_source:    utm.utm_source,\n      utm_medium:    utm.utm_medium,\n      utm_campaign:  utm.utm_campaign,\n      utm_content:   utm.utm_content,\n      utm_term:      utm.utm_term\n    };\n    try {\n      // mode: 'no-cors' porque Apps Script web apps n\u00E3o retornam CORS headers.\n      // keepalive: garante que o request completa mesmo com o redirect do\n      // showLoadingScreen \u2192 result page acontecendo em sequ\u00EAncia.\n      // Content-Type n\u00E3o setado de prop\u00F3sito (default text/plain evita preflight\n      // OPTIONS que Apps Script n\u00E3o responde).\n      fetch(SHEETS_WEBHOOK_URL, {\n        method: 'POST',\n        body: JSON.stringify(payload),\n        keepalive: true,\n        mode: 'no-cors'\n      }).catch(function () {});\n    } catch (_) {}\n  }\n\n  function completeQuiz(state) {\n    state.completedAt = new Date().toISOString();\n    saveState(state);\n    // GA4/PostHog: evento principal de conclus\u00E3o. Inclui resumo de answers (sem\n    // PII \u2014 s\u00F3 categorias) pra an\u00E1lise de cohort. kit_code mapeia dor \u2192 produto.\n    var summary = pjAnswerSummary(state);\n    summary.kit_code = DOR_TO_KIT_CODE[summary.dor_principal] || 'D01';\n    pjTrack('complete', summary);\n    // PostHog identify: linka o anonymous distinct_id ao email do user. Necessario\n    // pra atribuir compras (que vem do webhook Shopify com email como id) ao mesmo\n    // user que fez o quiz. Sem isso, PostHog ve 2 persons separados (anon + email).\n    try {\n      var email = (state.answers && state.answers.email) || '';\n      if (email && window.posthog && typeof window.posthog.identify === 'function') {\n        window.posthog.identify(email, {\n          name:  (state.answers && state.answers.nome) || '',\n          phone: (state.answers && state.answers.whatsapp) || '',\n          kit_code: summary.kit_code\n        });\n      }\n    } catch (_) {}\n    // Envia respostas COMPLETAS (com PII) pro Google Sheets \u2014 base de leads.\n    sendToSheets(state);\n    showLoadingScreen(state);\n  }\n\n  function showLoadingScreen(state) {\n    // GA4: viu tela de loading. Permite medir abandono entre completar e\n    // chegar na result page (se o user fecha aba durante o v\u00EDdeo).\n    pjTrack('loading_view', { dor_principal: state.answers.principalDor || '' });\n\n    // Inicia prefetch da result page IMEDIATAMENTE \u2014 aproveita os ~4s do v\u00EDdeo\n    // de loading pra baixar o HTML completo da result page espec\u00EDfica do dor\n    // do user (cada dor tem URL pr\u00F3pria) em background. Quando o redirect\n    // dispara, tudo j\u00E1 t\u00E1 em cache.\n    prefetchResultPage(state);\n\n    var loadingEl = root.querySelector('.pj-loading') || document.querySelector('.pj-loading');\n    if (!loadingEl) {\n      redirectToResult(state);\n      return;\n    }\n    quizEl.classList.add('hidden');\n    loadingEl.classList.remove('hidden');\n    // Scroll suave pro topo do loading pra usu\u00E1rio ver o v\u00EDdeo desde o in\u00EDcio\n    try {\n      loadingEl.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    } catch (_) {\n      window.scrollTo(0, 0);\n    }\n\n    var nameEl = loadingEl.querySelector('.pj-loading-name');\n    if (nameEl) nameEl.textContent = cap((state.answers.nome || 'Voc\u00EA').trim());\n\n    var steps = loadingEl.querySelectorAll('.pj-loading-steps li');\n    var video = loadingEl.querySelector('.pj-loading-video');\n\n    var fallbackDurationMs = 5000;\n    var redirected = false;\n    var stepsScheduled = false;\n    var stepTimers = [];\n\n    function go() {\n      if (redirected) return;\n      redirected = true;\n      redirectToResult(state);\n    }\n\n    function clearStepTimers() {\n      for (var i = 0; i < stepTimers.length; i++) clearTimeout(stepTimers[i]);\n      stepTimers = [];\n    }\n\n    function scheduleStepsForDuration(totalMs) {\n      if (stepsScheduled) return;\n      stepsScheduled = true;\n      // 4 checkmarks distribu\u00EDdos uniformemente DENTRO da dura\u00E7\u00E3o total\n      // (\u00FAltimo em ~95% pra garantir que ele apare\u00E7a antes do redirect)\n      var stops = [0.05, 0.30, 0.60, 0.92];\n      for (var i = 0; i < steps.length; i++) {\n        (function (idx) {\n          var t = setTimeout(function () {\n            if (steps[idx]) steps[idx].classList.add('is-visible');\n          }, Math.round(totalMs * stops[idx]));\n          stepTimers.push(t);\n        })(i);\n      }\n    }\n\n    function tryPlay() {\n      if (!video) return;\n      // Garantias de autoplay: muted + playsinline j\u00E1 est\u00E3o no markup;\n      // for\u00E7amos via JS pra cobrir browsers/contextos que ignoram o autoplay attr.\n      try { video.muted = true; video.playsInline = true; video.setAttribute('playsinline', ''); } catch (_) {}\n      var p;\n      try { p = video.play(); } catch (e) { p = null; }\n      if (p && p.then) {\n        p.then(function () {\n          // play OK\n        }).catch(function (err) {\n          // autoplay bloqueado \u2014 deixa o fallback timer cuidar\n          console.warn('pj-loading: video.play() rejected', err && err.name);\n        });\n      }\n    }\n\n    if (video) {\n      // Quando soubermos a dura\u00E7\u00E3o real, agendamos os checks proporcionalmente\n      video.addEventListener('loadedmetadata', function () {\n        var ms = (video.duration && isFinite(video.duration) && video.duration > 0.5)\n          ? Math.round(video.duration * 1000)\n          : fallbackDurationMs;\n        scheduleStepsForDuration(ms);\n      });\n      // Quando v\u00EDdeo terminar, redireciona\n      video.addEventListener('ended', go);\n      // Erro no v\u00EDdeo: usa timing fallback\n      video.addEventListener('error', function () {\n        scheduleStepsForDuration(fallbackDurationMs);\n        setTimeout(go, fallbackDurationMs + 200);\n      });\n      // Se metadata n\u00E3o vier em 1.2s, agenda com fallback\n      setTimeout(function () {\n        if (!stepsScheduled) scheduleStepsForDuration(fallbackDurationMs);\n      }, 1200);\n      // Hard stop: se ended n\u00E3o disparar em 9s (qualquer motivo), redireciona\n      setTimeout(go, 9000);\n      // Tenta dar play imediatamente E em resposta ao loadeddata (cobre Safari mobile)\n      tryPlay();\n      video.addEventListener('loadeddata', tryPlay);\n      video.addEventListener('canplay', tryPlay);\n    } else {\n      scheduleStepsForDuration(fallbackDurationMs);\n      setTimeout(go, fallbackDurationMs + 200);\n    }\n  }\n\n  /* Mapa principalDor \u2192 URL da result page espec\u00EDfica. Cada dor tem uma page\n     pr\u00F3pria no Shopify com handle opaco (random \u2014 sem nome da dor por SEO/privacy)\n     + metafields na variant apontando pro produto Shopify do kit. */\n  var RESULT_PAGE_BY_DOR = {\n    acne:        '/pages/diagnostic-result',\n    oleosidade:  '/pages/r-i6n2cym4',\n    saude:       '/pages/r-dnjevtgt',\n    manchas:     '/pages/r-ziq3sgvq',\n    vermelhidao: '/pages/r-7or3bbne',\n    sinais:      '/pages/r-zsisl2dg',\n    poros:       '/pages/r-llvmv0wy',\n    olheiras:    '/pages/r-y96j2r49'\n  };\n  var DEFAULT_RESULT_PAGE = '/pages/diagnostic-result';\n\n  function getResultPageUrl(state) {\n    var dor = state && state.answers && state.answers.principalDor;\n    return RESULT_PAGE_BY_DOR[dor] || DEFAULT_RESULT_PAGE;\n  }\n\n  function redirectToResult(state) {\n    // GA4: marca o redirect efetivo pra result page. Diferente do loading_view,\n    // este s\u00F3 dispara quando o v\u00EDdeo completa (ou hard timeout) \u2014 \u00FAtil pra\n    // medir % que pula/fecha durante o loading.\n    var dor = (state && state.answers && state.answers.principalDor) || '';\n    pjTrack('result_redirect', { dor_principal: dor, kit_code: DOR_TO_KIT_CODE[dor] || '' });\n    // Cada dor tem sua pr\u00F3pria result page (handle opaco no Shopify) \u2014 escolhida\n    // pelo principalDor do quiz. O HTML/assets j\u00E1 foram prefetchados pelo\n    // prefetchResultPage() (chamado no in\u00EDcio do showLoadingScreen), ent\u00E3o\n    // a transi\u00E7\u00E3o \u00E9 instant\u00E2nea no Chrome (prerender) ou near-instant.\n    window.location.href = getResultPageUrl(state);\n  }\n\n  function prefetchResultPage(state) {\n    // Idempotente \u2014 n\u00E3o duplica se j\u00E1 injetou.\n    if (document.getElementById('pj-prefetch-result')) return;\n    var url = getResultPageUrl(state);\n\n    // 1) Speculation Rules API (Chrome 109+) \u2014 prerendera a p\u00E1gina inteira\n    //    em background tab, com TODOS sub-resources (CSS, JS, fonts, imagens).\n    //    Quando o user navega, a swap \u00E9 literalmente instant\u00E2nea (sem network).\n    try {\n      if (typeof HTMLScriptElement !== 'undefined' &&\n          HTMLScriptElement.supports &&\n          HTMLScriptElement.supports('speculationrules')) {\n        var spec = document.createElement('script');\n        spec.id = 'pj-prefetch-result';\n        spec.type = 'speculationrules';\n        spec.textContent = JSON.stringify({\n          prerender: [{\n            source: 'list',\n            urls: [url]\n          }]\n        });\n        document.head.appendChild(spec);\n        return;\n      }\n    } catch (_) { /* segue pro fallback */ }\n\n    // 2) Fallback universal: <link rel=\"prefetch\"> \u2014 baixa o HTML em low-priority.\n    try {\n      var link = document.createElement('link');\n      link.id = 'pj-prefetch-result';\n      link.rel = 'prefetch';\n      link.href = url;\n      link.as = 'document';\n      document.head.appendChild(link);\n    } catch (_) {}\n\n    // 3) Belt-and-suspenders: fetch() de prioridade baixa pra for\u00E7ar cache HTTP.\n    try {\n      if (typeof fetch === 'function') {\n        var opts = { credentials: 'same-origin', cache: 'force-cache' };\n        try { opts.priority = 'low'; } catch (_) {}\n        fetch(url, opts).catch(function () {});\n      }\n    } catch (_) {}\n  }\n\n  /* Auto-advance \u2014 usado em single-select (350ms) e em interstitial Forbes (2000ms) */\n  var advanceTimer;\n  function scheduleAdvance(state, delay) {\n    clearTimeout(advanceTimer);\n    var fromStep = state.step;\n    var ms = (typeof delay === 'number') ? delay : 350;\n    advanceTimer = setTimeout(function () {\n      if (state.step === fromStep) goToStep(state, routeNext(state));\n    }, ms);\n  }\n\n  /* ----- Result page (Fatia 2B) --------------------------------------- */\n\n  var TEMPO_LABELS = {\n    ate_2: '<2 min',\n    de_2_a_3: '2-3 min',\n    de_3_a_5: '3-5 min'\n  };\n\n  /* SVG icons inline (16px viewBox 24x24) \u2014 uma string pronta por chave de chip */\n  var CHIP_ICON_AGE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 21v-8a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v8\"></path><line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\"></line><path d=\"M9 5a3 3 0 1 1 6 0c0 1.5-1 2-1.5 3\"></path></svg>';\n  var CHIP_ICON_TIME = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><polyline points=\"12 7 12 12 15 14\"></polyline></svg>';\n  var CHIP_ICON_TIPO = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 2s6 8 6 13a6 6 0 0 1-12 0c0-5 6-13 6-13z\"></path></svg>';\n  var DOR_ICONS = {\n    acne:        '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"9\" r=\"1.2\"></circle><circle cx=\"15\" cy=\"8\" r=\"1.5\"></circle><circle cx=\"11\" cy=\"14\" r=\"1.2\"></circle><circle cx=\"16\" cy=\"15\" r=\"1\"></circle><circle cx=\"7\" cy=\"15\" r=\"1\"></circle></svg>',\n    oleosidade:  '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 3s5 6 5 11a5 5 0 0 1-10 0c0-5 5-11 5-11z\"></path></svg>',\n    saude:       '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 21s-7-4-7-11a4 4 0 0 1 7-2.5A4 4 0 0 1 19 10c0 7-7 11-7 11z\"></path></svg>',\n    poros:       '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"7\" cy=\"8\" r=\"1.5\"></circle><circle cx=\"14\" cy=\"9\" r=\"1.5\"></circle><circle cx=\"10\" cy=\"15\" r=\"1.5\"></circle><circle cx=\"17\" cy=\"14\" r=\"1.5\"></circle></svg>',\n    manchas:     '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 2l2.5 6 6.5.5-5 4.5 1.5 6.5-5.5-3.5-5.5 3.5 1.5-6.5-5-4.5 6.5-.5z\"></path></svg>',\n    vermelhidao: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M8 14a4 4 0 0 0 8 0\"></path></svg>',\n    sinais:      '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 8c4 0 4 2 8 2s4-2 8-2\"></path><path d=\"M4 14c4 0 4 2 8 2s4-2 8-2\"></path></svg>',\n    olheiras:    '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 12s4-7 10-7 10 7 10 7-4 7-10 7S2 12 2 12z\"></path><circle cx=\"12\" cy=\"12\" r=\"3\"></circle></svg>'\n  };\n\n  function renderResultPage(state) {\n    var ans = state.answers || {};\n    // SOMENTE principalDor \u00E9 essencial \u2014 define o kit. Tudo o resto tem fallback.\n    // ANTES: validava nome+idade+tipoPele+dores \u2192 returning users de vers\u00E3o antiga\n    // ficavam em loop OU tela branca (quando redirect interno hit safety lock\n    // rec\u00E9m-armado pelo init() e abortava sem nunca remover .hidden do pj-result).\n    // Agora: se principalDor missing, redirect SEM lock guard (lock s\u00F3 protege loops\n    // user-visible); se tudo OK, popula defaults e segue render.\n    if (!ans.principalDor) {\n      // Sem dor principal: n\u00E3o d\u00E1 pra escolher kit. Fallback ao quiz.\n      // Sem lock guard aqui pra evitar render-em-branco: prefere loop vis\u00EDvel\n      // ao usu\u00E1rio ficar travado numa p\u00E1gina sem conte\u00FAdo. Init()'s lock segura.\n      window.location.href = '/pages/diagnostic';\n      return;\n    }\n    // Defaults pra campos n\u00E3o-cr\u00EDticos (n\u00E3o bloqueia render)\n    if (!Array.isArray(ans.dores) || ans.dores.length === 0) {\n      ans.dores = [ans.principalDor]; // backfill da principal \u2014 render funciona com array de 1\n      state.answers.dores = ans.dores; // persiste pra pr\u00F3ximos renders\n      saveState(state);\n    }\n    if (!ans.nome) ans.nome = 'Voc\u00EA';\n    if (!ans.idade) ans.idade = '';\n    if (!ans.tipoPele) ans.tipoPele = 'naosei';\n\n    // GA4: viu a result page (ap\u00F3s render). Inclui o kit_code (D01-D08) pra\n    // permitir funil por kit no Looker. Este \u00E9 o \"fundo de funil\" antes do\n    // CTA \u2192 add_to_cart \u2192 purchase.\n    var summary = pjAnswerSummary(state);\n    summary.kit_code = DOR_TO_KIT_CODE[summary.dor_principal] || 'D01';\n    pjTrack('result_view', summary);\n\n    // quizEl pode ser null na result page (markup do quiz n\u00E3o \u00E9 renderizado l\u00E1)\n    if (quizEl) quizEl.classList.add('hidden');\n    resultEl.classList.remove('hidden');\n\n    var nameEl = resultEl.querySelector('.pj-r-name');\n    if (nameEl) nameEl.textContent = cap(ans.nome);\n    var kitNameEl = resultEl.querySelector('.pj-r-kit-name');\n    if (kitNameEl) kitNameEl.textContent = cap(ans.nome);\n    var routineNameEl = resultEl.querySelector('.pj-r-routine-name');\n    if (routineNameEl) routineNameEl.textContent = cap(ans.nome);\n\n    var chipsEl = resultEl.querySelector('.pj-r-chips');\n    if (chipsEl) {\n      var chips = '';\n      var principalDor = ans.principalDor;\n      // 1. Dor principal \u2014 destaque com fundo escuro\n      if (principalDor && DOR_LABELS[principalDor]) {\n        var icoP = DOR_ICONS[principalDor] || '';\n        chips += '<span class=\"pj-r-chip pj-r-chip--primary\">' + icoP + escapeHtml(DOR_LABELS[principalDor]) + '</span>';\n      }\n      // 2. Outras dores (sem a principal)\n      for (var i = 0; i < ans.dores.length; i++) {\n        var dorKey = ans.dores[i];\n        if (dorKey === principalDor) continue;\n        var l = DOR_LABELS[dorKey];\n        var ico = DOR_ICONS[dorKey] || '';\n        if (l) chips += '<span class=\"pj-r-chip\">' + ico + escapeHtml(l) + '</span>';\n      }\n      // 3. Tipo de pele (esconde se 'naosei')\n      if (ans.tipoPele && ans.tipoPele !== 'naosei' && TIPO_PELE_LABELS[ans.tipoPele]) {\n        chips += '<span class=\"pj-r-chip\">' + CHIP_ICON_TIPO + 'Pele ' + escapeHtml(TIPO_PELE_LABELS[ans.tipoPele]) + '</span>';\n      }\n      // 4. Idade (esconde se vazio \u2014 pode acontecer em returning users de vers\u00E3o antiga)\n      if (ans.idade) {\n        chips += '<span class=\"pj-r-chip\">' + CHIP_ICON_AGE + escapeHtml(ans.idade) + ' anos</span>';\n      }\n      // 5. Tempo de rotina\n      if (ans.tempoRotina && TEMPO_LABELS[ans.tempoRotina]) {\n        chips += '<span class=\"pj-r-chip\">' + CHIP_ICON_TIME + escapeHtml(TEMPO_LABELS[ans.tempoRotina]) + '</span>';\n      }\n      chipsEl.innerHTML = chips;\n    }\n\n    var iaText = resultEl.querySelector('.pj-r-ia-text');\n    if (iaText) {\n      var nome = escapeHtml(cap(ans.nome));\n      var tempoLabel = escapeHtml(TEMPO_LABELS[ans.tempoRotina] || '2-3 min');\n      // Se tipoPele === 'naosei' (ou ausente), omite \"tipo X\" da frase de abertura.\n      var tipoLabel = (ans.tipoPele && ans.tipoPele !== 'naosei')\n        ? (TIPO_PELE_LABELS[ans.tipoPele] || '').toLowerCase()\n        : '';\n      var doresText = escapeHtml(buildDoresText(ans.dores));\n\n      // PAR\u00C1GRAFO 1 \u2014 Diagn\u00F3stico + raiz biol\u00F3gica + sequ\u00EAncia de tratamento\n      var p1Subject = tipoLabel\n        ? 'pele ' + escapeHtml(tipoLabel) + ' com ' + doresText\n        : 'sua pele com ' + doresText;\n      var p1 = nome + ', ' + p1Subject + ' tem uma raiz biol\u00F3gica: produ\u00E7\u00E3o desbalanceada de sebo que entope poros e dispara inflama\u00E7\u00E3o. A solu\u00E7\u00E3o existe \u2014 s\u00F3 exige a sequ\u00EAncia certa, limpar \u2192 tratar \u2192 restaurar, com produtos formulados pra atacar o problema sem agredir a pele.';\n\n      // PAR\u00C1GRAFO 2 \u2014 A = 3 kits (Starter/Core/Pro); B = s\u00F3 o Core (texto sem citar os outros).\n      var p2 = (_resultVariant === 'B')\n        ? 'Foi exatamente o que desenvolvemos com dermatologistas no seu kit Core, pensado pros seus ' + tempoLabel + '. Ele tem a base completa pra controlar a acne \u2014 limpeza, tratamento antiacne e o s\u00E9rum uniformizador noturno que clareia as marcas que j\u00E1 est\u00E3o na pele \u2014 mais o Renova, gel esfoliante facial que acelera a renova\u00E7\u00E3o celular e potencializa todos os outros ativos.'\n        : 'Foi exatamente o que desenvolvemos com dermatologistas em 3 kits, pensados pros seus ' + tempoLabel + '. Todos t\u00EAm a base completa pra controlar a acne \u2014 limpeza, tratamento antiacne e o s\u00E9rum uniformizador noturno que clareia as marcas que j\u00E1 est\u00E3o na pele. O Core acrescenta o Renova, gel esfoliante facial que acelera a renova\u00E7\u00E3o celular e potencializa todos os outros ativos. O Pro soma ainda o hidratante matinal, que recomp\u00F5e a barreira durante o dia e quebra o ciclo \"pele desidratada produz mais sebo\" \u2014 o passo que separa controlar a acne de transformar a pele.';\n\n      // PAR\u00C1GRAFO 3 \u2014 Prova social + resultado esperado\n      var p3 = 'Em 30-60 dias voc\u00EA entende por que +100.000 homens abandonaram o esquema de farm\u00E1cia gen\u00E9rica e constru\u00EDram a rotina deles aqui dentro.';\n\n      // Short = s\u00F3 o 1\u00BA par\u00E1grafo (diagn\u00F3stico). Long = tudo com respiro entre par\u00E1grafos.\n      var shortText = p1;\n      var longText = p1 + '<br><br>' + p2 + '<br><br>' + p3;\n      iaText.dataset.short = shortText;\n      iaText.dataset.long = longText;\n      iaText.innerHTML = shortText + ' <a href=\"#\" class=\"pj-r-ia-more\" data-state=\"short\">ver mais</a>';\n    }\n  }\n\n  function wireIaMore() {\n    var iaText = resultEl.querySelector('.pj-r-ia-text');\n    if (!iaText) return;\n    iaText.addEventListener('click', function (e) {\n      var link = e.target.closest('.pj-r-ia-more');\n      if (!link) return;\n      e.preventDefault();\n      var state = link.dataset.state;\n      if (state === 'short') {\n        iaText.innerHTML = iaText.dataset.long + ' <a href=\"#\" class=\"pj-r-ia-more\" data-state=\"long\">ver menos</a>';\n      } else {\n        iaText.innerHTML = iaText.dataset.short + ' <a href=\"#\" class=\"pj-r-ia-more\" data-state=\"short\">ver mais</a>';\n      }\n    });\n  }\n\n  function wireResultRestart() {\n    var btn = resultEl.querySelector('.pj-r-restart');\n    if (!btn) return;\n    btn.addEventListener('click', function () {\n      // GA4: user clicou em \"refazer o teste\". Sinal de insatisfa\u00E7\u00E3o com o\n      // kit recomendado \u2014 \u00FAtil pra investigar se a recomenda\u00E7\u00E3o foi off.\n      pjTrack('restart', { kit_code: _kitCode() });\n      resetState();\n      window.location.href = '/pages/diagnostic';\n    });\n  }\n\n  /* Modal \"detalhes da assinatura\" \u2014 abre com [data-modal-open], fecha com [data-modal-close] ou ESC */\n  function wireSubscriptionDetailsModal() {\n    var trigger = resultEl.querySelector('[data-modal-open=\"subscription\"]');\n    var modal = resultEl.querySelector('#pj-r-modal-subscription');\n    if (!trigger || !modal) return;\n    function open() {\n      modal.classList.add('is-open');\n      modal.setAttribute('aria-hidden', 'false');\n      document.body.style.overflow = 'hidden';\n    }\n    function close() {\n      modal.classList.remove('is-open');\n      modal.setAttribute('aria-hidden', 'true');\n      document.body.style.overflow = '';\n    }\n    trigger.addEventListener('click', open);\n    var closers = modal.querySelectorAll('[data-modal-close]');\n    Array.prototype.forEach.call(closers, function (c) {\n      c.addEventListener('click', close);\n    });\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && modal.classList.contains('is-open')) close();\n    });\n  }\n\n  /* Helpers compartilhados pelo kit principal */\n  function getSelectedAlt() {\n    return resultEl.querySelector('.pj-r-alt.is-selected');\n  }\n  function getCurrentMode() {\n    var btn = resultEl.querySelector('.pj-r-toggle-btn.is-active');\n    return btn ? btn.dataset.mode : 'assinar';\n  }\n  /* Retorna '1' (mensal) ou '2' (bimestral) baseado no bot\u00E3o de freq ativo. Default '1'. */\n  function getCurrentFreq() {\n    var active = resultEl.querySelector('.pj-r-freq-btn.is-active');\n    return (active && active.dataset.freq) || '1';\n  }\n  /* Order bump (Protetor Solar): true se o checkbox est\u00E1 marcado. */\n  function isBumpOn() {\n    var c = resultEl.querySelector('[data-bump-check]');\n    return !!(c && c.checked);\n  }\n  /* Atualiza o pre\u00E7o exibido no card do bump conforme o modo (avulso vs assinatura). */\n  function updateBumpPrice() {\n    var bumpEl = resultEl.querySelector('[data-bump]');\n    if (!bumpEl) return;\n    var priceEl = bumpEl.querySelector('[data-bump-price]');\n    if (!priceEl) return;\n    priceEl.textContent = (getCurrentMode() === 'unica')\n      ? (bumpEl.dataset.bumpPriceUnica || '67,90')\n      : (bumpEl.dataset.bumpPriceAssinar || '54,90');\n  }\n  /* Formata n\u00FAmero (decimal \"135.9\" ou \"135,90\") como string BR sem prefixo R$.\n     Retorna '' se n\u00E3o puder fazer parse. */\n  function formatPriceBR(raw) {\n    if (raw == null) return '';\n    var s = String(raw).replace(/\\./g, '_').replace(',', '.').replace('_', '.');\n    var n = parseFloat(s);\n    if (isNaN(n)) return '';\n    return n.toFixed(2).replace('.', ',');\n  }\n\n  /* Atualiza os pre\u00E7os e o texto de desconto em CADA card de variante conforme modo.\n     Em ambos os modos, o \"riscado\" \u00E9 o compare_at_price (pre\u00E7o cheio de varejo) \u2014\n     deixa o desconto expl\u00EDcito ao olho do user.\n     - Mode 'unica': from = compare_at_price, to = v.price (pre\u00E7o Shopify)\n     - Mode 'assinar': from = compare_at_price, to = assinatura_price (mostra desconto maior) */\n  function updateAltPrices() {\n    var mode = getCurrentMode();\n    var alts = resultEl.querySelectorAll('.pj-r-alt');\n    Array.prototype.forEach.call(alts, function (alt) {\n      var fromEl = alt.querySelector('.pj-r-price-from');\n      var toEl = alt.querySelector('.pj-r-price-to');\n      var discountEl = alt.querySelector('.pj-r-alt-discount');\n      if (!fromEl || !toEl) return;\n\n      var compare = parseFloat(String(alt.dataset.priceCompare || '0').replace(/\\./g, '').replace(',', '.'));\n      var once = parseFloat(String(alt.dataset.priceOnce || '0').replace(/\\./g, '').replace(',', '.'));\n      var sub = parseFloat(alt.dataset.priceSub || '0');\n\n      var fromN, toN;\n      if (mode === 'unica') {\n        fromN = compare;\n        toN = once;\n      } else {\n        fromN = compare;\n        toN = sub > 0 ? sub : once;\n      }\n      fromEl.textContent = 'R$ ' + fromN.toFixed(2).replace('.', ',');\n      toEl.textContent = 'R$ ' + toN.toFixed(2).replace('.', ',');\n\n      // Atualiza o \"% de desconto\" preservando o \u00EDcone check \u00E0 esquerda\n      if (discountEl && fromN > 0 && toN > 0 && fromN > toN) {\n        var pct = Math.round(((fromN - toN) / fromN) * 100);\n        var check = discountEl.querySelector('.pj-r-check');\n        discountEl.innerHTML = '';\n        if (check) discountEl.appendChild(check);\n        discountEl.appendChild(document.createTextNode(pct + '% de desconto'));\n      }\n    });\n  }\n\n  /* Calcula % desconto entre compare_at_price e o pre\u00E7o efetivo do modo atual.\n     Retorna 0 se n\u00E3o conseguir parsear. */\n  function getAltDiscountPct(alt, mode) {\n    if (!alt) return 0;\n    var compare = parseFloat(String(alt.dataset.priceCompare || '0').replace(/\\./g, '').replace(',', '.'));\n    var price;\n    if (mode === 'unica') {\n      price = parseFloat(String(alt.dataset.priceOnce || '0').replace(/\\./g, '').replace(',', '.'));\n    } else {\n      price = parseFloat(alt.dataset.priceSub || '0');\n    }\n    if (!(compare > 0) || !(price > 0) || price >= compare) return 0;\n    return Math.round(((compare - price) / compare) * 100);\n  }\n\n  /* Atualiza o texto em 2 linhas do CTA principal:\n     - Linha 1 (.pj-r-cta-main): nome do kit (\"ASSINAR/COMPRAR SEU KIT [NOME]\")\n     - Linha 2 (.pj-r-cta-sub): [pill X% OFF] + benef\u00EDcio (cancele / pagamento \u00FAnico) */\n  function updateCtaContent() {\n    var cta = resultEl.querySelector('.pj-r-cta');\n    var alt = getSelectedAlt();\n    if (!cta || !alt) return;\n    var mainEl = cta.querySelector('.pj-r-cta-main');\n    var subEl = cta.querySelector('.pj-r-cta-sub');\n    if (!mainEl || !subEl) return;\n    var mode = getCurrentMode();\n    var kitName = (alt.dataset.kitLabel || '').toUpperCase();\n    var discount = getAltDiscountPct(alt, mode);\n\n    // Linha 1: s\u00F3 o nome do kit\n    var action = 'COMPRAR'; /* 15/07: cliente pediu COMPRAR tb no modo assinatura */\n    mainEl.textContent = (_resultVariant === 'B') ? (action + ' SEU KIT') : (action + ' SEU KIT ' + kitName);\n\n    // Linha 2: pill de desconto + benef\u00EDcio curto\n    subEl.textContent = '';\n    if (discount > 0) {\n      var pill = document.createElement('span');\n      pill.className = 'pj-r-cta-discount';\n      pill.textContent = discount + '% OFF';\n      subEl.appendChild(pill);\n    }\n    var benefit = mode === 'unica' ? 'Pagamento \u00FAnico' : 'Cancele quando quiser';\n    if (discount > 0) subEl.appendChild(document.createTextNode(' \u00B7 ' + benefit));\n    else subEl.appendChild(document.createTextNode(benefit));\n    subEl.style.display = '';\n    updateBumpPrice();\n  }\n\n  function updateCtaHref() {\n    var cta = resultEl.querySelector('.pj-r-cta');\n    var alt = getSelectedAlt();\n    if (!cta || !alt) return;\n    var mode = getCurrentMode();\n\n    // Modo \"compra \u00FAnica\" n\u00E3o usa URL externo \u2014 adiciona ao cart Shopify on-click\n    // (handler delegado em wireCtaCartAdd intercepta e faz /cart/add.js)\n    if (mode === 'unica') {\n      var variantId = alt.dataset.variantId || '';\n      cta.setAttribute('href', variantId ? '/cart/add?id=' + variantId : '/cart');\n      cta.removeAttribute('target');\n      cta.style.pointerEvents = '';\n      cta.style.opacity = '';\n      cta.removeAttribute('aria-disabled');\n      updateCtaContent();\n      syncStickyCta();\n      return;\n    }\n\n    // Assinar (20/07: selling plans do app Subscriptions; Guru desativado no tema novo).\n    // Habilita s\u00F3 se a variante tem plano pra frequ\u00EAncia escolhida \u2014 e, com o bump\n    // LIGADO, s\u00F3 se o Protetor tamb\u00E9m tem plano (sen\u00E3o cobraria errado vs UI 54,90).\n    var isBi = getCurrentFreq() === '2';\n    var spKit = alt.getAttribute(isBi ? 'data-sp-2' : 'data-sp-1') || '';\n    var spOk = !!spKit;\n    if (spOk && isBumpOn()) {\n      var bumpElG = resultEl.querySelector('[data-bump]');\n      var spBumpG = bumpElG ? (bumpElG.getAttribute(isBi ? 'data-bump-sp-2' : 'data-bump-sp-1') || '') : '';\n      spOk = !!spBumpG;\n    }\n    cta.removeAttribute('target');\n    cta.setAttribute('href', '#');\n    if (spOk) {\n      cta.style.pointerEvents = '';\n      cta.style.opacity = '';\n      cta.removeAttribute('aria-disabled');\n    } else {\n      cta.style.pointerEvents = 'none';\n      cta.style.opacity = '0.45';\n      cta.setAttribute('aria-disabled', 'true');\n    }\n    updateCtaContent();\n    syncStickyCta();\n  }\n\n  /* Sincroniza o sticky CTA (label + href + aria-disabled) com o CTA principal.\n     Sticky usa vers\u00E3o curta em 1 linha: \"[ASSINAR/COMPRAR] [NOME] \u00B7 R$ XX,XX[/m\u00EAs]\" */\n  function syncStickyCta() {\n    if (!resultEl) return;\n    var mainCta = resultEl.querySelector('.pj-r-cta');\n    var sticky = resultEl.querySelector('.pj-r-cta-sticky');\n    if (!mainCta || !sticky) return;\n    var alt = getSelectedAlt();\n    var mode = getCurrentMode();\n    var label = sticky.querySelector('.pj-r-cta-sticky-label');\n    if (label && alt) {\n      var kitName = (alt.dataset.kitLabel || '').toUpperCase();\n      var action = 'COMPRAR'; /* 15/07: cliente pediu COMPRAR tb no modo assinatura */\n      label.textContent = (_resultVariant === 'B') ? (action + ' SEU KIT') : (action + ' SEU KIT ' + kitName);\n    }\n    sticky.setAttribute('href', mainCta.getAttribute('href') || '#');\n    if (mainCta.getAttribute('aria-disabled') === 'true') {\n      sticky.setAttribute('aria-disabled', 'true');\n    } else {\n      sticky.removeAttribute('aria-disabled');\n    }\n    /* card novo (14/07): nome, sub, thumb, economize e pre\u00E7os dentro do CTA */\n    var wrap = resultEl.querySelector('.pj-r-sticky');\n    if (wrap && alt) {\n      var parseBR = function (v) { return parseFloat(String(v || '0').replace(/\\./g, '').replace(',', '.')) || 0; };\n      var fmtBR = function (n) { return 'R$ ' + n.toFixed(2).replace('.', ','); };\n      var compare = parseBR(alt.dataset.priceCompare);\n      var price = mode === 'unica' ? parseBR(alt.dataset.priceOnce) : (parseFloat(alt.dataset.priceSub || '0') || 0);\n      var nameEl = wrap.querySelector('[data-r-sticky-name]');\n      var subEl2 = wrap.querySelector('[data-r-sticky-sub]');\n      var ecoEl = wrap.querySelector('[data-r-sticky-eco]');\n      var fromEl = wrap.querySelector('[data-r-sticky-from]');\n      var totalEl = wrap.querySelector('[data-r-sticky-total]');\n      var thumbEl = wrap.querySelector('[data-r-sticky-thumb]');\n      /* order bump (Protetor): soma no total/riscado quando marcado */\n      if (isBumpOn()) {\n        var bumpEl2 = resultEl.querySelector('[data-bump]');\n        if (bumpEl2) {\n          var bumpPrice = parseBR(mode === 'unica' ? (bumpEl2.dataset.bumpPriceUnica || '67,90') : (bumpEl2.dataset.bumpPriceAssinar || '54,90'));\n          var bumpFromEl = bumpEl2.querySelector('s');\n          var bumpFrom = bumpFromEl ? parseBR(bumpFromEl.textContent.replace(/[^0-9.,]/g, '')) : 79.90;\n          if (!(bumpFrom > 0)) bumpFrom = 79.90;\n          if (price > 0) { price += bumpPrice; compare += bumpFrom; }\n        }\n      }\n      if (nameEl) {\n        var kn2 = resultEl.querySelector('.pj-r-kit-name');\n        nameEl.textContent = 'Kit do ' + (kn2 ? kn2.textContent.trim() : 'voc\\u00ea') + (isBumpOn() ? ' + FPS' : '');\n      }\n      if (subEl2) {\n        subEl2.textContent = mode === 'unica' ? 'compra \\u00fanica' : 'assinatura';\n      }\n      if (totalEl) { totalEl.hidden = !(price > 0); if (price > 0) totalEl.textContent = fmtBR(price); }\n      if (fromEl) { fromEl.hidden = !(compare > price && price > 0); if (compare > 0) fromEl.textContent = fmtBR(compare); }\n      if (ecoEl) {\n        if (compare > price && price > 0) {\n          var pctOff = Math.round((compare - price) / compare * 100);\n          ecoEl.textContent = (pctOff > 0 ? pctOff + '% OFF \\u00b7 ' : '') + 'Economize ' + fmtBR(compare - price);\n          ecoEl.hidden = false;\n        }\n        else { ecoEl.hidden = true; }\n      }\n      var bthumb = wrap.querySelector('[data-r-sticky-thumb-bump]');\n      if (bthumb) {\n        if (!bthumb.getAttribute('src')) {\n          var bimg = resultEl.querySelector('[data-bump] img');\n          if (bimg && (bimg.currentSrc || bimg.src)) bthumb.src = bimg.currentSrc || bimg.src;\n        }\n        bthumb.hidden = !(isBumpOn() && bthumb.getAttribute('src'));\n      }\n      if (thumbEl) {\n        /* thumb = 1\u00AA foto do N\u00CDVEL selecionado (Core=4 etc.) \u2014 a 1\u00AA da galeria \u00E9 do Starter/3 */\n        var vs2 = alt.dataset.variantSet || '4';\n        var gimg = resultEl.querySelector('.pj-r-gallery-item[data-variant-set=\"' + vs2 + '\"] img') || resultEl.querySelector('.pj-r-gallery-track img');\n        var gsrc = gimg ? (gimg.getAttribute('data-thumb-src') || gimg.currentSrc || gimg.src) : '';\n        if (gsrc && thumbEl.getAttribute('src') !== gsrc) thumbEl.src = gsrc;\n        thumbEl.hidden = !gsrc;\n      }\n    }\n  }\n\n  /* Sticky CTA: aparece S\u00D3 quando (a) o usu\u00E1rio j\u00E1 passou pelos cards de variante\n     (altsViewed: flag persistente, vira true na 1\u00AA vez que .pj-r-alts entra no\n     viewport) E (b) o CTA principal est\u00E1 fora do viewport. Evita o sticky\n     piscar logo na carga, antes do user ver os kits. */\n  function wireStickyCta() {\n    var mainCta = resultEl.querySelector('.pj-r-cta');\n    var sticky = resultEl.querySelector('.pj-r-cta-sticky');\n    if (!mainCta || !sticky) return;\n    syncStickyCta();\n\n    // Sticky aparece quando o user passa pelo CTA principal (rect.bottom <= 0,\n    // i.e., CTA inteiro acima do topo do viewport). Como .pj-r-alts (kit list)\n    // est\u00E1 ANTES do .pj-r-cta no markup, passar pelo CTA implica ter passado\n    // pelas alts \u2014 n\u00E3o precisa de check separado.\n    var ticking = false;\n    function update() {\n      var rect = mainCta.getBoundingClientRect();\n      var wrap2 = resultEl.querySelector('.pj-r-sticky') || sticky;\n      wrap2.classList.toggle('is-visible', rect.bottom <= 0);\n      ticking = false;\n    }\n    function onScroll() {\n      if (!ticking) {\n        requestAnimationFrame(update);\n        ticking = true;\n      }\n    }\n    window.addEventListener('scroll', onScroll, { passive: true });\n    window.addEventListener('resize', onScroll, { passive: true });\n    // Avalia o estado inicial (ex: bookmark/deeplink com scroll j\u00E1 em baixo)\n    update();\n  }\n\n  /* Intercepta clicks nos CTAs (principal + sticky) quando modo === 'unica'.\n     Adiciona a variante ao cart Shopify e abre o side cart global (window.pjSideCart).\n     Modo 'assinar' segue normal pro link externo Guru. */\n  function wireCtaCartAdd() {\n    function handle(e) {\n      var cta = e.target.closest('.pj-r-cta, .pj-r-cta-sticky');\n      if (!cta) return;\n      // GA4: click no CTA principal. Disparado pra AMBOS os modos (\u00FAnica +\n      // assinar) e AMBAS as posi\u00E7\u00F5es (main + sticky). \u00C9 o \"intent to buy\"\n      // que precede o add_to_cart (unica) ou redirect Guru (assinar).\n      var mode = getCurrentMode();\n      var altSel = getSelectedAlt();\n      var ctaType = cta.classList.contains('pj-r-cta-sticky') ? 'sticky' : 'main';\n      var variantId = altSel ? (altSel.dataset.variantId || '') : '';\n      pjTrack('cta_click', {\n        type: ctaType,\n        mode: mode,\n        kit_code: _kitCode(),\n        variant_id: variantId,\n        freq: mode === 'assinar' ? getCurrentFreq() : ''\n      });\n      if (mode !== 'unica') {\n        // 20/07: assinar = add ao carrinho com SELLING PLAN (kit + bump na mesma\n        // frequ\u00EAncia) e abre o side cart \u2014 checkout segue pela Yever. Guru desativado.\n        e.preventDefault();\n        var altA = altSel;\n        if (!altA) return;\n        var kvid = parseInt(altA.dataset.variantId, 10);\n        var isBiA = getCurrentFreq() === '2';\n        var spKitA = altA.getAttribute(isBiA ? 'data-sp-2' : 'data-sp-1') || '';\n        if (!kvid || !spKitA) return; /* CTA j\u00E1 vem desabilitado sem plano */\n        if (!window.pjSideCart) { console.error('pjSideCart n\u00E3o carregado'); return; }\n        var labelA = cta.querySelector('.pj-r-cta-sticky-label') || cta.querySelector('.pj-r-cta-main') || cta;\n        var origA = labelA.textContent;\n        cta.style.pointerEvents = 'none';\n        labelA.textContent = 'ADICIONANDO...';\n        function addPlanItem(vid, sp) {\n          return fetch('/cart/add.js', {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n            credentials: 'same-origin',\n            body: JSON.stringify({ id: vid, quantity: 1, selling_plan: parseInt(sp, 10) })\n          }).then(function (r) { if (!r.ok) throw new Error('add ' + r.status); });\n        }\n        addPlanItem(kvid, spKitA)\n          .then(function () {\n            if (isBumpOn()) {\n              var bumpElA = resultEl.querySelector('[data-bump]');\n              var bvA = bumpElA ? parseInt(bumpElA.dataset.bumpVariant, 10) : 0;\n              var spBumpA = bumpElA ? (bumpElA.getAttribute(isBiA ? 'data-bump-sp-2' : 'data-bump-sp-1') || '') : '';\n              if (bvA && spBumpA) return addPlanItem(bvA, spBumpA);\n            }\n          })\n          .then(function () {\n            cta.style.pointerEvents = '';\n            labelA.textContent = origA;\n            window.pjSideCart.open();\n            var pSubA = parseFloat(altA.dataset.priceSub || '0');\n            if (isNaN(pSubA) || pSubA <= 0) { pSubA = parseFloat(String(altA.dataset.priceOnce || '0').replace(/\\./g, '').replace(',', '.')) || 0; }\n            pjTrack('add_to_cart', {\n              currency: 'BRL', value: pSubA, variant_id: String(kvid), kit_code: _kitCode(),\n              kit_size: altA.dataset.kitSize || altA.dataset.size || '',\n              mode: 'assinar', freq: getCurrentFreq(), selling_plan: spKitA, bump: isBumpOn()\n            });\n            try {\n              if (typeof window.gtag === 'function') {\n                window.gtag('event', 'add_to_cart', { currency: 'BRL', value: pSubA, items: [{ item_id: String(kvid), item_name: 'Kit Proper Jack ' + (_kitCode() || '') + ' (assinatura)', item_variant: altA.dataset.kitSize || '', price: pSubA, quantity: 1 }] });\n              }\n            } catch (_) {}\n          })\n          .catch(function (err) {\n            console.error('pj-r-cta assinar /cart/add.js failed:', err);\n            cta.style.pointerEvents = '';\n            labelA.textContent = origA;\n          });\n        return;\n      }\n      e.preventDefault();\n      var alt = altSel;\n      if (!alt) return;\n      var variantId = parseInt(alt.dataset.variantId, 10);\n      if (!variantId) return;\n      if (!window.pjSideCart) { console.error('pjSideCart n\u00E3o carregado'); return; }\n\n      // Pega o elemento de label correto: sticky usa .pj-r-cta-sticky-label,\n      // CTA principal usa .pj-r-cta-main. Fallback pro pr\u00F3prio cta (legado).\n      var label = cta.querySelector('.pj-r-cta-sticky-label')\n               || cta.querySelector('.pj-r-cta-main')\n               || cta;\n      var originalText = label.textContent;\n      cta.style.pointerEvents = 'none';\n      label.textContent = 'ADICIONANDO...';\n\n      window.pjSideCart.addItem(variantId, 1)\n        .then(function () {\n          // order bump: adiciona o Protetor Solar como 2\u00BA item separado se selecionado\n          if (isBumpOn()) {\n            var bumpEl = resultEl.querySelector('[data-bump]');\n            var bv = bumpEl ? parseInt(bumpEl.dataset.bumpVariant, 10) : 0;\n            if (bv) return window.pjSideCart.addItem(bv, 1);\n          }\n        })\n        .then(function () {\n          cta.style.pointerEvents = '';\n          label.textContent = originalText;\n          window.pjSideCart.open();\n          // GA4: add_to_cart \u00E9 evento padr\u00E3o (recommended event) \u2014 populando\n          // ele com pre\u00E7o/valor habilita o relat\u00F3rio de Ecommerce do GA4.\n          var priceRaw = parseFloat(String(alt.dataset.priceOnce || '0').replace(/\\./g, '').replace(',', '.'));\n          var value = isNaN(priceRaw) ? 0 : priceRaw;\n          pjTrack('add_to_cart', {\n            currency: 'BRL',\n            value: value,\n            variant_id: variantId,\n            kit_code: _kitCode(),\n            kit_size: alt.dataset.kitSize || alt.dataset.size || '',\n            mode: 'unica'\n          });\n          // GA4 standard event \"add_to_cart\" (sem prefixo pj_quiz_) \u2014 habilita\n          // Funil + relat\u00F3rios de Ecommerce nativos no GA4.\n          try {\n            if (typeof window.gtag === 'function') {\n              window.gtag('event', 'add_to_cart', {\n                currency: 'BRL',\n                value: value,\n                items: [{\n                  item_id: String(variantId),\n                  item_name: 'Kit Proper Jack ' + (_kitCode() || ''),\n                  item_variant: alt.dataset.kitSize || alt.dataset.size || '',\n                  price: value,\n                  quantity: 1\n                }]\n              });\n            }\n          } catch (_) {}\n        })\n        .catch(function (err) {\n          console.error('pj-r-cta /cart/add.js failed:', err);\n          cta.style.pointerEvents = '';\n          label.textContent = originalText;\n        });\n    }\n    resultEl.addEventListener('click', handle);\n  }\n  /* Wire do order bump: checkbox liga/desliga (re-monta href do CTA + estado visual + tracking).\n     O pre\u00E7o acompanha o modo via updateBumpPrice (chamado em updateCtaContent).\n     Imagens clic\u00E1veis j\u00E1 usam [data-photo-src] \u2192 lightbox global #pj-r-modal-photo. */\n  function wireBump() {\n    var bumpEl = resultEl.querySelector('[data-bump]');\n    if (!bumpEl) return;\n    var check = bumpEl.querySelector('[data-bump-check]');\n    if (check) {\n      check.addEventListener('change', function () {\n        bumpEl.classList.toggle('is-on', check.checked);\n        try { pjTrack('order_bump_toggle', { on: check.checked, mode: getCurrentMode(), kit_code: _kitCode() }); } catch (e) {}\n        updateCtaHref();\n      });\n    }\n    updateBumpPrice();\n  }\n  /* Retorna true se estamos em desktop (>=768px) \u2014 galeria muda comportamento. */\n  function isGalleryDesktop() {\n    return window.matchMedia && window.matchMedia('(min-width: 768px)').matches;\n  }\n\n  /* Constr\u00F3i os thumbs da galeria a partir dos .pj-r-gallery-item existentes.\n     Envolve em um wrapper com setas prev/next pra scroll horizontal \u2014 se todos\n     os thumbs vis\u00EDveis couberem em 1 linha, as setas ficam escondidas (CSS .has-overflow).\n     Em mobile o wrapper inteiro fica escondido via CSS. */\n  function buildGalleryThumbs() {\n    var gallery = resultEl.querySelector('.pj-r-gallery');\n    if (!gallery) return;\n    var existingWrap = gallery.querySelector('.pj-r-gallery-thumbs-wrap');\n    if (existingWrap) existingWrap.remove();\n    var items = gallery.querySelectorAll('.pj-r-gallery-item');\n    if (!items.length) return;\n\n    var wrap = document.createElement('div');\n    wrap.className = 'pj-r-gallery-thumbs-wrap';\n\n    var prevBtn = document.createElement('button');\n    prevBtn.type = 'button';\n    prevBtn.className = 'pj-r-gallery-thumbs-arrow pj-r-gallery-thumbs-arrow--prev';\n    prevBtn.setAttribute('aria-label', 'Miniaturas anteriores');\n    prevBtn.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>';\n\n    var ul = document.createElement('ul');\n    ul.className = 'pj-r-gallery-thumbs';\n    Array.prototype.forEach.call(items, function (item, idx) {\n      var img = item.querySelector('img');\n      if (!img) return;\n      var li = document.createElement('li');\n      li.className = 'pj-r-gallery-thumb';\n      li.setAttribute('role', 'button');\n      li.setAttribute('tabindex', '0');\n      li.dataset.position = item.dataset.position || String(idx + 1);\n      li.dataset.variantSet = item.dataset.variantSet || 'all';\n      var thumb = document.createElement('img');\n      // Usa data-thumb-src (200px) se dispon\u00EDvel; fallback pro src normal (800px).\n      thumb.src = img.getAttribute('data-thumb-src') || img.getAttribute('src');\n      thumb.loading = 'lazy';\n      thumb.alt = '';\n      li.appendChild(thumb);\n      ul.appendChild(li);\n    });\n\n    var nextBtn = document.createElement('button');\n    nextBtn.type = 'button';\n    nextBtn.className = 'pj-r-gallery-thumbs-arrow pj-r-gallery-thumbs-arrow--next';\n    nextBtn.setAttribute('aria-label', 'Pr\u00F3ximas miniaturas');\n    nextBtn.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>';\n\n    wrap.appendChild(prevBtn);\n    wrap.appendChild(ul);\n    wrap.appendChild(nextBtn);\n    gallery.appendChild(wrap);\n\n    ul.addEventListener('click', function (e) {\n      var thumb = e.target.closest && e.target.closest('.pj-r-gallery-thumb');\n      if (!thumb) return;\n      var item = resultEl.querySelector('.pj-r-gallery-item[data-position=\"' + thumb.dataset.position + '\"]');\n      if (item) setGalleryActiveItem(item);\n    });\n\n    // Scroll horizontal via setas\n    function step(dir) {\n      var firstThumb = ul.querySelector('.pj-r-gallery-thumb:not(.is-hidden)');\n      var w = firstThumb ? firstThumb.offsetWidth + 8 : 72;\n      ul.scrollBy({ left: dir * w * 3, behavior: 'smooth' });\n    }\n    prevBtn.addEventListener('click', function () { step(-1); });\n    nextBtn.addEventListener('click', function () { step(1); });\n\n    // Mostra/esconde setas baseado em overflow\n    function updateArrowsVisibility() {\n      var hasOverflow = ul.scrollWidth > ul.clientWidth + 2;\n      wrap.classList.toggle('has-overflow', hasOverflow);\n      if (hasOverflow) {\n        wrap.classList.toggle('at-start', ul.scrollLeft <= 1);\n        wrap.classList.toggle('at-end', ul.scrollLeft + ul.clientWidth >= ul.scrollWidth - 1);\n      }\n    }\n    ul.addEventListener('scroll', updateArrowsVisibility, { passive: true });\n    setTimeout(updateArrowsVisibility, 60);\n    window.addEventListener('resize', updateArrowsVisibility);\n    // Re-check ap\u00F3s cada updateGalleryForVariant (thumbs hidden mudam)\n    wrap._updateArrows = updateArrowsVisibility;\n  }\n\n  /* Marca um item como ativo + sincroniza o thumb correspondente. */\n  function setGalleryActiveItem(item) {\n    if (!item) return;\n    var gallery = resultEl.querySelector('.pj-r-gallery');\n    if (!gallery) return;\n    Array.prototype.forEach.call(gallery.querySelectorAll('.pj-r-gallery-item'), function (it) {\n      it.classList.remove('is-active');\n    });\n    item.classList.add('is-active');\n    Array.prototype.forEach.call(gallery.querySelectorAll('.pj-r-gallery-thumb'), function (t) {\n      t.classList.remove('is-active');\n    });\n    var thumb = gallery.querySelector('.pj-r-gallery-thumb[data-position=\"' + item.dataset.position + '\"]');\n    if (thumb) thumb.classList.add('is-active');\n  }\n\n  /* Filtra imagens da galeria de acordo com a variante selecionada.\n     Cada <li class=\"pj-r-alt\"> tem data-variant-set=\"3|4|5\" (n\u00FAmero de produtos),\n     e cada <figure class=\"pj-r-gallery-item\"> tem data-variant-set=\"3|4|5|all\".\n     Em desktop, ativa o primeiro item vis\u00EDvel e sincroniza thumbs. */\n  function updateGalleryForVariant() {\n    var alt = getSelectedAlt();\n    if (!alt) return;\n    var vset = alt.dataset.variantSet;\n    var items = resultEl.querySelectorAll('.pj-r-gallery-item');\n    Array.prototype.forEach.call(items, function (item) {\n      var v = item.dataset.variantSet;\n      var show = (v === vset) || (v === 'all');\n      item.classList.toggle('is-hidden', !show);\n    });\n    // Mobile: scroll horizontal volta pro in\u00EDcio\n    var track = resultEl.querySelector('.pj-r-gallery-track');\n    if (track) track.scrollLeft = 0;\n    // Sincroniza visibilidade dos thumbs (mesma regra)\n    Array.prototype.forEach.call(resultEl.querySelectorAll('.pj-r-gallery-thumb'), function (t) {\n      var v = t.dataset.variantSet;\n      var show = (v === vset) || (v === 'all');\n      t.classList.toggle('is-hidden', !show);\n    });\n    // Desktop: ativa o primeiro item vis\u00EDvel + recalcula arrows do strip de thumbs\n    if (isGalleryDesktop()) {\n      var firstVisible = resultEl.querySelector('.pj-r-gallery-item:not(.is-hidden)');\n      if (firstVisible) setGalleryActiveItem(firstVisible);\n      var thumbsWrap = resultEl.querySelector('.pj-r-gallery-thumbs-wrap');\n      if (thumbsWrap && typeof thumbsWrap._updateArrows === 'function') {\n        thumbsWrap.scrollLeft = 0;\n        thumbsWrap._updateArrows();\n      }\n    }\n  }\n  /* Formata n\u00FAmero decimal em BRL (\"49.90\" -> \"R$ 49,90\"). */\n  function formatBRL(value) {\n    var n = parseFloat(value);\n    if (isNaN(n)) return '';\n    return 'R$ ' + n.toFixed(2).replace('.', ',');\n  }\n\n  /* Lista de produtos do kit selecionado, lendo dos accordion items\n     da se\u00E7\u00E3o \"Conhe\u00E7a sua rotina\" (mesma variant). Cada item j\u00E1 tem\n     data-step-label, data-product-name e data-unit-price. */\n  function renderProductsForKit(altEl) {\n    if (!altEl) return;\n    var allLists = resultEl.querySelectorAll('.pj-r-alt-products');\n    Array.prototype.forEach.call(allLists, function (l) { l.innerHTML = ''; });\n    var listEl = altEl.querySelector('.pj-r-alt-products');\n    if (!listEl) return;\n    var vset = altEl.dataset.variantSet;\n    var routineGroup = resultEl.querySelector('.pj-r-routine-group[data-variant-set=\"' + vset + '\"]');\n    if (!routineGroup) {\n      listEl.innerHTML = '';\n      return;\n    }\n    var items = routineGroup.querySelectorAll('.pj-r-rtc');\n    /* Painel \"O QUE VEM NO KIT\" (padr\u00E3o definido no Kit Coringa 06/07): box com\n       miniatura + nome + unit\u00E1rio riscado, linha \"Brindes GR\u00C1TIS\" (s\u00F3 assinatura,\n       CSS esconde no modo \u00FAnica) e total riscado = compare_at do card (mesma\n       hist\u00F3ria de pre\u00E7o do topo). Produtos v\u00EAm do accordion da MESMA variante. */\n    var rows = '';\n    for (var i = 0; i < items.length; i++) {\n      /* nome exibido = step_label (nome de marca: LIMPA, RENOVA, MANH\u00C3...) \u2014 o\n         product_name \u00E9 o descritor (\"Gel de Limpeza Facial\") e fica de fallback */\n      var displayName = items[i].getAttribute('data-step-label') || items[i].getAttribute('data-product-name') || '';\n      var priceRaw = items[i].getAttribute('data-unit-price') || '';\n      var imgSrc = (items[i].getAttribute('data-img') || '').replace('width=1200', 'width=72');\n      var priceHtml = priceRaw ? formatBRL(priceRaw) : '';\n      rows += '<li>'\n        + (imgSrc ? '<img class=\"pj-r-prod-img\" src=\"' + escapeHtml(imgSrc) + '\" alt=\"\" loading=\"lazy\">' : '<span class=\"pj-r-prod-img\" aria-hidden=\"true\"></span>')\n        + '<span class=\"pj-r-prod-name\">' + escapeHtml(displayName) + '</span>'\n        + (priceHtml ? '<s class=\"pj-r-prod-price\">' + escapeHtml(priceHtml) + '</s>' : '')\n        + '</li>';\n    }\n    rows += '<li class=\"pj-r-prod-gift\">'\n      + '<span class=\"pj-r-prod-img pj-r-prod-gift-ico\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 12 20 22 4 22 4 12\"/><rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"/><line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"/><path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"/><path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"/></svg></span>'\n      + '<span class=\"pj-r-prod-name\">Brindes</span>'\n      + '<span class=\"pj-r-prod-free pj-r-prod-free--on\">GR\u00C1TIS</span>'\n      + '<span class=\"pj-r-prod-free pj-r-prod-free--off\">S\u00D3 NA ASSINATURA</span>'\n      + '</li>';\n    var compareTxt = altEl.getAttribute('data-price-compare') || '';\n    var totalHtml = compareTxt ? '<span class=\"pj-r-prods-total\">Comprando separado: <s>R$ ' + escapeHtml(compareTxt) + '</s></span>' : '';\n    listEl.innerHTML = '<div class=\"pj-r-prods-box\">'\n      + '<span class=\"pj-r-prods-label\">O que vem no kit</span>'\n      + '<ul class=\"pj-r-prods-list\">' + rows + '</ul>'\n      + totalHtml\n      + '</div>';\n  }\n\n  /* Filtra accordion \"Conhe\u00E7a sua rotina\" pela variante selecionada.\n     Cada <ul class=\"pj-r-routine-group\"> tem data-variant-set=\"3|4|5\". */\n  function updateRoutineForVariant() {\n    var alt = getSelectedAlt();\n    if (!alt) return;\n    var vset = alt.dataset.variantSet;\n    var groups = resultEl.querySelectorAll('.pj-r-routine-group');\n    Array.prototype.forEach.call(groups, function (g) {\n      if (g.dataset.variantSet === vset) { g.removeAttribute('hidden'); if (g._rtinsReset) g._rtinsReset(); }\n      else g.setAttribute('hidden', '');\n    });\n    updateRoutineBanner();\n  }\n\n  /* Atualiza a foto grande no banner topo da se\u00E7\u00E3o \"Conhe\u00E7a sua rotina\"\n     com base no item ABERTO da variante vis\u00EDvel. Fallback pro placeholder\n     se o item n\u00E3o tem imagem ou se nenhum item est\u00E1 aberto. */\n  function updateRoutineBanner() {\n    var bannerImg = resultEl.querySelector('.pj-r-routine-banner-img');\n    var fallback = resultEl.querySelector('.pj-r-routine-banner-fallback');\n    if (!bannerImg) return;\n    var activeGroup = resultEl.querySelector('.pj-r-routine-group:not([hidden])');\n    if (!activeGroup) {\n      bannerImg.setAttribute('hidden', '');\n      if (fallback) fallback.removeAttribute('hidden');\n      return;\n    }\n    var openItem = activeGroup.querySelector('.pj-r-accordion-item.is-open') || activeGroup.querySelector('.pj-r-accordion-item');\n    var src = openItem && openItem.dataset.img ? openItem.dataset.img : '';\n    var alt = openItem && openItem.dataset.imgAlt ? openItem.dataset.imgAlt : '';\n    if (src) {\n      bannerImg.src = src;\n      bannerImg.alt = alt;\n      bannerImg.removeAttribute('hidden');\n      if (fallback) fallback.setAttribute('hidden', '');\n    } else {\n      bannerImg.setAttribute('hidden', '');\n      bannerImg.removeAttribute('src');\n      if (fallback) fallback.removeAttribute('hidden');\n    }\n  }\n\n  function wireKitAlternatives() {\n    var alts = resultEl.querySelectorAll('.pj-r-alt');\n    if (!alts.length) return;\n    Array.prototype.forEach.call(alts, function (alt) {\n      alt.addEventListener('click', function () {\n        Array.prototype.forEach.call(alts, function (a) { a.classList.remove('is-selected'); });\n        alt.classList.add('is-selected');\n        renderProductsForKit(alt);\n        updateGalleryForVariant();\n        updateRoutineForVariant();\n        updateCtaHref();\n        // GA4: usu\u00E1rio trocou de kit (Starter/Core/Pro). Inclui variant_id pra\n        // join com dados de cart no Looker.\n        pjTrack('kit_select', {\n          variant_id: alt.dataset.variantId || '',\n          kit_size: alt.dataset.kitSize || alt.dataset.size || '',\n          kit_code: _kitCode()\n        });\n      });\n    });\n    // Estado inicial\n    var initial = resultEl.querySelector('.pj-r-alt.is-selected') || alts[0];\n    if (initial) {\n      renderProductsForKit(initial);\n      updateGalleryForVariant();\n      updateRoutineForVariant();\n      updateAltPrices();\n      updateCtaHref();\n    }\n  }\n\n  function wireSubscriptionToggle() {\n    var btns = resultEl.querySelectorAll('.pj-r-toggle-btn');\n    if (!btns.length) return;\n    var freq = resultEl.querySelector('.pj-r-freq');\n    var ctaLink = resultEl.querySelector('.pj-r-cta-link');\n    var cta = resultEl.querySelector('.pj-r-cta');\n    var altsList = resultEl.querySelector('.pj-r-alts');\n    Array.prototype.forEach.call(btns, function (b) {\n      b.addEventListener('click', function () {\n        Array.prototype.forEach.call(btns, function (x) { x.classList.remove('is-active'); });\n        b.classList.add('is-active');\n        var mode = b.dataset.mode;\n        if (mode === 'unica') {\n          if (freq) freq.classList.add('is-hidden');\n          if (ctaLink) ctaLink.style.display = 'none';\n          if (cta) { cta.dataset.mode = 'unica'; }\n          if (altsList) altsList.classList.add('is-mode-unica');\n        } else {\n          if (freq) freq.classList.remove('is-hidden');\n          if (ctaLink) ctaLink.style.display = '';\n          if (cta) { cta.dataset.mode = 'assinar'; }\n          if (altsList) altsList.classList.remove('is-mode-unica');\n        }\n        updateAltPrices();\n        updateCtaHref();\n        // GA4: toggle assinatura vs compra \u00FAnica. Mostra prefer\u00EAncia do user.\n        pjTrack('mode_toggle', { mode: mode, kit_code: _kitCode() });\n      });\n    });\n  }\n\n  function wireFrequencyToggle() {\n    var btns = resultEl.querySelectorAll('.pj-r-freq-btn');\n    if (!btns.length) return;\n    Array.prototype.forEach.call(btns, function (b) {\n      b.addEventListener('click', function () {\n        Array.prototype.forEach.call(btns, function (x) { x.classList.remove('is-active'); });\n        b.classList.add('is-active');\n        // Atualiza o CTA pra apontar pro URL Guru certo (mensal vs bimestral)\n        updateCtaHref();\n        // GA4: toggle freq mensal vs bimestral. \u00DAtil pra ARPU forecast.\n        pjTrack('freq_toggle', { freq: b.dataset.freq || '', kit_code: _kitCode() });\n      });\n    });\n  }\n\n  /* Setas da galeria. Mobile: scroll horizontal (peek do pr\u00F3ximo).\n     Desktop: troca o item ativo ciclando entre os vis\u00EDveis. */\n  function wireGalleryArrows() {\n    var prev = resultEl.querySelector('.pj-r-gallery-arrow--prev');\n    var next = resultEl.querySelector('.pj-r-gallery-arrow--next');\n    var track = resultEl.querySelector('.pj-r-gallery-track');\n    if (!track) return;\n\n    function step(dir) {\n      if (isGalleryDesktop()) {\n        var visibleItems = [];\n        Array.prototype.forEach.call(resultEl.querySelectorAll('.pj-r-gallery-item'), function (it) {\n          if (!it.classList.contains('is-hidden')) visibleItems.push(it);\n        });\n        if (!visibleItems.length) return;\n        var activeIdx = -1;\n        for (var i = 0; i < visibleItems.length; i++) {\n          if (visibleItems[i].classList.contains('is-active')) { activeIdx = i; break; }\n        }\n        if (activeIdx < 0) activeIdx = 0;\n        var newIdx = (activeIdx + dir + visibleItems.length) % visibleItems.length;\n        setGalleryActiveItem(visibleItems[newIdx]);\n      } else {\n        var firstVisible = track.querySelector('.pj-r-gallery-item:not(.is-hidden)');\n        var sw = firstVisible ? firstVisible.offsetWidth + 14 : track.clientWidth * 0.9;\n        track.scrollBy({ left: dir * sw, behavior: 'smooth' });\n      }\n    }\n    if (prev) prev.addEventListener('click', function () { step(-1); });\n    if (next) next.addEventListener('click', function () { step(1); });\n  }\n  /* Legado mantido pra compat \u2014 chamada do init segue, mas sem efeito agora. */\n  function wireGalleryThumbs() { /* substitu\u00EDdo por wireGalleryArrows */ }\n\n  /* P\u00F3s-processa o texto cru da descri\u00E7\u00E3o:\n     - Divide em par\u00E1grafos por <br><br> (quebras duplas)\n     - Linha terminando em \"?\" vira heading bold\n     - Linhas ap\u00F3s o heading (sem ponto final no padr\u00E3o de lista) viram bullets\n     - Auto-bold da primeira frase do primeiro par\u00E1grafo */\n  function enhanceRoutineDescriptions() {\n    var descs = resultEl.querySelectorAll('.pj-r-acc-desc');\n    Array.prototype.forEach.call(descs, function (desc) {\n      if (desc.dataset.enhanced) return;\n      desc.dataset.enhanced = '1';\n      var raw = desc.innerHTML;\n      var paragraphs = raw.split(/<br\\s*\\/?>\\s*<br\\s*\\/?>/i);\n      var html = '';\n      for (var pIdx = 0; pIdx < paragraphs.length; pIdx++) {\n        var lines = paragraphs[pIdx].split(/<br\\s*\\/?>/i)\n          .map(function (l) { return l.trim(); })\n          .filter(function (l) { return l.length > 0; });\n        if (!lines.length) continue;\n        var first = lines[0];\n        var firstText = first.replace(/<[^>]+>/g, '').trim();\n        var firstEndsQ = /\\?\\s*$/.test(firstText);\n        if (firstEndsQ && lines.length > 1) {\n          html += '<p class=\"pj-r-acc-heading\">' + first + '</p>';\n          html += '<ul class=\"pj-r-acc-bullets\">';\n          for (var i = 1; i < lines.length; i++) {\n            var li = lines[i].replace(/^[-\u2022\u00B7\u2013]\\s*/, '').replace(/[,;.]$/, '');\n            html += '<li>' + li + '</li>';\n          }\n          html += '</ul>';\n        } else if (firstEndsQ) {\n          html += '<p class=\"pj-r-acc-heading\">' + first + '</p>';\n        } else {\n          var content = lines.join('<br>');\n          if (pIdx === 0) {\n            var m = content.match(/^([^.!?]+[.!?])(\\s*)([\\s\\S]*)$/);\n            if (m && m[1].length > 6) {\n              content = '<strong class=\"pj-r-acc-lead\">' + m[1] + '</strong>' + m[2] + m[3];\n            }\n          }\n          html += '<p>' + content + '</p>';\n        }\n      }\n      desc.innerHTML = html;\n    });\n  }\n\n  /* Bot\u00E3o \"Ver composi\u00E7\u00E3o\" abre modal compartilhado #pj-r-modal-composition\n     populado dinamicamente com o nome+tamanho do produto + lista de ingredientes. */\n  function wireRoutineComposition() {\n    var modal = resultEl.querySelector('#pj-r-modal-composition');\n    if (!modal) return;\n    var titleEl = modal.querySelector('[data-comp-modal-name]');\n    var sizeEl = modal.querySelector('[data-comp-modal-size]');\n    var bodyEl = modal.querySelector('[data-comp-modal-body]');\n\n    function openModal(name, size, contentHtml) {\n      if (titleEl) titleEl.textContent = name || '';\n      if (sizeEl) {\n        if (size) { sizeEl.textContent = size; sizeEl.removeAttribute('hidden'); }\n        else { sizeEl.textContent = ''; sizeEl.setAttribute('hidden', ''); }\n      }\n      if (bodyEl) bodyEl.innerHTML = renderCompositionList(contentHtml);\n      modal.classList.add('is-open');\n      modal.setAttribute('aria-hidden', 'false');\n      document.body.style.overflow = 'hidden';\n    }\n    function closeModal() {\n      modal.classList.remove('is-open');\n      modal.setAttribute('aria-hidden', 'true');\n      document.body.style.overflow = '';\n    }\n\n    /* Converte conte\u00FAdo cru (com <br>) em lista de ingredientes ou prosa. */\n    function renderCompositionList(raw) {\n      if (!raw) return '';\n      var lines = raw.split(/<br\\s*\\/?>/i)\n        .map(function (l) { return l.trim(); })\n        .filter(function (l) { return l.length > 0; });\n      // Se tem m\u00FAltiplas linhas curtas, trata como lista\n      if (lines.length > 1) {\n        var html = '<ul class=\"pj-r-comp-list\">';\n        for (var i = 0; i < lines.length; i++) {\n          html += '<li>' + lines[i].replace(/^[-\u2022\u00B7\u2013]\\s*/, '') + '</li>';\n        }\n        html += '</ul>';\n        return html;\n      }\n      // Sen\u00E3o, prosa\n      return '<p class=\"pj-r-comp-prose\">' + lines.join('<br>') + '</p>';\n    }\n\n    var btns = resultEl.querySelectorAll('.pj-r-acc-comp-btn[data-comp-open]');\n    Array.prototype.forEach.call(btns, function (btn) {\n      btn.addEventListener('click', function (e) {\n        e.stopPropagation();\n        var name = btn.getAttribute('data-comp-name') || '';\n        var size = btn.getAttribute('data-comp-size') || '';\n        var tpl = btn.nextElementSibling;\n        var raw = (tpl && tpl.tagName === 'TEMPLATE') ? tpl.innerHTML : '';\n        openModal(name, size, raw);\n        // GA4: abriu modal de composi\u00E7\u00E3o/ingredientes do produto. Sinal forte\n        // de inten\u00E7\u00E3o \u2014 user est\u00E1 mergulhando no produto antes de comprar.\n        pjTrack('composition_view', { product_name: name, kit_code: _kitCode() });\n      });\n    });\n\n    var closers = modal.querySelectorAll('[data-modal-close]');\n    Array.prototype.forEach.call(closers, function (c) {\n      c.addEventListener('click', closeModal);\n    });\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && modal.classList.contains('is-open')) closeModal();\n    });\n  }\n\n  function wireRoutineAccordion() {\n    var items = resultEl.querySelectorAll('.pj-r-accordion-item');\n    if (!items.length) return;\n    Array.prototype.forEach.call(items, function (item) {\n      var btn = item.querySelector('.pj-r-accordion-btn');\n      if (!btn) return;\n      btn.addEventListener('click', function () {\n        var willOpen = !item.classList.contains('is-open');\n        // Comportamento accordion: fechar os irm\u00E3os da mesma group quando abrir um novo\n        if (willOpen) {\n          var group = item.parentElement;\n          if (group) {\n            Array.prototype.forEach.call(group.querySelectorAll('.pj-r-accordion-item.is-open'), function (sibling) {\n              if (sibling !== item) {\n                sibling.classList.remove('is-open');\n                var sBtn = sibling.querySelector('.pj-r-accordion-btn');\n                if (sBtn) sBtn.setAttribute('aria-expanded', 'false');\n              }\n            });\n          }\n        }\n        item.classList.toggle('is-open', willOpen);\n        btn.setAttribute('aria-expanded', willOpen ? 'true' : 'false');\n        if (willOpen) {\n          updateRoutineBanner();\n          // GA4: abriu o accordion de um passo da rotina (manh\u00E3/noite).\n          // step_label vem do data attribute do item (ex: \"Limpe\", \"Hidrate\").\n          pjTrack('routine_open', {\n            routine_step: item.getAttribute('data-step-label') || item.getAttribute('data-routine-step') || '',\n            kit_code: _kitCode()\n          });\n        }\n      });\n    });\n  }\n\n  /* Slider \"Conhe\u00E7a sua rotina\" (redesign 13/07): chips + dots + setas por grupo.\n     Substitui o accordion; mant\u00E9m o evento GA4 routine_open no passo visualizado. */\n  function wireRoutineSliders() {\n    var groups = resultEl.querySelectorAll('.pj-r-routine-group');\n    Array.prototype.forEach.call(groups, function (group) {\n      var slider = group.querySelector('[data-rtins-slider]');\n      if (!slider) return;\n      var cards = slider.querySelectorAll('.pj-r-rtc');\n      var chips = group.querySelectorAll('.pj-r-rtins-chip');\n      var dots = group.querySelectorAll('.pj-r-rtins-dot');\n      var prev = group.querySelector('.pj-r-rtins-arrow--prev');\n      var next = group.querySelector('.pj-r-rtins-arrow--next');\n      if (!cards.length) return;\n      var cur = 0;\n      function mark(i, silent) {\n        cur = i;\n        Array.prototype.forEach.call(chips, function (ch, ci) { ch.classList.toggle('is-on', ci === i); });\n        Array.prototype.forEach.call(dots, function (d, di) { d.classList.toggle('is-active', di === i); });\n        if (prev) prev.disabled = i === 0;\n        if (next) next.disabled = i === cards.length - 1;\n        if (!silent) {\n          pjTrack('routine_open', { routine_step: cards[i].getAttribute('data-step-label') || '', kit_code: _kitCode() });\n        }\n      }\n      function targetLeft(i) {\n        var card = cards[i];\n        var l = card.offsetLeft - (slider.clientWidth - card.offsetWidth) / 2;\n        var max = slider.scrollWidth - slider.clientWidth;\n        return Math.max(0, Math.min(l, max));\n      }\n      function goTo(i) {\n        i = Math.max(0, Math.min(cards.length - 1, i));\n        slider.scrollTo({ left: targetLeft(i), behavior: 'smooth' });\n        if (i !== cur) mark(i);\n      }\n      function sync() {\n        var max = slider.scrollWidth - slider.clientWidth;\n        var best;\n        if (slider.scrollLeft <= 2) best = 0;\n        else if (slider.scrollLeft >= max - 2) best = cards.length - 1;\n        else {\n          var center = slider.scrollLeft + slider.clientWidth / 2;\n          best = 0; var bd = Infinity;\n          for (var k = 0; k < cards.length; k++) {\n            var cc = cards[k].offsetLeft + cards[k].offsetWidth / 2;\n            var d = Math.abs(cc - center);\n            if (d < bd) { bd = d; best = k; }\n          }\n        }\n        if (best !== cur) mark(best);\n      }\n      var tick = false;\n      slider.addEventListener('scroll', function () { if (!tick) { tick = true; requestAnimationFrame(function () { tick = false; sync(); }); } }, { passive: true });\n      Array.prototype.forEach.call(chips, function (ch, ci) { ch.addEventListener('click', function () { goTo(ci); }); });\n      Array.prototype.forEach.call(dots, function (d, di) { d.addEventListener('click', function () { goTo(di); }); });\n      if (prev) prev.addEventListener('click', function () { goTo(cur - 1); });\n      if (next) next.addEventListener('click', function () { goTo(cur + 1); });\n      group._rtinsReset = function () { slider.scrollLeft = 0; mark(0, true); };\n    });\n  }\n\n  function wireSliderArrows() {\n    var arrows = resultEl.querySelectorAll('.pj-r-slider-arrow');\n    var sliderMap = {\n      ad: '.pj-r-ad-slider',\n      benefit: '.pj-r-benefits-slider',\n      video: '.pj-r-video-slider'\n    };\n    Array.prototype.forEach.call(arrows, function (btn) {\n      btn.addEventListener('click', function () {\n        var key = btn.dataset.target;\n        var dir = btn.classList.contains('pj-r-slider-arrow--prev') ? -1 : 1;\n        var slider = resultEl.querySelector(sliderMap[key]);\n        if (!slider) return;\n        var card = slider.querySelector('article');\n        var step = card ? card.offsetWidth + 12 : slider.clientWidth * 0.85;\n        slider.scrollBy({ left: step * dir, behavior: 'smooth' });\n      });\n    });\n  }\n\n  function wireResultAdDots() {\n    var slider = resultEl.querySelector('.pj-r-ad-slider');\n    var dots = resultEl.querySelectorAll('.pj-r-ad-dot');\n    if (!slider || !dots.length) return;\n    var cards = slider.querySelectorAll('.pj-r-ad-card');\n    if (!cards.length) return;\n\n    // ---- Auto-scroll ----------------------------------------------------\n    // Avan\u00E7a 1 card a cada 2.5s. Pausa quando o user interage (touch/drag/click\n    // nas arrows) e retoma ap\u00F3s 6s de idle. Pausa tamb\u00E9m quando a section sai\n    // do viewport pra n\u00E3o desperdi\u00E7ar CPU.\n    var AUTO_INTERVAL_MS = 2500;\n    var RESUME_AFTER_MS = 6000;\n    var autoTimer = null;\n    var resumeTimer = null;\n    var paused = false;\n    var inView = false;\n\n    function nextIndex() {\n      var center = slider.scrollLeft + slider.clientWidth / 2;\n      var current = 0, minDist = Infinity;\n      Array.prototype.forEach.call(cards, function (card, i) {\n        var c = card.offsetLeft + card.offsetWidth / 2;\n        var d = Math.abs(c - center);\n        if (d < minDist) { minDist = d; current = i; }\n      });\n      return (current + 1) % cards.length;\n    }\n    function scrollToCard(idx) {\n      if (idx < 0 || idx >= cards.length) return;\n      var card = cards[idx];\n      var target = card.offsetLeft - (slider.clientWidth - card.offsetWidth) / 2;\n      slider.scrollTo({ left: Math.max(0, target), behavior: 'smooth' });\n    }\n    function startAuto() {\n      stopAuto();\n      if (paused || !inView) return;\n      autoTimer = setInterval(function () {\n        if (paused || !inView) return;\n        scrollToCard(nextIndex());\n      }, AUTO_INTERVAL_MS);\n    }\n    function stopAuto() {\n      if (autoTimer) { clearInterval(autoTimer); autoTimer = null; }\n    }\n    function pauseAndScheduleResume() {\n      paused = true;\n      stopAuto();\n      clearTimeout(resumeTimer);\n      resumeTimer = setTimeout(function () { paused = false; startAuto(); }, RESUME_AFTER_MS);\n    }\n\n    // Eventos de intera\u00E7\u00E3o: pausa o auto-scroll. Inclui touch e mousedown pra\n    // pegar drag manual, e click nas arrows \u00E9 interceptado via delega\u00E7\u00E3o no\n    // .pj-r-slider-wrap pai.\n    slider.addEventListener('touchstart', pauseAndScheduleResume, { passive: true });\n    slider.addEventListener('mousedown', pauseAndScheduleResume);\n    var wrap = slider.closest('.pj-r-slider-wrap');\n    if (wrap) {\n      wrap.addEventListener('click', function (e) {\n        if (e.target.closest('.pj-r-slider-arrow')) pauseAndScheduleResume();\n      });\n    }\n    // Pausa quando a section sai do viewport (poupa CPU + evita scroll fantasma)\n    if ('IntersectionObserver' in window) {\n      var io = new IntersectionObserver(function (entries) {\n        entries.forEach(function (e) {\n          inView = e.isIntersecting;\n          if (inView) startAuto(); else stopAuto();\n        });\n      }, { threshold: 0.25 });\n      io.observe(slider);\n    } else {\n      inView = true;\n      startAuto();\n    }\n    // ---- /Auto-scroll ---------------------------------------------------\n\n    var scrollTimer;\n    slider.addEventListener('scroll', function () {\n      clearTimeout(scrollTimer);\n      scrollTimer = setTimeout(function () {\n        var center = slider.scrollLeft + slider.clientWidth / 2;\n        var closest = 0, minDist = Infinity;\n        Array.prototype.forEach.call(cards, function (card, i) {\n          var c = card.offsetLeft + card.offsetWidth / 2;\n          var d = Math.abs(c - center);\n          if (d < minDist) { minDist = d; closest = i; }\n        });\n        Array.prototype.forEach.call(dots, function (dot, i) {\n          dot.classList.toggle('is-active', i === closest);\n        });\n      }, 60);\n    });\n  }\n\n  /* Reviews via API Okendo (produto ancora PJ26):\n     - Inicial: pega 5 reviews mais recentes\n     - \"ver mais\" pagina via nextUrl que o Okendo retorna\n     - Renderiza no markup existente .pj-r-reviews-list mantendo o estilo do tema */\n  var OKENDO_STAR_SVG = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon></svg>';\n  var OKENDO_STAR_EMPTY_SVG = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon></svg>';\n  function okendoStarsFor(rating) {\n    var r = parseInt(rating, 10);\n    if (isNaN(r) || r < 0) r = 5;\n    if (r > 5) r = 5;\n    var s = '';\n    for (var i = 1; i <= 5; i++) s += (i <= r) ? OKENDO_STAR_SVG : OKENDO_STAR_EMPTY_SVG;\n    return s;\n  }\n\n  function timeAgoPt(dateStr) {\n    var d = new Date(dateStr);\n    if (isNaN(d.getTime())) return '';\n    var sec = Math.floor((Date.now() - d.getTime()) / 1000);\n    var months = Math.floor(sec / (30 * 24 * 3600));\n    if (months >= 12) {\n      var years = Math.floor(months / 12);\n      return years + (years === 1 ? ' ano atr\u00E1s' : ' anos atr\u00E1s');\n    }\n    if (months >= 1) return months + (months === 1 ? ' m\u00EAs atr\u00E1s' : ' meses atr\u00E1s');\n    var days = Math.floor(sec / (24 * 3600));\n    if (days >= 1) return days + (days === 1 ? ' dia atr\u00E1s' : ' dias atr\u00E1s');\n    var hrs = Math.floor(sec / 3600);\n    if (hrs >= 1) return hrs + (hrs === 1 ? ' hora atr\u00E1s' : ' horas atr\u00E1s');\n    return 'agora h\u00E1 pouco';\n  }\n\n  /* Play/pause dos v\u00EDdeos de depoimento.\n     - Click no bot\u00E3o \u2192 toggle play do v\u00EDdeo daquele card\n     - Quando inicia um, pausa os outros\n     - Estado \u00E9 sincronizado via events nativos play/pause/ended (mais robusto que tracking manual). */\n  function wireVideoTestimonials() {\n    var cards = resultEl.querySelectorAll('.pj-r-video-card');\n    if (!cards.length) return;\n    Array.prototype.forEach.call(cards, function (card) {\n      var videoEl = card.querySelector('.pj-r-video-el');\n      var btnEl = card.querySelector('[data-video-toggle]');\n      if (!videoEl || !btnEl) return;\n\n      // iOS Safari + preload=\"metadata\" n\u00E3o renderiza o primeiro frame como poster\n      // por default \u2014 s\u00F3 mostra o background cream. Solu\u00E7\u00E3o: ao receber metadata,\n      // seek pra 0.1s pra for\u00E7ar o decode do primeiro frame, que vira o \"thumbnail\"\n      // vis\u00EDvel enquanto o v\u00EDdeo n\u00E3o toca. Usa `seeked` pra confirmar antes de\n      // marcar como pronto (alguns browsers s\u00F3 renderizam ap\u00F3s o seek completar).\n      var posterShown = false;\n      function showPoster() {\n        if (posterShown) return;\n        try {\n          // Pula pro 1\u00BA frame vis\u00EDvel \u2014 currentTime=0 nem sempre renderiza.\n          videoEl.currentTime = 0.1;\n        } catch (_) { /* alguns browsers exigem que metadata esteja carregada */ }\n      }\n      videoEl.addEventListener('loadedmetadata', showPoster);\n      videoEl.addEventListener('seeked', function () {\n        posterShown = true;\n        card.classList.add('has-poster');\n      });\n\n      // Lazy-load REAL: o markup vem com preload=\"none\" e data-src (sem <source>\n      // tag). Aqui injetamos a <source> tag + chamamos load() quando o card\n      // entra no viewport via IntersectionObserver. Sem isso, 5 v\u00EDdeos HD-720p\n      // baixavam metadata (~700KB cada) no page load mesmo escondidos.\n      function injectSourceAndLoad() {\n        var dataSrc = videoEl.getAttribute('data-src');\n        if (!dataSrc || videoEl.querySelector('source')) return;\n        var source = document.createElement('source');\n        source.src = dataSrc;\n        source.type = 'video/mp4';\n        videoEl.appendChild(source);\n        try { videoEl.preload = 'metadata'; videoEl.load(); } catch (_) {}\n      }\n      if ('IntersectionObserver' in window) {\n        var io = new IntersectionObserver(function (entries) {\n          entries.forEach(function (e) {\n            if (e.isIntersecting) {\n              injectSourceAndLoad();\n              io.unobserve(videoEl);\n            }\n          });\n        }, { rootMargin: '200px 0px' });\n        io.observe(videoEl);\n      } else {\n        injectSourceAndLoad();\n      }\n\n      function pauseAllOthers() {\n        Array.prototype.forEach.call(cards, function (c) {\n          if (c === card) return;\n          var v = c.querySelector('.pj-r-video-el');\n          if (v && !v.paused) v.pause();\n        });\n      }\n      function tryPlay() {\n        pauseAllOthers();\n        // Garante que a <source> foi injetada (caso o user clique em play antes\n        // do IntersectionObserver disparar \u2014 improv\u00E1vel mas poss\u00EDvel).\n        injectSourceAndLoad();\n        videoEl.muted = false;\n        var p = videoEl.play();\n        if (p && p.then) p.catch(function () { /* autoplay blocked: silent */ });\n        // GA4: user iniciou play em um depoimento. video_id (ou src) pra\n        // diferenciar quais v\u00EDdeos performam melhor como social proof.\n        var src = videoEl.getAttribute('data-src') || videoEl.currentSrc || '';\n        var videoId = src.split('/').pop().split('?')[0];\n        pjTrack('video_play', { video_id: videoId, kit_code: _kitCode() });\n      }\n      // INTEN\u00C7\u00C3O do usu\u00E1rio (wantsPlay) como source of truth \u2014 N\u00C3O videoEl.paused.\n      // .paused \u00E9 vol\u00E1til durante o play() async (iOS Safari) e, com touch+click\n      // fantasma ou clique no bot\u00E3o E no v\u00EDdeo, o handleToggle disparava 2x: a 2\u00AA\n      // via .paused ainda em transi\u00E7\u00E3o e chamava tryPlay() de novo em vez de pausar\n      // (bug \"pause n\u00E3o funciona\", 19 May). Flag + debounce = 1 a\u00E7\u00E3o por gesto.\n      var wantsPlay = false;\n      var lastToggleAt = 0;\n      function handleToggle() {\n        var now = Date.now();\n        if (now - lastToggleAt < 300) return;   // ignora disparo duplicado do mesmo gesto\n        lastToggleAt = now;\n        if (wantsPlay) {\n          wantsPlay = false;\n          try { videoEl.pause(); } catch (_) {}\n          card.classList.remove('is-playing');\n        } else {\n          wantsPlay = true;\n          tryPlay();\n        }\n      }\n\n      // Touch (mobile) \u2192 preventDefault no touchend evita click-ghost.\n      // Desktop usa click direto. Guard de 400ms entre touch e click pra\n      // n\u00E3o duplicar em dispositivos h\u00EDbridos (Surface, iPad Pro).\n      var lastTouchAt = 0;\n      btnEl.addEventListener('touchend', function (e) {\n        e.preventDefault();\n        lastTouchAt = Date.now();\n        handleToggle();\n      }, { passive: false });\n      btnEl.addEventListener('click', function () {\n        if (Date.now() - lastTouchAt < 400) return;\n        handleToggle();\n      });\n      // Click no <video> tamb\u00E9m faz toggle \u2014 UX padr\u00E3o de player. Resolve o\n      // caso do user clicar fora do bot\u00E3o pequeno (48px no desktop quando\n      // playing) na regi\u00E3o vis\u00EDvel do v\u00EDdeo.\n      videoEl.addEventListener('click', function () {\n        if (Date.now() - lastTouchAt < 400) return;\n        handleToggle();\n      });\n      // Sincroniza inten\u00E7\u00E3o + .is-playing via events nativos (cobre play/pause via\n      // JS, controls nativos ou fim do v\u00EDdeo). Mant\u00E9m wantsPlay coerente com a realidade.\n      videoEl.addEventListener('play', function () { wantsPlay = true; card.classList.add('is-playing'); });\n      videoEl.addEventListener('pause', function () { wantsPlay = false; card.classList.remove('is-playing'); });\n      videoEl.addEventListener('ended', function () { wantsPlay = false; card.classList.remove('is-playing'); });\n    });\n  }\n\n  /* Dots do slider de v\u00EDdeos: atualiza ao scrollar. */\n  function wireVideoDots() {\n    var slider = resultEl.querySelector('.pj-r-video-slider');\n    var dots = resultEl.querySelectorAll('.pj-r-video-dots span');\n    if (!slider || !dots.length) return;\n    var cards = slider.querySelectorAll('.pj-r-video-card');\n    if (!cards.length) return;\n    var scrollTimer;\n    slider.addEventListener('scroll', function () {\n      clearTimeout(scrollTimer);\n      scrollTimer = setTimeout(function () {\n        var center = slider.scrollLeft + slider.clientWidth / 2;\n        var closest = 0, minDist = Infinity;\n        Array.prototype.forEach.call(cards, function (card, i) {\n          var c = card.offsetLeft + card.offsetWidth / 2;\n          var d = Math.abs(c - center);\n          if (d < minDist) { minDist = d; closest = i; }\n        });\n        Array.prototype.forEach.call(dots, function (d, i) {\n          d.classList.toggle('is-active', i === closest);\n        });\n      }, 60);\n    });\n  }\n\n  /* Wire de scroll suave pra elementos com [data-scroll-to=\"<selector>\"].\n     Click no elemento \u2192 window.scrollTo at\u00E9 o destino, com offset pra sticky header. */\n  function wireScrollAnchors() {\n    var btns = resultEl.querySelectorAll('[data-scroll-to]');\n    Array.prototype.forEach.call(btns, function (btn) {\n      btn.addEventListener('click', function (e) {\n        e.preventDefault();\n        var sel = btn.getAttribute('data-scroll-to');\n        var target = resultEl.querySelector(sel) || document.querySelector(sel);\n        if (!target) return;\n        var rect = target.getBoundingClientRect();\n        var y = window.pageYOffset + rect.top - 80;\n        window.scrollTo({ top: y, behavior: 'smooth' });\n      });\n    });\n  }\n\n  /* Infla artificialmente o count de reviews do Okendo (+7.000) e recalcula a distribui\u00E7\u00E3o\n     proporcional por estrela baseado numa m\u00E9dia t\u00EDpica 4.9. Aplica em todos os locais\n     onde [data-okendo-count] aparece e nos .pj-r-rd-fill/.pj-r-rd-count das barras. */\n  function inflateOkendoCount() {\n    var INFLATE = 12000;\n    // distribui\u00E7\u00E3o proporcional pra m\u00E9dia ~4.9 (92% 5\u2605, 6% 4\u2605, 1.2% 3\u2605, 0.5% 2\u2605, 0.3% 1\u2605) \u2014 bate com o card pj-reviews-breakdown\n    var DIST = { 5: 0.92, 4: 0.06, 3: 0.012, 2: 0.005, 1: 0.003 };\n\n    var countEls = resultEl.querySelectorAll('[data-okendo-count]');\n    if (!countEls.length) return;\n    var rawText = (countEls[0].textContent || '0').replace(/\\D/g, '');\n    var realCount = parseInt(rawText, 10);\n    if (!realCount || isNaN(realCount)) return;\n\n    var inflated = realCount + INFLATE;\n    var formatPt = function (n) {\n      try { return n.toLocaleString('pt-BR'); }\n      catch (e) { return String(n).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.'); }\n    };\n    var formatted = formatPt(inflated);\n\n    Array.prototype.forEach.call(countEls, function (el) { el.textContent = formatted; });\n\n    var distItems = resultEl.querySelectorAll('.pj-r-rating-distribution li');\n    var counts = {};\n    var maxC = 0;\n    Array.prototype.forEach.call(distItems, function (li) {\n      var numEl = li.querySelector('.pj-r-rd-num');\n      var num = parseInt(numEl ? numEl.textContent : '0', 10);\n      if (!num) return;\n      var c = Math.round(inflated * (DIST[num] || 0));\n      counts[num] = c;\n      if (c > maxC) maxC = c;\n    });\n    Array.prototype.forEach.call(distItems, function (li) {\n      var numEl = li.querySelector('.pj-r-rd-num');\n      var num = parseInt(numEl ? numEl.textContent : '0', 10);\n      var fillEl = li.querySelector('.pj-r-rd-fill');\n      var countEl = li.querySelector('.pj-r-rd-count');\n      var c = counts[num] || 0;\n      var pct = maxC > 0 ? (c / maxC) * 100 : 0;\n      if (fillEl) fillEl.style.width = pct.toFixed(1) + '%';\n      if (countEl) countEl.textContent = formatPt(c);\n    });\n  }\n\n  /* Delega\u00E7\u00E3o \u00FAnica pra fechar QUALQUER modal via [data-modal-close] ou tecla ESC.\n     Substitui os listeners individuais espalhados \u2014 mais resiliente. */\n  function wireModalCloseDelegation() {\n    function closeModalEl(m) {\n      if (!m) return;\n      m.classList.remove('is-open');\n      m.setAttribute('aria-hidden', 'true');\n      document.body.style.overflow = '';\n    }\n    /* 21/07: delega\u00E7\u00E3o no DOCUMENT (n\u00E3o no resultEl) \u2014 os modais s\u00E3o portalados\n       pro <body> no fim do init (fora do resultEl), sen\u00E3o clique de fechar n\u00E3o\n       borbulharia at\u00E9 aqui. */\n    document.addEventListener('click', function (e) {\n      var t = e.target;\n      while (t && t.nodeType === 1) {\n        if (t.hasAttribute && t.hasAttribute('data-modal-close')) {\n          var modal = t;\n          while (modal && !(modal.classList && modal.classList.contains('pj-r-modal'))) modal = modal.parentElement;\n          closeModalEl(modal);\n          return;\n        }\n        t = t.parentElement;\n      }\n    });\n    document.addEventListener('keydown', function (e) {\n      if (e.key !== 'Escape') return;\n      var open = document.querySelectorAll('.pj-r-modal.is-open');\n      Array.prototype.forEach.call(open, closeModalEl);\n    });\n  }\n\n  /* Downsize Okendo CDN dimensions param (?d=1600x1600 \u2192 ?d=600x600). */\n  function okendoDownsize(url, dim) {\n    if (!url) return url;\n    var d = dim || 600;\n    return url.replace(/([?&])d=\\d+x\\d+/, '$1d=' + d + 'x' + d);\n  }\n\n  /* Lightbox compartilhado pra fotos de reviews (galeria topo + reviews individuais)\n     E pra imagens da galeria principal do produto.\n     Click em qualquer [data-photo-src] abre o modal #pj-r-modal-photo.\n     - Quando n\u00E3o h\u00E1 nome+body (ex: imagens de produto), esconde o bloco meta via .is-image-only.\n     - Quando o click vem de dentro de um \"grupo\" (galeria ou fotos de review com 2+ imgs),\n       habilita as setas prev/next que navegam pelas imagens vis\u00EDveis daquele grupo.\n       Teclas \u2190/\u2192 no teclado tamb\u00E9m navegam. */\n  function wireOkendoPhotoLightbox() {\n    var modal = resultEl.querySelector('#pj-r-modal-photo');\n    if (!modal) return;\n    var imgEl = modal.querySelector('[data-photo-modal-img]');\n    var nameEl = modal.querySelector('[data-photo-modal-name]');\n    var bodyEl = modal.querySelector('[data-photo-modal-body]');\n    var prevBtn = modal.querySelector('[data-photo-prev]');\n    var nextBtn = modal.querySelector('[data-photo-next]');\n    var openToken = 0; // pra cancelar swap se trocar de foto antes do preload terminar\n\n    // Containers cujas imgs formam um grupo naveg\u00E1vel pelas setas.\n    var GROUP_SELECTORS = ['.pj-r-gallery-track', '.pj-r-reviews-photos', '.pj-r-review-photos', '.pj-r-bump'];\n    var currentGroup = []; // [{thumb, large, name, body}, ...]\n    var currentIndex = 0;\n\n    function showItem(item) {\n      openToken++;\n      var token = openToken;\n      var smallSrc = okendoDownsize(item.large, 600);\n      if (imgEl) {\n        imgEl.src = item.thumb || smallSrc;\n        imgEl.alt = item.name || 'Foto';\n        if (smallSrc && smallSrc !== item.thumb) {\n          var preloader = new Image();\n          preloader.onload = function () {\n            if (token === openToken && modal.classList.contains('is-open')) {\n              imgEl.src = smallSrc;\n            }\n          };\n          preloader.src = smallSrc;\n        }\n      }\n      if (nameEl) nameEl.textContent = item.name || '';\n      if (bodyEl) {\n        if (item.body) { bodyEl.textContent = item.body; bodyEl.removeAttribute('hidden'); }\n        else { bodyEl.textContent = ''; bodyEl.setAttribute('hidden', ''); }\n      }\n      if (!item.name && !item.body) modal.classList.add('is-image-only');\n      else modal.classList.remove('is-image-only');\n      // Mostra/esconde setas conforme tamanho do grupo\n      var hasMulti = currentGroup.length > 1;\n      if (prevBtn) { if (hasMulti) prevBtn.removeAttribute('hidden'); else prevBtn.setAttribute('hidden', ''); }\n      if (nextBtn) { if (hasMulti) nextBtn.removeAttribute('hidden'); else nextBtn.setAttribute('hidden', ''); }\n    }\n\n    function findGroupContainer(el) {\n      for (var i = 0; i < GROUP_SELECTORS.length; i++) {\n        var c = el.closest && el.closest(GROUP_SELECTORS[i]);\n        if (c) return c;\n      }\n      return null;\n    }\n\n    function buildGroupFromTarget(target) {\n      var container = findGroupContainer(target);\n      if (!container) {\n        return {\n          group: [{\n            thumb: target.getAttribute('src'),\n            large: target.getAttribute('data-photo-src'),\n            name: target.getAttribute('data-photo-name'),\n            body: target.getAttribute('data-photo-body')\n          }],\n          index: 0\n        };\n      }\n      var els = Array.prototype.slice.call(container.querySelectorAll('[data-photo-src]'))\n        .filter(function (el) {\n          // Filtra imgs ocultas (variant filter na galeria, ou hidden em geral)\n          var item = el.closest('.pj-r-gallery-item');\n          if (item && item.classList.contains('is-hidden')) return false;\n          if (el.offsetParent === null && !el.classList.contains('pj-r-gallery-img')) return false;\n          return true;\n        });\n      var group = els.map(function (el) {\n        return {\n          thumb: el.getAttribute('src'),\n          large: el.getAttribute('data-photo-src'),\n          name: el.getAttribute('data-photo-name'),\n          body: el.getAttribute('data-photo-body')\n        };\n      });\n      var idx = els.indexOf(target);\n      if (idx < 0) idx = 0;\n      return { group: group, index: idx };\n    }\n\n    function openFromTarget(target) {\n      var result = buildGroupFromTarget(target);\n      currentGroup = result.group;\n      currentIndex = result.index;\n      modal.classList.add('is-open');\n      modal.setAttribute('aria-hidden', 'false');\n      document.body.style.overflow = 'hidden';\n      showItem(currentGroup[currentIndex]);\n      // GA4: zoom em foto (galeria principal ou foto de review do Okendo).\n      // \"source\" indica de onde veio o click pra separar engagement com kit vs social proof.\n      var container = findGroupContainer(target);\n      var source = container\n        ? (container.classList.contains('pj-r-gallery-track') ? 'gallery'\n          : (container.classList.contains('pj-r-reviews-photos') || container.classList.contains('pj-r-review-photos')) ? 'reviews'\n          : 'other')\n        : 'single';\n      pjTrack('gallery_zoom', { source: source, kit_code: _kitCode() });\n    }\n\n    function navigate(delta) {\n      if (currentGroup.length < 2) return;\n      currentIndex = (currentIndex + delta + currentGroup.length) % currentGroup.length;\n      showItem(currentGroup[currentIndex]);\n    }\n\n    function closeModal() {\n      openToken++;\n      modal.classList.remove('is-open');\n      modal.setAttribute('aria-hidden', 'true');\n      document.body.style.overflow = '';\n      if (imgEl) imgEl.removeAttribute('src');\n      currentGroup = [];\n      currentIndex = 0;\n    }\n\n    resultEl.addEventListener('click', function (e) {\n      var t = e.target;\n      while (t && t !== resultEl) {\n        if (t.hasAttribute && t.hasAttribute('data-photo-src')) {\n          e.preventDefault();\n          openFromTarget(t);\n          return;\n        }\n        t = t.parentElement;\n      }\n    });\n\n    if (prevBtn) prevBtn.addEventListener('click', function (e) {\n      e.preventDefault(); e.stopPropagation(); navigate(-1);\n    });\n    if (nextBtn) nextBtn.addEventListener('click', function (e) {\n      e.preventDefault(); e.stopPropagation(); navigate(1);\n    });\n\n    var closers = modal.querySelectorAll('[data-modal-close]');\n    Array.prototype.forEach.call(closers, function (c) { c.addEventListener('click', closeModal); });\n    document.addEventListener('keydown', function (e) {\n      if (!modal.classList.contains('is-open')) return;\n      if (e.key === 'Escape') { closeModal(); return; }\n      if (e.key === 'ArrowLeft') { navigate(-1); return; }\n      if (e.key === 'ArrowRight') { navigate(1); return; }\n    });\n    // Imagem: clicar fecha (desktop). Em mobile, swipe horizontal navega entre as fotos do grupo.\n    if (imgEl) {\n      var _sx = 0, _sy = 0, _swiped = false;\n      imgEl.addEventListener('touchstart', function (e) {\n        var t = e.touches && e.touches[0]; if (!t) return;\n        _sx = t.clientX; _sy = t.clientY; _swiped = false;\n      }, { passive: true });\n      imgEl.addEventListener('touchend', function (e) {\n        var t = e.changedTouches && e.changedTouches[0]; if (!t) return;\n        var dx = t.clientX - _sx, dy = t.clientY - _sy;\n        if (Math.abs(dx) > 40 && Math.abs(dx) > Math.abs(dy)) { _swiped = true; navigate(dx < 0 ? 1 : -1); }\n      }, { passive: true });\n      imgEl.addEventListener('click', function () { if (_swiped) { _swiped = false; return; } closeModal(); });\n    }\n  }\n\n  function wireOkendoReviews() {\n    var section = resultEl.querySelector('.pj-r-reviews');\n    if (!section) return;\n    var subscriber = section.getAttribute('data-okendo-subscriber');\n    var productId = section.getAttribute('data-okendo-product-id');\n    var listEl = section.querySelector('[data-okendo-reviews-list]');\n    var moreBtn = section.querySelector('[data-okendo-more]');\n    var galleryEl = section.querySelector('[data-okendo-photos]');\n    var filterBtns = section.querySelectorAll('[data-rev-filter]');\n    var verifiedSealUrl = section.getAttribute('data-okendo-verified-seal') || '';\n    if (!subscriber || !productId || !listEl) return;\n\n    var BASE = 'https://api.okendo.io';\n    /* FIX (11/06): antes us\u00E1vamos o endpoint product-scoped do anchor PJ26\n       (/products/shopify-.../reviews). Esse endpoint s\u00F3 devolve as reviews que o\n       Okendo SINDICA pro grupo do PJ26 (~14 produtos). Produtos novos/fora do grupo\n       (ex.: shopify-9448772010152) N\u00C3O sindicam pro anchor \u2192 reviews recentes sumiam\n       (a mais nova travava em 05/06). Trocado pelo feed STORE-WIDE: traz sempre as\n       avalia\u00E7\u00F5es mais novas de QUALQUER produto, com os MESMOS params (orderBy/nextUrl/\n       shape id\u00EAnticos), ent\u00E3o o resto do c\u00F3digo n\u00E3o muda. productId continua lido s\u00F3\n       pra guard de configura\u00E7\u00E3o. */\n    var baseUrlPrefix = '/v1/stores/' + subscriber + '/reviews';\n    var isFetching = false;\n    var reqGen = 0;           // gera\u00E7\u00E3o de request: troca de filtro invalida respostas em voo\n    var allReviews = [];      // cache acumulado de TODAS as reviews j\u00E1 buscadas\n    var currentFilter = 'recent';\n    var nextUrl = buildInitialUrl('recent');\n\n    /* Constr\u00F3i URL inicial baseado no filter ativo.\n       - 'recent': orderBy=date desc\n       - 'photos': orderBy=date desc + filter client-side\n       - 'rating-desc': orderBy=rating desc (5\u2605 primeiro)\n       - 'rating-asc': orderBy=rating asc (1\u2605 primeiro) */\n    function buildInitialUrl(filter) {\n      var limit = filter === 'photos' ? 30 : 15;\n      var orderBy = 'date+desc';\n      if (filter === 'rating-desc') orderBy = 'rating+desc';\n      else if (filter === 'rating-asc') orderBy = 'rating+asc';\n      return baseUrlPrefix + '?limit=' + limit + '&orderBy=' + orderBy;\n    }\n\n    /* Okendo retorna nextUrl como \"/stores/...\" (sem /v1/), mas a API s\u00F3 responde\n       com /v1/ prefixado \u2014 sem isso d\u00E1 403. */\n    function ensureV1(path) {\n      if (!path) return path;\n      if (path.indexOf('/v1/') === 0) return path;\n      if (path.indexOf('/stores/') === 0) return '/v1' + path;\n      return path;\n    }\n\n    function setMoreState(state) {\n      if (!moreBtn) return;\n      moreBtn.style.opacity = '';\n      if (state === 'loading') {\n        moreBtn.textContent = 'carregando\u2026';\n        moreBtn.disabled = true;\n      } else if (state === 'idle') {\n        moreBtn.textContent = 'ver mais avalia\u00E7\u00F5es';\n        moreBtn.disabled = false;\n      } else if (state === 'done') {\n        moreBtn.textContent = 'sem mais avalia\u00E7\u00F5es';\n        moreBtn.disabled = true;\n        moreBtn.style.opacity = '0.5';\n      } else if (state === 'error') {\n        moreBtn.textContent = 'erro ao carregar \u2014 tentar novamente';\n        moreBtn.disabled = false;\n      }\n    }\n\n    /* Filtros server-side (rating) j\u00E1 v\u00EAm filtrados da API \u2014 n\u00E3o precisa refiltrar.\n       Filtro 'photos' \u00E9 client-side (API n\u00E3o suporta) \u2014 refiltra do cache. */\n    function applyFilter(reviews) {\n      if (currentFilter === 'photos') {\n        return reviews.filter(function (r) {\n          var ms = r.media || [];\n          for (var i = 0; i < ms.length; i++) if (ms[i].type === 'image') return true;\n          return false;\n        });\n      }\n      return reviews;\n    }\n\n    var collectedPhotos = []; // pra galeria topo (sempre lista todas as fotos, independente do filter)\n    var galleryPhotos = []; // cache dedicado da galeria topo (independente da lista filtrada)\n\n    /* Fetch dedicado pra galeria de fotos: pega 50 reviews mais recentes e extrai\n       todas as fotos. Roda em paralelo com a lista, n\u00E3o interfere com filtros. */\n    function loadGalleryPhotos() {\n      var url = baseUrlPrefix + '?limit=50&orderBy=date+desc&_cb=' + Date.now();\n      fetch(BASE + ensureV1(url), { cache: 'no-store' }).then(function (r) {\n        return r.ok ? r.json() : null;\n      }).then(function (data) {\n        if (!data) return;\n        var arr = (data && data.reviews) || [];\n        galleryPhotos = [];\n        for (var i = 0; i < arr.length; i++) {\n          var r = arr[i];\n          var ms = r.media || [];\n          var name = (r.reviewer && r.reviewer.displayName) || 'Cliente Proper';\n          var body = (r.body || '').replace(/\\s+/g, ' ').trim();\n          for (var j = 0; j < ms.length; j++) {\n            if (ms[j].type !== 'image') continue;\n            var th = ms[j].thumbnailUrl || ms[j].largeUrl || ms[j].fullSizeUrl;\n            var fu = ms[j].largeUrl || ms[j].fullSizeUrl || ms[j].thumbnailUrl;\n            if (!th) continue;\n            galleryPhotos.push({ thumb: th, full: fu, name: name, body: body });\n          }\n        }\n        renderTopGallery();\n      }).catch(function () { /* silent */ });\n    }\n\n    function renderTopGallery() {\n      if (!galleryEl) return;\n      if (galleryPhotos.length === 0) { galleryEl.setAttribute('hidden', ''); return; }\n      var html = '';\n      for (var i = 0; i < galleryPhotos.length; i++) {\n        var p = galleryPhotos[i];\n        html += '<img class=\"pj-r-reviews-photo\"'\n          + ' src=\"' + escapeHtml(p.thumb) + '\"'\n          + ' data-photo-src=\"' + escapeHtml(p.full) + '\"'\n          + ' data-photo-name=\"' + escapeHtml(p.name) + '\"'\n          + ' data-photo-body=\"' + escapeHtml(p.body) + '\"'\n          + ' alt=\"\" loading=\"lazy\">';\n      }\n      galleryEl.innerHTML = html;\n      galleryEl.removeAttribute('hidden');\n    }\n\n    function renderReview(r) {\n      var name = (r.reviewer && r.reviewer.displayName) ? r.reviewer.displayName : 'Cliente Proper';\n      var ago = timeAgoPt(r.dateCreated);\n      var body = (r.body || '').replace(/\\s+/g, ' ').trim();\n      var verified = !!(r.reviewer && r.reviewer.isVerified);\n      var media = r.media || [];\n\n      var verifiedBadge = verified\n        ? '<span class=\"pj-r-review-verified\" title=\"Compra verificada\"><svg viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"2.5 6.5 5 8.5 9.5 3.5\"></polyline></svg>Verificado</span>'\n        : '';\n\n      var photosHtml = '';\n      var photoCount = 0;\n      for (var j = 0; j < media.length; j++) {\n        var m = media[j];\n        if (m.type !== 'image') continue;\n        var thumbUrl = m.thumbnailUrl || m.largeUrl || m.fullSizeUrl;\n        var fullUrl = m.largeUrl || m.fullSizeUrl || m.thumbnailUrl;\n        if (!thumbUrl) continue;\n        var attrs = 'src=\"' + escapeHtml(thumbUrl) + '\"'\n          + ' data-photo-src=\"' + escapeHtml(fullUrl) + '\"'\n          + ' data-photo-name=\"' + escapeHtml(name) + '\"'\n          + ' data-photo-body=\"' + escapeHtml(body) + '\"';\n        if (photoCount === 0) photosHtml += '<div class=\"pj-r-review-photos\">';\n        photosHtml += '<img class=\"pj-r-review-photo\" ' + attrs + ' alt=\"\" loading=\"lazy\">';\n        photoCount++;\n      }\n      if (photoCount > 0) photosHtml += '</div>';\n\n      return '<li>'\n        +   '<div class=\"pj-r-review-head\">'\n        +     '<strong class=\"pj-r-review-name\">' + escapeHtml(name) + '</strong>'\n        +     verifiedBadge\n        +     '<span class=\"pj-r-review-time\">' + escapeHtml(ago) + '</span>'\n        +   '</div>'\n        +   '<span class=\"pj-r-stars pj-r-stars--small\" aria-hidden=\"true\">' + okendoStarsFor(r.rating) + '</span>'\n        +   '<p class=\"pj-r-review-text\">' + escapeHtml(body) + '</p>'\n        +   photosHtml\n        + '</li>';\n    }\n\n    function renderFromCache() {\n      var filtered = applyFilter(allReviews);\n      if (currentFilter === 'recent' || currentFilter === 'photos') {\n        filtered = filtered.slice().sort(function (a, b) {\n          return new Date(b.dateCreated || 0) - new Date(a.dateCreated || 0);\n        });\n      }\n      if (filtered.length === 0) {\n        if (nextUrl && !isFetching) {\n          // ainda h\u00E1 mais p\u00E1ginas pra buscar \u2014 mostra loading e tenta puxar\n          listEl.innerHTML = '<li class=\"pj-r-reviews-empty\">Procurando avalia\u00E7\u00F5es\u2026</li>';\n        } else {\n          listEl.innerHTML = '<li class=\"pj-r-reviews-empty\">Nenhuma avalia\u00E7\u00E3o com esse filtro.</li>';\n        }\n        return;\n      }\n      var html = '';\n      for (var i = 0; i < filtered.length; i++) html += renderReview(filtered[i]);\n      listEl.innerHTML = html;\n    }\n\n    function renderSkeleton() {\n      listEl.innerHTML = '<li class=\"pj-r-reviews-empty\">Carregando avalia\u00E7\u00F5es\u2026</li>';\n    }\n\n    function fetchAndAppend() {\n      if (isFetching || !nextUrl) return Promise.resolve();\n      var gen = reqGen;         // se o filtro mudar no meio, esta resposta \u00E9 descartada\n      isFetching = true;\n      setMoreState('loading');\n      /* blindagem (14/07): _cb \u00FAnico fura browser/proxy/service-worker cache;\n         no-store impede reuso local. Reviews \"presas no passado\" recorriam a payload velho. */\n      var fetchUrl = BASE + ensureV1(nextUrl);\n      fetchUrl += (fetchUrl.indexOf('?') >= 0 ? '&' : '?') + '_cb=' + Date.now();\n      return fetch(fetchUrl, { cache: 'no-store' }).then(function (r) {\n        if (!r.ok) throw new Error('http ' + r.status);\n        return r.json();\n      }).then(function (data) {\n        if (gen !== reqGen) return null;   // resposta de filtro antigo em voo \u2014 ignora\n        var arr = (data && data.reviews) || [];\n        for (var i = 0; i < arr.length; i++) allReviews.push(arr[i]);\n        nextUrl = (data && data.nextUrl) ? data.nextUrl : null;\n        renderFromCache();\n        setMoreState(nextUrl ? 'idle' : 'done');\n        isFetching = false;\n        return null;\n      }).catch(function (e) {\n        if (gen !== reqGen) return;\n        if (window && window.console) console.warn('Okendo reviews fetch error', e);\n        setMoreState('error');\n        isFetching = false;\n      });\n    }\n\n    /* Se o filter ativo retornar < 3 resultados, auto-puxa mais p\u00E1ginas\n       at\u00E9 ter resultado satisfat\u00F3rio ou acabar pagina\u00E7\u00E3o.\n       Pra 'photos', tenta at\u00E9 8 vezes pq fotos s\u00E3o raras. */\n    function ensureMinResults(attemptsLeft) {\n      if (attemptsLeft == null) attemptsLeft = currentFilter === 'photos' ? 8 : 3;\n      if (attemptsLeft <= 0) return;\n      var filtered = applyFilter(allReviews);\n      if (filtered.length >= 5 || !nextUrl) return;\n      fetchAndAppend().then(function () { ensureMinResults(attemptsLeft - 1); });\n    }\n\n    function setFilter(name) {\n      reqGen++;                 // invalida qualquer resposta em voo do filtro anterior\n      isFetching = false;       // libera a trava pra request do filtro novo sair j\u00E1\n      currentFilter = name;\n      Array.prototype.forEach.call(filterBtns, function (b) {\n        b.classList.toggle('is-active', b.getAttribute('data-rev-filter') === name);\n      });\n      // Reset completo \u2014 cada filter tem orderBy pr\u00F3prio, ent\u00E3o precisa nova query.\n      allReviews = [];\n      nextUrl = buildInitialUrl(name);\n      listEl.innerHTML = '<li class=\"pj-r-reviews-empty\">Carregando\u2026</li>';\n      fetchAndAppend().then(function () { ensureMinResults(); });\n    }\n\n    Array.prototype.forEach.call(filterBtns, function (btn) {\n      btn.addEventListener('click', function () {\n        setFilter(btn.getAttribute('data-rev-filter'));\n      });\n    });\n\n    renderSkeleton();\n    fetchAndAppend();\n    loadGalleryPhotos();\n    if (moreBtn) moreBtn.addEventListener('click', fetchAndAppend);\n  }\n\n  /* ----- Wiring por tela do quiz -------------------------------------- */\n\n  function wireDoresCards(state, step) {\n    step = step || stepEls[1];\n    if (!step) return;\n    var cards = step.querySelectorAll('.pj-card');\n    Array.prototype.forEach.call(cards, function (card) {\n      var id = card.dataset.id;\n      if (state.answers.dores.indexOf(id) !== -1) card.classList.add('is-selected');\n      card.addEventListener('click', function () {\n        var idx = state.answers.dores.indexOf(id);\n        if (idx === -1) state.answers.dores.push(id);\n        else state.answers.dores.splice(idx, 1);\n        card.classList.toggle('is-selected');\n        saveState(state);\n        refreshCta(state);\n        // P1 engagement tracking \u2014 alimenta cohort analysis no PostHog\n        _p1NoteCardClick(state.answers.dores.length);\n      });\n    });\n  }\n\n  /* Step 2 \u2014 Principal Dor (condicional): mostra apenas os cards das dores selecionadas no step 1 */\n  function showPrincipalDorCards(state) {\n    var step = stepEls[2];\n    if (!step) return;\n    var cards = step.querySelectorAll('.pj-card--principal');\n    var dores = Array.isArray(state.answers.dores) ? state.answers.dores : [];\n    Array.prototype.forEach.call(cards, function (card) {\n      var id = card.dataset.id;\n      var inDores = dores.indexOf(id) !== -1;\n      card.classList.toggle('hidden', !inDores);\n      card.classList.toggle('is-selected', inDores && id === state.answers.principalDor);\n      card.setAttribute('aria-checked', (id === state.answers.principalDor) ? 'true' : 'false');\n    });\n  }\n\n  function wirePrincipalDorOptions(state) {\n    var step = stepEls[2];\n    if (!step) return;\n    var cards = step.querySelectorAll('.pj-card--principal');\n    Array.prototype.forEach.call(cards, function (card) {\n      var id = card.dataset.id;\n      card.addEventListener('click', function () {\n        if (card.classList.contains('hidden')) return;\n        Array.prototype.forEach.call(cards, function (c) {\n          c.classList.remove('is-selected');\n          c.setAttribute('aria-checked', 'false');\n        });\n        card.classList.add('is-selected');\n        card.setAttribute('aria-checked', 'true');\n        state.answers.principalDor = id;\n        saveState(state);\n        refreshCta(state);\n        scheduleAdvance(state);\n      });\n    });\n  }\n\n  /* A/B (pictograms): layout COMPACTO dos cards de dor (P1 + P2).\n     Troca a imagem de IA pelo pictograma PNG do cliente (window.PJ_PICTO_SRC,\n     vindo do Liquid), reestrutura o card pra \u00EDcone + label na MESMA linha, e\n     muda o grid pra 2 colunas (p\u00E1gina curta). S\u00F3 na variante 'pictograms'.\n     Idempotente (card j\u00E1 com .pj-card--picto \u00E9 pulado). */\n  function applyCardVariant() {\n    if (_cardVariant !== 'pictograms' || !root) return;\n    var SRC = window.PJ_PICTO_SRC || {};\n    var cards = root.querySelectorAll('.pj-step[data-step=\"1\"] .pj-card, .pj-step[data-step=\"2\"] .pj-card--principal');\n    Array.prototype.forEach.call(cards, function (card) {\n      if (card.classList.contains('pj-card--picto')) return; // j\u00E1 feito\n      var id = card.getAttribute('data-id');\n      var src = SRC[id];\n      if (!src) return;\n      card.classList.add('pj-card--picto');\n      var wrap = card.querySelector('.pj-card-img-wrap');\n      var img = document.createElement('img');\n      img.className = 'pj-card-picto-img';\n      img.src = src;\n      img.alt = '';\n      img.setAttribute('aria-hidden', 'true');\n      img.setAttribute('decoding', 'async');\n      card.insertBefore(img, card.firstChild);\n      if (wrap) wrap.parentNode.removeChild(wrap); // remove o bloco da imagem de IA\n    });\n    // Grid 2 colunas (compacto) em P1 e P2.\n    var grids = root.querySelectorAll('.pj-step[data-step=\"1\"] .pj-cards-grid, .pj-step[data-step=\"2\"] .pj-cards-grid');\n    Array.prototype.forEach.call(grids, function (g) { g.classList.add('pj-grid--picto'); });\n  }\n\n  /* Step 3 \u2014 N\u00EDvel Acne (condicional, s\u00F3 se principalDor === 'acne'): single-select 6 n\u00EDveis */\n  function wireAcneNivelOptions(state) {\n    var step = stepEls[3];\n    if (!step) return;\n    var cards = step.querySelectorAll('.pj-card--acne');\n    Array.prototype.forEach.call(cards, function (card) {\n      var id = card.dataset.id;\n      card.addEventListener('click', function () {\n        Array.prototype.forEach.call(cards, function (c) {\n          c.classList.remove('is-selected');\n          c.setAttribute('aria-checked', 'false');\n        });\n        card.classList.add('is-selected');\n        card.setAttribute('aria-checked', 'true');\n        state.answers.acneNivel = id;\n        saveState(state);\n        refreshCta(state);\n        scheduleAdvance(state);\n      });\n    });\n  }\n\n  function wireFrequenciaOptions(state) {\n    var step = stepEls[10];\n    if (!step) return;\n    var options = step.querySelectorAll('.pj-option');\n    Array.prototype.forEach.call(options, function (opt) {\n      var id = opt.dataset.id;\n      if (state.answers.frequencia === id) opt.classList.add('is-selected');\n      opt.addEventListener('click', function () {\n        Array.prototype.forEach.call(options, function (o) { o.classList.remove('is-selected'); });\n        opt.classList.add('is-selected');\n        state.answers.frequencia = id;\n        saveState(state);\n        refreshCta(state);\n        scheduleAdvance(state);\n      });\n    });\n  }\n\n  function wireTempoRotinaOptions(state) {\n    var step = stepEls[8];\n    if (!step) return;\n    var options = step.querySelectorAll('.pj-option');\n    Array.prototype.forEach.call(options, function (opt) {\n      var id = opt.dataset.id;\n      if (state.answers.tempoRotina === id) opt.classList.add('is-selected');\n      opt.addEventListener('click', function () {\n        Array.prototype.forEach.call(options, function (o) { o.classList.remove('is-selected'); });\n        opt.classList.add('is-selected');\n        state.answers.tempoRotina = id;\n        saveState(state);\n        refreshCta(state);\n        scheduleAdvance(state);\n      });\n    });\n  }\n\n  function wireTomPeleSwatches(state) {\n    var step = stepEls[6];\n    if (!step) return;\n    var swatches = step.querySelectorAll('.pj-tom');\n    Array.prototype.forEach.call(swatches, function (sw) {\n      var id = sw.dataset.id;\n      if (state.answers.tomPele === id) sw.classList.add('is-selected');\n      sw.addEventListener('click', function () {\n        Array.prototype.forEach.call(swatches, function (s) { s.classList.remove('is-selected'); });\n        sw.classList.add('is-selected');\n        state.answers.tomPele = id;\n        saveState(state);\n        refreshCta(state);\n        scheduleAdvance(state);\n      });\n    });\n  }\n\n  function wireTipoPeleOptions(state) {\n    var step = stepEls[7];\n    if (!step) return;\n    var options = step.querySelectorAll('.pj-card');\n    Array.prototype.forEach.call(options, function (opt) {\n      var id = opt.dataset.id;\n      if (state.answers.tipoPele === id) opt.classList.add('is-selected');\n      opt.addEventListener('click', function () {\n        Array.prototype.forEach.call(options, function (o) { o.classList.remove('is-selected'); });\n        opt.classList.add('is-selected');\n        state.answers.tipoPele = id;\n        saveState(state);\n        refreshCta(state);\n        scheduleAdvance(state);\n      });\n    });\n  }\n\n  function wireAgeInput(state) {\n    var step = stepEls[9];\n    if (!step) return;\n    var input = step.querySelector('.pj-age-input');\n    var card = step.querySelector('.pj-age-card');\n    var preview = step.querySelector('.pj-age-preview');\n    var italic = step.querySelector('.pj-age-italic');\n    if (!input || !card) return;\n    input.value = state.answers.idade || '';\n\n    function sync() {\n      var cleaned = input.value.replace(/\\D/g, '').slice(0, 2);\n      input.value = cleaned;\n      var n = parseInt(cleaned, 10);\n      var valid = !isNaN(n) && n >= 10 && n <= 99;\n      card.classList.toggle('has-value', cleaned.length > 0);\n      card.classList.toggle('is-valid', valid);\n      if (preview && italic) {\n        if (valid) {\n          preview.classList.remove('hidden');\n          italic.textContent = cleaned;\n        } else {\n          preview.classList.add('hidden');\n        }\n      }\n      state.answers.idade = cleaned;\n      saveState(state);\n      refreshCta(state);\n    }\n\n    sync();\n    input.addEventListener('input', sync);\n    input.addEventListener('keydown', function (e) {\n      if (e.key === 'Enter' && !ctaBtn.disabled) { e.preventDefault(); ctaBtn.click(); }\n    });\n  }\n\n  function wireNameInput(state) {\n    var step = stepEls[4];\n    if (!step) return;\n    var input = step.querySelector('.pj-name-input');\n    var card = step.querySelector('.pj-name-card');\n    var preview = step.querySelector('.pj-name-preview');\n    var italic = step.querySelector('.pj-name-italic');\n    var greetingName = step.querySelector('.pj-greeting-name');\n    if (!input || !card || !preview || !italic) return;\n    input.value = state.answers.nome || '';\n\n    function sync() {\n      var v = input.value.trim();\n      var valid = v.length >= 2;\n      card.classList.toggle('is-valid', valid);\n      if (valid) {\n        preview.classList.remove('hidden');\n        italic.textContent = cap(v);\n      } else {\n        preview.classList.add('hidden');\n      }\n      // Atualiza o saudar do t\u00EDtulo: \"Deixa a gente te conhecer melhor[, Nome] \uD83E\uDD1D\"\n      if (greetingName) {\n        greetingName.textContent = valid ? ', ' + cap(v) : '';\n      }\n      state.answers.nome = input.value;\n      saveState(state);\n      refreshCta(state);\n    }\n\n    sync();\n    input.addEventListener('input', sync);\n    input.addEventListener('keydown', function (e) {\n      if (e.key === 'Enter' && !ctaBtn.disabled) { e.preventDefault(); ctaBtn.click(); }\n    });\n  }\n\n  function wireAdSlider() {\n    var step = stepEls[5];\n    if (!step) return;\n    var slider = step.querySelector('.pj-ad-slider');\n    if (!slider) return;\n    var cards = slider.querySelectorAll('.pj-ad-card');\n    if (!cards.length) return;\n    var prev = step.querySelector('.pj-ad-arrow--prev');\n    var next = step.querySelector('.pj-ad-arrow--next');\n    var dots = step.querySelectorAll('.pj-ad-dot');\n\n    function colWidth() {\n      var first = cards[0];\n      return first ? (first.offsetWidth + 12) : (slider.clientWidth * 0.8);\n    }\n    function activeCol() {\n      var col = Math.round(slider.scrollLeft / colWidth());\n      if (col < 0) col = 0;\n      if (dots.length && col > dots.length - 1) col = dots.length - 1;\n      return col;\n    }\n    function updateStates() {\n      var atStart = slider.scrollLeft <= 4;\n      var atEnd = slider.scrollLeft + slider.clientWidth >= slider.scrollWidth - 4;\n      if (prev) prev.disabled = atStart;\n      if (next) next.disabled = atEnd;\n      var col = activeCol();\n      Array.prototype.forEach.call(dots, function (dot, i) {\n        dot.classList.toggle('is-active', i === col);\n      });\n    }\n    if (prev) prev.addEventListener('click', function () {\n      slider.scrollBy({ left: -colWidth(), behavior: 'smooth' });\n    });\n    if (next) next.addEventListener('click', function () {\n      slider.scrollBy({ left: colWidth(), behavior: 'smooth' });\n    });\n    Array.prototype.forEach.call(dots, function (dot, i) {\n      dot.addEventListener('click', function () {\n        slider.scrollTo({ left: i * colWidth(), behavior: 'smooth' });\n      });\n    });\n    var scrollTimer;\n    slider.addEventListener('scroll', function () {\n      clearTimeout(scrollTimer);\n      scrollTimer = setTimeout(updateStates, 60);\n    }, { passive: true });\n    window.addEventListener('resize', updateStates);\n    setTimeout(updateStates, 50);\n  }\n\n  function wireContactInputs(state) {\n    var step = stepEls[12];\n    if (!step) return;\n    var emailField = step.querySelector('[data-field=\"email\"]');\n    var emailInput = emailField ? emailField.querySelector('.pj-input') : null;\n    var phoneField = step.querySelector('[data-field=\"whatsapp\"]');\n    var phoneInput = phoneField ? phoneField.querySelector('.pj-input') : null;\n    if (!emailInput || !phoneInput) return;\n\n    emailInput.value = state.answers.email || '';\n    phoneInput.value = state.answers.whatsapp ? formatPhone(state.answers.whatsapp) : '';\n\n    function syncEmail() {\n      state.answers.email = emailInput.value.trim();\n      emailField.classList.toggle('is-valid', isValidEmail(state.answers.email));\n      saveState(state);\n      refreshCta(state);\n    }\n    function syncPhone() {\n      var formatted = formatPhone(phoneInput.value);\n      phoneInput.value = formatted;\n      state.answers.whatsapp = formatted;\n      phoneField.classList.toggle('is-valid', isValidPhone(formatted));\n      saveState(state);\n      refreshCta(state);\n    }\n\n    syncEmail();\n    syncPhone();\n\n    emailInput.addEventListener('input', syncEmail);\n    emailInput.addEventListener('focus', function () { emailField.classList.add('is-focused'); });\n    emailInput.addEventListener('blur', function () { emailField.classList.remove('is-focused'); });\n    phoneInput.addEventListener('input', syncPhone);\n    phoneInput.addEventListener('focus', function () { phoneField.classList.add('is-focused'); });\n    phoneInput.addEventListener('blur', function () { phoneField.classList.remove('is-focused'); });\n    phoneInput.addEventListener('keydown', function (e) {\n      if (e.key === 'Enter' && !ctaBtn.disabled) { e.preventDefault(); ctaBtn.click(); }\n    });\n  }\n\n  /* ----- Init ---------------------------------------------------------- */\n\n  // Helper pra deferir trabalho non-critical pra idle time do main thread.\n  // Reduz TBT (Total Blocking Time) do Lighthouse: cada wire function vira\n  // task isolada que o browser executa entre frames de paint/scroll, sem\n  // bloquear o user de ver conte\u00FAdo. Fallback setTimeout pra browsers sem\n  // requestIdleCallback (Safari < 17 e alguns mobile).\n  function idle(fn, fallbackDelay) {\n    if (typeof window.requestIdleCallback === 'function') {\n      window.requestIdleCallback(fn, { timeout: 2000 });\n    } else {\n      setTimeout(fn, fallbackDelay || 50);\n    }\n  }\n\n  function init() {\n    root = document.getElementById('pj-quiz');\n    if (!root) return;\n    quizEl = root.querySelector('.pj-quiz-mode');\n    resultEl = root.querySelector('.pj-result');\n    progressSegments = root.querySelector('.pj-progress-segments');\n    progressCount = root.querySelector('.pj-progress-count');\n    ctaBtn = root.querySelector('.pj-cta');\n    ctaLabel = root.querySelector('.pj-cta-label');\n    prevBtn = root.querySelector('.pj-prev');\n    for (var n = 1; n <= STEP_COUNT; n++) {\n      stepEls[n] = root.querySelector('.pj-step[data-step=\"' + n + '\"]');\n    }\n\n    // A/B: aplica pictogramas nos cards de dor (P1/P2) se for a variante de teste.\n    applyCardVariant();\n\n    // Ambas as variantes usam FOTOS REAIS: o Principal Dor (step 2) tem o markup com\n    // as imgs antigas (dor-*.jpg). Copia os src das fotos (dor-*-c.jpg) do step 15 pros\n    // cards de mesmo data-id no step 2 \u2014 sen\u00E3o a tela \"qual delas...\" fica inconsistente.\n    if (stepEls[2] && stepEls[15]) {\n      var _cSrc = {};\n      Array.prototype.forEach.call(stepEls[15].querySelectorAll('.pj-card'), function (c) {\n        var img = c.querySelector('.pj-card-img');\n        if (img) _cSrc[c.getAttribute('data-id')] = img.getAttribute('src');\n      });\n      Array.prototype.forEach.call(stepEls[2].querySelectorAll('.pj-card'), function (c) {\n        var img = c.querySelector('.pj-card-img'), id = c.getAttribute('data-id');\n        if (img && _cSrc[id]) img.setAttribute('src', _cSrc[id]);\n      });\n    }\n\n    var state = loadState();\n    if (!state) state = makeInitialState();\n\n    // Detecta se est\u00E1 numa result page comparando o pathname atual com qualquer\n    // entry do RESULT_PAGE_BY_DOR (legacy /pages/diagnostic-result + as novas\n    // pages opacas por dor). Fallback de query string ?completed=true pra\n    // compat com bookmarks/UTMs antigos.\n    var currentPath = window.location.pathname;\n    var isResultPath = false;\n    for (var dorKey in RESULT_PAGE_BY_DOR) {\n      if (RESULT_PAGE_BY_DOR.hasOwnProperty(dorKey) &&\n          currentPath.indexOf(RESULT_PAGE_BY_DOR[dorKey]) !== -1) {\n        isResultPath = true;\n        break;\n      }\n    }\n    // Detec\u00E7\u00E3o tamb\u00E9m pelo template (defesa em profundidade \u2014 se o user criar\n    // mais pages no futuro com template_suffix=diagnostic-result mas sem ter\n    // entry no mapa, ainda funciona como result page).\n    if (!isResultPath && document.body && document.body.className) {\n      isResultPath = document.body.className.indexOf('diagnostic-result') !== -1;\n    }\n    var params = new URLSearchParams(window.location.search);\n    var isCompletedView = isResultPath || params.get('completed') === 'true';\n\n    // Safety lock: se redirecionamos nos \u00FAltimos 3s, n\u00E3o redireciona de novo.\n    // Mata qualquer loop independente da causa raiz (state corrompido, URL n\u00E3o\n    // matching, etc). Usa sessionStorage pra escopo de tab (limpa ao fechar).\n    var REDIRECT_LOCK_KEY = 'pj_redirect_lock';\n    var REDIRECT_LOCK_MS = 3000;\n    function recentlyRedirected() {\n      try {\n        var raw = sessionStorage.getItem(REDIRECT_LOCK_KEY);\n        if (!raw) return false;\n        var ts = parseInt(raw, 10);\n        if (isNaN(ts)) return false;\n        return (Date.now() - ts) < REDIRECT_LOCK_MS;\n      } catch (_) { return false; }\n    }\n    function markRedirect() {\n      try { sessionStorage.setItem(REDIRECT_LOCK_KEY, String(Date.now())); } catch (_) {}\n    }\n\n    // Resume \u2192 result page pra returning users. 2 cenarios cobertos:\n    //   1. completedAt setado (passou pela form de contato com sucesso)\n    //   2. step >= STEP_COUNT (chegou na form mas nao completou \u2014 provavel ter\n    //      desistido de dar email/whatsapp). Se voltarem, melhor ver result\n    //      que reabrir a form que ja recusaram preencher.\n    // Em ambos: state.answers.principalDor precisa estar setado (= kit assignado).\n    // Users mid-quiz (step < 12) continuam de onde pararam, como sempre foi.\n    // resetState() limpa tudo, entao quem clica \"Refazer\" comeca do zero.\n    var reachedEnd = (state.completedAt) || (typeof state.step === 'number' && state.step === LAST_STEP);\n    if (!isResultPath && reachedEnd && state.answers && state.answers.principalDor && !recentlyRedirected()) {\n      markRedirect();\n      var resumeUrl = RESULT_PAGE_BY_DOR[state.answers.principalDor] || DEFAULT_RESULT_PAGE;\n      /* 11/08: feedback visual durante o redirect \u2014 antes ficava tela em branco (anti-flash\n         esconde o quiz) e, na variante intro, o INICIAR aparecia MORTO (o return abaixo\n         roda antes do wiring). Overlay inline: zero depend\u00EAncia de CSS externo. */\n      try {\n        var pjRedirMsg = document.createElement('div');\n        pjRedirMsg.style.cssText = 'position:fixed;inset:0;z-index:99999;display:flex;flex-direction:column;gap:14px;align-items:center;justify-content:center;background:#F5F0EB;color:#3D4A33;font:700 15px Montserrat,system-ui,sans-serif;text-align:center;padding:0 24px';\n        pjRedirMsg.innerHTML = 'Encontramos seu resultado.<br>Carregando\u2026';\n        (document.body || document.documentElement).appendChild(pjRedirMsg);\n      } catch (_) {}\n      window.location.replace(resumeUrl);\n      return;\n    }\n\n    if (isCompletedView) {\n      // Sem state.completedAt no result path \u2192 manda pro quiz pra completar\n      if (isResultPath && !state.completedAt && !recentlyRedirected()) {\n        markRedirect();\n        window.location.href = '/pages/diagnostic';\n        return;\n      }\n      if (state.completedAt) {\n        // Cache da dor pra wire functions (event tracking inclui kit_code)\n        _resultDor = state.answers.principalDor || '';\n        // CR\u00CDTICO \u2014 above-the-fold, precisa rodar antes do user interagir:\n        // render do conte\u00FAdo + CTA principal + kit switcher + sticky.\n        // ORDEM IMPORTA: buildGalleryThumbs PRECISA rodar antes de\n        // wireKitAlternatives \u2014 o filtro de variant (updateGalleryForVariant)\n        // chamado no init de wireKitAlternatives filtra os thumbs por\n        // data-variant-set, mas se os thumbs ainda n\u00E3o foram criados, nenhum\n        // filtro \u00E9 aplicado e todos os thumbs (de todos os kits) aparecem.\n        renderResultPage(state);\n        buildGalleryThumbs();\n        wireGalleryArrows();\n        wireKitAlternatives();\n        wireCtaCartAdd();\n        wireSubscriptionToggle();\n        wireFrequencyToggle();\n        wireBump();\n        wireStickyCta();\n        wireSubscriptionDetailsModal();\n\n        // DEFERIDO \u2014 below-the-fold ou s\u00F3 ativa em intera\u00E7\u00E3o. Roda em idle pra\n        // n\u00E3o bloquear o paint inicial (reduz TBT do Lighthouse de ~2000ms).\n        idle(function () { enhanceRoutineDescriptions(); });\n        idle(function () { wireRoutineComposition(); wireRoutineAccordion(); wireRoutineSliders(); });\n        idle(function () { wireVideoTestimonials(); wireVideoDots(); });\n        idle(function () { wireSliderArrows(); wireResultAdDots(); });\n        idle(function () { wireModalCloseDelegation(); wireOkendoPhotoLightbox(); });\n        idle(function () { wireScrollAnchors(); wireIaMore(); wireResultRestart(); });\n        idle(function () { wireOkendoReviews(); }, 500); /* inflateOkendoCount desligado: count fixo 14.534 server-side (sem flash) */\n        // PORTAL dos modais (21/07): wrappers legados do tema criam stacking\n        // context/containing block \u2014 o fixed z-index 10000 ficava ATR\u00C1S do header\n        // sticky (z 960). Mover pro <body> tira do contexto-armadilha. Roda por\n        // \u00FAltimo: os wire*() acima j\u00E1 capturaram as refs por closure, e o fechar\n        // \u00E9 delegado no document (n\u00E3o no resultEl).\n        idle(function () {\n          var mods = document.querySelectorAll('.pj-r-modal');\n          Array.prototype.forEach.call(mods, function (m) { document.body.appendChild(m); });\n        }, 1200);\n        return;\n      }\n      var url = new URL(window.location.href);\n      url.searchParams.delete('completed');\n      window.history.replaceState({}, '', url.toString());\n    }\n\n    // Setup do mapa de wiring. Cada step s\u00F3 \u00E9 wirado quando goToStep \u00E9\n    // chamado pra ele (on-demand). Elimina o trabalho desnecess\u00E1rio de\n    // pre-wirar 12 steps no init que virava long tasks no Lighthouse.\n    _stepWirers = {\n      1:  function () { wireDoresCards(state); },\n      2:  function () { wirePrincipalDorOptions(state); },\n      3:  function () { wireAcneNivelOptions(state); },\n      4:  function () { wireNameInput(state); },\n      5:  function () { wireAdSlider(); },\n      6:  function () { wireTomPeleSwatches(state); },\n      7:  function () { wireTipoPeleOptions(state); },\n      8:  function () { wireTempoRotinaOptions(state); },\n      9:  function () { wireAgeInput(state); },\n      10: function () { wireFrequenciaOptions(state); },\n      11: function () { /* interstitial Forbes - sem wiring espec\u00EDfico */ },\n      12: function () { wireContactInputs(state); },\n      13: function () { wireDoresCards(state, stepEls[13]); },\n      14: function () { wireDoresCards(state, stepEls[14]); },\n      15: function () { wireDoresCards(state, stepEls[15]); }\n    };\n\n    ctaBtn.addEventListener('click', function () {\n      if (ctaBtn.disabled) return;\n      // GA4: usu\u00E1rio respondeu o step atual e avan\u00E7ou. Diferente do step_view\n      // (que dispara em qualquer entrada, inclusive back). Esse s\u00F3 dispara em\n      // forward \u2014 \u00E9 o que importa pro funil de convers\u00E3o.\n      pjTrack('step_answered', { step: state.step, dor_principal: state.answers.principalDor || '' });\n      goToStep(state, routeNext(state));\n    });\n    prevBtn.addEventListener('click', function () {\n      // GA4: usu\u00E1rio voltou \u2014 \u00FAtil pra mapear pontos de fric\u00E7\u00E3o/d\u00FAvida.\n      pjTrack('back', { step: state.step });\n      goToStep(state, routePrev(state));\n    });\n\n    // Landing por VARIANTE: um state fresco (nunca salvou \u2192 updatedAt null) abre no\n    // TOPO da rota da variante (B=Nome, C=Tipo, A=Dores). O state inicial nasce com\n    // step=1, ent\u00E3o N\u00C3O d\u00E1 pra confiar nele direto. Resume s\u00F3 vale se o step salvo\n    // ainda pertence \u00E0 rota atual.\n    var _route = getRoute(state);\n    var landing;\n    if (!state.updatedAt) {\n      landing = _route[0];\n    } else if (typeof state.step === 'number' && _route.indexOf(state.step) !== -1) {\n      landing = state.step;\n    } else {\n      landing = _route[0];\n    }\n    if (landing > STEP_COUNT) landing = STEP_COUNT;\n\n    // GA4: usu\u00E1rio aterrissou no /pages/diagnostic. Diferente do GA4 page_view\n    // autom\u00E1tico \u2014 esse s\u00F3 dispara quando o quiz foi inicializado com sucesso\n    // (filtra crawlers, prerender, etc). \u00C9 o \"topo de funil\" do quiz.\n    pjTrack('landing', { step: landing, has_state: state.startedAt ? 1 : 0 });\n\n    // === INTRO PAGE (V3) ===\n    // Se a intro existir no markup (V3 theme), mostra ela primeiro.\n    // Quiz body fica oculto via CSS. Click no INICIAR: hide intro, show body.\n    // goToStep ainda dispara \u2014 wire dos steps acontece em background \u2014 s\u00F3 nao\n    // visivel ate o usuario dismissar a intro.\n    var introEl = root.querySelector('.pj-intro');\n    /* 27/07: o CTA vive na barra sticky PORTALADA pro <body> (fora do root) \u2014\n       buscar no document, sen\u00E3o o wiring falha e a variante B abre sem intro. */\n    var introCta = document.querySelector('#pj-intro-cta');\n    var quizBodyEl = root.querySelector('.pj-quiz-body');\n    if (INTRO_ENABLED && introEl && introCta && quizBodyEl) {\n      pjTrack('intro_view');\n      var introHandled = false;\n      introCta.addEventListener('click', function () {\n        if (introHandled) return;\n        introHandled = true;\n        pjTrack('intro_clicked');\n        introEl.classList.add('is-hidden');\n        /* 27/07: a barra sticky do INICIAR \u00E9 portalada pro <body> (fora da .pj-intro)\n           \u2014 precisa esconder explicitamente. */\n        var introBar = document.querySelector('.pj-intro-ctabar');\n        if (introBar) introBar.classList.add('is-hidden');\n        quizBodyEl.classList.add('is-visible');\n        try { window.scrollTo({ top: 0, left: 0, behavior: 'instant' }); } catch (_) { window.scrollTo(0, 0); }\n      });\n    } else if (quizBodyEl) {\n      // Intro OFF (flag) ou inexistente (V2/tema antigo) \u2014 abre o quiz direto.\n      if (introEl) introEl.classList.add('is-hidden');\n      quizBodyEl.classList.add('is-visible');\n    }\n\n    // goToStep vai chamar wireStepOnce(landing) automaticamente.\n    goToStep(state, landing);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n"],
  "mappings": "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",
  "names": ["init", "t", "e", "o", "prevBtn"]
}
