@auto-topup/web 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +40 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +594 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +578 -0
- package/dist/index.mjs.map +1 -0
- package/dist/retailcode.iife.global.js +235 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/widget.ts","../src/dialog.ts","../src/webview.ts","../src/styles.ts"],"sourcesContent":["import { resolveAccent } from '@auto-topup/core';\nimport { TopupWidget } from './widget.js';\nimport type { TopupCallbacks } from '@auto-topup/core';\n\nexport type { TopupCallbacks };\nexport { TopupWidget };\n\nexport interface CreateConfig extends TopupCallbacks {\n publicKey: string;\n msisdn: string;\n container: string;\n /** Defaults to https://corporatedevapi.retailcode.com.ng — only set this for testing */\n baseUrl?: string;\n theme?: { accent?: string; fontFamily?: string };\n}\n\nexport const RetailcodeTopup = {\n create(config: CreateConfig) {\n const widget = new TopupWidget({\n ...config,\n theme: {\n ...config.theme,\n accent: resolveAccent(config.theme?.accent),\n },\n });\n return {\n mount: () => widget.mount(),\n };\n },\n};\n","import {\n RetailcodeApiClient,\n RetailcodeApiError,\n TopupApiConfig,\n TopupCallbacks,\n resolveAccent,\n formatPhone,\n isValidMsisdn,\n isValidAmount,\n} from '@auto-topup/core';\nimport { loadSwal, swal } from './dialog.js';\nimport { closeWebview, updateUrlStatus } from './webview.js';\nimport { buildTokens, buildStyles } from './styles.js';\n\ninterface WidgetOptions extends TopupCallbacks {\n publicKey: string;\n msisdn: string;\n container: string;\n baseUrl?: string;\n theme?: { accent?: string; fontFamily?: string };\n}\n\nexport class TopupWidget {\n private readonly client: RetailcodeApiClient;\n private readonly opts: WidgetOptions;\n\n constructor(opts: WidgetOptions) {\n this.opts = opts;\n this.client = new RetailcodeApiClient(opts.publicKey, opts.baseUrl);\n }\n\n async mount(): Promise<void> {\n const { msisdn, container, onClose, theme = {} } = this.opts;\n\n const target = document.querySelector(container);\n if (!target) return;\n\n const accent = resolveAccent(theme.accent);\n const fontFamily = theme.fontFamily ?? \"'DM Sans', system-ui, sans-serif\";\n const tokens = buildTokens(accent, fontFamily);\n\n let shadow: ShadowRoot | null = null;\n\n const showInitError = (message: string) => {\n const html = `\n <div style=\"font-family:${fontFamily};padding:24px;border:1.5px solid #FCA5A5;background:#FEF2F2;border-radius:8px;color:#991B1B;text-align:center;max-width:440px;margin:40px auto;\">\n <div style=\"font-weight:700;font-size:15px;margin-bottom:4px;\">SDK failed to initialize</div>\n <div style=\"font-size:13px;opacity:0.8;\">${message}</div>\n </div>`;\n if (shadow) shadow.innerHTML = html;\n else (target as HTMLElement).innerHTML = html;\n };\n\n if (!isValidMsisdn(msisdn)) {\n showInitError('Subscriber phone number is not valid.');\n return;\n }\n\n shadow = target.attachShadow({ mode: 'open' });\n this.renderSpinner(shadow, tokens);\n\n let cfg: TopupApiConfig;\n try {\n cfg = await this.client.fetchConfig(msisdn);\n } catch (e) {\n const msg =\n e instanceof RetailcodeApiError ? e.message : 'Could not connect to the activation server.';\n showInitError(msg);\n return;\n }\n\n shadow.innerHTML = '';\n await loadSwal();\n\n const {\n name: prefilledName = '',\n subscribedAirtime = false,\n subscribedData = false,\n airtimethresholds = {},\n airtimeMin = 0,\n airtimeMax = 10000,\n dataThresholds = {},\n dataPlans = [],\n terms = null,\n } = cfg;\n\n const isFullSubscriber = subscribedAirtime && subscribedData;\n const isPartialSubscriber = (subscribedAirtime || subscribedData) && !isFullSubscriber;\n const isBrandNew = !subscribedAirtime && !subscribedData;\n\n // Terms gate for brand-new users\n if (isBrandNew && terms) {\n const result = await swal({\n title: 'Terms & Conditions',\n html: `\n <div style=\"text-align:left;font-size:13px;line-height:1.65;color:#374151;max-height:340px;overflow-y:auto;padding-right:4px;font-family:${fontFamily};\">\n ${typeof terms === 'string' ? terms.replace(/\\n/g, '<br>') : ''}\n </div>`,\n confirmButtonText: 'I Agree & Continue',\n confirmButtonColor: accent,\n showCancelButton: true,\n cancelButtonText: 'Decline',\n cancelButtonColor: '#9CA3AF',\n allowOutsideClick: false,\n allowEscapeKey: false,\n reverseButtons: true,\n });\n if (!result.isConfirmed) {\n closeWebview(onClose);\n return;\n }\n }\n\n // Build option HTML strings\n const airtimeOptions = Object.entries(airtimethresholds)\n .map(([k, id]) => `<option value=\"${id}\">Below ₦${k}</option>`)\n .join('');\n const dataOptions = Object.entries(dataThresholds)\n .map(([k, id]) => `<option value=\"${id}\">Below ${k}</option>`)\n .join('');\n const dataPlanOptions = dataPlans\n .map(p => `<option value=\"${p.productId}\">${p.allowance} — ₦${p.price}</option>`)\n .join('');\n\n const modal = document.createElement('div');\n modal.className = 'rc-modal';\n modal.innerHTML = this.buildModalHtml({\n tokens,\n msisdn,\n prefilledName,\n airtimeMin,\n airtimeMax,\n airtimeOptions,\n dataOptions,\n dataPlanOptions,\n });\n\n shadow.appendChild(modal);\n\n // ── Refs ────────────────────────────────────────────────────────────────\n const $ = <T extends Element = HTMLElement>(id: string) =>\n shadow!.getElementById(id) as T | null;\n\n const typeSelect = $<HTMLSelectElement>('rc-type-select')!;\n const airtimeSec = $('section-airtime')!;\n const dataSec = $('section-data')!;\n const titleText = $('rc-main-title')!;\n const descText = $('rc-desc')!;\n const submitBtn = $<HTMLButtonElement>('rc-submit')!;\n const msisdnField = $('field-msisdn')!;\n const depLinkWrap = $('rc-dependent-link-wrap')!;\n const depControls = $('section-dependent-controls')!;\n const typeSelectorGrp = $('group-type-selector')!;\n const beneficiaryRow = $('row-beneficiary')!;\n const spendingRow = $('row-spending')!;\n const airtimeMaxField = $('field-airtime-max')!;\n const dataMaxField = $('field-data-max')!;\n\n let forceDependentView = false;\n\n const refreshUI = () => {\n const isDep = isFullSubscriber || forceDependentView;\n const mode = typeSelect.value;\n\n if (isDep) {\n titleText.innerText = 'Add Dependent';\n descText.innerText = 'Configure subscription for someone else';\n msisdnField.classList.remove('hidden');\n beneficiaryRow.style.gridTemplateColumns = '1fr 1fr';\n typeSelectorGrp.classList.remove('hidden');\n depLinkWrap.classList.add('hidden');\n depControls.classList.remove('hidden');\n airtimeSec.classList.toggle('hidden', mode === 'data');\n dataSec.classList.toggle('hidden', mode === 'airtime');\n airtimeMaxField.classList.toggle('hidden', mode === 'data');\n dataMaxField.classList.toggle('hidden', mode === 'airtime');\n spendingRow.style.gridTemplateColumns = mode === 'both' ? '1fr 1fr' : '1fr';\n } else if (isPartialSubscriber) {\n titleText.innerText = 'Complete Profile';\n descText.innerText = 'Finish your Auto Topup subscription';\n msisdnField.classList.add('hidden');\n beneficiaryRow.style.gridTemplateColumns = '1fr';\n typeSelectorGrp.classList.add('hidden');\n depLinkWrap.classList.remove('hidden');\n depControls.classList.add('hidden');\n airtimeSec.classList.toggle('hidden', subscribedAirtime);\n dataSec.classList.toggle('hidden', subscribedData);\n } else {\n titleText.innerText = 'Auto Topup Subscription';\n descText.innerText = 'Automate your airtime & data recharge';\n msisdnField.classList.add('hidden');\n beneficiaryRow.style.gridTemplateColumns = '1fr';\n typeSelectorGrp.classList.remove('hidden');\n depLinkWrap.classList.add('hidden');\n depControls.classList.add('hidden');\n airtimeSec.classList.toggle('hidden', mode === 'data');\n dataSec.classList.toggle('hidden', mode === 'airtime');\n }\n };\n\n refreshUI();\n\n // ── Event wiring ────────────────────────────────────────────────────────\n const unmount = () => { shadow!.innerHTML = ''; };\n\n typeSelect.addEventListener('change', refreshUI);\n $('rc-close')!.addEventListener('click', () => closeWebview(onClose, unmount));\n\n $('rc-switch-to-dep')!.addEventListener('click', (e) => {\n e.preventDefault();\n forceDependentView = true;\n ($<HTMLInputElement>('rc-name'))!.value = '';\n refreshUI();\n });\n\n $<HTMLInputElement>('rc-name')!.addEventListener('input', e => {\n const el = e.target as HTMLInputElement;\n el.value = el.value.replace(/[^a-zA-Z\\s]/g, '');\n });\n\n ['rc-msisdn-input', 'airtimeTopupValue', 'rc-airtime-max', 'rc-data-max'].forEach(id => {\n $<HTMLInputElement>(id)?.addEventListener('input', e => {\n const el = e.target as HTMLInputElement;\n el.value = el.value.replace(/\\D/g, '');\n });\n });\n\n shadow.querySelectorAll<HTMLInputElement | HTMLSelectElement>('.rc-field input, .rc-field select')\n .forEach(el => {\n const sync = () => el.closest('.rc-field')!.classList.toggle('has-val', el.value !== '');\n el.addEventListener('input', sync);\n el.addEventListener('change', sync);\n sync();\n });\n\n // ── Submit ──────────────────────────────────────────────────────────────\n submitBtn.addEventListener('click', async () => {\n const getVal = (id: string) =>\n ($<HTMLInputElement>(id))?.value.trim() ?? '';\n\n const isDep = isFullSubscriber || forceDependentView;\n const beneficiary = isDep ? getVal('rc-msisdn-input') : msisdn;\n\n if (!airtimeSec.classList.contains('hidden')) {\n if (!isValidAmount(getVal('airtimeTopupValue'), airtimeMin, airtimeMax)) {\n swal({ icon: 'warning', title: 'Invalid Amount', text: `Enter ₦${airtimeMin} – ₦${airtimeMax}.`, confirmButtonColor: accent });\n return;\n }\n }\n if (isDep && !beneficiary) {\n swal({ icon: 'warning', title: 'Wait!', text: 'Enter the dependent phone number.', confirmButtonColor: accent });\n return;\n }\n\n submitBtn.disabled = true;\n submitBtn.innerText = 'Processing…';\n\n const common = { network: 'MTN', msisdn: beneficiary, name: getVal('rc-name') };\n\n try {\n if (!airtimeSec.classList.contains('hidden')) {\n await this.client.subscribeAirtime({\n ...common,\n airtimeThresholdId: getVal('airtimeThresholdId'),\n airtimeTopupValue: getVal('airtimeTopupValue'),\n ...(isDep && { customerMsisdn: msisdn, monthlyMaximum: getVal('rc-airtime-max') }),\n });\n }\n if (!dataSec.classList.contains('hidden')) {\n await this.client.subscribeData({\n ...common,\n dataThresholdId: getVal('dataThresholdId'),\n dataTopupValue: getVal('dataTopupValue'),\n ...(isDep && { customerMsisdn: msisdn, monthlyMaximum: getVal('rc-data-max') }),\n });\n }\n\n updateUrlStatus('successful');\n this.opts.onSuccess?.({ success: true });\n // Use didClose so we notify the native host AFTER SweetAlert2 finishes\n // its close animation — prevents the black-screen flash that occurs when\n // Flutter/iOS dismisses the sheet while the backdrop is still fading out.\n swal({\n icon: 'success',\n title: 'Subscription Active!',\n text: 'Your auto top-up is now enabled.',\n confirmButtonColor: accent,\n didClose: () => closeWebview(onClose, unmount, true),\n });\n } catch (err) {\n updateUrlStatus('failed');\n swal({ icon: 'error', title: 'Oops!', text: (err as Error).message, confirmButtonColor: accent });\n submitBtn.disabled = false;\n submitBtn.innerText = 'Activate Subscription';\n }\n });\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n private renderSpinner(shadow: ShadowRoot, tokens: ReturnType<typeof buildTokens>): void {\n const el = document.createElement('div');\n el.innerHTML = `\n <style>\n :host { display:flex; align-items:center; justify-content:center; min-height:100vh; background:#fff; }\n @media (min-width:560px) { :host { background:rgba(0,0,0,.50); } }\n ${buildStyles(tokens).match(/\\.rc-spinner-ring[\\s\\S]*?@keyframes rc-spin[\\s\\S]*?}/)?.[0] ?? ''}\n </style>\n <div class=\"rc-spinner-ring\"></div>`;\n shadow.appendChild(el);\n }\n\n private buildModalHtml(p: {\n tokens: ReturnType<typeof buildTokens>;\n msisdn: string;\n prefilledName: string;\n airtimeMin: number;\n airtimeMax: number;\n airtimeOptions: string;\n dataOptions: string;\n dataPlanOptions: string;\n }): string {\n return `\n <style>${buildStyles(p.tokens)}</style>\n\n <div class=\"rc-header\">\n <div class=\"rc-header-top\">\n <div class=\"rc-title\">\n <h2 id=\"rc-main-title\">Auto Topup Subscription</h2>\n <p id=\"rc-desc\">Automate your airtime & data recharge</p>\n </div>\n <button class=\"rc-close-btn\" id=\"rc-close\" aria-label=\"Close\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n <div class=\"rc-account-bar\">\n <div class=\"rc-dot\"></div>\n <div>\n <span class=\"rc-acc-label\">Your Phone Number</span>\n <span class=\"rc-acc-no\">${formatPhone(p.msisdn)}</span>\n </div>\n </div>\n </div>\n\n <div class=\"rc-content\">\n <div class=\"rc-group\">\n <p class=\"rc-group-title\">Registration Details</p>\n <div class=\"rc-row\" id=\"row-beneficiary\">\n <div class=\"rc-field\" id=\"field-name\">\n <input type=\"text\" id=\"rc-name\" placeholder=\" \" value=\"${p.prefilledName}\" autocomplete=\"name\">\n <label>Full Name</label>\n </div>\n <div class=\"rc-field hidden\" id=\"field-msisdn\">\n <input type=\"tel\" id=\"rc-msisdn-input\" placeholder=\" \" autocomplete=\"tel\">\n <label>Phone Number</label>\n </div>\n </div>\n </div>\n\n <div class=\"rc-group\" id=\"group-type-selector\">\n <p class=\"rc-group-title\">Subscription Type</p>\n <div class=\"rc-field has-val\">\n <select id=\"rc-type-select\">\n <option value=\"airtime\">Airtime Only</option>\n <option value=\"data\">Data Only</option>\n <option value=\"both\">Both Airtime & Data</option>\n </select>\n <label>Automation Mode</label>\n </div>\n </div>\n\n <hr class=\"rc-divider\">\n\n <div id=\"section-airtime\" class=\"section-animate\">\n <p class=\"rc-group-title\">Airtime Setup</p>\n <div class=\"rc-row\" style=\"grid-template-columns:1fr 1fr\">\n <div class=\"rc-field has-val\">\n <select id=\"airtimeThresholdId\">${p.airtimeOptions || '<option value=\"\">Loading…</option>'}</select>\n <label>Recharge when</label>\n </div>\n <div class=\"rc-field\">\n <input type=\"tel\" id=\"airtimeTopupValue\" placeholder=\" \">\n <label>Amount (₦)</label>\n <small>₦${p.airtimeMin} – ₦${p.airtimeMax}</small>\n </div>\n </div>\n </div>\n\n <div id=\"section-data\" class=\"hidden section-animate\">\n <p class=\"rc-group-title\">Data Setup</p>\n <div class=\"rc-row\" style=\"grid-template-columns:1fr 1fr\">\n <div class=\"rc-field has-val\">\n <select id=\"dataThresholdId\">${p.dataOptions || '<option value=\"\">Loading…</option>'}</select>\n <label>Recharge when</label>\n </div>\n <div class=\"rc-field has-val\">\n <select id=\"dataTopupValue\">${p.dataPlanOptions || '<option value=\"\">Loading…</option>'}</select>\n <label>Select Plan</label>\n </div>\n </div>\n </div>\n\n <div id=\"section-dependent-controls\" class=\"hidden\">\n <hr class=\"rc-divider\">\n <p class=\"rc-group-title\">Spending Controls</p>\n <div class=\"rc-row\" id=\"row-spending\">\n <div class=\"rc-field\" id=\"field-airtime-max\">\n <input type=\"tel\" id=\"rc-airtime-max\" placeholder=\" \">\n <label>Airtime Limit (₦)</label>\n </div>\n <div class=\"rc-field\" id=\"field-data-max\">\n <input type=\"tel\" id=\"rc-data-max\" placeholder=\" \">\n <label>Data Limit (₦)</label>\n </div>\n </div>\n </div>\n\n <button class=\"rc-submit-btn\" id=\"rc-submit\">Activate Subscription</button>\n\n <div id=\"rc-dependent-link-wrap\" class=\"rc-link-wrap hidden\">\n Or <a id=\"rc-switch-to-dep\">add a dependent instead</a>\n </div>\n </div>\n\n <div class=\"rc-footer\">\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/>\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\n </svg>\n Secured by <strong> Retailcode</strong>\n </div>\n `;\n }\n}\n","// Lazy-loads SweetAlert2 from CDN on first call.\n// The Swal reference is typed loosely so we don't need @types/sweetalert2.\n\ndeclare global {\n interface Window {\n Swal: SwalStatic;\n }\n}\n\ninterface SwalStatic {\n fire(opts: Record<string, unknown>): Promise<{ isConfirmed: boolean }>;\n}\n\nlet loadPromise: Promise<void> | null = null;\n\nexport function loadSwal(): Promise<void> {\n if (window.Swal) return Promise.resolve();\n if (loadPromise) return loadPromise;\n\n loadPromise = new Promise<void>((resolve) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = 'https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css';\n document.head.appendChild(link);\n\n const script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/sweetalert2@11';\n script.onload = () => resolve();\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n\nexport function swal(opts: Record<string, unknown>): Promise<{ isConfirmed: boolean }> {\n return window.Swal.fire(opts);\n}\n","// Bridges for closing the widget across all host environments.\n\ndeclare global {\n interface Window {\n ReactNativeWebView?: { postMessage(msg: string): void };\n webkit?: { messageHandlers?: { retailcode?: { postMessage(msg: unknown): void } } };\n Android?: { close?(): void };\n RetailcodeFlutter?: { postMessage(msg: string): void }; // Flutter JavascriptChannel\n }\n}\n\nexport function updateUrlStatus(status: 'successful' | 'failed'): void {\n const url = new URL(window.location.href);\n url.searchParams.set('status', status);\n window.history.replaceState({}, '', url);\n}\n\nexport function closeWebview(\n onClose?: (r: { closed: true }) => void,\n unmount?: () => void,\n success = false,\n): void {\n const url = new URL(window.location.href);\n url.searchParams.set('isClose', 'true');\n window.history.replaceState({}, '', url);\n\n const isNative = !!(\n window.ReactNativeWebView ||\n window.RetailcodeFlutter ||\n window.webkit?.messageHandlers?.retailcode ||\n window.Android?.close\n );\n\n // In native WebView contexts the host app dismisses the whole view, so\n // clearing the DOM first causes a black-screen flash. Only unmount for\n // plain browser usage where there is no native dismiss.\n if (!isNative) unmount?.();\n\n onClose?.({ closed: true });\n\n // Include success flag so native apps know whether to fire onSuccess\n // before dismissing — this way the dialog is always fully visible first.\n const msg = JSON.stringify({ action: 'close', success });\n\n if (window.ReactNativeWebView) {\n window.ReactNativeWebView.postMessage(msg);\n } else if (window.RetailcodeFlutter) {\n window.RetailcodeFlutter.postMessage(msg);\n } else if (window.webkit?.messageHandlers?.retailcode) {\n window.webkit.messageHandlers.retailcode.postMessage({ action: 'close', success });\n } else if (window.Android?.close) {\n window.Android.close();\n }\n}\n","import { mix, rgba } from '@auto-topup/core';\n\nexport interface StyleTokens {\n accent: string;\n accentHover: string;\n accentFocus: string;\n accentShadow: string;\n fontFamily: string;\n}\n\nexport function buildTokens(accent: string, fontFamily: string): StyleTokens {\n return {\n accent,\n accentHover: mix(accent, -10),\n accentFocus: rgba(accent, 0.15),\n accentShadow: rgba(accent, 0.25),\n fontFamily,\n };\n}\n\nexport function buildStyles(t: StyleTokens): string {\n return `\n @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&display=swap');\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n :host {\n display: flex;\n justify-content: center;\n min-height: 100vh;\n font-family: ${t.fontFamily};\n background: #FFFFFF;\n }\n @media (min-width: 560px) {\n :host { background: rgba(0,0,0,.50); align-items: center; padding: 20px; }\n }\n\n .rc-modal {\n width: 100%; max-width: 440px; background: #FFFFFF; overflow: hidden;\n animation: modalSlide .35s cubic-bezier(.22,1,.36,1) both;\n border-radius: 0; box-shadow: none;\n }\n @media (min-width: 560px) {\n .rc-modal {\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0,0,0,.06), 0 12px 32px rgba(0,0,0,.12), 0 32px 64px rgba(0,0,0,.08);\n }\n }\n @keyframes modalSlide { from { opacity:0; transform:translateY(16px); } to { opacity:1; transform:none; } }\n\n .rc-header { padding: 24px 20px 14px; }\n .rc-header-top { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 12px; }\n .rc-title h2 { font-size: 19px; font-weight: 700; color: #111827; letter-spacing: -.3px; }\n .rc-title p { font-size: 13px; color: #6B7280; margin-top: 3px; line-height: 1.4; }\n\n .rc-close-btn {\n display: inline-flex; align-items: center; justify-content: center;\n width: 28px; height: 28px; background: #F3F4F6; border: none;\n border-radius: 6px; color: #6B7280; cursor: pointer; transition: background .15s; flex-shrink: 0;\n }\n .rc-close-btn:hover { background: #E5E7EB; }\n\n .rc-account-bar {\n display: flex; align-items: center; background: ${t.accent};\n padding: 10px 14px; border-radius: 6px; color: #fff;\n }\n .rc-dot { width: 8px; height: 8px; background: #4ADE80; border-radius: 50%; margin-right: 10px; box-shadow: 0 0 0 2px rgba(74,222,128,.3); flex-shrink: 0; }\n .rc-acc-label { font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; opacity: .65; display: block; margin-bottom: 1px; }\n .rc-acc-no { font-size: 14px; font-weight: 700; letter-spacing: .03em; }\n\n .rc-content { padding: 20px 20px 16px; }\n .rc-group { margin-bottom: 14px; }\n .rc-group-title { font-size: 10px; font-weight: 700; color: #9CA3AF; text-transform: uppercase; letter-spacing: .09em; margin-bottom: 10px; }\n\n .rc-field { position: relative; margin-bottom: 10px; }\n .rc-field:last-child { margin-bottom: 0; }\n .rc-field label { position: absolute; left: 12px; top: 16px; font-size: 13.5px; color: #9CA3AF; transition: all .16s cubic-bezier(.4,0,.2,1); pointer-events: none; transform-origin: left top; }\n .rc-field input, .rc-field select {\n width: 100%; height: 52px; padding: 20px 12px 6px;\n background: #F9FAFB; border: 1.5px solid #E5E7EB; border-radius: 6px;\n font-family: inherit; font-size: 14px; font-weight: 500; color: #111827;\n outline: none; transition: border-color .18s, box-shadow .18s, background .18s;\n appearance: none; -webkit-appearance: none;\n }\n .rc-field select {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");\n background-repeat: no-repeat; background-position: right 12px center; padding-right: 34px; cursor: pointer;\n }\n .rc-field input:focus, .rc-field select:focus {\n border-color: ${t.accent}; background: #FFFFFF; box-shadow: 0 0 0 3px ${t.accentFocus};\n }\n .rc-field.has-val label, .rc-field input:focus ~ label, .rc-field select:focus ~ label {\n top: 7px; font-size: 10.5px; font-weight: 700; color: ${t.accent};\n }\n .rc-field small { display: block; margin-top: 4px; font-size: 11px; color: #9CA3AF; }\n\n .rc-row { display: grid; gap: 10px; margin-bottom: 10px; }\n .rc-row .rc-field { margin-bottom: 0; }\n .rc-divider { height: 1px; background: #F3F4F6; margin: 16px 0; border: none; }\n .section-animate { animation: fadeIn .25s ease-out; }\n @keyframes fadeIn { from { opacity:0; transform:translateY(4px); } to { opacity:1; transform:none; } }\n\n .rc-link-wrap { margin-top: 12px; text-align: center; font-size: 13px; color: #9CA3AF; }\n .rc-link-wrap a { color: ${t.accent}; text-decoration: none; font-weight: 600; cursor: pointer; }\n .rc-link-wrap a:hover { text-decoration: underline; }\n\n .rc-submit-btn {\n width: 100%; height: 52px; background: ${t.accent}; color: #FFFFFF; border: none;\n border-radius: 6px; font-family: inherit; font-size: 15px; font-weight: 700;\n cursor: pointer; letter-spacing: .01em; margin-top: 6px;\n box-shadow: 0 4px 12px ${t.accentShadow};\n transition: background .18s, transform .1s, box-shadow .18s;\n }\n .rc-submit-btn:hover:not(:disabled) { background: ${t.accentHover}; transform: translateY(-1px); box-shadow: 0 6px 18px ${rgba(t.accent, 0.35)}; }\n .rc-submit-btn:active:not(:disabled) { transform: translateY(0); }\n .rc-submit-btn:disabled { opacity: .5; cursor: not-allowed; transform: none; }\n\n .rc-spinner-ring {\n width: 48px; height: 48px;\n border: 4px solid ${rgba(t.accent, 0.18)};\n border-top-color: ${t.accent};\n border-radius: 50%;\n animation: rc-spin .75s linear infinite;\n }\n @keyframes rc-spin { to { transform: rotate(360deg); } }\n\n .rc-footer {\n text-align: center; padding: 0 20px 18px; font-size: 11px; color: #D1D5DB;\n display: flex; align-items: center; justify-content: center; gap: 5px;\n }\n .rc-footer svg { opacity: .5; }\n .hidden { display: none !important; }\n `;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAA8B;;;ACA9B,IAAAC,eASO;;;ACIP,IAAI,cAAoC;AAEjC,SAAS,WAA0B;AACxC,MAAI,OAAO,KAAM,QAAO,QAAQ,QAAQ;AACxC,MAAI,YAAa,QAAO;AAExB,gBAAc,IAAI,QAAc,CAAC,YAAY;AAC3C,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,aAAS,KAAK,YAAY,IAAI;AAE9B,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM;AACb,WAAO,SAAS,MAAM,QAAQ;AAC9B,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC,CAAC;AAED,SAAO;AACT;AAEO,SAAS,KAAK,MAAkE;AACrF,SAAO,OAAO,KAAK,KAAK,IAAI;AAC9B;;;ACzBO,SAAS,gBAAgB,QAAuC;AACrE,QAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,MAAI,aAAa,IAAI,UAAU,MAAM;AACrC,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,GAAG;AACzC;AAEO,SAAS,aACd,SACA,SACA,UAAU,OACJ;AArBR;AAsBE,QAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,MAAI,aAAa,IAAI,WAAW,MAAM;AACtC,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,GAAG;AAEvC,QAAM,WAAW,CAAC,EAChB,OAAO,sBACP,OAAO,uBACP,kBAAO,WAAP,mBAAe,oBAAf,mBAAgC,iBAChC,YAAO,YAAP,mBAAgB;AAMlB,MAAI,CAAC,SAAU;AAEf,qCAAU,EAAE,QAAQ,KAAK;AAIzB,QAAM,MAAM,KAAK,UAAU,EAAE,QAAQ,SAAS,QAAQ,CAAC;AAEvD,MAAI,OAAO,oBAAoB;AAC7B,WAAO,mBAAmB,YAAY,GAAG;AAAA,EAC3C,WAAW,OAAO,mBAAmB;AACnC,WAAO,kBAAkB,YAAY,GAAG;AAAA,EAC1C,YAAW,kBAAO,WAAP,mBAAe,oBAAf,mBAAgC,YAAY;AACrD,WAAO,OAAO,gBAAgB,WAAW,YAAY,EAAE,QAAQ,SAAS,QAAQ,CAAC;AAAA,EACnF,YAAW,YAAO,YAAP,mBAAgB,OAAO;AAChC,WAAO,QAAQ,MAAM;AAAA,EACvB;AACF;;;ACrDA,kBAA0B;AAUnB,SAAS,YAAY,QAAgB,YAAiC;AAC3E,SAAO;AAAA,IACL;AAAA,IACA,iBAAa,iBAAI,QAAQ,GAAG;AAAA,IAC5B,iBAAa,kBAAK,QAAQ,IAAI;AAAA,IAC9B,kBAAc,kBAAK,QAAQ,IAAI;AAAA,IAC/B;AAAA,EACF;AACF;AAEO,SAAS,YAAY,GAAwB;AAClD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAQY,EAAE,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDAiCuB,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBA0B1C,EAAE,MAAM,gDAAgD,EAAE,WAAW;AAAA;AAAA;AAAA,8DAG7B,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAWvC,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA,+CAIQ,EAAE,MAAM;AAAA;AAAA;AAAA,+BAGxB,EAAE,YAAY;AAAA;AAAA;AAAA,wDAGW,EAAE,WAAW,6DAAyD,kBAAK,EAAE,QAAQ,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAMxH,kBAAK,EAAE,QAAQ,IAAI,CAAC;AAAA,0BACpB,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAalC;;;AH9GO,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAAY,MAAqB;AAC/B,SAAK,OAAO;AACZ,SAAK,SAAS,IAAI,iCAAoB,KAAK,WAAW,KAAK,OAAO;AAAA,EACpE;AAAA,EAEA,MAAM,QAAuB;AA/B/B;AAgCI,UAAM,EAAE,QAAQ,WAAW,SAAS,QAAQ,CAAC,EAAE,IAAI,KAAK;AAExD,UAAM,SAAS,SAAS,cAAc,SAAS;AAC/C,QAAI,CAAC,OAAQ;AAEb,UAAM,aAAS,4BAAc,MAAM,MAAM;AACzC,UAAM,cAAa,WAAM,eAAN,YAAoB;AACvC,UAAM,SAAS,YAAY,QAAQ,UAAU;AAE7C,QAAI,SAA4B;AAEhC,UAAM,gBAAgB,CAAC,YAAoB;AACzC,YAAM,OAAO;AAAA,kCACe,UAAU;AAAA;AAAA,qDAES,OAAO;AAAA;AAEtD,UAAI,OAAQ,QAAO,YAAY;AAAA,UAC1B,CAAC,OAAuB,YAAY;AAAA,IAC3C;AAEA,QAAI,KAAC,4BAAc,MAAM,GAAG;AAC1B,oBAAc,uCAAuC;AACrD;AAAA,IACF;AAEA,aAAS,OAAO,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,SAAK,cAAc,QAAQ,MAAM;AAEjC,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,KAAK,OAAO,YAAY,MAAM;AAAA,IAC5C,SAAS,GAAG;AACV,YAAM,MACJ,aAAa,kCAAqB,EAAE,UAAU;AAChD,oBAAc,GAAG;AACjB;AAAA,IACF;AAEA,WAAO,YAAY;AACnB,UAAM,SAAS;AAEf,UAAM;AAAA,MACJ,MAAM,gBAAgB;AAAA,MACtB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,MACjB,oBAAoB,CAAC;AAAA,MACrB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,iBAAiB,CAAC;AAAA,MAClB,YAAY,CAAC;AAAA,MACb,QAAQ;AAAA,IACV,IAAI;AAEJ,UAAM,mBAAmB,qBAAqB;AAC9C,UAAM,uBAAuB,qBAAqB,mBAAmB,CAAC;AACtE,UAAM,aAAa,CAAC,qBAAqB,CAAC;AAG1C,QAAI,cAAc,OAAO;AACvB,YAAM,SAAS,MAAM,KAAK;AAAA,QACxB,OAAO;AAAA,QACP,MAAM;AAAA,qJACuI,UAAU;AAAA,cACjJ,OAAO,UAAU,WAAW,MAAM,QAAQ,OAAO,MAAM,IAAI,EAAE;AAAA;AAAA,QAEnE,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,QACpB,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,MAClB,CAAC;AACD,UAAI,CAAC,OAAO,aAAa;AACvB,qBAAa,OAAO;AACpB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,OAAO,QAAQ,iBAAiB,EACpD,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,kBAAkB,EAAE,iBAAY,CAAC,WAAW,EAC7D,KAAK,EAAE;AACV,UAAM,cAAc,OAAO,QAAQ,cAAc,EAC9C,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,kBAAkB,EAAE,WAAW,CAAC,WAAW,EAC5D,KAAK,EAAE;AACV,UAAM,kBAAkB,UACrB,IAAI,OAAK,kBAAkB,EAAE,SAAS,KAAK,EAAE,SAAS,iBAAO,EAAE,KAAK,WAAW,EAC/E,KAAK,EAAE;AAEV,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,YAAY,KAAK,eAAe;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,YAAY,KAAK;AAGxB,UAAM,IAAI,CAAkC,OAC1C,OAAQ,eAAe,EAAE;AAE3B,UAAM,aAAkB,EAAqB,gBAAgB;AAC7D,UAAM,aAAkB,EAAE,iBAAiB;AAC3C,UAAM,UAAkB,EAAE,cAAc;AACxC,UAAM,YAAkB,EAAE,eAAe;AACzC,UAAM,WAAkB,EAAE,SAAS;AACnC,UAAM,YAAkB,EAAqB,WAAW;AACxD,UAAM,cAAkB,EAAE,cAAc;AACxC,UAAM,cAAkB,EAAE,wBAAwB;AAClD,UAAM,cAAkB,EAAE,4BAA4B;AACtD,UAAM,kBAAkB,EAAE,qBAAqB;AAC/C,UAAM,iBAAkB,EAAE,iBAAiB;AAC3C,UAAM,cAAkB,EAAE,cAAc;AACxC,UAAM,kBAAkB,EAAE,mBAAmB;AAC7C,UAAM,eAAkB,EAAE,gBAAgB;AAE1C,QAAI,qBAAqB;AAEzB,UAAM,YAAY,MAAM;AACtB,YAAM,QAAQ,oBAAoB;AAClC,YAAM,OAAO,WAAW;AAExB,UAAI,OAAO;AACT,kBAAU,YAAY;AACtB,iBAAS,YAAa;AACtB,oBAAY,UAAU,OAAO,QAAQ;AACrC,uBAAe,MAAM,sBAAsB;AAC3C,wBAAgB,UAAU,OAAO,QAAQ;AACzC,oBAAY,UAAU,IAAI,QAAQ;AAClC,oBAAY,UAAU,OAAO,QAAQ;AACrC,mBAAW,UAAU,OAAO,UAAU,SAAS,MAAM;AACrD,gBAAQ,UAAU,OAAO,UAAa,SAAS,SAAS;AACxD,wBAAgB,UAAU,OAAO,UAAU,SAAS,MAAM;AAC1D,qBAAa,UAAU,OAAO,UAAa,SAAS,SAAS;AAC7D,oBAAY,MAAM,sBAAsB,SAAS,SAAS,YAAY;AAAA,MACxE,WAAW,qBAAqB;AAC9B,kBAAU,YAAY;AACtB,iBAAS,YAAa;AACtB,oBAAY,UAAU,IAAI,QAAQ;AAClC,uBAAe,MAAM,sBAAsB;AAC3C,wBAAgB,UAAU,IAAI,QAAQ;AACtC,oBAAY,UAAU,OAAO,QAAQ;AACrC,oBAAY,UAAU,IAAI,QAAQ;AAClC,mBAAW,UAAU,OAAO,UAAU,iBAAiB;AACvD,gBAAQ,UAAU,OAAO,UAAa,cAAc;AAAA,MACtD,OAAO;AACL,kBAAU,YAAY;AACtB,iBAAS,YAAa;AACtB,oBAAY,UAAU,IAAI,QAAQ;AAClC,uBAAe,MAAM,sBAAsB;AAC3C,wBAAgB,UAAU,OAAO,QAAQ;AACzC,oBAAY,UAAU,IAAI,QAAQ;AAClC,oBAAY,UAAU,IAAI,QAAQ;AAClC,mBAAW,UAAU,OAAO,UAAU,SAAS,MAAM;AACrD,gBAAQ,UAAU,OAAO,UAAa,SAAS,SAAS;AAAA,MAC1D;AAAA,IACF;AAEA,cAAU;AAGV,UAAM,UAAU,MAAM;AAAE,aAAQ,YAAY;AAAA,IAAI;AAEhD,eAAW,iBAAiB,UAAU,SAAS;AAC/C,MAAE,UAAU,EAAG,iBAAiB,SAAS,MAAM,aAAa,SAAS,OAAO,CAAC;AAE7E,MAAE,kBAAkB,EAAG,iBAAiB,SAAS,CAAC,MAAM;AACtD,QAAE,eAAe;AACjB,2BAAqB;AACrB,MAAC,EAAoB,SAAS,EAAI,QAAQ;AAC1C,gBAAU;AAAA,IACZ,CAAC;AAED,MAAoB,SAAS,EAAG,iBAAiB,SAAS,OAAK;AAC7D,YAAM,KAAK,EAAE;AACb,SAAG,QAAQ,GAAG,MAAM,QAAQ,gBAAgB,EAAE;AAAA,IAChD,CAAC;AAED,KAAC,mBAAmB,qBAAqB,kBAAkB,aAAa,EAAE,QAAQ,QAAM;AA5N5F,UAAAC;AA6NM,OAAAA,MAAA,EAAoB,EAAE,MAAtB,gBAAAA,IAAyB,iBAAiB,SAAS,OAAK;AACtD,cAAM,KAAK,EAAE;AACb,WAAG,QAAQ,GAAG,MAAM,QAAQ,OAAO,EAAE;AAAA,MACvC;AAAA,IACF,CAAC;AAED,WAAO,iBAAuD,mCAAmC,EAC9F,QAAQ,QAAM;AACb,YAAM,OAAO,MAAM,GAAG,QAAQ,WAAW,EAAG,UAAU,OAAO,WAAW,GAAG,UAAU,EAAE;AACvF,SAAG,iBAAiB,SAAS,IAAI;AACjC,SAAG,iBAAiB,UAAU,IAAI;AAClC,WAAK;AAAA,IACP,CAAC;AAGH,cAAU,iBAAiB,SAAS,YAAY;AA5OpD,UAAAA,KAAA;AA6OM,YAAM,SAAS,CAAC,OAAY;AA7OlC,YAAAA,KAAAC;AA8OS,gBAAAA,OAAAD,MAAA,EAAoB,EAAE,MAAtB,gBAAAA,IAA0B,MAAM,WAAhC,OAAAC,MAA0C;AAAA;AAE7C,YAAM,QAAc,oBAAoB;AACxC,YAAM,cAAc,QAAQ,OAAO,iBAAiB,IAAI;AAExD,UAAI,CAAC,WAAW,UAAU,SAAS,QAAQ,GAAG;AAC5C,YAAI,KAAC,4BAAc,OAAO,mBAAmB,GAAG,YAAY,UAAU,GAAG;AACvE,eAAK,EAAE,MAAM,WAAW,OAAO,kBAAkB,MAAM,eAAU,UAAU,iBAAO,UAAU,KAAK,oBAAoB,OAAO,CAAC;AAC7H;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,CAAC,aAAa;AACzB,aAAK,EAAE,MAAM,WAAW,OAAO,SAAS,MAAM,qCAAqC,oBAAoB,OAAO,CAAC;AAC/G;AAAA,MACF;AAEA,gBAAU,WAAa;AACvB,gBAAU,YAAa;AAEvB,YAAM,SAAS,EAAE,SAAS,OAAO,QAAQ,aAAa,MAAM,OAAO,SAAS,EAAE;AAE9E,UAAI;AACF,YAAI,CAAC,WAAW,UAAU,SAAS,QAAQ,GAAG;AAC5C,gBAAM,KAAK,OAAO,iBAAiB,gDAC9B,SAD8B;AAAA,YAEjC,oBAAoB,OAAO,oBAAoB;AAAA,YAC/C,mBAAoB,OAAO,mBAAmB;AAAA,cAC1C,SAAS,EAAE,gBAAgB,QAAQ,gBAAgB,OAAO,gBAAgB,EAAE,EACjF;AAAA,QACH;AACA,YAAI,CAAC,QAAQ,UAAU,SAAS,QAAQ,GAAG;AACzC,gBAAM,KAAK,OAAO,cAAc,gDAC3B,SAD2B;AAAA,YAE9B,iBAAiB,OAAO,iBAAiB;AAAA,YACzC,gBAAiB,OAAO,gBAAgB;AAAA,cACpC,SAAS,EAAE,gBAAgB,QAAQ,gBAAgB,OAAO,aAAa,EAAE,EAC9E;AAAA,QACH;AAEA,wBAAgB,YAAY;AAC5B,eAAAD,MAAA,KAAK,MAAK,cAAV,wBAAAA,KAAsB,EAAE,SAAS,KAAK;AAItC,aAAK;AAAA,UACH,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,oBAAoB;AAAA,UACpB,UAAU,MAAM,aAAa,SAAS,SAAS,IAAI;AAAA,QACrD,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,wBAAgB,QAAQ;AACxB,aAAK,EAAE,MAAM,SAAS,OAAO,SAAS,MAAO,IAAc,SAAS,oBAAoB,OAAO,CAAC;AAChG,kBAAU,WAAY;AACtB,kBAAU,YAAY;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAIQ,cAAc,QAAoB,QAA8C;AA5S1F;AA6SI,UAAM,KAAK,SAAS,cAAc,KAAK;AACvC,OAAG,YAAY;AAAA;AAAA;AAAA;AAAA,WAIT,uBAAY,MAAM,EAAE,MAAM,sDAAsD,MAAhF,mBAAoF,OAApF,YAA0F,EAAE;AAAA;AAAA;AAGlG,WAAO,YAAY,EAAE;AAAA,EACvB;AAAA,EAEQ,eAAe,GASZ;AACT,WAAO;AAAA,eACI,YAAY,EAAE,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAkBE,0BAAY,EAAE,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uEAUY,EAAE,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDA4BtC,EAAE,kBAAkB,yCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAMhF,EAAE,UAAU,iBAAO,EAAE,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CASV,EAAE,eAAe,yCAAoC;AAAA;AAAA;AAAA;AAAA,4CAItD,EAAE,mBAAmB,yCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCnG;AACF;;;ADnaO,IAAM,kBAAkB;AAAA,EAC7B,OAAO,QAAsB;AAjB/B;AAkBI,UAAM,SAAS,IAAI,YAAY,iCAC1B,SAD0B;AAAA,MAE7B,OAAO,iCACF,OAAO,QADL;AAAA,QAEL,YAAQ,6BAAc,YAAO,UAAP,mBAAc,MAAM;AAAA,MAC5C;AAAA,IACF,EAAC;AACD,WAAO;AAAA,MACL,OAAO,MAAM,OAAO,MAAM;AAAA,IAC5B;AAAA,EACF;AACF;","names":["import_core","import_core","_a","_b"]}
|