{
  "version": 3,
  "sources": ["/cdn/shop/t/19/assets/partial-pay-v2.js?cb=1779718141626593000"],
  "sourcesContent": ["/* ============================================================================\n   Farmkart Partial-Payment \u2014 frontend controller\n   ----------------------------------------------------------------------------\n   Spec : docs/superpowers/specs/2026-05-25-partial-payment-build-spec.md\n   Mock : docs/mocks/2026-05-25-partial-payment-mock.html\n   Snippet: snippets/partial-pay-button.liquid\n   Styles : assets/partial-pay.css\n\n   FLOW:\n     1. User clicks [data-fk-pp-open] \u2192 modal opens at state=form\n     2. Form submit \u2192 POST /apps/partial-pay/initiate (mock for now)\n     3. Pincode-loading \u2192 ShipRocket pincode check (reuses /apps/shipping)\n     4. Summary \u2192 user reviews \u2192 clicks Pay \u2192 Razorpay Standard Checkout opens\n     5. On Razorpay handler \u2192 POST /apps/partial-pay/result \u2192 poll for order\n     6. Success \u2192 order confirmed, balance reminder shown\n     7. Error path: any failure \u2192 state=error \u2192 retry routes back to summary\n\n   MOCK MODE:\n     Append ?fk_pp_mock=1 to URL \u2192 backend calls return fake data so the full\n     UX is reviewable without Vercel endpoints. Use for design QA.\n\n   ANALYTICS:\n     Fires custom events (forward-compatible + legacy Breeze names for tracking pipeline reuse):\n       'farmkart-partial-pay-initiate'  + legacy 'breeze-initiate-checkout'\n       'farmkart-partial-pay-purchase'  + legacy 'breeze-purchase'\n       'farmkart-partial-pay-error'\n\n   ACCESSIBILITY:\n     - role=dialog, aria-modal, focus trap, ESC to close, return focus on close.\n     - hidden attribute toggled per state (not just display:none) for screen readers.\n   ============================================================================ */\n\n(function () {\n  'use strict';\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // CONFIG & UTILITIES\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  var CFG = window.FK_PARTIAL_PAY || {};\n  var URL_PARAMS = new URLSearchParams(window.location.search);\n  var MOCK_MODE = URL_PARAMS.get('fk_pp_mock') === '1' || CFG.debug === true;\n  var RAZORPAY_SDK_URL = 'https://checkout.razorpay.com/v1/checkout.js';\n\n  function log() {\n    if (!CFG.debug && !MOCK_MODE) return;\n    var args = Array.prototype.slice.call(arguments);\n    args.unshift('[fk-pp]');\n    console.log.apply(console, args);\n  }\n\n  function rupees(paise) {\n    return CFG.currencySymbol + Math.round(paise / 100).toLocaleString('en-IN');\n  }\n\n  function ulid() {\n    // Lightweight ULID-ish: 10-char timestamp + 16-char randomness\n    var ts = Date.now().toString(36).toUpperCase().padStart(10, '0');\n    var rand = '';\n    for (var i = 0; i < 16; i++) {\n      rand += 'ABCDEFGHJKMNPQRSTVWXYZ0123456789'.charAt(Math.floor(Math.random() * 32));\n    }\n    return ts + rand;\n  }\n\n  function dispatchEvent(name, data) {\n    var detail = { data: data || {} };\n    window.dispatchEvent(new CustomEvent(name, { detail: detail }));\n    // Legacy event names \u2014 keep existing breeze.js analytics passthrough alive\n    if (name === 'farmkart-partial-pay-purchase') {\n      window.dispatchEvent(new CustomEvent('breeze-purchase', { detail: detail }));\n    }\n    if (name === 'farmkart-partial-pay-initiate') {\n      window.dispatchEvent(new CustomEvent('breeze-initiate-checkout', { detail: detail }));\n    }\n  }\n\n  function loadScript(src) {\n    return new Promise(function (resolve, reject) {\n      // Razorpay SDK already on window \u2014 fast path.\n      if (window.Razorpay) return resolve();\n\n      var existing = document.querySelector('script[src=\"' + src + '\"]');\n      var s = existing || document.createElement('script');\n      if (!existing) {\n        s.src = src;\n        s.async = true;\n        document.head.appendChild(s);\n      }\n\n      // Poll for window.Razorpay because s.onload fires before some browsers\n      // finish exposing the global, producing a false-positive\n      // \"Razorpay SDK failed to load\" error even though the SDK then opens\n      // milliseconds later (real bug witnessed on Tarun's 2026-05-26 payment).\n      var deadline = Date.now() + 10000;\n      var poll = setInterval(function () {\n        if (window.Razorpay) {\n          clearInterval(poll);\n          resolve();\n        } else if (Date.now() > deadline) {\n          clearInterval(poll);\n          reject(new Error('Razorpay SDK did not initialize within 10s'));\n        }\n      }, 50);\n\n      s.onerror = function () {\n        clearInterval(poll);\n        reject(new Error('Failed to load ' + src));\n      };\n    });\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // CART HELPERS \u2014 pulls live cart from Shopify Ajax API\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function fetchCart() {\n    if (MOCK_MODE) {\n      return Promise.resolve({\n        total_price: 240000,\n        items_subtotal_price: 235000,\n        total_shipping_price: 5000,\n        item_count: 3,\n        token: 'mock_cart_token_' + Date.now(),\n        items: [\n          { id: 1, product_title: 'Roko Fungicide 250g', variant_title: null, quantity: 1, final_line_price: 62000, vendor: 'UPL', sku: 'FK-ROKO-250' },\n          { id: 2, product_title: 'Bayer Insecticide 1L', variant_title: null, quantity: 1, final_line_price: 128000, vendor: 'Bayer', sku: 'FK-BAYER-1L' },\n          { id: 3, product_title: 'Sticker Spreader 500ml', variant_title: null, quantity: 1, final_line_price: 45000, vendor: 'Adjuvant', sku: 'FK-STICKER-500' }\n        ]\n      });\n    }\n    return fetch('/cart.js', { headers: { 'Accept': 'application/json' } })\n      .then(function (r) {\n        if (!r.ok) throw new Error('Cart fetch failed: ' + r.status);\n        return r.json();\n      });\n  }\n\n  function computeDeposit(totalPaise, rate, floorPaise) {\n    rate = rate || 0.05;\n    floorPaise = floorPaise || 15000;\n    var raw = Math.round(totalPaise * rate);\n    return Math.max(raw, floorPaise);\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // BACKEND ADAPTER \u2014 wraps fetch with mock-mode fallback\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function apiPost(path, body) {\n    if (MOCK_MODE) {\n      log('MOCK POST', path, body);\n      return new Promise(function (resolve) {\n        setTimeout(function () {\n          resolve(mockResponse(path, body));\n        }, 700 + Math.random() * 600);\n      });\n    }\n    return fetch(CFG.apiBase + path, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify(body),\n      credentials: 'same-origin'\n    }).then(function (r) {\n      return r.text().then(function (text) {\n        var json = null;\n        try { json = text ? JSON.parse(text) : {}; } catch (e) { json = { _raw: text }; }\n        if (!r.ok) {\n          var detail = (json && (json.detail || json.error)) || ('HTTP ' + r.status);\n          var err = new Error('API ' + path + ' failed: ' + detail);\n          err.status = r.status;\n          err.body = json;\n          throw err;\n        }\n        return json;\n      });\n    });\n  }\n\n  function mockResponse(path, body) {\n    if (path === '/initiate') {\n      var ppId = body.pp_id || ulid();\n      return {\n        ok: true,\n        pp_id: ppId,\n        razorpay_order_id: 'order_MOCK_' + ppId.slice(0, 10),\n        razorpay_key_id: CFG.razorpayKeyId,\n        amount_paise: body.deposit_paise,\n        currency: 'INR'\n      };\n    }\n    if (path === '/result' || path === '/order-confirm') {\n      return {\n        ok: true,\n        pp_id: body.pp_id,\n        order_name: '#FK-' + (4628 + Math.floor(Math.random() * 100)),\n        order_id: 6900000000000 + Math.floor(Math.random() * 100000),\n        financial_status: 'partially_paid',\n        balance_paise: body.balance_paise || 0,\n        estimated_delivery: '4\u20136 days'\n      };\n    }\n    if (path === '/pincode-check') {\n      var valid = /^\\d{6}$/.test(body.pincode || '');\n      return {\n        ok: valid,\n        serviceable: valid,\n        city: body.city || 'Indore',\n        edd_days: '4\u20136',\n        shipping_paise: 5000,\n        reason: valid ? null : 'invalid_pincode'\n      };\n    }\n    return { ok: true };\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // STATE MACHINE \u2014 drives modal visibility\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  var STATES = ['form', 'pincode-loading', 'summary', 'razorpay', 'success', 'error'];\n  var PROGRESS_INDEX = { 'form': 0, 'pincode-loading': 1, 'summary': 1, 'razorpay': 2, 'success': 3, 'error': 2 };\n\n  var ctx = {\n    modal: null,\n    isOpen: false,\n    state: 'form',\n    pp_id: null,\n    triggerCTA: null,     // remembers which CTA opened the modal (for focus return)\n    triggerContext: null, // 'pdp' | 'cart-drawer' | 'cart-page'\n    totalPaise: 0,\n    depositPaise: 0,\n    balancePaise: 0,\n    rate: 0.05,\n    shopper: null,        // populated after form submission\n    pinResult: null,      // populated after pincode check\n    cart: null            // populated from Shopify /cart.js\n  };\n\n  function setState(state) {\n    if (!ctx.modal) return;\n    if (STATES.indexOf(state) === -1) {\n      console.warn('[fk-pp] unknown state:', state);\n      return;\n    }\n    ctx.state = state;\n    log('state \u2192', state);\n    ctx.modal.querySelectorAll('[data-pp-state]').forEach(function (el) {\n      var match = el.getAttribute('data-pp-state') === state;\n      el.hidden = !match;\n    });\n    // Progress bar\n    var idx = PROGRESS_INDEX[state];\n    ctx.modal.querySelectorAll('.fk-pp-modal__progress span').forEach(function (el, i) {\n      el.classList.remove('is-active', 'is-done');\n      if (i < idx) el.classList.add('is-done');\n      else if (i === idx) el.classList.add('is-active');\n    });\n    // Title update\n    var titles = {\n      'form': 'Reserve your order',\n      'pincode-loading': 'Checking delivery\u2026',\n      'summary': 'Review & pay',\n      'razorpay': 'Complete UPI payment',\n      'success': 'All done!',\n      'error': 'Payment issue'\n    };\n    var titleEl = ctx.modal.querySelector('#fk-pp-modal-title');\n    if (titleEl && titles[state]) titleEl.textContent = titles[state];\n    // Focus management \u2014 focus first focusable in newly-visible section\n    setTimeout(function () {\n      var section = ctx.modal.querySelector('[data-pp-state=\"' + state + '\"]');\n      if (!section) return;\n      var firstField = section.querySelector('input, button, select, textarea, [href]');\n      if (firstField) firstField.focus({ preventScroll: true });\n    }, 50);\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // MODAL OPEN / CLOSE\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function openModal(triggerBtn) {\n    ctx.modal = document.getElementById('fk-pp-modal');\n    if (!ctx.modal) {\n      console.error('[fk-pp] Modal element #fk-pp-modal not found in DOM');\n      return;\n    }\n    ctx.triggerCTA = triggerBtn;\n    var ctaWrap = triggerBtn ? triggerBtn.closest('[data-fk-pp-cta]') : null;\n    if (ctaWrap) {\n      ctx.totalPaise = parseInt(ctaWrap.dataset.ppTotalPaise, 10) || 0;\n      ctx.depositPaise = parseInt(ctaWrap.dataset.ppDepositPaise, 10) || 0;\n      ctx.balancePaise = parseInt(ctaWrap.dataset.ppBalancePaise, 10) || 0;\n      ctx.rate = parseFloat(ctaWrap.dataset.ppRate) || 0.05;\n      ctx.triggerContext = ctaWrap.dataset.ppContext || 'unknown';\n      // PDP context: build a single-line pseudo-cart from the displayed product.\n      // Buy-Now flow \u2014 we reserve THIS product, not the cart contents.\n      // Variant ID source order (most robust first):\n      //   1. Snippet-set data-pp-variant-id (preferred; may be missing if section render cache is stale)\n      //   2. Shopify product form's hidden id input (always present + fresh on every render)\n      //   3. URL ?variant=NNN\n      if (ctx.triggerContext === 'pdp') {\n        var variantId = parseInt(ctaWrap.dataset.ppVariantId, 10);\n        if (!variantId) {\n          var hiddenInput = document.querySelector('product-form input[name=\"id\"], form input.product-variant-id, form[action*=\"/cart/add\"] input[name=\"id\"]');\n          if (hiddenInput && hiddenInput.value) variantId = parseInt(hiddenInput.value, 10);\n        }\n        if (!variantId) variantId = parseInt(URL_PARAMS.get('variant'), 10);\n        var qtyInput = document.querySelector('input[name=\"quantity\"], quantity-input input');\n        var qty = qtyInput ? Math.max(1, parseInt(qtyInput.value, 10) || 1) : 1;\n        if (variantId) {\n          var titleEl = document.querySelector('h1.product__title, h1[class*=\"product__title\"]');\n          ctx.pdpItem = {\n            id: variantId,\n            product_title: ctaWrap.dataset.ppProductTitle || (titleEl ? titleEl.textContent.trim() : ''),\n            quantity: qty,\n            final_line_price: ctx.totalPaise * qty,\n          };\n          log('pdp variant resolved', { variant_id: variantId, qty: qty, source: ctaWrap.dataset.ppVariantId ? 'data-attr' : 'form-input-fallback' });\n        } else {\n          console.error('[fk-pp] PDP: could not determine variant_id from data-attr / form input / URL \u2014 will fail validation');\n        }\n      }\n    }\n    ctx.pp_id = ulid();\n\n    // Always re-fetch the cart at modal open \u2014 cart may have changed since page load\n    fetchCart().then(function (cart) {\n      ctx.cart = cart;\n      // For cart contexts, override totals with live cart (PDP uses the buy-now product total)\n      if (ctx.triggerContext !== 'pdp') {\n        ctx.totalPaise = cart.total_price;\n        ctx.depositPaise = computeDeposit(ctx.totalPaise, ctx.rate);\n        ctx.balancePaise = ctx.totalPaise - ctx.depositPaise;\n      }\n      log('opened', { context: ctx.triggerContext, total: ctx.totalPaise, deposit: ctx.depositPaise, balance: ctx.balancePaise });\n      dispatchEvent('farmkart-partial-pay-initiate', {\n        shopOrderId: null,\n        totalPrice: ctx.totalPaise / 100,\n        currency: 'INR',\n        items: (cart.items || []).map(function (i) {\n          return { id: i.id, name: i.product_title, price: i.final_line_price / 100, quantity: i.quantity, variant: i.variant_title };\n        })\n      });\n    }).catch(function (err) {\n      log('cart fetch failed', err);\n      // Continue anyway with CTA-provided totals\n    });\n\n    ctx.modal.hidden = false;\n    ctx.modal.setAttribute('aria-hidden', 'false');\n    document.body.style.overflow = 'hidden';\n    ctx.isOpen = true;\n    // Pre-fill phone from any existing form data\n    setState('form');\n  }\n\n  function closeModal() {\n    if (!ctx.modal || !ctx.isOpen) return;\n    ctx.modal.hidden = true;\n    ctx.modal.setAttribute('aria-hidden', 'true');\n    document.body.style.overflow = '';\n    ctx.isOpen = false;\n    if (ctx.triggerCTA) ctx.triggerCTA.focus({ preventScroll: true });\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // FORM SUBMIT \u2192 pincode check \u2192 summary\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function handleFormSubmit(e) {\n    e.preventDefault();\n    var form = e.target;\n    var data = {};\n    new FormData(form).forEach(function (val, key) { data[key] = (val + '').trim(); });\n\n    // Minimal client-side validation; backend should re-verify\n    if (!data.phone || data.phone.length < 10) return alertInline('phone', 'Please enter a valid phone number');\n    if (!data.name) return alertInline('name', 'Please enter your name');\n    if (!data.address) return alertInline('address', 'Please enter your address');\n    if (!data.city) return alertInline('city', 'Please enter your city');\n    if (!/^\\d{6}$/.test(data.pincode || '')) return alertInline('pincode', 'Please enter a valid 6-digit pincode');\n\n    // Backend expects shopper.address to be a nested object (line1/city/state/pincode/country)\n    ctx.shopper = {\n      phone: data.phone,\n      name: data.name,\n      email: data.email || undefined,\n      address: {\n        line1: data.address,\n        city: data.city,\n        state: data.state || '',\n        pincode: data.pincode,\n        country: 'IN',\n      },\n    };\n    setState('pincode-loading');\n\n    apiPost('/pincode-check', { pincode: data.pincode, city: data.city })\n      .then(function (result) {\n        ctx.pinResult = result;\n        if (!result.serviceable) {\n          showError('We don\\'t deliver to pincode ' + data.pincode + ' yet. Please try another pincode or contact us on WhatsApp.');\n          return;\n        }\n        applyShippingToTotals();\n        renderSummary();\n        setState('summary');\n      })\n      .catch(function (err) {\n        log('pincode check failed', err);\n        // Soft-fail: proceed without pincode confirmation\n        ctx.pinResult = { serviceable: true, city: data.city, edd_days: '4\u20137', shipping_paise: ctx.cart ? (ctx.cart.total_shipping_price || 5000) : 5000 };\n        applyShippingToTotals();\n        renderSummary();\n        setState('summary');\n      });\n  }\n\n  // Roll shipping into ctx.totalPaise + ctx.balancePaise once we know it from\n  // the pincode check. PDP context starts with product-only total (Liquid snippet\n  // can't know shipping until pincode is entered). Cart contexts already include\n  // shipping via cart.total_price \u2014 skip there.\n  //\n  // Without this, the user saw \"balance \u20B9428\" on screen but Shopify charged\n  // \u20B9478 on delivery (\u20B950 shipping mismatch). Real bug seen on order #4622.\n  function applyShippingToTotals() {\n    if (ctx.triggerContext !== 'pdp') return;     // cart contexts already include shipping\n    if (ctx.shippingApplied) return;              // idempotent (back/edit pincode replays)\n    var shippingPaise = (ctx.pinResult && ctx.pinResult.shipping_paise) || 0;\n    if (shippingPaise <= 0) return;\n    ctx.totalPaise += shippingPaise;\n    ctx.balancePaise = Math.max(0, ctx.totalPaise - ctx.depositPaise);\n    ctx.shippingApplied = true;\n  }\n\n  function alertInline(fieldName, msg) {\n    var input = ctx.modal.querySelector('[name=\"' + fieldName + '\"]');\n    if (input) { input.focus(); input.setAttribute('aria-invalid', 'true'); }\n    alert(msg);  // TODO Phase 4: replace with inline error UI per field\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // SUMMARY RENDER\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function renderSummary() {\n    var m = ctx.modal;\n    // Pincode confirmation strip\n    var cityEl = m.querySelector('[data-pp-pin-city]');\n    var codeEl = m.querySelector('[data-pp-pin-code]');\n    var eddEl = m.querySelector('[data-pp-pin-edd]');\n    if (cityEl) cityEl.textContent = ctx.pinResult.city;\n    if (codeEl) codeEl.textContent = (ctx.shopper.address && ctx.shopper.address.pincode) || '';\n    if (eddEl) eddEl.textContent = ' \u00B7 ' + (ctx.pinResult.edd_days || '4\u20137') + ' days \u00B7 shipping ' + rupees(ctx.pinResult.shipping_paise || 0);\n\n    // Line items\n    var items = (ctx.cart && ctx.cart.items) || [];\n    var itemsHtml = items.map(function (i) {\n      return '<div class=\"fk-pp-summary__item\"><span>' + escapeHtml(i.product_title) + ' \u00D7 ' + i.quantity + '</span><span>' + rupees(i.final_line_price) + '</span></div>';\n    }).join('');\n    var itemsRoot = m.querySelector('[data-pp-summary-items]');\n    if (itemsRoot) itemsRoot.innerHTML = itemsHtml || '<div class=\"fk-pp-summary__item\"><span>Your cart</span><span>' + rupees(ctx.totalPaise - (ctx.pinResult.shipping_paise || 0)) + '</span></div>';\n\n    // Totals\n    var subtotalPaise = ctx.totalPaise - (ctx.pinResult.shipping_paise || 0);\n    var shippingPaise = ctx.pinResult.shipping_paise || 0;\n    setText(m, '[data-pp-summary-subtotal]', rupees(subtotalPaise));\n    setText(m, '[data-pp-summary-shipping]', shippingPaise > 0 ? rupees(shippingPaise) : 'Free');\n    setText(m, '[data-pp-summary-total]', rupees(ctx.totalPaise));\n\n    // Deposit display\n    setText(m, '[data-pp-deposit-amount]', rupees(ctx.depositPaise));\n    setText(m, '[data-pp-balance-amount]', rupees(ctx.balancePaise));\n    setText(m, '[data-pp-cta-amount]', rupees(ctx.depositPaise));\n  }\n\n  function setText(root, selector, value) {\n    var el = root.querySelector(selector);\n    if (el) el.textContent = value;\n  }\n  function escapeHtml(s) {\n    return String(s || '').replace(/[&<>\"]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]; });\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // PAY (Razorpay)\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function handlePayClick() {\n    // Re-entrancy guard: rapid double-clicks (or click during /initiate\n    // round-trip) used to fire TWO parallel pipelines. The second one's\n    // openRazorpay() saw `window.Razorpay` not yet loaded and called\n    // showError, leaving the FK modal stuck in the error state behind the\n    // Razorpay iframe that the first pipeline successfully opened. Single\n    // flag short-circuits the second click.\n    if (ctx.payInProgress) { log('pay click ignored \u2014 already in progress'); return; }\n    ctx.payInProgress = true;\n\n    setState('razorpay');\n    // On PDP context, ALWAYS use just the displayed variant (Buy-Now style \u2014 doesn't touch cart).\n    // On cart contexts, use the live cart contents.\n    var sourceItems;\n    if (ctx.triggerContext === 'pdp' && ctx.pdpItem) {\n      sourceItems = [ctx.pdpItem];\n    } else {\n      sourceItems = (ctx.cart && ctx.cart.items) || [];\n    }\n    apiPost('/initiate', {\n      pp_id: ctx.pp_id,\n      context: ctx.triggerContext,\n      total_paise: ctx.totalPaise,\n      deposit_paise: ctx.depositPaise,\n      balance_paise: ctx.balancePaise,\n      shopper: ctx.shopper,\n      pincode_result: ctx.pinResult,\n      cart_token: (ctx.cart && ctx.cart.token) || '',\n      items: sourceItems.map(function (i) {\n        return { variant_id: i.id, quantity: i.quantity, price_paise: i.final_line_price };\n      })\n    })\n      .then(function (init) {\n        log('initiate ok', init);\n        return loadScript(RAZORPAY_SDK_URL).then(function () { return init; });\n      })\n      .then(function (init) {\n        openRazorpay(init);\n      })\n      .catch(function (err) {\n        console.error('[fk-pp] initiate failed', err.status, err.body || err.message);\n        var detail = (err.body && (err.body.detail || err.body.error)) || err.message || 'unknown';\n        showError('Could not start payment. Reason: ' + detail);\n      })\n      .finally(function () {\n        ctx.payInProgress = false;\n      });\n  }\n\n  function openRazorpay(init) {\n    if (MOCK_MODE) {\n      log('MOCK Razorpay \u2014 simulating success in 1.8s');\n      setTimeout(function () {\n        handlePaymentResult({\n          razorpay_payment_id: 'pay_MOCK_' + Date.now(),\n          razorpay_order_id: init.razorpay_order_id,\n          razorpay_signature: 'MOCK_SIG'\n        });\n      }, 1800);\n      return;\n    }\n\n    if (!window.Razorpay) {\n      showError('Razorpay SDK failed to load. Please refresh and try again.');\n      return;\n    }\n\n    var rzp = new window.Razorpay({\n      key: init.razorpay_key_id,\n      amount: init.amount_paise,\n      currency: 'INR',\n      order_id: init.razorpay_order_id,\n      name: CFG.merchantName || 'Farmkart',\n      description: 'Deposit \u2014 balance ' + rupees(ctx.balancePaise) + ' on delivery',\n      image: '/cdn/shop/files/farmkart-logo-square.png',  // TODO: replace with real square logo URL\n      theme: { color: '#72BE43' },\n      prefill: {\n        name: ctx.shopper.name,\n        email: ctx.shopper.email || '',\n        contact: ctx.shopper.phone\n      },\n      method: { upi: true, card: false, netbanking: false, wallet: false },\n      notes: { pp_id: ctx.pp_id, context: ctx.triggerContext },\n      handler: function (response) {\n        handlePaymentResult(response);\n      },\n      modal: {\n        ondismiss: function () {\n          log('Razorpay modal dismissed by user');\n          setState('summary');  // bring them back to review screen\n        }\n      }\n    });\n    rzp.open();\n  }\n\n  function handlePaymentResult(response) {\n    log('payment result', response);\n    apiPost('/result', {\n      pp_id: ctx.pp_id,\n      razorpay_payment_id: response.razorpay_payment_id,\n      razorpay_order_id: response.razorpay_order_id,\n      razorpay_signature: response.razorpay_signature,\n      balance_paise: ctx.balancePaise\n    })\n      .then(function (result) {\n        log('order created', result);\n        renderSuccess(result);\n        setState('success');\n        dispatchEvent('farmkart-partial-pay-purchase', {\n          shopOrderId: result.order_name || result.order_id,\n          totalPrice: ctx.totalPaise / 100,\n          currency: 'INR',\n          shippingCharge: (ctx.pinResult.shipping_paise || 0) / 100,\n          items: (ctx.cart && ctx.cart.items || []).map(function (i) {\n            return { id: i.id, name: i.product_title, price: i.final_line_price / 100, quantity: i.quantity, variant: i.variant_title };\n          })\n        });\n      })\n      .catch(function (err) {\n        log('order create failed', err);\n        showError('Payment received but order creation failed. Our team will contact you shortly. Your payment is safe.');\n      });\n  }\n\n  function renderSuccess(result) {\n    var m = ctx.modal;\n    setText(m, '[data-pp-order-name]', result.order_name || ('#' + result.order_id));\n    setText(m, '[data-pp-success-balance]', rupees(result.balance_paise || ctx.balancePaise) + ' due on delivery');\n    setText(m, '[data-pp-success-edd]', result.estimated_delivery || (ctx.pinResult && ctx.pinResult.edd_days + ' days') || '4\u20137 days');\n    var waLink = m.querySelector('[data-pp-whatsapp-link]');\n    if (waLink && CFG.whatsAppNumber) {\n      var waMsg = encodeURIComponent('Hi Farmkart! I just reserved order ' + (result.order_name || '#' + result.order_id) + '. Please send updates here. Thanks!');\n      waLink.setAttribute('href', 'https://wa.me/' + CFG.whatsAppNumber + '?text=' + waMsg);\n    }\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // ERROR\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function showError(reason) {\n    if (!ctx.modal) return;\n    var reasonEl = ctx.modal.querySelector('[data-pp-error-reason]');\n    if (reasonEl && reason) reasonEl.textContent = reason;\n    setState('error');\n    dispatchEvent('farmkart-partial-pay-error', { reason: reason, pp_id: ctx.pp_id });\n  }\n\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // EVENT BINDINGS \u2014 delegated, work for dynamically-rendered CTAs too\n  // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function onReady(fn) {\n    if (document.readyState !== 'loading') return fn();\n    document.addEventListener('DOMContentLoaded', fn);\n  }\n\n  onReady(function () {\n    log('init', { mock: MOCK_MODE, cfg: CFG });\n\n    // SAFETY BELT \u2014 two layers gate the CTA visibility for real shoppers.\n    //   1. razorpayKeyId must not be a PLACEHOLDER (always required)\n    //   2. EITHER the theme setting `partial_pay_enabled` is true (public launch)\n    //      OR the URL has ?fk_pp_test=1 (private smoke testing by ops)\n    // Mock mode (?fk_pp_mock=1) bypasses both for design QA.\n    var keyOk = CFG.razorpayKeyId && CFG.razorpayKeyId.indexOf('PLACEHOLDER') === -1;\n    var testModeUrl = URL_PARAMS.get('fk_pp_test') === '1';\n    var publiclyEnabled = CFG.ctaEnabled === true;\n    var shouldShow = MOCK_MODE || (keyOk && (publiclyEnabled || testModeUrl));\n\n    if (!shouldShow) {\n      var reason = !keyOk\n        ? 'Razorpay key not configured'\n        : 'partial-pay not publicly enabled \u2014 append ?fk_pp_test=1 to preview';\n      console.warn('[fk-pp] hiding CTAs:', reason);\n      document.querySelectorAll('.fk-pp-cta').forEach(function (el) { el.style.display = 'none'; });\n      var modalToRemove = document.getElementById('fk-pp-modal');\n      if (modalToRemove) modalToRemove.remove();\n      return;\n    }\n    if (testModeUrl && !publiclyEnabled) {\n      log('test mode (?fk_pp_test=1) \u2014 CTA visible to you only, hidden from real shoppers');\n    }\n\n    // PORTAL FIX \u2014 move the modal out of any wrapping form (e.g. the PDP product\n    // form, cart-drawer form) onto document.body. HTML disallows nested <form>\n    // elements; browsers silently strip the inner one, which deletes the modal's\n    // submit button. Reparenting to body keeps the modal markup intact.\n    var modal = document.getElementById('fk-pp-modal');\n    if (modal && modal.parentNode !== document.body) {\n      document.body.appendChild(modal);\n      log('modal reparented to document.body');\n    }\n\n    document.addEventListener('click', function (e) {\n      var openBtn = e.target.closest('[data-fk-pp-open]');\n      if (openBtn) {\n        e.preventDefault();\n        openModal(openBtn);\n        return;\n      }\n      var closeBtn = e.target.closest('[data-fk-pp-close]');\n      if (closeBtn) {\n        e.preventDefault();\n        closeModal();\n        return;\n      }\n      var payBtn = e.target.closest('[data-fk-pp-pay]');\n      if (payBtn) {\n        e.preventDefault();\n        handlePayClick();\n        return;\n      }\n      var backBtn = e.target.closest('[data-fk-pp-back-form]');\n      if (backBtn) {\n        e.preventDefault();\n        setState('form');\n        return;\n      }\n      var retryBtn = e.target.closest('[data-fk-pp-retry]');\n      if (retryBtn) {\n        e.preventDefault();\n        setState('summary');\n        return;\n      }\n    });\n\n    document.addEventListener('submit', function (e) {\n      var form = e.target.closest('[data-fk-pp-form]');\n      if (form) handleFormSubmit(e);\n    });\n\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && ctx.isOpen) closeModal();\n    });\n  });\n})();\n\n\n/* cache-bust marker: 1779716966020847000 */\n"],
  "mappings": "CAgCC,UAAY,CACX,aAKA,IAAI,IAAM,OAAO,gBAAkB,CAAC,EAChC,WAAa,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACvD,UAAY,WAAW,IAAI,YAAY,IAAM,KAAO,IAAI,QAAU,GAClE,iBAAmB,+CAEvB,SAAS,KAAM,CACb,GAAI,GAAC,IAAI,OAAS,CAAC,WACnB,KAAI,KAAO,MAAM,UAAU,MAAM,KAAK,SAAS,EAC/C,KAAK,QAAQ,SAAS,EACtB,QAAQ,IAAI,MAAM,QAAS,IAAI,EACjC,CAEA,SAAS,OAAO,MAAO,CACrB,OAAO,IAAI,eAAiB,KAAK,MAAM,MAAQ,GAAG,EAAE,eAAe,OAAO,CAC5E,CAEA,SAAS,MAAO,CAId,QAFI,GAAK,KAAK,IAAI,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAI,GAAG,EAC3D,KAAO,GACF,EAAI,EAAG,EAAI,GAAI,IACtB,MAAQ,mCAAmC,OAAO,KAAK,MAAM,KAAK,OAAO,EAAI,EAAE,CAAC,EAElF,OAAO,GAAK,IACd,CAEA,SAAS,cAAc,KAAM,KAAM,CACjC,IAAI,OAAS,CAAE,KAAM,MAAQ,CAAC,CAAE,EAChC,OAAO,cAAc,IAAI,YAAY,KAAM,CAAE,OAAQ,MAAO,CAAC,CAAC,EAE1D,OAAS,iCACX,OAAO,cAAc,IAAI,YAAY,kBAAmB,CAAE,OAAQ,MAAO,CAAC,CAAC,EAEzE,OAAS,iCACX,OAAO,cAAc,IAAI,YAAY,2BAA4B,CAAE,OAAQ,MAAO,CAAC,CAAC,CAExF,CAEA,SAAS,WAAW,IAAK,CACvB,OAAO,IAAI,QAAQ,SAAU,QAAS,OAAQ,CAE5C,GAAI,OAAO,SAAU,OAAO,QAAQ,EAEpC,IAAI,SAAW,SAAS,cAAc,eAAiB,IAAM,IAAI,EAC7D,EAAI,UAAY,SAAS,cAAc,QAAQ,EAC9C,WACH,EAAE,IAAM,IACR,EAAE,MAAQ,GACV,SAAS,KAAK,YAAY,CAAC,GAO7B,IAAI,SAAW,KAAK,IAAI,EAAI,IACxB,KAAO,YAAY,UAAY,CAC7B,OAAO,UACT,cAAc,IAAI,EAClB,QAAQ,GACC,KAAK,IAAI,EAAI,WACtB,cAAc,IAAI,EAClB,OAAO,IAAI,MAAM,4CAA4C,CAAC,EAElE,EAAG,EAAE,EAEL,EAAE,QAAU,UAAY,CACtB,cAAc,IAAI,EAClB,OAAO,IAAI,MAAM,kBAAoB,GAAG,CAAC,CAC3C,CACF,CAAC,CACH,CAKA,SAAS,WAAY,CACnB,OAAI,UACK,QAAQ,QAAQ,CACrB,YAAa,KACb,qBAAsB,MACtB,qBAAsB,IACtB,WAAY,EACZ,MAAO,mBAAqB,KAAK,IAAI,EACrC,MAAO,CACL,CAAE,GAAI,EAAG,cAAe,sBAAuB,cAAe,KAAM,SAAU,EAAG,iBAAkB,KAAO,OAAQ,MAAO,IAAK,aAAc,EAC5I,CAAE,GAAI,EAAG,cAAe,uBAAwB,cAAe,KAAM,SAAU,EAAG,iBAAkB,MAAQ,OAAQ,QAAS,IAAK,aAAc,EAChJ,CAAE,GAAI,EAAG,cAAe,yBAA0B,cAAe,KAAM,SAAU,EAAG,iBAAkB,KAAO,OAAQ,WAAY,IAAK,gBAAiB,CACzJ,CACF,CAAC,EAEI,MAAM,WAAY,CAAE,QAAS,CAAE,OAAU,kBAAmB,CAAE,CAAC,EACnE,KAAK,SAAU,EAAG,CACjB,GAAI,CAAC,EAAE,GAAI,MAAM,IAAI,MAAM,sBAAwB,EAAE,MAAM,EAC3D,OAAO,EAAE,KAAK,CAChB,CAAC,CACL,CAEA,SAAS,eAAe,WAAY,KAAM,WAAY,CACpD,KAAO,MAAQ,IACf,WAAa,YAAc,KAC3B,IAAI,IAAM,KAAK,MAAM,WAAa,IAAI,EACtC,OAAO,KAAK,IAAI,IAAK,UAAU,CACjC,CAKA,SAAS,QAAQ,KAAM,KAAM,CAC3B,OAAI,WACF,IAAI,YAAa,KAAM,IAAI,EACpB,IAAI,QAAQ,SAAU,QAAS,CACpC,WAAW,UAAY,CACrB,QAAQ,aAAa,KAAM,IAAI,CAAC,CAClC,EAAG,IAAM,KAAK,OAAO,EAAI,GAAG,CAC9B,CAAC,GAEI,MAAM,IAAI,QAAU,KAAM,CAC/B,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,OAAU,kBAAmB,EAC5E,KAAM,KAAK,UAAU,IAAI,EACzB,YAAa,aACf,CAAC,EAAE,KAAK,SAAU,EAAG,CACnB,OAAO,EAAE,KAAK,EAAE,KAAK,SAAU,KAAM,CACnC,IAAI,KAAO,KACX,GAAI,CAAE,KAAO,KAAO,KAAK,MAAM,IAAI,EAAI,CAAC,CAAG,OAAS,EAAG,CAAE,KAAO,CAAE,KAAM,IAAK,CAAG,CAChF,GAAI,CAAC,EAAE,GAAI,CACT,IAAI,OAAU,OAAS,KAAK,QAAU,KAAK,QAAY,QAAU,EAAE,OAC/D,IAAM,IAAI,MAAM,OAAS,KAAO,YAAc,MAAM,EACxD,UAAI,OAAS,EAAE,OACf,IAAI,KAAO,KACL,GACR,CACA,OAAO,IACT,CAAC,CACH,CAAC,CACH,CAEA,SAAS,aAAa,KAAM,KAAM,CAChC,GAAI,OAAS,YAAa,CACxB,IAAI,KAAO,KAAK,OAAS,KAAK,EAC9B,MAAO,CACL,GAAI,GACJ,MAAO,KACP,kBAAmB,cAAgB,KAAK,MAAM,EAAG,EAAE,EACnD,gBAAiB,IAAI,cACrB,aAAc,KAAK,cACnB,SAAU,KACZ,CACF,CACA,GAAI,OAAS,WAAa,OAAS,iBACjC,MAAO,CACL,GAAI,GACJ,MAAO,KAAK,MACZ,WAAY,QAAU,KAAO,KAAK,MAAM,KAAK,OAAO,EAAI,GAAG,GAC3D,SAAU,MAAgB,KAAK,MAAM,KAAK,OAAO,EAAI,GAAM,EAC3D,iBAAkB,iBAClB,cAAe,KAAK,eAAiB,EACrC,mBAAoB,eACtB,EAEF,GAAI,OAAS,iBAAkB,CAC7B,IAAI,MAAQ,UAAU,KAAK,KAAK,SAAW,EAAE,EAC7C,MAAO,CACL,GAAI,MACJ,YAAa,MACb,KAAM,KAAK,MAAQ,SACnB,SAAU,WACV,eAAgB,IAChB,OAAQ,MAAQ,KAAO,iBACzB,CACF,CACA,MAAO,CAAE,GAAI,EAAK,CACpB,CAKA,IAAI,OAAS,CAAC,OAAQ,kBAAmB,UAAW,WAAY,UAAW,OAAO,EAC9E,eAAiB,CAAE,KAAQ,EAAG,kBAAmB,EAAG,QAAW,EAAG,SAAY,EAAG,QAAW,EAAG,MAAS,CAAE,EAE1G,IAAM,CACR,MAAO,KACP,OAAQ,GACR,MAAO,OACP,MAAO,KACP,WAAY,KACZ,eAAgB,KAChB,WAAY,EACZ,aAAc,EACd,aAAc,EACd,KAAM,IACN,QAAS,KACT,UAAW,KACX,KAAM,IACR,EAEA,SAAS,SAAS,MAAO,CACvB,GAAK,IAAI,MACT,IAAI,OAAO,QAAQ,KAAK,IAAM,GAAI,CAChC,QAAQ,KAAK,yBAA0B,KAAK,EAC5C,MACF,CACA,IAAI,MAAQ,MACZ,IAAI,eAAW,KAAK,EACpB,IAAI,MAAM,iBAAiB,iBAAiB,EAAE,QAAQ,SAAU,GAAI,CAClE,IAAI,MAAQ,GAAG,aAAa,eAAe,IAAM,MACjD,GAAG,OAAS,CAAC,KACf,CAAC,EAED,IAAI,IAAM,eAAe,KAAK,EAC9B,IAAI,MAAM,iBAAiB,6BAA6B,EAAE,QAAQ,SAAU,GAAI,EAAG,CACjF,GAAG,UAAU,OAAO,YAAa,SAAS,EACtC,EAAI,IAAK,GAAG,UAAU,IAAI,SAAS,EAC9B,IAAM,KAAK,GAAG,UAAU,IAAI,WAAW,CAClD,CAAC,EAED,IAAI,OAAS,CACX,KAAQ,qBACR,kBAAmB,0BACnB,QAAW,eACX,SAAY,uBACZ,QAAW,YACX,MAAS,eACX,EACI,QAAU,IAAI,MAAM,cAAc,oBAAoB,EACtD,SAAW,OAAO,KAAK,IAAG,QAAQ,YAAc,OAAO,KAAK,GAEhE,WAAW,UAAY,CACrB,IAAI,QAAU,IAAI,MAAM,cAAc,mBAAqB,MAAQ,IAAI,EACvE,GAAK,QACL,KAAI,WAAa,QAAQ,cAAc,yCAAyC,EAC5E,YAAY,WAAW,MAAM,CAAE,cAAe,EAAK,CAAC,EAC1D,EAAG,EAAE,EACP,CAKA,SAAS,UAAU,WAAY,CAE7B,GADA,IAAI,MAAQ,SAAS,eAAe,aAAa,EAC7C,CAAC,IAAI,MAAO,CACd,QAAQ,MAAM,qDAAqD,EACnE,MACF,CACA,IAAI,WAAa,WACjB,IAAI,QAAU,WAAa,WAAW,QAAQ,kBAAkB,EAAI,KACpE,GAAI,UACF,IAAI,WAAa,SAAS,QAAQ,QAAQ,aAAc,EAAE,GAAK,EAC/D,IAAI,aAAe,SAAS,QAAQ,QAAQ,eAAgB,EAAE,GAAK,EACnE,IAAI,aAAe,SAAS,QAAQ,QAAQ,eAAgB,EAAE,GAAK,EACnE,IAAI,KAAO,WAAW,QAAQ,QAAQ,MAAM,GAAK,IACjD,IAAI,eAAiB,QAAQ,QAAQ,WAAa,UAO9C,IAAI,iBAAmB,OAAO,CAChC,IAAI,UAAY,SAAS,QAAQ,QAAQ,YAAa,EAAE,EACxD,GAAI,CAAC,UAAW,CACd,IAAI,YAAc,SAAS,cAAc,0GAA0G,EAC/I,aAAe,YAAY,QAAO,UAAY,SAAS,YAAY,MAAO,EAAE,EAClF,CACK,YAAW,UAAY,SAAS,WAAW,IAAI,SAAS,EAAG,EAAE,GAClE,IAAI,SAAW,SAAS,cAAc,8CAA8C,EAChF,IAAM,SAAW,KAAK,IAAI,EAAG,SAAS,SAAS,MAAO,EAAE,GAAK,CAAC,EAAI,EACtE,GAAI,UAAW,CACb,IAAI,QAAU,SAAS,cAAc,gDAAgD,EACrF,IAAI,QAAU,CACZ,GAAI,UACJ,cAAe,QAAQ,QAAQ,iBAAmB,QAAU,QAAQ,YAAY,KAAK,EAAI,IACzF,SAAU,IACV,iBAAkB,IAAI,WAAa,GACrC,EACA,IAAI,uBAAwB,CAAE,WAAY,UAAW,IAAK,IAAK,OAAQ,QAAQ,QAAQ,YAAc,YAAc,qBAAsB,CAAC,CAC5I,MACE,QAAQ,MAAM,2GAAsG,CAExH,CAEF,IAAI,MAAQ,KAAK,EAGjB,UAAU,EAAE,KAAK,SAAU,KAAM,CAC/B,IAAI,KAAO,KAEP,IAAI,iBAAmB,QACzB,IAAI,WAAa,KAAK,YACtB,IAAI,aAAe,eAAe,IAAI,WAAY,IAAI,IAAI,EAC1D,IAAI,aAAe,IAAI,WAAa,IAAI,cAE1C,IAAI,SAAU,CAAE,QAAS,IAAI,eAAgB,MAAO,IAAI,WAAY,QAAS,IAAI,aAAc,QAAS,IAAI,YAAa,CAAC,EAC1H,cAAc,gCAAiC,CAC7C,YAAa,KACb,WAAY,IAAI,WAAa,IAC7B,SAAU,MACV,OAAQ,KAAK,OAAS,CAAC,GAAG,IAAI,SAAU,EAAG,CACzC,MAAO,CAAE,GAAI,EAAE,GAAI,KAAM,EAAE,cAAe,MAAO,EAAE,iBAAmB,IAAK,SAAU,EAAE,SAAU,QAAS,EAAE,aAAc,CAC5H,CAAC,CACH,CAAC,CACH,CAAC,EAAE,MAAM,SAAU,IAAK,CACtB,IAAI,oBAAqB,GAAG,CAE9B,CAAC,EAED,IAAI,MAAM,OAAS,GACnB,IAAI,MAAM,aAAa,cAAe,OAAO,EAC7C,SAAS,KAAK,MAAM,SAAW,SAC/B,IAAI,OAAS,GAEb,SAAS,MAAM,CACjB,CAEA,SAAS,YAAa,CAChB,CAAC,IAAI,OAAS,CAAC,IAAI,SACvB,IAAI,MAAM,OAAS,GACnB,IAAI,MAAM,aAAa,cAAe,MAAM,EAC5C,SAAS,KAAK,MAAM,SAAW,GAC/B,IAAI,OAAS,GACT,IAAI,YAAY,IAAI,WAAW,MAAM,CAAE,cAAe,EAAK,CAAC,EAClE,CAKA,SAAS,iBAAiB,EAAG,CAC3B,EAAE,eAAe,EACjB,IAAI,KAAO,EAAE,OACT,KAAO,CAAC,EAIZ,GAHA,IAAI,SAAS,IAAI,EAAE,QAAQ,SAAU,IAAK,IAAK,CAAE,KAAK,GAAG,GAAK,IAAM,IAAI,KAAK,CAAG,CAAC,EAG7E,CAAC,KAAK,OAAS,KAAK,MAAM,OAAS,GAAI,OAAO,YAAY,QAAS,mCAAmC,EAC1G,GAAI,CAAC,KAAK,KAAM,OAAO,YAAY,OAAQ,wBAAwB,EACnE,GAAI,CAAC,KAAK,QAAS,OAAO,YAAY,UAAW,2BAA2B,EAC5E,GAAI,CAAC,KAAK,KAAM,OAAO,YAAY,OAAQ,wBAAwB,EACnE,GAAI,CAAC,UAAU,KAAK,KAAK,SAAW,EAAE,EAAG,OAAO,YAAY,UAAW,sCAAsC,EAG7G,IAAI,QAAU,CACZ,MAAO,KAAK,MACZ,KAAM,KAAK,KACX,MAAO,KAAK,OAAS,OACrB,QAAS,CACP,MAAO,KAAK,QACZ,KAAM,KAAK,KACX,MAAO,KAAK,OAAS,GACrB,QAAS,KAAK,QACd,QAAS,IACX,CACF,EACA,SAAS,iBAAiB,EAE1B,QAAQ,iBAAkB,CAAE,QAAS,KAAK,QAAS,KAAM,KAAK,IAAK,CAAC,EACjE,KAAK,SAAU,OAAQ,CAEtB,GADA,IAAI,UAAY,OACZ,CAAC,OAAO,YAAa,CACvB,UAAU,+BAAkC,KAAK,QAAU,6DAA6D,EACxH,MACF,CACA,sBAAsB,EACtB,cAAc,EACd,SAAS,SAAS,CACpB,CAAC,EACA,MAAM,SAAU,IAAK,CACpB,IAAI,uBAAwB,GAAG,EAE/B,IAAI,UAAY,CAAE,YAAa,GAAM,KAAM,KAAK,KAAM,SAAU,WAAO,eAAgB,IAAI,MAAQ,IAAI,KAAK,sBAAwB,GAAa,EACjJ,sBAAsB,EACtB,cAAc,EACd,SAAS,SAAS,CACpB,CAAC,CACL,CASA,SAAS,uBAAwB,CAC/B,GAAI,IAAI,iBAAmB,OACvB,KAAI,gBACR,KAAI,cAAiB,IAAI,WAAa,IAAI,UAAU,gBAAmB,EACnE,eAAiB,IACrB,IAAI,YAAc,cAClB,IAAI,aAAe,KAAK,IAAI,EAAG,IAAI,WAAa,IAAI,YAAY,EAChE,IAAI,gBAAkB,IACxB,CAEA,SAAS,YAAY,UAAW,IAAK,CACnC,IAAI,MAAQ,IAAI,MAAM,cAAc,UAAY,UAAY,IAAI,EAC5D,QAAS,MAAM,MAAM,EAAG,MAAM,aAAa,eAAgB,MAAM,GACrE,MAAM,GAAG,CACX,CAKA,SAAS,eAAgB,CACvB,IAAI,EAAI,IAAI,MAER,OAAS,EAAE,cAAc,oBAAoB,EAC7C,OAAS,EAAE,cAAc,oBAAoB,EAC7C,MAAQ,EAAE,cAAc,mBAAmB,EAC3C,SAAQ,OAAO,YAAc,IAAI,UAAU,MAC3C,SAAQ,OAAO,YAAe,IAAI,QAAQ,SAAW,IAAI,QAAQ,QAAQ,SAAY,IACrF,QAAO,MAAM,YAAc,UAAS,IAAI,UAAU,UAAY,YAAS,uBAAsB,OAAO,IAAI,UAAU,gBAAkB,CAAC,GAGzI,IAAI,MAAS,IAAI,MAAQ,IAAI,KAAK,OAAU,CAAC,EACzC,UAAY,MAAM,IAAI,SAAU,EAAG,CACrC,MAAO,0CAA4C,WAAW,EAAE,aAAa,EAAI,SAAQ,EAAE,SAAW,gBAAkB,OAAO,EAAE,gBAAgB,EAAI,eACvJ,CAAC,EAAE,KAAK,EAAE,EACN,UAAY,EAAE,cAAc,yBAAyB,EACrD,YAAW,UAAU,UAAY,WAAa,gEAAkE,OAAO,IAAI,YAAc,IAAI,UAAU,gBAAkB,EAAE,EAAI,iBAGnL,IAAI,cAAgB,IAAI,YAAc,IAAI,UAAU,gBAAkB,GAClE,cAAgB,IAAI,UAAU,gBAAkB,EACpD,QAAQ,EAAG,6BAA8B,OAAO,aAAa,CAAC,EAC9D,QAAQ,EAAG,6BAA8B,cAAgB,EAAI,OAAO,aAAa,EAAI,MAAM,EAC3F,QAAQ,EAAG,0BAA2B,OAAO,IAAI,UAAU,CAAC,EAG5D,QAAQ,EAAG,2BAA4B,OAAO,IAAI,YAAY,CAAC,EAC/D,QAAQ,EAAG,2BAA4B,OAAO,IAAI,YAAY,CAAC,EAC/D,QAAQ,EAAG,uBAAwB,OAAO,IAAI,YAAY,CAAC,CAC7D,CAEA,SAAS,QAAQ,KAAM,SAAU,MAAO,CACtC,IAAI,GAAK,KAAK,cAAc,QAAQ,EAChC,KAAI,GAAG,YAAc,MAC3B,CACA,SAAS,WAAW,EAAG,CACrB,OAAO,OAAO,GAAK,EAAE,EAAE,QAAQ,UAAW,SAAU,EAAG,CAAE,MAAO,CAAE,IAAK,QAAS,IAAK,OAAQ,IAAK,OAAQ,IAAK,QAAS,EAAE,CAAC,CAAG,CAAC,CACjI,CAKA,SAAS,gBAAiB,CAOxB,GAAI,IAAI,cAAe,CAAE,IAAI,8CAAyC,EAAG,MAAQ,CACjF,IAAI,cAAgB,GAEpB,SAAS,UAAU,EAGnB,IAAI,YACA,IAAI,iBAAmB,OAAS,IAAI,QACtC,YAAc,CAAC,IAAI,OAAO,EAE1B,YAAe,IAAI,MAAQ,IAAI,KAAK,OAAU,CAAC,EAEjD,QAAQ,YAAa,CACnB,MAAO,IAAI,MACX,QAAS,IAAI,eACb,YAAa,IAAI,WACjB,cAAe,IAAI,aACnB,cAAe,IAAI,aACnB,QAAS,IAAI,QACb,eAAgB,IAAI,UACpB,WAAa,IAAI,MAAQ,IAAI,KAAK,OAAU,GAC5C,MAAO,YAAY,IAAI,SAAU,EAAG,CAClC,MAAO,CAAE,WAAY,EAAE,GAAI,SAAU,EAAE,SAAU,YAAa,EAAE,gBAAiB,CACnF,CAAC,CACH,CAAC,EACE,KAAK,SAAU,KAAM,CACpB,WAAI,cAAe,IAAI,EAChB,WAAW,gBAAgB,EAAE,KAAK,UAAY,CAAE,OAAO,IAAM,CAAC,CACvE,CAAC,EACA,KAAK,SAAU,KAAM,CACpB,aAAa,IAAI,CACnB,CAAC,EACA,MAAM,SAAU,IAAK,CACpB,QAAQ,MAAM,0BAA2B,IAAI,OAAQ,IAAI,MAAQ,IAAI,OAAO,EAC5E,IAAI,OAAU,IAAI,OAAS,IAAI,KAAK,QAAU,IAAI,KAAK,QAAW,IAAI,SAAW,UACjF,UAAU,oCAAsC,MAAM,CACxD,CAAC,EACA,QAAQ,UAAY,CACnB,IAAI,cAAgB,EACtB,CAAC,CACL,CAEA,SAAS,aAAa,KAAM,CAC1B,GAAI,UAAW,CACb,IAAI,iDAA4C,EAChD,WAAW,UAAY,CACrB,oBAAoB,CAClB,oBAAqB,YAAc,KAAK,IAAI,EAC5C,kBAAmB,KAAK,kBACxB,mBAAoB,UACtB,CAAC,CACH,EAAG,IAAI,EACP,MACF,CAEA,GAAI,CAAC,OAAO,SAAU,CACpB,UAAU,4DAA4D,EACtE,MACF,CAEA,IAAI,IAAM,IAAI,OAAO,SAAS,CAC5B,IAAK,KAAK,gBACV,OAAQ,KAAK,aACb,SAAU,MACV,SAAU,KAAK,kBACf,KAAM,IAAI,cAAgB,WAC1B,YAAa,0BAAuB,OAAO,IAAI,YAAY,EAAI,eAC/D,MAAO,2CACP,MAAO,CAAE,MAAO,SAAU,EAC1B,QAAS,CACP,KAAM,IAAI,QAAQ,KAClB,MAAO,IAAI,QAAQ,OAAS,GAC5B,QAAS,IAAI,QAAQ,KACvB,EACA,OAAQ,CAAE,IAAK,GAAM,KAAM,GAAO,WAAY,GAAO,OAAQ,EAAM,EACnE,MAAO,CAAE,MAAO,IAAI,MAAO,QAAS,IAAI,cAAe,EACvD,QAAS,SAAU,SAAU,CAC3B,oBAAoB,QAAQ,CAC9B,EACA,MAAO,CACL,UAAW,UAAY,CACrB,IAAI,kCAAkC,EACtC,SAAS,SAAS,CACpB,CACF,CACF,CAAC,EACD,IAAI,KAAK,CACX,CAEA,SAAS,oBAAoB,SAAU,CACrC,IAAI,iBAAkB,QAAQ,EAC9B,QAAQ,UAAW,CACjB,MAAO,IAAI,MACX,oBAAqB,SAAS,oBAC9B,kBAAmB,SAAS,kBAC5B,mBAAoB,SAAS,mBAC7B,cAAe,IAAI,YACrB,CAAC,EACE,KAAK,SAAU,OAAQ,CACtB,IAAI,gBAAiB,MAAM,EAC3B,cAAc,MAAM,EACpB,SAAS,SAAS,EAClB,cAAc,gCAAiC,CAC7C,YAAa,OAAO,YAAc,OAAO,SACzC,WAAY,IAAI,WAAa,IAC7B,SAAU,MACV,gBAAiB,IAAI,UAAU,gBAAkB,GAAK,IACtD,OAAQ,IAAI,MAAQ,IAAI,KAAK,OAAS,CAAC,GAAG,IAAI,SAAU,EAAG,CACzD,MAAO,CAAE,GAAI,EAAE,GAAI,KAAM,EAAE,cAAe,MAAO,EAAE,iBAAmB,IAAK,SAAU,EAAE,SAAU,QAAS,EAAE,aAAc,CAC5H,CAAC,CACH,CAAC,CACH,CAAC,EACA,MAAM,SAAU,IAAK,CACpB,IAAI,sBAAuB,GAAG,EAC9B,UAAU,sGAAsG,CAClH,CAAC,CACL,CAEA,SAAS,cAAc,OAAQ,CAC7B,IAAI,EAAI,IAAI,MACZ,QAAQ,EAAG,uBAAwB,OAAO,YAAe,IAAM,OAAO,QAAS,EAC/E,QAAQ,EAAG,4BAA6B,OAAO,OAAO,eAAiB,IAAI,YAAY,EAAI,kBAAkB,EAC7G,QAAQ,EAAG,wBAAyB,OAAO,oBAAuB,IAAI,WAAa,IAAI,UAAU,SAAW,SAAY,eAAU,EAClI,IAAI,OAAS,EAAE,cAAc,yBAAyB,EACtD,GAAI,QAAU,IAAI,eAAgB,CAChC,IAAI,MAAQ,mBAAmB,uCAAyC,OAAO,YAAc,IAAM,OAAO,UAAY,qCAAqC,EAC3J,OAAO,aAAa,OAAQ,iBAAmB,IAAI,eAAiB,SAAW,KAAK,CACtF,CACF,CAKA,SAAS,UAAU,OAAQ,CACzB,GAAK,IAAI,MACT,KAAI,SAAW,IAAI,MAAM,cAAc,wBAAwB,EAC3D,UAAY,SAAQ,SAAS,YAAc,QAC/C,SAAS,OAAO,EAChB,cAAc,6BAA8B,CAAE,OAAQ,OAAQ,MAAO,IAAI,KAAM,CAAC,EAClF,CAKA,SAAS,QAAQ,GAAI,CACnB,GAAI,SAAS,aAAe,UAAW,OAAO,GAAG,EACjD,SAAS,iBAAiB,mBAAoB,EAAE,CAClD,CAEA,QAAQ,UAAY,CAClB,IAAI,OAAQ,CAAE,KAAM,UAAW,IAAK,GAAI,CAAC,EAOzC,IAAI,MAAQ,IAAI,eAAiB,IAAI,cAAc,QAAQ,aAAa,IAAM,GAC1E,YAAc,WAAW,IAAI,YAAY,IAAM,IAC/C,gBAAkB,IAAI,aAAe,GACrC,WAAa,WAAc,QAAU,iBAAmB,aAE5D,GAAI,CAAC,WAAY,CACf,IAAI,OAAU,MAEV,0EADA,8BAEJ,QAAQ,KAAK,uBAAwB,MAAM,EAC3C,SAAS,iBAAiB,YAAY,EAAE,QAAQ,SAAU,GAAI,CAAE,GAAG,MAAM,QAAU,MAAQ,CAAC,EAC5F,IAAI,cAAgB,SAAS,eAAe,aAAa,EACrD,eAAe,cAAc,OAAO,EACxC,MACF,CACI,aAAe,CAAC,iBAClB,IAAI,qFAAgF,EAOtF,IAAI,MAAQ,SAAS,eAAe,aAAa,EAC7C,OAAS,MAAM,aAAe,SAAS,OACzC,SAAS,KAAK,YAAY,KAAK,EAC/B,IAAI,mCAAmC,GAGzC,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,QAAU,EAAE,OAAO,QAAQ,mBAAmB,EAClD,GAAI,QAAS,CACX,EAAE,eAAe,EACjB,UAAU,OAAO,EACjB,MACF,CACA,IAAI,SAAW,EAAE,OAAO,QAAQ,oBAAoB,EACpD,GAAI,SAAU,CACZ,EAAE,eAAe,EACjB,WAAW,EACX,MACF,CACA,IAAI,OAAS,EAAE,OAAO,QAAQ,kBAAkB,EAChD,GAAI,OAAQ,CACV,EAAE,eAAe,EACjB,eAAe,EACf,MACF,CACA,IAAI,QAAU,EAAE,OAAO,QAAQ,wBAAwB,EACvD,GAAI,QAAS,CACX,EAAE,eAAe,EACjB,SAAS,MAAM,EACf,MACF,CACA,IAAI,SAAW,EAAE,OAAO,QAAQ,oBAAoB,EACpD,GAAI,SAAU,CACZ,EAAE,eAAe,EACjB,SAAS,SAAS,EAClB,MACF,CACF,CAAC,EAED,SAAS,iBAAiB,SAAU,SAAU,EAAG,CAC/C,IAAI,KAAO,EAAE,OAAO,QAAQ,mBAAmB,EAC3C,MAAM,iBAAiB,CAAC,CAC9B,CAAC,EAED,SAAS,iBAAiB,UAAW,SAAU,EAAG,CAC5C,EAAE,MAAQ,UAAY,IAAI,QAAQ,WAAW,CACnD,CAAC,CACH,CAAC,CACH,GAAG",
  "names": []
}
